Rename /npc pose --save to /npc pose --mirror and add /npc pose --save to save the current NPC pose

This commit is contained in:
fullwall 2022-04-24 19:22:55 +08:00
parent 3bd2f7db8c
commit 324d94a21f
17 changed files with 184 additions and 12 deletions

View File

@ -1671,8 +1671,8 @@ public class NPCCommands {
@Command( @Command(
aliases = { "npc" }, aliases = { "npc" },
usage = "pose (--save [name] (-d)|--assume [name]|--remove [name]|--default [name]) (-a)", usage = "pose (--save [name] (-d) | --mirror [name] (-d) | --assume [name] | --remove [name] | --default [name]) (-a)",
desc = "Changes/Saves/Lists NPC's head pose(s)", desc = "Manage NPC poses",
flags = "ad", flags = "ad",
modifiers = { "pose" }, modifiers = { "pose" },
min = 1, min = 1,
@ -1687,14 +1687,28 @@ public class NPCCommands {
if (args.getSenderLocation() == null) if (args.getSenderLocation() == null)
throw new ServerCommandException(); throw new ServerCommandException();
if (trait.addPose(args.getFlag("save"), args.getSenderLocation(), args.hasFlag('d'))) { if (trait.addPose(args.getFlag("save"), npc.getStoredLocation(), args.hasFlag('d'))) {
Messaging.sendTr(sender, Messages.POSE_ADDED); Messaging.sendTr(sender, Messages.POSE_ADDED);
} else } else {
throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("save")); throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("save"));
}
} else if (args.hasValueFlag("mirror")) {
if (args.getFlag("mirror").isEmpty())
throw new CommandException(Messages.INVALID_POSE_NAME);
if (args.getSenderLocation() == null)
throw new ServerCommandException();
if (trait.addPose(args.getFlag("mirror"), npc.getStoredLocation(), args.hasFlag('d'))) {
Messaging.sendTr(sender, Messages.POSE_ADDED);
} else {
throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("mirror"));
}
} else if (args.hasValueFlag("default")) { } else if (args.hasValueFlag("default")) {
String pose = args.getFlag("default"); String pose = args.getFlag("default");
if (!trait.hasPose(pose)) if (!trait.hasPose(pose))
throw new CommandException(Messages.POSE_MISSING, pose); throw new CommandException(Messages.POSE_MISSING, pose);
trait.setDefaultPose(pose); trait.setDefaultPose(pose);
Messaging.sendTr(sender, Messages.DEFAULT_POSE_SET, pose); Messaging.sendTr(sender, Messages.DEFAULT_POSE_SET, pose);
} else if (args.hasValueFlag("assume")) { } else if (args.hasValueFlag("assume")) {
@ -1704,6 +1718,7 @@ public class NPCCommands {
if (!trait.hasPose(pose)) if (!trait.hasPose(pose))
throw new CommandException(Messages.POSE_MISSING, pose); throw new CommandException(Messages.POSE_MISSING, pose);
trait.assumePose(pose); trait.assumePose(pose);
} else if (args.hasValueFlag("remove")) { } else if (args.hasValueFlag("remove")) {
if (args.getFlag("remove").isEmpty()) if (args.getFlag("remove").isEmpty())
@ -1720,8 +1735,7 @@ public class NPCCommands {
return; return;
if (args.getSenderLocation() == null) if (args.getSenderLocation() == null)
throw new ServerCommandException(); throw new ServerCommandException();
Location location = args.getSenderLocation(); trait.assumePose(args.getSenderLocation());
trait.assumePose(location);
} }
@Command( @Command(

View File

@ -102,6 +102,7 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
min = dist; min = dist;
lookingAt = player; lookingAt = player;
} }
if (old != lookingAt) { if (old != lookingAt) {
NPCLookCloseChangeTargetEvent event = new NPCLookCloseChangeTargetEvent(npc, old, lookingAt); NPCLookCloseChangeTargetEvent event = new NPCLookCloseChangeTargetEvent(npc, old, lookingAt);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
@ -132,6 +133,10 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
return lookingAt; return lookingAt;
} }
public boolean isEnabled() {
return enabled;
}
private boolean isInvisible(Player player) { private boolean isInvisible(Player player) {
return player.getGameMode() == GameMode.SPECTATOR || player.hasPotionEffect(PotionEffectType.INVISIBILITY) return player.getGameMode() == GameMode.SPECTATOR || player.hasPotionEffect(PotionEffectType.INVISIBILITY)
|| isPluginVanished(player) || !canSee(player); || isPluginVanished(player) || !canSee(player);
@ -218,6 +223,7 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
if (lookingAt == null) if (lookingAt == null)
return; return;
Util.faceEntity(npc.getEntity(), lookingAt); Util.faceEntity(npc.getEntity(), lookingAt);
if (npc.getEntity().getType().name().equals("SHULKER")) { if (npc.getEntity().getType().name().equals("SHULKER")) {
boolean wasSilent = npc.getEntity().isSilent(); boolean wasSilent = npc.getEntity().isSilent();

View File

@ -62,7 +62,7 @@ public class Poses extends Trait {
private void assumePose(float yaw, float pitch) { private void assumePose(float yaw, float pitch) {
if (!npc.isSpawned()) { if (!npc.isSpawned()) {
npc.spawn(npc.getOrAddTrait(CurrentLocation.class).getLocation(), SpawnReason.COMMAND); npc.spawn(npc.getStoredLocation(), SpawnReason.COMMAND);
} }
Util.setRotation(npc.getEntity(), yaw, pitch); Util.setRotation(npc.getEntity(), yaw, pitch);
} }
@ -127,12 +127,14 @@ public class Poses extends Trait {
@Override @Override
public void run() { public void run() {
if (!hasPose(defaultPose)) if (!hasPose(defaultPose) || npc.getNavigator().isNavigating())
return; return;
if (!npc.getNavigator().isNavigating() if (npc.hasTrait(LookClose.class)) {
&& (!npc.hasTrait(LookClose.class) || !npc.getOrAddTrait(LookClose.class).canSeeTarget())) { LookClose trait = npc.getOrAddTrait(LookClose.class);
assumePose(defaultPose); if (trait.isEnabled() && trait.canSeeTarget())
return;
} }
assumePose(defaultPose);
} }
@Override @Override

View File

@ -0,0 +1,95 @@
package net.citizensnpcs.trait;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
@TraitName("rotationtrait")
public class RotationTrait extends Trait {
protected boolean rotating;
protected double tx;
protected double ty;
protected double tz;
protected float xMaxRotAngle = 10;
protected float yMaxRotSpeed = 40;
public RotationTrait() {
super("rotationtrait");
}
private double getEyeY() {
return NMS.getHeight(npc.getEntity());
}
private double getX() {
return npc.getStoredLocation().getX();
}
protected float getTargetPitchDifference() {
double dx = tx - getX();
double dy = ty - (getY() + getEyeY());
double dz = tz - getZ();
double diag = Math.sqrt((float) (dx * dx + dz * dz));
return (float) -Math.toDegrees(Math.atan2(dy, diag));
}
private double getY() {
return npc.getStoredLocation().getY();
}
protected float getTargetYawDifference() {
return (float) Math.toDegrees(Math.atan2(tz - getZ(), tx - getX())) - 90.0F;
}
private double getZ() {
return npc.getStoredLocation().getZ();
}
protected float rotateTowards(float target, float current, float maxRotPerTick) {
float diff = Util.clamp(current - target);
return target + clamp(diff, -maxRotPerTick, maxRotPerTick);
}
@Override
public void run() {
if (!npc.isSpawned() || npc.getNavigator().isNavigating()) {
// npc.yHeadRot = Mth.rotateIfNecessary(npc.yHeadRot, npc.yBodyRot, 75);
return;
}
if (true) {
// npc.setXRot(0.0F);
}
if (this.rotating) {
this.rotating = false;
NMS.setHeadYaw(npc.getEntity(),
Util.clamp(rotateTowards(NMS.getHeadYaw(npc.getEntity()), getTargetYawDifference(), this.yMaxRotSpeed)));
float d = Util.clamp(NMS.getHeadYaw(npc.getEntity()) - 40);
if (d > NMS.getYaw(npc.getEntity())) {
NMS.setBodyYaw(npc.getEntity(), d);
}
if (d != NMS.getYaw(npc.getEntity())) {
d = NMS.getHeadYaw(npc.getEntity()) + 40;
while (d >= 180F) {
d -= 360F;
}
while (d < -180F) {
d += 360F;
}
if (d < NMS.getYaw(npc.getEntity())) {
NMS.setBodyYaw(npc.getEntity(), d);
}
}
NMS.setPitch(npc.getEntity(),
rotateTowards(npc.getStoredLocation().getPitch(), getTargetPitchDifference(), this.xMaxRotAngle));
}
}
public static float clamp(float var0, float var1, float var2) {
if (var0 < var1) {
return var1;
} else {
return var0 > var2 ? var2 : var0;
}
}
}

View File

@ -553,6 +553,10 @@ public class NMS {
BRIDGE.setPeekShulker(entity, peek); BRIDGE.setPeekShulker(entity, peek);
} }
public static void setPitch(Entity entity, float pitch) {
BRIDGE.setPitch(entity, pitch);
}
public static void setPolarBearRearing(Entity entity, boolean rearing) { public static void setPolarBearRearing(Entity entity, boolean rearing) {
BRIDGE.setPolarBearRearing(entity, rearing); BRIDGE.setPolarBearRearing(entity, rearing);
} }

View File

@ -155,6 +155,8 @@ public interface NMSBridge {
public void setPeekShulker(Entity entity, int peek); public void setPeekShulker(Entity entity, int peek);
public void setPitch(Entity entity, float pitch);
public void setPolarBearRearing(Entity entity, boolean rearing); public void setPolarBearRearing(Entity entity, boolean rearing);
public void setProfile(SkullMeta meta, GameProfile profile); public void setProfile(SkullMeta meta, GameProfile profile);

View File

@ -1000,6 +1000,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).p(rearing); ((EntityPolarBear) getHandle(entity)).p(rearing);

View File

@ -1057,6 +1057,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).p(rearing); ((EntityPolarBear) getHandle(entity)).p(rearing);

View File

@ -1065,6 +1065,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).p(rearing); ((EntityPolarBear) getHandle(entity)).p(rearing);

View File

@ -1101,6 +1101,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).s(rearing); ((EntityPolarBear) getHandle(entity)).s(rearing);

View File

@ -1161,6 +1161,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).r(rearing); ((EntityPolarBear) getHandle(entity)).r(rearing);

View File

@ -1194,6 +1194,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a((byte) peek); ((EntityShulker) getHandle(shulker)).a((byte) peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).r(rearing); ((EntityPolarBear) getHandle(entity)).r(rearing);

View File

@ -1226,6 +1226,11 @@ public class NMSImpl implements NMSBridge {
((EntityShulker) getHandle(shulker)).a(peek); ((EntityShulker) getHandle(shulker)).a(peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((EntityPolarBear) getHandle(entity)).t(rearing); ((EntityPolarBear) getHandle(entity)).t(rearing);

View File

@ -1225,6 +1225,11 @@ public class NMSImpl implements NMSBridge {
((Shulker) getHandle(shulker)).setRawPeekAmount(peek); ((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).setXRot(pitch);
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((PolarBear) getHandle(entity)).setStanding(rearing); ((PolarBear) getHandle(entity)).setStanding(rearing);

View File

@ -1232,6 +1232,11 @@ public class NMSImpl implements NMSBridge {
((Shulker) getHandle(shulker)).setRawPeekAmount(peek); ((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).setXRot(pitch);
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
((PolarBear) getHandle(entity)).setStanding(rearing); ((PolarBear) getHandle(entity)).setStanding(rearing);

View File

@ -23,7 +23,6 @@ public class PlayerBodyControl {
} }
if (e()) if (e())
if (Math.abs(this.mob.yHeadRot - this.lastStableYHeadRot) > 15.0F) { if (Math.abs(this.mob.yHeadRot - this.lastStableYHeadRot) > 15.0F) {
System.out.println("BIG DX");
this.lastStableYHeadRot = 0; this.lastStableYHeadRot = 0;
this.lastStableYHeadRot = this.mob.yHeadRot; this.lastStableYHeadRot = this.mob.yHeadRot;
rotateBodyIfNecessary(); rotateBodyIfNecessary();

View File

@ -944,6 +944,11 @@ public class NMSImpl implements NMSBridge {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
getHandle(entity).pitch = pitch;
}
@Override @Override
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) { public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();