From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: kashike Date: Wed, 15 Aug 2018 01:26:09 -0700 Subject: [PATCH] Allow disabling armour stand ticking diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java index 54d7f6efcf42d4c7a8c209dfe3c5485318afafe3..5ea60c713426f11e420360a08a9ea1039d4f6b02 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -378,4 +378,10 @@ public class PaperWorldConfig { private void armorStandEntityLookups() { armorStandEntityLookups = getBoolean("armor-stands-do-collision-entity-lookups", true); } + + public boolean armorStandTick = true; + private void armorStandTick() { + this.armorStandTick = this.getBoolean("armor-stands-tick", this.armorStandTick); + log("ArmorStand ticking is " + (this.armorStandTick ? "enabled" : "disabled") + " by default"); + } } diff --git a/src/main/java/net/minecraft/server/EntityArmorStand.java b/src/main/java/net/minecraft/server/EntityArmorStand.java index 8922c656617bd8aed5b68f671d5191a537695bdf..8021d06b7765ad00abdbd8b77c37f7a80cb15803 100644 --- a/src/main/java/net/minecraft/server/EntityArmorStand.java +++ b/src/main/java/net/minecraft/server/EntityArmorStand.java @@ -46,9 +46,16 @@ public class EntityArmorStand extends EntityLiving { public Vector3f leftLegPose; public Vector3f rightLegPose; public boolean canMove = true; // Paper + // Paper start - Allow ArmorStands not to tick + public boolean canTick = true; + public boolean canTickSetByAPI = false; + private boolean noTickPoseDirty = false; + private boolean noTickEquipmentDirty = false; + // Paper end public EntityArmorStand(EntityTypes entitytypes, World world) { super(entitytypes, world); + if (world != null) this.canTick = world.paperConfig.armorStandTick; // Paper - armour stand ticking this.handItems = NonNullList.a(2, ItemStack.b); this.armorItems = NonNullList.a(4, ItemStack.b); this.headPose = EntityArmorStand.bj; @@ -144,6 +151,7 @@ public class EntityArmorStand extends EntityLiving { this.armorItems.set(enumitemslot.b(), itemstack); } + this.noTickEquipmentDirty = true; // Paper - Allow equipment to be updated even when tick disabled } @Override @@ -224,6 +232,7 @@ public class EntityArmorStand extends EntityLiving { } nbttagcompound.set("Pose", this.B()); + if (this.canTickSetByAPI) nbttagcompound.setBoolean("Paper.CanTickOverride", this.canTick); // Paper - persist no tick setting } @Override @@ -255,6 +264,12 @@ public class EntityArmorStand extends EntityLiving { this.setBasePlate(nbttagcompound.getBoolean("NoBasePlate")); this.setMarker(nbttagcompound.getBoolean("Marker")); this.noclip = !this.A(); + // Paper start - persist no tick + if (nbttagcompound.hasKey("Paper.CanTickOverride")) { + this.canTick = nbttagcompound.getBoolean("Paper.CanTickOverride"); + this.canTickSetByAPI = true; + } + // Paper end NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Pose"); this.g(nbttagcompound1); @@ -610,7 +625,29 @@ public class EntityArmorStand extends EntityLiving { @Override public void tick() { + // Paper start + if (!this.canTick) { + if (this.noTickPoseDirty) { + this.noTickPoseDirty = false; + this.updatePose(); + } + + if (this.noTickEquipmentDirty) { + this.noTickEquipmentDirty = false; + this.updateEntityEquipment(); + } + + return; + } + // Paper end + super.tick(); + // Paper start - Split into separate method + updatePose(); + } + + public void updatePose() { + // Paper end Vector3f vector3f = (Vector3f) this.datawatcher.get(EntityArmorStand.c); if (!this.headPose.equals(vector3f)) { @@ -733,29 +770,36 @@ public class EntityArmorStand extends EntityLiving { public void setHeadPose(Vector3f vector3f) { this.headPose = vector3f; this.datawatcher.set(EntityArmorStand.c, vector3f); + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking } public void setBodyPose(Vector3f vector3f) { this.bodyPose = vector3f; this.datawatcher.set(EntityArmorStand.d, vector3f); + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking } public void setLeftArmPose(Vector3f vector3f) { this.leftArmPose = vector3f; this.datawatcher.set(EntityArmorStand.e, vector3f); + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking } public void setRightArmPose(Vector3f vector3f) { this.rightArmPose = vector3f; this.datawatcher.set(EntityArmorStand.f, vector3f); + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking } public void setLeftLegPose(Vector3f vector3f) { + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking this.leftLegPose = vector3f; this.datawatcher.set(EntityArmorStand.g, vector3f); + } public void setRightLegPose(Vector3f vector3f) { + this.noTickPoseDirty = true; // Paper - Allow updates when not ticking this.rightLegPose = vector3f; this.datawatcher.set(EntityArmorStand.bh, vector3f); } diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 97c0cc10d30a299a95e019f59bfcbbff176455ab..57395c71ce8e6c1b0246ca9bd7bf7f688e770d15 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2520,6 +2520,7 @@ public abstract class EntityLiving extends Entity { } } + public final void updateEntityEquipment() { p(); }; // Paper - OBFHELPER private void p() { Map map = this.q(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java index c19f0b0dd3fe988a30049297355445fd73cae630..cb22cbd68a4d310fecad3a87a97bf101216a5f64 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java @@ -311,5 +311,16 @@ public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { public boolean isSlotDisabled(org.bukkit.inventory.EquipmentSlot slot) { return getHandle().isSlotDisabled(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot)); } + + @Override + public boolean canTick() { + return this.getHandle().canTick; + } + + @Override + public void setCanTick(final boolean tick) { + this.getHandle().canTick = tick; + this.getHandle().canTickSetByAPI = true; + } // Paper end }