From a16226ccafb029454f54b6cd54856402d8280497 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 12 Mar 2022 00:17:46 +0800 Subject: [PATCH] Allow /npc equip to work with Striders, fix a bug with /npc look --- .../citizensnpcs/editor/EquipmentEditor.java | 6 ++- ...pperGUI.java => SteerableEquipperGUI.java} | 2 +- .../java/net/citizensnpcs/trait/Saddle.java | 38 ++++++++++++++----- .../nms/v1_18_R2/util/PlayerLookControl.java | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) rename main/src/main/java/net/citizensnpcs/editor/{PigEquipperGUI.java => SteerableEquipperGUI.java} (97%) diff --git a/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java b/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java index 4dea25dff..f6164c51d 100644 --- a/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java +++ b/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java @@ -100,7 +100,11 @@ public class EquipmentEditor extends Editor { private static final Map EQUIPPERS = Maps.newEnumMap(EntityType.class); static { - EQUIPPER_GUIS.put(EntityType.PIG, PigEquipperGUI.class); + EQUIPPER_GUIS.put(EntityType.PIG, SteerableEquipperGUI.class); + try { + EQUIPPER_GUIS.put(EntityType.valueOf("STRIDER"), SteerableEquipperGUI.class); + } catch (IllegalArgumentException ex) { + } EQUIPPER_GUIS.put(EntityType.ENDERMAN, EndermanEquipperGUI.class); EQUIPPERS.put(EntityType.SHEEP, new SheepEquipper()); EQUIPPERS.put(EntityType.HORSE, new HorseEquipper()); diff --git a/main/src/main/java/net/citizensnpcs/editor/PigEquipperGUI.java b/main/src/main/java/net/citizensnpcs/editor/SteerableEquipperGUI.java similarity index 97% rename from main/src/main/java/net/citizensnpcs/editor/PigEquipperGUI.java rename to main/src/main/java/net/citizensnpcs/editor/SteerableEquipperGUI.java index 9eccdb856..387163e4c 100644 --- a/main/src/main/java/net/citizensnpcs/editor/PigEquipperGUI.java +++ b/main/src/main/java/net/citizensnpcs/editor/SteerableEquipperGUI.java @@ -33,7 +33,7 @@ import net.citizensnpcs.trait.Saddle; compatMaterial = { "BARRIER", "FIRE" }, title = "<4>Unused") }, value = "xxx") -public class PigEquipperGUI extends InventoryMenuPage { +public class SteerableEquipperGUI extends InventoryMenuPage { @InjectContext private NPC npc; @MenuSlot(slot = { 0, 1 }) diff --git a/main/src/main/java/net/citizensnpcs/trait/Saddle.java b/main/src/main/java/net/citizensnpcs/trait/Saddle.java index 7ae7ac90c..110bcd476 100644 --- a/main/src/main/java/net/citizensnpcs/trait/Saddle.java +++ b/main/src/main/java/net/citizensnpcs/trait/Saddle.java @@ -1,6 +1,7 @@ package net.citizensnpcs.trait; import org.bukkit.entity.Pig; +import org.bukkit.entity.Steerable; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEntityEvent; @@ -8,6 +9,7 @@ import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitName; +import net.citizensnpcs.util.Util; /** * Persists saddle metadata. @@ -16,9 +18,9 @@ import net.citizensnpcs.api.trait.TraitName; */ @TraitName("saddle") public class Saddle extends Trait implements Toggleable { - private boolean pig; @Persist("") private boolean saddle; + private boolean steerable; public Saddle() { super("saddle"); @@ -26,24 +28,27 @@ public class Saddle extends Trait implements Toggleable { @EventHandler public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { - if (pig && npc.equals(CitizensAPI.getNPCRegistry().getNPC(event.getRightClicked()))) + if (steerable && npc.equals(CitizensAPI.getNPCRegistry().getNPC(event.getRightClicked()))) { event.setCancelled(true); + } } @Override public void onSpawn() { - if (npc.getEntity() instanceof Pig) { - ((Pig) npc.getEntity()).setSaddle(saddle); - pig = true; - } else - pig = false; + if (Util.optionalEntitySet("PIG", "STRIDER").contains(npc.getEntity().getType())) { + steerable = true; + updateSaddleState(); + } else { + steerable = false; + } } @Override public boolean toggle() { saddle = !saddle; - if (pig) - ((Pig) npc.getEntity()).setSaddle(saddle); + if (steerable) { + updateSaddleState(); + } return saddle; } @@ -52,7 +57,22 @@ public class Saddle extends Trait implements Toggleable { return "Saddle{" + saddle + "}"; } + private void updateSaddleState() { + if (SUPPORT_STEERABLE) { + try { + ((Steerable) npc.getEntity()).setSaddle(saddle); + } catch (Throwable t) { + SUPPORT_STEERABLE = false; + ((Pig) npc.getEntity()).setSaddle(saddle); + } + } else { + ((Pig) npc.getEntity()).setSaddle(saddle); + } + } + public boolean useSaddle() { return saddle; } + + private static boolean SUPPORT_STEERABLE = true; } \ No newline at end of file diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerLookControl.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerLookControl.java index 4b54a2cb9..972d6497e 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerLookControl.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerLookControl.java @@ -68,7 +68,7 @@ public class PlayerLookControl { protected float getXRotD() { double var0 = this.tx - this.a.getX(); - double var2 = this.ty - this.a.getEyeY(); + double var2 = this.ty - (this.a.getY() + this.a.getEyeY()); double var4 = this.tz - this.a.getZ(); double var6 = Mth.sqrt((float) (var0 * var0 + var4 * var4)); return (float) (-(Mth.atan2(var2, var6) * 57.2957763671875D));