Implement new API and fix an error from Paper

This commit is contained in:
fullwall 2019-02-05 18:12:02 +08:00
parent d7aab0acbd
commit 3682faebec
11 changed files with 130 additions and 29 deletions

View File

@ -10,16 +10,20 @@ import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps; 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.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.CitizensPlugin; import net.citizensnpcs.api.CitizensPlugin;
import net.citizensnpcs.api.SkullMetaProvider;
import net.citizensnpcs.api.ai.speech.SpeechFactory; import net.citizensnpcs.api.ai.speech.SpeechFactory;
import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.command.CommandContext;
import net.citizensnpcs.api.command.CommandManager; import net.citizensnpcs.api.command.CommandManager;
@ -72,6 +76,18 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
private CitizensNPCRegistry npcRegistry; private CitizensNPCRegistry npcRegistry;
private NPCDataStore saves; private NPCDataStore saves;
private NPCSelector selector; 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 CitizensSpeechFactory speechFactory;
private final Map<String, NPCRegistry> storedRegistries = Maps.newHashMap(); private final Map<String, NPCRegistry> storedRegistries = Maps.newHashMap();
private CitizensTraitFactory traitFactory; private CitizensTraitFactory traitFactory;
@ -212,6 +228,11 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
return new File(getDataFolder(), "scripts"); return new File(getDataFolder(), "scripts");
} }
@Override
public SkullMetaProvider getSkullMetaProvider() {
return skullMetaProvider;
}
@Override @Override
public SpeechFactory getSpeechFactory() { public SpeechFactory getSpeechFactory() {
return speechFactory; return speechFactory;

View File

@ -1,11 +1,11 @@
package net.citizensnpcs.npc; package net.citizensnpcs.npc;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.util.NMS;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.util.NMS;
public abstract class AbstractEntityController implements EntityController { public abstract class AbstractEntityController implements EntityController {
private Entity bukkitEntity; private Entity bukkitEntity;
@ -23,11 +23,6 @@ public abstract class AbstractEntityController implements EntityController {
return bukkitEntity; return bukkitEntity;
} }
@Override
public void setEntity(Entity entity) {
this.bukkitEntity = entity;
}
@Override @Override
public void remove() { public void remove() {
if (bukkitEntity == null) if (bukkitEntity == null)
@ -36,6 +31,11 @@ public abstract class AbstractEntityController implements EntityController {
bukkitEntity = null; bukkitEntity = null;
} }
@Override
public void setEntity(Entity entity) {
this.bukkitEntity = entity;
}
@Override @Override
public void spawn(Location at, NPC npc) { public void spawn(Location at, NPC npc) {
bukkitEntity = createEntity(at, npc); bukkitEntity = createEntity(at, npc);

View File

@ -137,8 +137,9 @@ public class SkinUpdateTracker {
if (tracker.fovVisibleSkins.contains(skinnable)) if (tracker.fovVisibleSkins.contains(skinnable))
continue; continue;
if (canSee(player, skinnable, true)) if (canSee(player, skinnable, true)) {
output.add(skinnable); output.add(skinnable);
}
} }
} }

View File

@ -222,6 +222,10 @@ public class NMS {
BRIDGE.registerEntityClass(clazz); BRIDGE.registerEntityClass(clazz);
} }
public static void remove(Entity entity) {
BRIDGE.remove(entity);
}
public static void removeFromServerPlayerList(Player player) { public static void removeFromServerPlayerList(Player player) {
BRIDGE.removeFromServerPlayerList(player); BRIDGE.removeFromServerPlayerList(player);
} }

View File

@ -91,6 +91,8 @@ public interface NMSBridge {
public void registerEntityClass(Class<?> clazz); public void registerEntityClass(Class<?> clazz);
public void remove(Entity entity);
public void removeFromServerPlayerList(Player player); public void removeFromServerPlayerList(Player player);
public void removeFromWorld(org.bukkit.entity.Entity entity); public void removeFromWorld(org.bukkit.entity.Entity entity);

View File

@ -709,6 +709,11 @@ public class NMSImpl implements NMSBridge {
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); 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 @Override
public void removeFromServerPlayerList(Player player) { public void removeFromServerPlayerList(Player player) {
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

View File

@ -767,6 +767,11 @@ public class NMSImpl implements NMSBridge {
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); 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 @Override
public void removeFromServerPlayerList(Player player) { public void removeFromServerPlayerList(Player player) {
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

View File

@ -774,6 +774,11 @@ public class NMSImpl implements NMSBridge {
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); 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 @Override
public void removeFromServerPlayerList(Player player) { public void removeFromServerPlayerList(Player player) {
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

View File

@ -2,7 +2,6 @@ package net.citizensnpcs.nms.v1_13_R2.entity;
import java.util.UUID; import java.util.UUID;
import net.citizensnpcs.util.Util;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; 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.Skin;
import net.citizensnpcs.npc.skin.SkinnableEntity; import net.citizensnpcs.npc.skin.SkinnableEntity;
import net.citizensnpcs.util.NMS; 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.PlayerInteractManager;
import net.minecraft.server.v1_13_R2.WorldServer; 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; SkinnableEntity npc = entity instanceof SkinnableEntity ? (SkinnableEntity) entity : null;
npc.getSkinTracker().onRemoveNPC(); npc.getSkinTracker().onRemoveNPC();
} }
super.remove(); NMS.remove(entity);
// Paper decided to break Spigot compatibility.
// super.remove();
} }
} }

View File

@ -13,7 +13,6 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import net.minecraft.server.v1_13_R2.*;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.Location; import org.bukkit.Location;
@ -183,6 +182,59 @@ import net.citizensnpcs.util.NMSBridge;
import net.citizensnpcs.util.PlayerAnimation; import net.citizensnpcs.util.PlayerAnimation;
import net.citizensnpcs.util.PlayerUpdateTask; import net.citizensnpcs.util.PlayerUpdateTask;
import net.citizensnpcs.util.Util; 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") @SuppressWarnings("unchecked")
public class NMSImpl implements NMSBridge { 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()); 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 @Override
public void removeFromServerPlayerList(Player player) { public void removeFromServerPlayerList(Player player) {
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);
@ -1280,7 +1337,8 @@ public class NMSImpl implements NMSBridge {
entity.a(f, f1, f2, f3); entity.a(f, f1, f2, f3);
f9 = 0.91F; f9 = 0.91F;
if (entity.onGround) { 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; .getBlock().n() * 0.91F;
} }
if (entity.z_()) { 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) { private static BlockPosition.b getBlockPositionBE(BlockPosition.b blockPos, double x, double y, double z) {
try { try {
return blockPos.c(x, y, z); return blockPos.c(x, y, z);
} } catch (NoSuchMethodError ex) {
catch (NoSuchMethodError ex) {
try { try {
return (BlockPosition.b) BLOCK_POSITION_B_D.invoke(blockPos, x, y, z); return (BlockPosition.b) BLOCK_POSITION_B_D.invoke(blockPos, x, y, z);
} } catch (Throwable ex2) {
catch (Throwable ex2) {
ex2.printStackTrace(); ex2.printStackTrace();
return null; 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) { public static BossBar getBossBar(org.bukkit.entity.Entity entity) {
BossBattleServer bserver = null; BossBattleServer bserver = null;
try { try {
if (entity.getType() == EntityType.WITHER) { if (entity.getType() == EntityType.WITHER) {
try { try {
bserver = ((EntityWither) NMSImpl.getHandle(entity)).bossBattle; bserver = ((EntityWither) NMSImpl.getHandle(entity)).bossBattle;
} } catch (NoSuchFieldError ex) {
catch (NoSuchFieldError ex) {
bserver = (BossBattleServer) WITHER_BOSS_BAR_FIELD.get(NMSImpl.getHandle(entity)); bserver = (BossBattleServer) WITHER_BOSS_BAR_FIELD.get(NMSImpl.getHandle(entity));
} }
} else if (entity.getType() == EntityType.ENDER_DRAGON) { } else if (entity.getType() == EntityType.ENDER_DRAGON) {
try { try {
bserver = ((EnderDragonBattle) ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))).bossBattle; bserver = ((EnderDragonBattle) ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))).bossBattle;
} } catch (NoSuchFieldError ex) {
catch (NoSuchFieldError ex) {
bserver = (BossBattleServer) ENDERDRAGON_BATTLE_BAR_FIELD bserver = (BossBattleServer) ENDERDRAGON_BATTLE_BAR_FIELD
.get(ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))); .get(ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity)));
} }
@ -1443,18 +1495,15 @@ public class NMSImpl implements NMSBridge {
}; };
try { try {
network.socketAddress = socketAddress; network.socketAddress = socketAddress;
} } catch (NoSuchFieldError ex) {
catch (NoSuchFieldError ex) {
if (NETWORK_ADDRESS == null) { if (NETWORK_ADDRESS == null) {
return; return;
} }
try { try {
NETWORK_ADDRESS.set(network, socketAddress); NETWORK_ADDRESS.set(network, socketAddress);
} } catch (IllegalArgumentException e) {
catch (IllegalArgumentException e) {
e.printStackTrace(); e.printStackTrace();
} } catch (IllegalAccessException e) {
catch (IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -1570,6 +1619,8 @@ public class NMSImpl implements NMSBridge {
private static final Set<EntityType> BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH, private static final Set<EntityType> BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH,
EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME,
EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST); 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 Field CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getField(CraftBossBar.class, "handle");
private static final float DEFAULT_SPEED = 1F; private static final float DEFAULT_SPEED = 1F;
private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c", false); private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c", false);

View File

@ -664,6 +664,11 @@ public class NMSImpl implements NMSBridge {
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString()); 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 @Override
public void removeFromServerPlayerList(Player player) { public void removeFromServerPlayerList(Player player) {
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player); EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);