ea855e2b46
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Developers!: You will need to clean up your work/Minecraft/1.13.2 folder for this Also, restore a patch that was dropped in the last upstream Bukkit Changes: 279eeab3 Fix command description not being set 96e2bb18 Remove debug print from SyntheticEventTest CraftBukkit Changes: d3ed1516 Fix dangerously threaded beacons 217a293d Don't relocate joptsimple to allow --help to work. 1be05a21 Prepare for imminent Java 12 release a49270b2 Mappings Update 5259d80c SPIGOT-4669: Fix PlayerTeleportEvent coordinates for relative teleports Spigot Changes: e6eb36f2 Rebuild patches
281 lines
12 KiB
Diff
281 lines
12 KiB
Diff
From c3e0bed1cacc07c470717a3a75769ce86673f31a Mon Sep 17 00:00:00 2001
|
|
From: kashike <kashike@vq.lc>
|
|
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 4059c7a72..10efe6b3d 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -498,4 +498,10 @@ public class PaperWorldConfig {
|
|
break;
|
|
}
|
|
}
|
|
+
|
|
+ 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 c604182dd..2c54e3e34 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityArmorStand.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityArmorStand.java
|
|
@@ -45,6 +45,11 @@ 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;
|
|
+ private boolean noTickPoseDirty = false;
|
|
+ private boolean noTickEquipmentDirty = false;
|
|
+ // Paper end
|
|
|
|
public EntityArmorStand(World world) {
|
|
super(EntityTypes.ARMOR_STAND, world);
|
|
@@ -57,6 +62,7 @@ public class EntityArmorStand extends EntityLiving {
|
|
this.leftLegPose = EntityArmorStand.bB;
|
|
this.rightLegPose = EntityArmorStand.bC;
|
|
this.noclip = this.isNoGravity();
|
|
+ if (world != null) this.canTick = world.paperConfig.armorStandTick; // Paper - armour stand ticking
|
|
this.setSize(0.5F, 1.975F);
|
|
this.Q = 0.0F;
|
|
}
|
|
@@ -128,6 +134,7 @@ public class EntityArmorStand extends EntityLiving {
|
|
this.bF.set(enumitemslot.b(), itemstack);
|
|
}
|
|
|
|
+ this.noTickEquipmentDirty = true; // Paper - Allow equipment to be updated even when tick disabled
|
|
}
|
|
|
|
public boolean c(int i, ItemStack itemstack) {
|
|
@@ -199,6 +206,7 @@ public class EntityArmorStand extends EntityLiving {
|
|
}
|
|
|
|
nbttagcompound.set("Pose", this.z());
|
|
+ nbttagcompound.setBoolean("Paper.CanTick", this.canTick); // Paper - persist no tick setting
|
|
}
|
|
|
|
public void a(NBTTagCompound nbttagcompound) {
|
|
@@ -230,6 +238,11 @@ public class EntityArmorStand extends EntityLiving {
|
|
this.setMarker(nbttagcompound.getBoolean("Marker"));
|
|
this.bI = !this.isMarker();
|
|
this.noclip = this.isNoGravity();
|
|
+ // Paper start - persist no tick
|
|
+ if (nbttagcompound.hasKey("Paper.CanTick")) {
|
|
+ this.canTick = nbttagcompound.getBoolean("Paper.CanTick");
|
|
+ }
|
|
+ // Paper end
|
|
NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Pose");
|
|
|
|
this.g(nbttagcompound1);
|
|
@@ -553,7 +566,30 @@ public class EntityArmorStand extends EntityLiving {
|
|
}
|
|
|
|
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.b);
|
|
|
|
if (!this.headPose.equals(vector3f)) {
|
|
@@ -682,31 +718,37 @@ public class EntityArmorStand extends EntityLiving {
|
|
public void setHeadPose(Vector3f vector3f) {
|
|
this.headPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.b, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public void setBodyPose(Vector3f vector3f) {
|
|
this.bodyPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.c, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public void setLeftArmPose(Vector3f vector3f) {
|
|
this.leftArmPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.d, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public void setRightArmPose(Vector3f vector3f) {
|
|
this.rightArmPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.e, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public void setLeftLegPose(Vector3f vector3f) {
|
|
this.leftLegPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.f, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public void setRightLegPose(Vector3f vector3f) {
|
|
this.rightLegPose = vector3f;
|
|
this.datawatcher.set(EntityArmorStand.g, vector3f);
|
|
+ this.noTickPoseDirty = true; // Paper - Allow updates when not ticking
|
|
}
|
|
|
|
public Vector3f r() {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
index bc1ab273b..cb32d64bd 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -2083,52 +2083,7 @@ public abstract class EntityLiving extends Entity {
|
|
}
|
|
}
|
|
|
|
- EnumItemSlot[] aenumitemslot = EnumItemSlot.values();
|
|
- int j = aenumitemslot.length;
|
|
-
|
|
- for (int k = 0; k < j; ++k) {
|
|
- EnumItemSlot enumitemslot = aenumitemslot[k];
|
|
- ItemStack itemstack;
|
|
-
|
|
- switch (enumitemslot.a()) {
|
|
- case HAND:
|
|
- itemstack = (ItemStack) this.bB.get(enumitemslot.b());
|
|
- break;
|
|
- case ARMOR:
|
|
- itemstack = (ItemStack) this.bC.get(enumitemslot.b());
|
|
- break;
|
|
- default:
|
|
- continue;
|
|
- }
|
|
-
|
|
- ItemStack itemstack1 = this.getEquipment(enumitemslot);
|
|
-
|
|
- if (!ItemStack.matches(itemstack1, itemstack)) {
|
|
- // Paper start - PlayerArmorChangeEvent
|
|
- if (this instanceof EntityPlayer && enumitemslot.getType() == EnumItemSlot.Function.ARMOR) {
|
|
- final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack);
|
|
- final org.bukkit.inventory.ItemStack newItem = CraftItemStack.asBukkitCopy(itemstack1);
|
|
- new PlayerArmorChangeEvent((Player) this.getBukkitEntity(), PlayerArmorChangeEvent.SlotType.valueOf(enumitemslot.name()), oldItem, newItem).callEvent();
|
|
- }
|
|
- // Paper end
|
|
- ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutEntityEquipment(this.getId(), enumitemslot, itemstack1)));
|
|
- if (!itemstack.isEmpty()) {
|
|
- this.getAttributeMap().a(itemstack.a(enumitemslot));
|
|
- }
|
|
-
|
|
- if (!itemstack1.isEmpty()) {
|
|
- this.getAttributeMap().b(itemstack1.a(enumitemslot));
|
|
- }
|
|
-
|
|
- switch (enumitemslot.a()) {
|
|
- case HAND:
|
|
- this.bB.set(enumitemslot.b(), itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack());
|
|
- break;
|
|
- case ARMOR:
|
|
- this.bC.set(enumitemslot.b(), itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack());
|
|
- }
|
|
- }
|
|
- }
|
|
+ updateEntityEquipment(); // Paper - split into own method
|
|
|
|
if (this.ticksLived % 20 == 0) {
|
|
this.getCombatTracker().g();
|
|
@@ -2221,6 +2176,57 @@ public abstract class EntityLiving extends Entity {
|
|
}
|
|
}
|
|
|
|
+ // Paper start - split into own method from above
|
|
+ public void updateEntityEquipment() {
|
|
+ EnumItemSlot[] aenumitemslot = EnumItemSlot.values();
|
|
+ int j = aenumitemslot.length;
|
|
+
|
|
+ for (int k = 0; k < j; ++k) {
|
|
+ EnumItemSlot enumitemslot = aenumitemslot[k];
|
|
+ ItemStack itemstack;
|
|
+
|
|
+ switch (enumitemslot.a()) {
|
|
+ case HAND:
|
|
+ itemstack = (ItemStack) this.bB.get(enumitemslot.b());
|
|
+ break;
|
|
+ case ARMOR:
|
|
+ itemstack = (ItemStack) this.bC.get(enumitemslot.b());
|
|
+ break;
|
|
+ default:
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ ItemStack itemstack1 = this.getEquipment(enumitemslot);
|
|
+
|
|
+ if (!ItemStack.matches(itemstack1, itemstack)) {
|
|
+ // Paper start - PlayerArmorChangeEvent
|
|
+ if (this instanceof EntityPlayer && enumitemslot.getType() == EnumItemSlot.Function.ARMOR) {
|
|
+ final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack);
|
|
+ final org.bukkit.inventory.ItemStack newItem = CraftItemStack.asBukkitCopy(itemstack1);
|
|
+ new PlayerArmorChangeEvent((Player) this.getBukkitEntity(), PlayerArmorChangeEvent.SlotType.valueOf(enumitemslot.name()), oldItem, newItem).callEvent();
|
|
+ }
|
|
+ // Paper end
|
|
+ ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutEntityEquipment(this.getId(), enumitemslot, itemstack1)));
|
|
+ if (!itemstack.isEmpty()) {
|
|
+ this.getAttributeMap().a(itemstack.a(enumitemslot));
|
|
+ }
|
|
+
|
|
+ if (!itemstack1.isEmpty()) {
|
|
+ this.getAttributeMap().b(itemstack1.a(enumitemslot));
|
|
+ }
|
|
+
|
|
+ switch (enumitemslot.a()) {
|
|
+ case HAND:
|
|
+ this.bB.set(enumitemslot.b(), itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack());
|
|
+ break;
|
|
+ case ARMOR:
|
|
+ this.bC.set(enumitemslot.b(), itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack());
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
protected float e(float f, float f1) {
|
|
float f2 = MathHelper.g(f - this.aQ);
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java
|
|
index 9f5c3b92e..07ce93f17 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java
|
|
@@ -297,5 +297,15 @@ 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;
|
|
+ }
|
|
// Paper end
|
|
}
|
|
--
|
|
2.21.0
|
|
|