From b35c81562963bf009e7dd2fa44c3e5b1fa588a24 Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 15 Mar 2023 18:44:30 +0800 Subject: [PATCH] Fix no such method error on severely outdated minecraft versions, add InteractionController --- .../main/java/net/citizensnpcs/Settings.java | 12 +- .../nonliving/InteractionController.java | 124 ++++++++++++++++++ .../v1_19_R3/util/CustomEntityRegistry.java | 1 + .../nms/v1_19_R3/util/NMSImpl.java | 2 + 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/InteractionController.java diff --git a/main/src/main/java/net/citizensnpcs/Settings.java b/main/src/main/java/net/citizensnpcs/Settings.java index 9ec7d34e6..a9895204c 100644 --- a/main/src/main/java/net/citizensnpcs/Settings.java +++ b/main/src/main/java/net/citizensnpcs/Settings.java @@ -328,9 +328,13 @@ public class Settings { } protected void loadFromKey(DataKey root) { - if (root.keyExists(path)) { - ((YamlKey) root).getSection("").setComments(path, - comments == null ? null : Arrays.asList(comments.split("
"))); + if (SUPPORTS_SET_COMMENTS && root.keyExists(path)) { + try { + ((YamlKey) root).getSection("").setComments(path, + comments == null ? null : Arrays.asList(comments.split("
"))); + } catch (Throwable t) { + SUPPORTS_SET_COMMENTS = false; + } } if (migrate != null && root.keyExists(migrate) && !root.keyExists(path)) { value = root.getRaw(migrate); @@ -344,4 +348,6 @@ public class Settings { root.setRaw(path, value); } } + + private static boolean SUPPORTS_SET_COMMENTS = true; } diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/InteractionController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/InteractionController.java new file mode 100644 index 000000000..4f860d621 --- /dev/null +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/InteractionController.java @@ -0,0 +1,124 @@ +package net.citizensnpcs.nms.v1_19_R3.entity.nonliving; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R3.CraftServer; +import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_19_R3.entity.CraftInteraction; +import org.bukkit.util.Vector; + +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController; +import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder; +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.util.Util; +import net.minecraft.core.PositionImpl; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Interaction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.AABB; + +public class InteractionController extends MobEntityController { + public InteractionController() { + super(EntityInteractionNPC.class); + } + + @Override + public org.bukkit.entity.Interaction getBukkitEntity() { + return (org.bukkit.entity.Interaction) super.getBukkitEntity(); + } + + public static class EntityInteractionNPC extends Interaction implements NPCHolder { + private final CitizensNPC npc; + + public EntityInteractionNPC(EntityType types, Level level) { + this(types, level, null); + } + + public EntityInteractionNPC(EntityType types, Level level, NPC npc) { + super(types, level); + this.npc = (CitizensNPC) npc; + } + + @Override + public CraftEntity getBukkitEntity() { + if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { + NMSImpl.setBukkitEntity(this, new InteractionNPC(this)); + } + return super.getBukkitEntity(); + } + + @Override + public NPC getNPC() { + return npc; + } + + @Override + public boolean isPushable() { + return npc == null ? super.isPushable() + : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected()); + } + + @Override + protected AABB makeBoundingBox() { + return NMSBoundingBox.makeBB(npc, super.makeBoundingBox()); + } + + @Override + public void push(double x, double y, double z) { + Vector vector = Util.callPushEvent(npc, x, y, z); + if (vector != null) { + super.push(vector.getX(), vector.getY(), vector.getZ()); + } + } + + @Override + public void push(Entity entity) { + // this method is called by both the entities involved - cancelling + // it will not stop the NPC from moving. + super.push(entity); + if (npc != null) { + Util.callCollisionEvent(npc, entity.getBukkitEntity()); + } + } + + @Override + public boolean save(CompoundTag save) { + return npc == null ? super.save(save) : false; + } + + @Override + public Entity teleportTo(ServerLevel worldserver, PositionImpl location) { + if (npc == null) + return super.teleportTo(worldserver, location); + return NMSImpl.teleportAcrossWorld(this, worldserver, location); + } + + @Override + public void tick() { + if (npc != null) { + npc.update(); + } else { + super.tick(); + } + } + + @Override + public boolean updateFluidHeightAndDoFluidPushing(TagKey tagkey, double d0) { + return NMSImpl.fluidPush(npc, this, () -> super.updateFluidHeightAndDoFluidPushing(tagkey, d0)); + } + } + + public static class InteractionNPC extends CraftInteraction implements ForwardingNPCHolder { + public InteractionNPC(EntityInteractionNPC entity) { + super((CraftServer) Bukkit.getServer(), entity); + } + } +} diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java index 445981f15..5c64edca8 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java @@ -434,6 +434,7 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry> minecraftClassMap.put(EntityType.BLOCK_DISPLAY, Display.ItemDisplay.class); minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.TextDisplay.class); minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.BlockDisplay.class); + minecraftClassMap.put(EntityType.INTERACTION, net.minecraft.world.entity.Interaction.class); minecraftClassMap.put(EntityType.SILVERFISH, Silverfish.class); minecraftClassMap.put(EntityType.SKELETON, Skeleton.class); minecraftClassMap.put(EntityType.SKELETON_HORSE, SkeletonHorse.class); diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java index 6b4747668..07439e9be 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java @@ -196,6 +196,7 @@ import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FallingBlockController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FireworkController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FishingHookController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.GlowItemFrameController; +import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.InteractionController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemDisplayController; import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemFrameController; @@ -1020,6 +1021,7 @@ public class NMSImpl implements NMSBridge { EntityControllers.setEntityControllerForType(EntityType.BLOCK_DISPLAY, BlockDisplayController.class); EntityControllers.setEntityControllerForType(EntityType.ITEM_DISPLAY, TextDisplayController.class); EntityControllers.setEntityControllerForType(EntityType.TEXT_DISPLAY, ItemDisplayController.class); + EntityControllers.setEntityControllerForType(EntityType.INTERACTION, InteractionController.class); } @Override