diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index 6b4c3215d..02a600d11 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -255,6 +255,16 @@ public class CitizensNPC extends AbstractNPC { entityController.spawn(at.clone(), this); getEntity().setMetadata(NPC_METADATA_MARKER, new FixedMetadataValue(CitizensAPI.getPlugin(), true)); + Collection onPreSpawn = traits.values(); + for (Trait trait : onPreSpawn.toArray(new Trait[onPreSpawn.size()])) { + try { + trait.onPreSpawn(); + } catch (Throwable ex) { + Messaging.severeTr(Messages.TRAIT_ONSPAWN_FAILED, trait.getName(), getId()); + ex.printStackTrace(); + } + } + boolean loaded = Util.isLoaded(at); boolean couldSpawn = !loaded ? false : NMS.addEntityToWorld(getEntity(), CreatureSpawnEvent.SpawnReason.CUSTOM); @@ -294,10 +304,7 @@ public class CitizensNPC extends AbstractNPC { navigator.onSpawn(); - // Modify NPC using traits after the entity has been created Collection onSpawn = traits.values(); - - // work around traits modifying the map during this iteration. for (Trait trait : onSpawn.toArray(new Trait[onSpawn.size()])) { try { trait.onSpawn(); diff --git a/main/src/main/java/net/citizensnpcs/trait/ArmorStandTrait.java b/main/src/main/java/net/citizensnpcs/trait/ArmorStandTrait.java index 4719772af..26684f989 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ArmorStandTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ArmorStandTrait.java @@ -65,54 +65,59 @@ public class ArmorStandTrait extends Trait { return visible; } + @Override + public void onPreSpawn() { + onSpawn(); + } + @Override public void onSpawn() { - if (npc.getEntity() instanceof ArmorStand) { - ArmorStand entity = (ArmorStand) npc.getEntity(); - if (leftArm != null) { - entity.setLeftArmPose(leftArm); - } - if (leftLeg != null) { - entity.setLeftLegPose(leftLeg); - } - if (rightArm != null) { - entity.setRightArmPose(rightArm); - } - if (rightLeg != null) { - entity.setRightLegPose(rightLeg); - } - if (body != null) { - entity.setBodyPose(body); - } - if (head != null) { - entity.setHeadPose(head); - } - entity.setVisible(visible); - entity.setGravity(gravity); - entity.setArms(hasarms); - entity.setBasePlate(hasbaseplate); - entity.setSmall(small); - entity.setMarker(marker); + if (!(npc.getEntity() instanceof ArmorStand)) + return; + ArmorStand entity = (ArmorStand) npc.getEntity(); + if (leftArm != null) { + entity.setLeftArmPose(leftArm); } + if (leftLeg != null) { + entity.setLeftLegPose(leftLeg); + } + if (rightArm != null) { + entity.setRightArmPose(rightArm); + } + if (rightLeg != null) { + entity.setRightLegPose(rightLeg); + } + if (body != null) { + entity.setBodyPose(body); + } + if (head != null) { + entity.setHeadPose(head); + } + entity.setVisible(visible); + entity.setGravity(gravity); + entity.setArms(hasarms); + entity.setBasePlate(hasbaseplate); + entity.setSmall(small); + entity.setMarker(marker); } @Override public void run() { - if (npc.getEntity() instanceof ArmorStand) { - ArmorStand entity = (ArmorStand) npc.getEntity(); - body = entity.getBodyPose(); - leftArm = entity.getLeftArmPose(); - leftLeg = entity.getLeftLegPose(); - rightArm = entity.getRightArmPose(); - rightLeg = entity.getRightLegPose(); - head = entity.getHeadPose(); - entity.setVisible(visible); - entity.setGravity(gravity); - entity.setArms(hasarms); - entity.setBasePlate(hasbaseplate); - entity.setSmall(small); - entity.setMarker(marker); - } + if (!(npc.getEntity() instanceof ArmorStand)) + return; + ArmorStand entity = (ArmorStand) npc.getEntity(); + body = entity.getBodyPose(); + leftArm = entity.getLeftArmPose(); + leftLeg = entity.getLeftLegPose(); + rightArm = entity.getRightArmPose(); + rightLeg = entity.getRightLegPose(); + head = entity.getHeadPose(); + entity.setVisible(visible); + entity.setGravity(gravity); + entity.setArms(hasarms); + entity.setBasePlate(hasbaseplate); + entity.setSmall(small); + entity.setMarker(marker); } /** diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java index 4aee3ee5e..bd71d7ecc 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java @@ -127,10 +127,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); } diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java index 6bf6005f5..15bb0e6c8 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java @@ -140,10 +140,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); } diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java index 1e06a67eb..b24db0a9e 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java @@ -421,10 +421,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); } diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java index f3b247cb0..3d68ed7b1 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java @@ -424,11 +424,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java index 60a6b6b38..2a8a3c65f 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java @@ -170,7 +170,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable public void run() { ((WorldServer) world).removeEntity(EntityHumanNPC.this); } - }, 35); // give enough time for death and smoke animation + }, 15); // give enough time for death and smoke animation } @Override @@ -425,10 +425,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); /* double diff = this.yaw - this.aK; diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java index 338352228..8769f2df4 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java @@ -183,7 +183,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable public void run() { ((WorldServer) world).removeEntity(EntityHumanNPC.this); } - }, 35); // give enough time for death and smoke animation + }, 15); // give enough time for death and smoke animation } @Override @@ -455,10 +455,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable boolean navigating = npc.getNavigator().isNavigating(); updatePackets(navigating); - if (noDamageTicks > 0) { - --noDamageTicks; - } - npc.update(); /* double diff = this.yaw - this.aK; diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java index 2eba097ae..e6d48161d 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java @@ -197,11 +197,11 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable if (this.hurtTime > 0) this.hurtTime--; - if (this.invulnerableTime > 0) - this.invulnerableTime--; + if (isDeadOrDying()) { tickDeath(); } + if (this.lastHurtByPlayerTime > 0) { this.lastHurtByPlayerTime--; } else { @@ -482,10 +482,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable updatePackets(npc.getNavigator().isNavigating()); - if (invulnerableTime > 0) { - --invulnerableTime; - } - npc.update(); }