Browse Source

entity tags for snuvi, mod spawned entities bypass limits, prevent
entity tick tag

Kajetan Johannes Hammerle 2 years ago
parent
commit
03e1765369

+ 12 - 4
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -39,6 +39,7 @@ import net.minecraftforge.event.entity.*;
 import net.minecraftforge.event.entity.item.ItemTossEvent;
 import net.minecraftforge.event.entity.living.*;
 import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;
+import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
 import net.minecraftforge.event.entity.player.*;
 import net.minecraftforge.event.world.*;
 import net.minecraftforge.eventbus.api.*;
@@ -670,15 +671,15 @@ public class ScriptEvents implements BlockHarvest, Craft, ContainerClick {
     @SubscribeEvent(receiveCanceled = true)
     public void onEntityJoinWorld(EntityJoinWorldEvent e) {
         Entity ent = e.getEntity();
-        if(!e.getEntity().isPassenger()
-                && !scripts.getEntityLimits().isAllowedToSpawn(ent.getType())) {
-            e.getEntity().getPassengers().forEach(rider -> {
+        if(!ent.isPassenger() && !scripts.getEntityLimits().isAllowedToSpawn(ent.getType())
+                && !ent.getTags().contains("mod_spawned")) {
+            ent.getPassengers().forEach(rider -> {
                 if(rider == null || rider instanceof PlayerEntity) {
                     return;
                 }
                 rider.remove();
             });
-            e.getEntity().removePassengers();
+            ent.removePassengers();
             e.setCanceled(true);
             return;
         }
@@ -687,6 +688,13 @@ public class ScriptEvents implements BlockHarvest, Craft, ContainerClick {
         });
     }
 
+    @SubscribeEvent(receiveCanceled = true)
+    public void onLivingUpdate(LivingUpdateEvent e) {
+        if(e.getEntity().getTags().contains("no_tick")) {
+            e.setCanceled(true);
+        }
+    }
+
     @SubscribeEvent(receiveCanceled = true)
     public void onEntityLeaveWorld(EntityLeaveWorldEvent e) {
         Entity ent = e.getEntity();

+ 10 - 1
src/main/java/me/km/snuviscript/commands/EntityCommands.java

@@ -188,7 +188,8 @@ public class EntityCommands {
                     : new CompoundNBT();
             nbt.putString("id", type.toString());
             ServerWorld sw = (ServerWorld) l.getWorld();
-            Entity ent = EntityType.loadEntityAndExecute(nbt, sw, (e) -> {
+            Entity ent = EntityType.loadEntityAndExecute(nbt, sw, e -> {
+                e.addTag("mod_spawned");
                 e.setLocationAndAngles(l.getX(), l.getY(), l.getZ(), e.rotationYaw,
                         e.rotationPitch);
                 return e;
@@ -262,5 +263,13 @@ public class EntityCommands {
             }
             return ((TameableEntity) in[0].get(sc)).getOwnerId();
         });
+        sm.registerFunction("entity.addtag",
+                (sc, in) -> ((Entity) in[0].get(sc)).addTag(in[1].getString(sc)));
+        sm.registerFunction("entity.removetag",
+                (sc, in) -> ((Entity) in[0].get(sc)).removeTag(in[1].getString(sc)));
+        sm.registerFunction("entity.hastag",
+                (sc, in) -> ((Entity) in[0].get(sc)).getTags().contains(in[1].getString(sc)));
+        sm.registerConsumer("entity.cleartags",
+                (sc, in) -> ((Entity) in[0].get(sc)).getTags().clear());
     }
 }

+ 6 - 3
src/main/java/me/km/snuviscript/commands/ReadCommands.java

@@ -21,7 +21,8 @@ import net.minecraft.world.server.ServerWorld;
 public class ReadCommands {
 
     public static void registerFunctions(ScriptManager sm, MinecraftServer server) {
-        sm.registerFunction("read.player", (sc, in) -> Utils.getPlayerByName(server, in[0].getString(sc)));
+        sm.registerFunction("read.player",
+                (sc, in) -> Utils.getPlayerByName(server, in[0].getString(sc)));
         sm.registerFunction("read.location", (sc, in) -> new Location(server, in[0].getString(sc)));
         sm.registerFunction("read.item", (sc, in) -> {
             try {
@@ -51,8 +52,10 @@ public class ReadCommands {
             Location l = (Location) in[0].get(sc);
             ServerWorld sw = (ServerWorld) l.getWorld();
             CompoundNBT compoundnbt = JsonToNBT.getTagFromJson(SnuviUtils.connect(sc, in, 1));
-            Entity entity = EntityType.loadEntityAndExecute(compoundnbt, sw, (ent) -> {
-                ent.setLocationAndAngles(l.getX(), l.getY(), l.getZ(), ent.rotationYaw, ent.rotationPitch);
+            Entity entity = EntityType.loadEntityAndExecute(compoundnbt, sw, ent -> {
+                ent.addTag("mod_spawned");
+                ent.setLocationAndAngles(l.getX(), l.getY(), l.getZ(), ent.rotationYaw,
+                        ent.rotationPitch);
                 return sw.summonEntity(ent) ? ent : null;
             });
             return entity;