Backport some Llama controllable changes, minor camel fixes

This commit is contained in:
fullwall 2023-06-12 09:47:03 +08:00
parent 3702b019cd
commit ff736ebd4b
23 changed files with 330 additions and 108 deletions

View File

@ -109,7 +109,7 @@ public class EquipmentEditor extends Editor {
EQUIPPERS.put(EntityType.SHEEP, new SheepEquipper());
EQUIPPERS.put(EntityType.HORSE, new HorseEquipper());
for (EntityType type : Util.optionalEntitySet("ZOMBIE_HORSE", "LLAMA", "TRADER_LLAMA", "DONKEY", "MULE",
"SKELETON_HORSE")) {
"SKELETON_HORSE", "CAMEL")) {
EQUIPPERS.put(type, new HorseEquipper());
}
}

View File

@ -46,7 +46,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends EntityHorseDonkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -144,8 +143,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_12_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_12_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -21,6 +22,7 @@ import net.minecraft.server.v1_12_R1.BlockPosition;
import net.minecraft.server.v1_12_R1.DamageSource;
import net.minecraft.server.v1_12_R1.Entity;
import net.minecraft.server.v1_12_R1.EntityLlama;
import net.minecraft.server.v1_12_R1.GenericAttributes;
import net.minecraft.server.v1_12_R1.IBlockData;
import net.minecraft.server.v1_12_R1.NBTTagCompound;
import net.minecraft.server.v1_12_R1.SoundEffect;
@ -43,7 +45,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends EntityLlama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(World world) {
this(world, null);
@ -54,6 +58,7 @@ public class LlamaController extends MobEntityController {
this.npc = (CitizensNPC) npc;
if (npc != null) {
((Llama) getBukkitEntity()).setDomestication(((Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
}
}
@ -113,6 +118,14 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public boolean cV() {
if (npc != null && riding) {
return true;
}
return super.cV();
}
@Override
protected SoundEffect d(DamageSource damagesource) {
return NMSImpl.getSoundEffect(npc, super.d(damagesource), NPC.Metadata.HURT_SOUND);
@ -130,8 +143,6 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);
@ -172,9 +183,18 @@ public class LlamaController extends MobEntityController {
@Override
public void M() {
if (npc == null) {
super.M();
} else {
super.M();
if (npc != null) {
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED)
.setValue(baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
c(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}

View File

@ -50,7 +50,6 @@ public class HorseSkeletonController extends MobEntityController {
public static class EntityHorseSkeletonNPC extends EntityHorseSkeleton implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -159,8 +158,6 @@ public class HorseSkeletonController extends MobEntityController {
return NMSImpl.getSoundEffect(npc, super.D(), NPC.Metadata.AMBIENT_SOUND);
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_13_R2.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_13_R2.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -24,6 +25,7 @@ import net.minecraft.server.v1_13_R2.EntityBoat;
import net.minecraft.server.v1_13_R2.EntityLlama;
import net.minecraft.server.v1_13_R2.EntityMinecartAbstract;
import net.minecraft.server.v1_13_R2.FluidType;
import net.minecraft.server.v1_13_R2.GenericAttributes;
import net.minecraft.server.v1_13_R2.IBlockData;
import net.minecraft.server.v1_13_R2.NBTTagCompound;
import net.minecraft.server.v1_13_R2.SoundEffect;
@ -47,7 +49,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends EntityLlama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(World world) {
this(world, null);
@ -58,6 +62,7 @@ public class LlamaController extends MobEntityController {
this.npc = (CitizensNPC) npc;
if (npc != null) {
((Llama) getBukkitEntity()).setDomestication(((Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
}
}
@ -107,6 +112,14 @@ public class LlamaController extends MobEntityController {
return NMS.getFallDistance(npc, super.bn());
}
@Override
public boolean bT() {
if (npc != null && riding) {
return true;
}
return super.bT();
}
@Override
public void c(float f, float f1) {
if (npc == null || !npc.isFlyable()) {
@ -144,8 +157,6 @@ public class LlamaController extends MobEntityController {
return NMSImpl.getSoundEffect(npc, super.D(), NPC.Metadata.AMBIENT_SOUND);
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);
@ -181,9 +192,18 @@ public class LlamaController extends MobEntityController {
@Override
public void mobTick() {
if (npc == null) {
super.mobTick();
} else {
super.mobTick();
if (npc != null) {
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED)
.setValue(baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
d(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}

View File

@ -53,7 +53,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends EntityHorseDonkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -158,8 +157,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_14_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_14_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -26,6 +27,7 @@ import net.minecraft.server.v1_14_R1.EntityLlama;
import net.minecraft.server.v1_14_R1.EntityMinecartAbstract;
import net.minecraft.server.v1_14_R1.EntityTypes;
import net.minecraft.server.v1_14_R1.FluidType;
import net.minecraft.server.v1_14_R1.GenericAttributes;
import net.minecraft.server.v1_14_R1.IBlockData;
import net.minecraft.server.v1_14_R1.NBTTagCompound;
import net.minecraft.server.v1_14_R1.SoundEffect;
@ -50,7 +52,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends EntityLlama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityTypes<? extends EntityLlama> types, World world) {
this(types, world, null);
@ -61,6 +65,7 @@ public class LlamaController extends MobEntityController {
this.npc = (CitizensNPC) npc;
if (npc != null) {
((Llama) getBukkitEntity()).setDomestication(((Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
}
}
@ -108,6 +113,14 @@ public class LlamaController extends MobEntityController {
return NMS.getFallDistance(npc, super.bv());
}
@Override
public boolean ca() {
if (npc != null && riding) {
return true;
}
return super.ca();
}
@Override
protected void checkDespawn() {
if (npc == null) {
@ -130,6 +143,11 @@ public class LlamaController extends MobEntityController {
return npc == null ? super.d(save) : false;
}
@Override
public boolean dD() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.dD();
}
@Override
public void e(Vec3D vec3d) {
if (npc == null || !npc.isFlyable()) {
@ -139,8 +157,6 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public void f(double x, double y, double z) {
Vector vector = Util.callPushEvent(npc, x, y, z);
@ -193,9 +209,22 @@ public class LlamaController extends MobEntityController {
@Override
public void mobTick() {
if (npc == null) {
super.mobTick();
} else {
super.mobTick();
if (npc != null) {
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED)
.setValue(baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, yaw, pitch);
}
d(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}

View File

@ -54,7 +54,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends EntityHorseDonkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -160,8 +159,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
public CraftEntity getBukkitEntity() {
if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {

View File

@ -14,6 +14,7 @@ import net.citizensnpcs.nms.v1_15_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_15_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -27,6 +28,7 @@ import net.minecraft.server.v1_15_R1.EntityLlama;
import net.minecraft.server.v1_15_R1.EntityMinecartAbstract;
import net.minecraft.server.v1_15_R1.EntityTypes;
import net.minecraft.server.v1_15_R1.FluidType;
import net.minecraft.server.v1_15_R1.GenericAttributes;
import net.minecraft.server.v1_15_R1.IBlockData;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
import net.minecraft.server.v1_15_R1.SoundEffect;
@ -51,7 +53,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends EntityLlama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityTypes<? extends EntityLlama> types, World world) {
this(types, world, null);
@ -62,6 +66,7 @@ public class LlamaController extends MobEntityController {
this.npc = (CitizensNPC) npc;
if (npc != null) {
((Llama) getBukkitEntity()).setDomestication(((Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
}
}
@ -117,6 +122,14 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public boolean cj() {
if (npc != null && riding) {
return true;
}
return super.cj();
}
@Override
public void collide(net.minecraft.server.v1_15_R1.Entity entity) {
// this method is called by both the entities involved - cancelling
@ -141,8 +154,6 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public CraftEntity getBukkitEntity() {
if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
@ -195,12 +206,22 @@ public class LlamaController extends MobEntityController {
@Override
public void mobTick() {
if (npc == null) {
super.mobTick();
} else {
super.mobTick();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.mobTick();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED)
.setValue(baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, yaw, pitch);
}
d(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();

View File

@ -54,7 +54,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends EntityHorseDonkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -146,8 +145,6 @@ public class HorseDonkeyController extends MobEntityController {
return npc == null ? super.d(save) : false;
}
@Override
public boolean er() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.er();

View File

@ -14,6 +14,7 @@ import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -27,6 +28,7 @@ import net.minecraft.server.v1_16_R3.EntityLlama;
import net.minecraft.server.v1_16_R3.EntityMinecartAbstract;
import net.minecraft.server.v1_16_R3.EntityTypes;
import net.minecraft.server.v1_16_R3.FluidType;
import net.minecraft.server.v1_16_R3.GenericAttributes;
import net.minecraft.server.v1_16_R3.IBlockData;
import net.minecraft.server.v1_16_R3.NBTTagCompound;
import net.minecraft.server.v1_16_R3.SoundEffect;
@ -51,7 +53,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends EntityLlama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityTypes<? extends EntityLlama> types, World world) {
this(types, world, null);
@ -62,6 +66,7 @@ public class LlamaController extends MobEntityController {
this.npc = (CitizensNPC) npc;
if (npc != null) {
((Llama) getBukkitEntity()).setDomestication(((Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
}
}
@ -127,13 +132,19 @@ public class LlamaController extends MobEntityController {
}
}
@Override
public boolean cs() {
if (npc != null && riding) {
return true;
}
return super.cs();
}
@Override
public boolean d(NBTTagCompound save) {
return npc == null ? super.d(save) : false;
}
@Override
public void g(Vec3D vec3d) {
if (npc == null || !npc.isFlyable()) {
@ -195,12 +206,22 @@ public class LlamaController extends MobEntityController {
@Override
public void mobTick() {
if (npc == null) {
super.mobTick();
} else {
super.mobTick();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.mobTick();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED)
.setValue(baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, yaw, pitch);
}
d(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();

View File

@ -53,7 +53,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends Donkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -130,8 +129,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -24,6 +25,7 @@ import net.minecraft.tags.Tag;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.horse.Llama;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -50,7 +52,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends Llama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityType<? extends Llama> types, Level level) {
this(types, level, null);
@ -62,6 +66,7 @@ public class LlamaController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Llama) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -97,20 +102,28 @@ public class LlamaController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -144,6 +157,14 @@ public class LlamaController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);

View File

@ -54,7 +54,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends Donkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -131,8 +130,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_18_R2.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_18_R2.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -25,6 +26,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.horse.Llama;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -51,7 +53,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends Llama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityType<? extends Llama> types, Level level) {
this(types, level, null);
@ -63,6 +67,7 @@ public class LlamaController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Llama) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -98,20 +103,28 @@ public class LlamaController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -145,6 +158,14 @@ public class LlamaController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -26,6 +27,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.camel.Camel;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -58,7 +60,9 @@ public class CamelController extends MobEntityController {
}
public static class EntityCamelNPC extends Camel implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityCamelNPC(EntityType<? extends Camel> types, Level level) {
this(types, level, null);
@ -70,6 +74,7 @@ public class CamelController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Camel) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Camel) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -105,20 +110,28 @@ public class CamelController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -152,6 +165,14 @@ public class CamelController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);
@ -163,6 +184,11 @@ public class CamelController extends MobEntityController {
: npc.data().<Boolean> get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
}
@Override
public boolean isVehicle() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.isVehicle();
}
@Override
public void knockback(double strength, double dx, double dz) {
NMS.callKnockbackEvent(npc, (float) strength, dx, dz, (evt) -> super.knockback((float) evt.getStrength(),

View File

@ -55,7 +55,6 @@ public class HorseDonkeyController extends MobEntityController {
public static class EntityHorseDonkeyNPC extends Donkey implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -127,8 +126,6 @@ public class HorseDonkeyController extends MobEntityController {
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -26,6 +27,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.horse.Llama;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -52,7 +54,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends Llama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityType<? extends Llama> types, Level level) {
this(types, level, null);
@ -64,6 +68,7 @@ public class LlamaController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Llama) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -99,20 +104,28 @@ public class LlamaController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -146,6 +159,14 @@ public class LlamaController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);
@ -157,6 +178,11 @@ public class LlamaController extends MobEntityController {
: npc.data().<Boolean> get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
}
@Override
public boolean isVehicle() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.isVehicle();
}
@Override
public void knockback(double strength, double dx, double dz) {
NMS.callKnockbackEvent(npc, (float) strength, dx, dz, (evt) -> super.knockback((float) evt.getStrength(),

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_20_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_20_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -26,6 +27,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.camel.Camel;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -58,7 +60,9 @@ public class CamelController extends MobEntityController {
}
public static class EntityCamelNPC extends Camel implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityCamelNPC(EntityType<? extends Camel> types, Level level) {
this(types, level, null);
@ -70,6 +74,7 @@ public class CamelController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Camel) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Camel) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -105,20 +110,28 @@ public class CamelController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -152,6 +165,14 @@ public class CamelController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);
@ -163,6 +184,11 @@ public class CamelController extends MobEntityController {
: npc.data().<Boolean> get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
}
@Override
public boolean isVehicle() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.isVehicle();
}
@Override
public void knockback(double strength, double dx, double dz) {
NMS.callKnockbackEvent(npc, (float) strength, dx, dz, (evt) -> super.knockback((float) evt.getStrength(),

View File

@ -228,12 +228,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
boolean damaged = super.hurt(damagesource, f);
if (damaged && hurtMarked) {
hurtMarked = false;
Bukkit.getScheduler().runTask(CitizensAPI.getPlugin(), new Runnable() {
@Override
public void run() {
EntityHumanNPC.this.hurtMarked = true;
}
});
Bukkit.getScheduler().runTask(CitizensAPI.getPlugin(), () -> EntityHumanNPC.this.hurtMarked = true);
}
return damaged;
}

View File

@ -55,7 +55,6 @@ public class HorseMuleController extends MobEntityController {
public static class EntityHorseMuleNPC extends Mule implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -127,8 +126,6 @@ public class HorseMuleController extends MobEntityController {
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);

View File

@ -55,7 +55,6 @@ public class HorseSkeletonController extends MobEntityController {
public static class EntityHorseSkeletonNPC extends SkeletonHorse implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
@ -127,8 +126,6 @@ public class HorseSkeletonController extends MobEntityController {
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);

View File

@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_20_R1.util.NMSBoundingBox;
import net.citizensnpcs.nms.v1_20_R1.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@ -26,6 +27,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.horse.Llama;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.Boat;
@ -52,7 +54,9 @@ public class LlamaController extends MobEntityController {
}
public static class EntityLlamaNPC extends Llama implements NPCHolder {
private double baseMovementSpeed;
private final CitizensNPC npc;
private boolean riding;
public EntityLlamaNPC(EntityType<? extends Llama> types, Level level) {
this(types, level, null);
@ -64,6 +68,7 @@ public class LlamaController extends MobEntityController {
if (npc != null) {
((org.bukkit.entity.Llama) getBukkitEntity())
.setDomestication(((org.bukkit.entity.Llama) getBukkitEntity()).getMaxDomestication());
baseMovementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED).getValue();
}
}
@ -99,20 +104,28 @@ public class LlamaController extends MobEntityController {
@Override
public void customServerAiStep() {
if (npc == null) {
super.customServerAiStep();
} else {
super.customServerAiStep();
if (npc != null) {
NMSImpl.updateMinecraftAIState(npc, this);
if (npc.useMinecraftAI()) {
super.customServerAiStep();
if (npc.hasTrait(Controllable.class) && npc.getOrAddTrait(Controllable.class).isEnabled()) {
riding = getBukkitEntity().getPassengers().size() > 0;
getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(
baseMovementSpeed * npc.getNavigator().getDefaultParameters().speedModifier());
} else {
riding = false;
}
if (riding) {
if (npc.getNavigator().isNavigating()) {
org.bukkit.entity.Entity basePassenger = passengers.get(0).getBukkitEntity();
NMS.look(basePassenger, getYRot(), getXRot());
}
setFlag(4, true); // datawatcher method
}
NMS.setStepHeight(getBukkitEntity(), 1);
npc.update();
}
}
@Override
protected SoundEvent getAmbientSound() {
return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
@ -146,6 +159,14 @@ public class LlamaController extends MobEntityController {
return npc;
}
@Override
public boolean isControlledByLocalInstance() {
if (npc != null && riding) {
return true;
}
return super.isControlledByLocalInstance();
}
@Override
public boolean isLeashed() {
return NMSImpl.isLeashed(npc, super::isLeashed, this);
@ -157,6 +178,11 @@ public class LlamaController extends MobEntityController {
: npc.data().<Boolean> get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
}
@Override
public boolean isVehicle() {
return npc != null && npc.getNavigator().isNavigating() ? false : super.isVehicle();
}
@Override
public void knockback(double strength, double dx, double dz) {
NMS.callKnockbackEvent(npc, (float) strength, dx, dz, (evt) -> super.knockback((float) evt.getStrength(),