From 3682faebec7a2bf9b73db7497b7669bf6957a1a1 Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 5 Feb 2019 18:12:02 +0800 Subject: [PATCH] Implement new API and fix an error from Paper --- .../main/java/net/citizensnpcs/Citizens.java | 21 +++++ .../npc/AbstractEntityController.java | 16 ++-- .../npc/skin/SkinUpdateTracker.java | 3 +- .../main/java/net/citizensnpcs/util/NMS.java | 4 + .../java/net/citizensnpcs/util/NMSBridge.java | 2 + .../nms/v1_10_R1/util/NMSImpl.java | 5 ++ .../nms/v1_11_R1/util/NMSImpl.java | 5 ++ .../nms/v1_12_R1/util/NMSImpl.java | 5 ++ .../nms/v1_13_R2/entity/HumanController.java | 6 +- .../nms/v1_13_R2/util/NMSImpl.java | 87 +++++++++++++++---- .../nms/v1_8_R3/util/NMSImpl.java | 5 ++ 11 files changed, 130 insertions(+), 29 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index 146058f63..719fa7e15 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -10,16 +10,20 @@ import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.CitizensPlugin; +import net.citizensnpcs.api.SkullMetaProvider; import net.citizensnpcs.api.ai.speech.SpeechFactory; import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.command.CommandManager; @@ -72,6 +76,18 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { private CitizensNPCRegistry npcRegistry; private NPCDataStore saves; private NPCSelector selector; + private final SkullMetaProvider skullMetaProvider = new SkullMetaProvider() { + @Override + public String getTexture(SkullMeta meta) { + return Iterables.getFirst(NMS.getProfile(meta).getProperties().get("textures"), new Property("", "")) + .getValue(); + } + + @Override + public void setTexture(String string, SkullMeta meta) { + NMS.setProfile(meta, new GameProfile(meta.getOwningPlayer().getUniqueId(), string)); + } + }; private CitizensSpeechFactory speechFactory; private final Map storedRegistries = Maps.newHashMap(); private CitizensTraitFactory traitFactory; @@ -212,6 +228,11 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { return new File(getDataFolder(), "scripts"); } + @Override + public SkullMetaProvider getSkullMetaProvider() { + return skullMetaProvider; + } + @Override public SpeechFactory getSpeechFactory() { return speechFactory; diff --git a/main/src/main/java/net/citizensnpcs/npc/AbstractEntityController.java b/main/src/main/java/net/citizensnpcs/npc/AbstractEntityController.java index bf5bab00a..2bdda5627 100644 --- a/main/src/main/java/net/citizensnpcs/npc/AbstractEntityController.java +++ b/main/src/main/java/net/citizensnpcs/npc/AbstractEntityController.java @@ -1,11 +1,11 @@ package net.citizensnpcs.npc; -import net.citizensnpcs.api.npc.NPC; -import net.citizensnpcs.util.NMS; - import org.bukkit.Location; import org.bukkit.entity.Entity; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.util.NMS; + public abstract class AbstractEntityController implements EntityController { private Entity bukkitEntity; @@ -23,11 +23,6 @@ public abstract class AbstractEntityController implements EntityController { return bukkitEntity; } - @Override - public void setEntity(Entity entity) { - this.bukkitEntity = entity; - } - @Override public void remove() { if (bukkitEntity == null) @@ -36,6 +31,11 @@ public abstract class AbstractEntityController implements EntityController { bukkitEntity = null; } + @Override + public void setEntity(Entity entity) { + this.bukkitEntity = entity; + } + @Override public void spawn(Location at, NPC npc) { bukkitEntity = createEntity(at, npc); diff --git a/main/src/main/java/net/citizensnpcs/npc/skin/SkinUpdateTracker.java b/main/src/main/java/net/citizensnpcs/npc/skin/SkinUpdateTracker.java index f81e19b63..676de7f3b 100644 --- a/main/src/main/java/net/citizensnpcs/npc/skin/SkinUpdateTracker.java +++ b/main/src/main/java/net/citizensnpcs/npc/skin/SkinUpdateTracker.java @@ -137,8 +137,9 @@ public class SkinUpdateTracker { if (tracker.fovVisibleSkins.contains(skinnable)) continue; - if (canSee(player, skinnable, true)) + if (canSee(player, skinnable, true)) { output.add(skinnable); + } } } diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index fc8e2a939..1fae632b8 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -222,6 +222,10 @@ public class NMS { BRIDGE.registerEntityClass(clazz); } + public static void remove(Entity entity) { + BRIDGE.remove(entity); + } + public static void removeFromServerPlayerList(Player player) { BRIDGE.removeFromServerPlayerList(player); } diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index 3a819d0b7..c994cb28e 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -91,6 +91,8 @@ public interface NMSBridge { public void registerEntityClass(Class clazz); + public void remove(Entity entity); + public void removeFromServerPlayerList(Player player); public void removeFromWorld(org.bukkit.entity.Entity entity); diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index 246d9fc30..095b9fe9b 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -709,6 +709,11 @@ public class NMSImpl implements NMSBridge { throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); } + @Override + public void remove(org.bukkit.entity.Entity entity) { + NMSImpl.getHandle(entity).die(); + } + @Override public void removeFromServerPlayerList(Player player) { EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java index a877b0b83..96855483b 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java @@ -767,6 +767,11 @@ public class NMSImpl implements NMSBridge { throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); } + @Override + public void remove(org.bukkit.entity.Entity entity) { + NMSImpl.getHandle(entity).die(); + } + @Override public void removeFromServerPlayerList(Player player) { EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java index 8e723d591..6542db6f1 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java @@ -774,6 +774,11 @@ public class NMSImpl implements NMSBridge { throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); } + @Override + public void remove(org.bukkit.entity.Entity entity) { + NMSImpl.getHandle(entity).die(); + } + @Override public void removeFromServerPlayerList(Player player) { EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java index 0a5bacd49..7b699c836 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java @@ -2,7 +2,6 @@ package net.citizensnpcs.nms.v1_13_R2.entity; import java.util.UUID; -import net.citizensnpcs.util.Util; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; @@ -21,6 +20,7 @@ import net.citizensnpcs.npc.AbstractEntityController; import net.citizensnpcs.npc.skin.Skin; import net.citizensnpcs.npc.skin.SkinnableEntity; import net.citizensnpcs.util.NMS; +import net.citizensnpcs.util.Util; import net.minecraft.server.v1_13_R2.PlayerInteractManager; import net.minecraft.server.v1_13_R2.WorldServer; @@ -117,6 +117,8 @@ public class HumanController extends AbstractEntityController { SkinnableEntity npc = entity instanceof SkinnableEntity ? (SkinnableEntity) entity : null; npc.getSkinTracker().onRemoveNPC(); } - super.remove(); + NMS.remove(entity); + // Paper decided to break Spigot compatibility. + // super.remove(); } } diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java index 0d6a01765..fb55a4d49 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Random; import java.util.Set; -import net.minecraft.server.v1_13_R2.*; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; @@ -183,6 +182,59 @@ import net.citizensnpcs.util.NMSBridge; import net.citizensnpcs.util.PlayerAnimation; import net.citizensnpcs.util.PlayerUpdateTask; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_13_R2.AttributeInstance; +import net.minecraft.server.v1_13_R2.AxisAlignedBB; +import net.minecraft.server.v1_13_R2.Block; +import net.minecraft.server.v1_13_R2.BlockPosition; +import net.minecraft.server.v1_13_R2.BossBattleServer; +import net.minecraft.server.v1_13_R2.ControllerJump; +import net.minecraft.server.v1_13_R2.CrashReport; +import net.minecraft.server.v1_13_R2.CrashReportSystemDetails; +import net.minecraft.server.v1_13_R2.DamageSource; +import net.minecraft.server.v1_13_R2.DataWatcherObject; +import net.minecraft.server.v1_13_R2.EnchantmentManager; +import net.minecraft.server.v1_13_R2.Enchantments; +import net.minecraft.server.v1_13_R2.EnderDragonBattle; +import net.minecraft.server.v1_13_R2.Entity; +import net.minecraft.server.v1_13_R2.EntityBird; +import net.minecraft.server.v1_13_R2.EntityEnderDragon; +import net.minecraft.server.v1_13_R2.EntityFish; +import net.minecraft.server.v1_13_R2.EntityFishingHook; +import net.minecraft.server.v1_13_R2.EntityHorse; +import net.minecraft.server.v1_13_R2.EntityHorseAbstract; +import net.minecraft.server.v1_13_R2.EntityHuman; +import net.minecraft.server.v1_13_R2.EntityInsentient; +import net.minecraft.server.v1_13_R2.EntityLiving; +import net.minecraft.server.v1_13_R2.EntityMinecartAbstract; +import net.minecraft.server.v1_13_R2.EntityPlayer; +import net.minecraft.server.v1_13_R2.EntityPolarBear; +import net.minecraft.server.v1_13_R2.EntityRabbit; +import net.minecraft.server.v1_13_R2.EntityShulker; +import net.minecraft.server.v1_13_R2.EntityTameableAnimal; +import net.minecraft.server.v1_13_R2.EntityTracker; +import net.minecraft.server.v1_13_R2.EntityTrackerEntry; +import net.minecraft.server.v1_13_R2.EntityTypes; +import net.minecraft.server.v1_13_R2.EntityWither; +import net.minecraft.server.v1_13_R2.EnumMoveType; +import net.minecraft.server.v1_13_R2.GenericAttributes; +import net.minecraft.server.v1_13_R2.IRegistry; +import net.minecraft.server.v1_13_R2.MathHelper; +import net.minecraft.server.v1_13_R2.MinecraftKey; +import net.minecraft.server.v1_13_R2.MobEffects; +import net.minecraft.server.v1_13_R2.NavigationAbstract; +import net.minecraft.server.v1_13_R2.NetworkManager; +import net.minecraft.server.v1_13_R2.Packet; +import net.minecraft.server.v1_13_R2.PacketPlayOutEntityTeleport; +import net.minecraft.server.v1_13_R2.PacketPlayOutPlayerInfo; +import net.minecraft.server.v1_13_R2.PathEntity; +import net.minecraft.server.v1_13_R2.PathPoint; +import net.minecraft.server.v1_13_R2.PathfinderGoalSelector; +import net.minecraft.server.v1_13_R2.RegistryMaterials; +import net.minecraft.server.v1_13_R2.ReportedException; +import net.minecraft.server.v1_13_R2.SoundEffect; +import net.minecraft.server.v1_13_R2.SoundEffects; +import net.minecraft.server.v1_13_R2.Vec3D; +import net.minecraft.server.v1_13_R2.WorldServer; @SuppressWarnings("unchecked") public class NMSImpl implements NMSBridge { @@ -748,6 +800,11 @@ public class NMSImpl implements NMSBridge { throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); } + @Override + public void remove(org.bukkit.entity.Entity entity) { + NMSImpl.getHandle(entity).die(); + } + @Override public void removeFromServerPlayerList(Player player) { EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); @@ -1280,7 +1337,8 @@ public class NMSImpl implements NMSBridge { entity.a(f, f1, f2, f3); f9 = 0.91F; if (entity.onGround) { - f9 = entity.world.getType(getBlockPositionBE(blockposition_b, entity.locX, bb.minY - 1.0D, entity.locZ)) + f9 = entity.world + .getType(getBlockPositionBE(blockposition_b, entity.locX, bb.minY - 1.0D, entity.locZ)) .getBlock().n() * 0.91F; } if (entity.z_()) { @@ -1352,35 +1410,29 @@ public class NMSImpl implements NMSBridge { private static BlockPosition.b getBlockPositionBE(BlockPosition.b blockPos, double x, double y, double z) { try { return blockPos.c(x, y, z); - } - catch (NoSuchMethodError ex) { + } catch (NoSuchMethodError ex) { try { return (BlockPosition.b) BLOCK_POSITION_B_D.invoke(blockPos, x, y, z); - } - catch (Throwable ex2) { + } catch (Throwable ex2) { ex2.printStackTrace(); return null; } } } - private static final Method BLOCK_POSITION_B_D = NMS.getMethod(BlockPosition.b.class, "e", false, double.class, double.class, double.class); - public static BossBar getBossBar(org.bukkit.entity.Entity entity) { BossBattleServer bserver = null; try { if (entity.getType() == EntityType.WITHER) { try { bserver = ((EntityWither) NMSImpl.getHandle(entity)).bossBattle; - } - catch (NoSuchFieldError ex) { + } catch (NoSuchFieldError ex) { bserver = (BossBattleServer) WITHER_BOSS_BAR_FIELD.get(NMSImpl.getHandle(entity)); } } else if (entity.getType() == EntityType.ENDER_DRAGON) { try { bserver = ((EnderDragonBattle) ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))).bossBattle; - } - catch (NoSuchFieldError ex) { + } catch (NoSuchFieldError ex) { bserver = (BossBattleServer) ENDERDRAGON_BATTLE_BAR_FIELD .get(ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))); } @@ -1443,18 +1495,15 @@ public class NMSImpl implements NMSBridge { }; try { network.socketAddress = socketAddress; - } - catch (NoSuchFieldError ex) { + } catch (NoSuchFieldError ex) { if (NETWORK_ADDRESS == null) { return; } try { NETWORK_ADDRESS.set(network, socketAddress); - } - catch (IllegalArgumentException e) { + } catch (IllegalArgumentException e) { e.printStackTrace(); - } - catch (IllegalAccessException e) { + } catch (IllegalAccessException e) { e.printStackTrace(); } } @@ -1570,6 +1619,8 @@ public class NMSImpl implements NMSBridge { private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST); + private static final Method BLOCK_POSITION_B_D = NMS.getMethod(BlockPosition.b.class, "e", false, double.class, + double.class, double.class); private static final Field CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getField(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c", false); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java index 048e352a1..bd41da036 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java @@ -664,6 +664,11 @@ public class NMSImpl implements NMSBridge { throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); } + @Override + public void remove(org.bukkit.entity.Entity entity) { + NMSImpl.getHandle(entity).die(); + } + @Override public void removeFromServerPlayerList(Player player) { EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);