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.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<String, NPCRegistry> 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;

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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();
}
}

View File

@ -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<EntityType> 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);

View File

@ -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);