Skip to content

Commit 3682fae

Browse files
committed
Implement new API and fix an error from Paper
1 parent d7aab0a commit 3682fae

File tree

11 files changed

+130
-29
lines changed

11 files changed

+130
-29
lines changed

main/src/main/java/net/citizensnpcs/Citizens.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010
import org.bukkit.Bukkit;
1111
import org.bukkit.ChatColor;
1212
import org.bukkit.command.CommandSender;
13+
import org.bukkit.inventory.meta.SkullMeta;
1314
import org.bukkit.plugin.Plugin;
1415
import org.bukkit.plugin.RegisteredServiceProvider;
1516
import org.bukkit.plugin.java.JavaPlugin;
1617

1718
import com.google.common.collect.Iterables;
1819
import com.google.common.collect.Maps;
20+
import com.mojang.authlib.GameProfile;
21+
import com.mojang.authlib.properties.Property;
1922

2023
import net.citizensnpcs.Settings.Setting;
2124
import net.citizensnpcs.api.CitizensAPI;
2225
import net.citizensnpcs.api.CitizensPlugin;
26+
import net.citizensnpcs.api.SkullMetaProvider;
2327
import net.citizensnpcs.api.ai.speech.SpeechFactory;
2428
import net.citizensnpcs.api.command.CommandContext;
2529
import net.citizensnpcs.api.command.CommandManager;
@@ -72,6 +76,18 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
7276
private CitizensNPCRegistry npcRegistry;
7377
private NPCDataStore saves;
7478
private NPCSelector selector;
79+
private final SkullMetaProvider skullMetaProvider = new SkullMetaProvider() {
80+
@Override
81+
public String getTexture(SkullMeta meta) {
82+
return Iterables.getFirst(NMS.getProfile(meta).getProperties().get("textures"), new Property("", ""))
83+
.getValue();
84+
}
85+
86+
@Override
87+
public void setTexture(String string, SkullMeta meta) {
88+
NMS.setProfile(meta, new GameProfile(meta.getOwningPlayer().getUniqueId(), string));
89+
}
90+
};
7591
private CitizensSpeechFactory speechFactory;
7692
private final Map<String, NPCRegistry> storedRegistries = Maps.newHashMap();
7793
private CitizensTraitFactory traitFactory;
@@ -212,6 +228,11 @@ public File getScriptFolder() {
212228
return new File(getDataFolder(), "scripts");
213229
}
214230

231+
@Override
232+
public SkullMetaProvider getSkullMetaProvider() {
233+
return skullMetaProvider;
234+
}
235+
215236
@Override
216237
public SpeechFactory getSpeechFactory() {
217238
return speechFactory;

main/src/main/java/net/citizensnpcs/npc/AbstractEntityController.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package net.citizensnpcs.npc;
22

3-
import net.citizensnpcs.api.npc.NPC;
4-
import net.citizensnpcs.util.NMS;
5-
63
import org.bukkit.Location;
74
import org.bukkit.entity.Entity;
85

6+
import net.citizensnpcs.api.npc.NPC;
7+
import net.citizensnpcs.util.NMS;
8+
99
public abstract class AbstractEntityController implements EntityController {
1010
private Entity bukkitEntity;
1111

@@ -23,11 +23,6 @@ public Entity getBukkitEntity() {
2323
return bukkitEntity;
2424
}
2525

26-
@Override
27-
public void setEntity(Entity entity) {
28-
this.bukkitEntity = entity;
29-
}
30-
3126
@Override
3227
public void remove() {
3328
if (bukkitEntity == null)
@@ -36,6 +31,11 @@ public void remove() {
3631
bukkitEntity = null;
3732
}
3833

34+
@Override
35+
public void setEntity(Entity entity) {
36+
this.bukkitEntity = entity;
37+
}
38+
3939
@Override
4040
public void spawn(Location at, NPC npc) {
4141
bukkitEntity = createEntity(at, npc);

main/src/main/java/net/citizensnpcs/npc/skin/SkinUpdateTracker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,9 @@ private void getNewVisibleNavigating(Player player, Collection<SkinnableEntity>
137137
if (tracker.fovVisibleSkins.contains(skinnable))
138138
continue;
139139

140-
if (canSee(player, skinnable, true))
140+
if (canSee(player, skinnable, true)) {
141141
output.add(skinnable);
142+
}
142143
}
143144
}
144145

main/src/main/java/net/citizensnpcs/util/NMS.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@ public static void registerEntityClass(Class<?> clazz) {
222222
BRIDGE.registerEntityClass(clazz);
223223
}
224224

225+
public static void remove(Entity entity) {
226+
BRIDGE.remove(entity);
227+
}
228+
225229
public static void removeFromServerPlayerList(Player player) {
226230
BRIDGE.removeFromServerPlayerList(player);
227231
}

main/src/main/java/net/citizensnpcs/util/NMSBridge.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public interface NMSBridge {
9191

9292
public void registerEntityClass(Class<?> clazz);
9393

94+
public void remove(Entity entity);
95+
9496
public void removeFromServerPlayerList(Player player);
9597

9698
public void removeFromWorld(org.bukkit.entity.Entity entity);

v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,11 @@ public void registerEntityClass(Class<?> clazz) {
709709
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString());
710710
}
711711

712+
@Override
713+
public void remove(org.bukkit.entity.Entity entity) {
714+
NMSImpl.getHandle(entity).die();
715+
}
716+
712717
@Override
713718
public void removeFromServerPlayerList(Player player) {
714719
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,11 @@ public void registerEntityClass(Class<?> clazz) {
767767
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString());
768768
}
769769

770+
@Override
771+
public void remove(org.bukkit.entity.Entity entity) {
772+
NMSImpl.getHandle(entity).die();
773+
}
774+
770775
@Override
771776
public void removeFromServerPlayerList(Player player) {
772777
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,11 @@ public void registerEntityClass(Class<?> clazz) {
774774
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString());
775775
}
776776

777+
@Override
778+
public void remove(org.bukkit.entity.Entity entity) {
779+
NMSImpl.getHandle(entity).die();
780+
}
781+
777782
@Override
778783
public void removeFromServerPlayerList(Player player) {
779784
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);

v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.UUID;
44

5-
import net.citizensnpcs.util.Util;
65
import org.bukkit.Bukkit;
76
import org.bukkit.Location;
87
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
@@ -21,6 +20,7 @@
2120
import net.citizensnpcs.npc.skin.Skin;
2221
import net.citizensnpcs.npc.skin.SkinnableEntity;
2322
import net.citizensnpcs.util.NMS;
23+
import net.citizensnpcs.util.Util;
2424
import net.minecraft.server.v1_13_R2.PlayerInteractManager;
2525
import net.minecraft.server.v1_13_R2.WorldServer;
2626

@@ -117,6 +117,8 @@ public void remove() {
117117
SkinnableEntity npc = entity instanceof SkinnableEntity ? (SkinnableEntity) entity : null;
118118
npc.getSkinTracker().onRemoveNPC();
119119
}
120-
super.remove();
120+
NMS.remove(entity);
121+
// Paper decided to break Spigot compatibility.
122+
// super.remove();
121123
}
122124
}

v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import java.util.Random;
1414
import java.util.Set;
1515

16-
import net.minecraft.server.v1_13_R2.*;
1716
import org.bukkit.Bukkit;
1817
import org.bukkit.DyeColor;
1918
import org.bukkit.Location;
@@ -183,6 +182,59 @@
183182
import net.citizensnpcs.util.PlayerAnimation;
184183
import net.citizensnpcs.util.PlayerUpdateTask;
185184
import net.citizensnpcs.util.Util;
185+
import net.minecraft.server.v1_13_R2.AttributeInstance;
186+
import net.minecraft.server.v1_13_R2.AxisAlignedBB;
187+
import net.minecraft.server.v1_13_R2.Block;
188+
import net.minecraft.server.v1_13_R2.BlockPosition;
189+
import net.minecraft.server.v1_13_R2.BossBattleServer;
190+
import net.minecraft.server.v1_13_R2.ControllerJump;
191+
import net.minecraft.server.v1_13_R2.CrashReport;
192+
import net.minecraft.server.v1_13_R2.CrashReportSystemDetails;
193+
import net.minecraft.server.v1_13_R2.DamageSource;
194+
import net.minecraft.server.v1_13_R2.DataWatcherObject;
195+
import net.minecraft.server.v1_13_R2.EnchantmentManager;
196+
import net.minecraft.server.v1_13_R2.Enchantments;
197+
import net.minecraft.server.v1_13_R2.EnderDragonBattle;
198+
import net.minecraft.server.v1_13_R2.Entity;
199+
import net.minecraft.server.v1_13_R2.EntityBird;
200+
import net.minecraft.server.v1_13_R2.EntityEnderDragon;
201+
import net.minecraft.server.v1_13_R2.EntityFish;
202+
import net.minecraft.server.v1_13_R2.EntityFishingHook;
203+
import net.minecraft.server.v1_13_R2.EntityHorse;
204+
import net.minecraft.server.v1_13_R2.EntityHorseAbstract;
205+
import net.minecraft.server.v1_13_R2.EntityHuman;
206+
import net.minecraft.server.v1_13_R2.EntityInsentient;
207+
import net.minecraft.server.v1_13_R2.EntityLiving;
208+
import net.minecraft.server.v1_13_R2.EntityMinecartAbstract;
209+
import net.minecraft.server.v1_13_R2.EntityPlayer;
210+
import net.minecraft.server.v1_13_R2.EntityPolarBear;
211+
import net.minecraft.server.v1_13_R2.EntityRabbit;
212+
import net.minecraft.server.v1_13_R2.EntityShulker;
213+
import net.minecraft.server.v1_13_R2.EntityTameableAnimal;
214+
import net.minecraft.server.v1_13_R2.EntityTracker;
215+
import net.minecraft.server.v1_13_R2.EntityTrackerEntry;
216+
import net.minecraft.server.v1_13_R2.EntityTypes;
217+
import net.minecraft.server.v1_13_R2.EntityWither;
218+
import net.minecraft.server.v1_13_R2.EnumMoveType;
219+
import net.minecraft.server.v1_13_R2.GenericAttributes;
220+
import net.minecraft.server.v1_13_R2.IRegistry;
221+
import net.minecraft.server.v1_13_R2.MathHelper;
222+
import net.minecraft.server.v1_13_R2.MinecraftKey;
223+
import net.minecraft.server.v1_13_R2.MobEffects;
224+
import net.minecraft.server.v1_13_R2.NavigationAbstract;
225+
import net.minecraft.server.v1_13_R2.NetworkManager;
226+
import net.minecraft.server.v1_13_R2.Packet;
227+
import net.minecraft.server.v1_13_R2.PacketPlayOutEntityTeleport;
228+
import net.minecraft.server.v1_13_R2.PacketPlayOutPlayerInfo;
229+
import net.minecraft.server.v1_13_R2.PathEntity;
230+
import net.minecraft.server.v1_13_R2.PathPoint;
231+
import net.minecraft.server.v1_13_R2.PathfinderGoalSelector;
232+
import net.minecraft.server.v1_13_R2.RegistryMaterials;
233+
import net.minecraft.server.v1_13_R2.ReportedException;
234+
import net.minecraft.server.v1_13_R2.SoundEffect;
235+
import net.minecraft.server.v1_13_R2.SoundEffects;
236+
import net.minecraft.server.v1_13_R2.Vec3D;
237+
import net.minecraft.server.v1_13_R2.WorldServer;
186238

187239
@SuppressWarnings("unchecked")
188240
public class NMSImpl implements NMSBridge {
@@ -748,6 +800,11 @@ public void registerEntityClass(Class<?> clazz) {
748800
throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz.toString());
749801
}
750802

803+
@Override
804+
public void remove(org.bukkit.entity.Entity entity) {
805+
NMSImpl.getHandle(entity).die();
806+
}
807+
751808
@Override
752809
public void removeFromServerPlayerList(Player player) {
753810
EntityPlayer handle = (EntityPlayer) NMSImpl.getHandle(player);
@@ -1280,7 +1337,8 @@ public static void flyingMoveLogic(EntityLiving entity, float f, float f1, float
12801337
entity.a(f, f1, f2, f3);
12811338
f9 = 0.91F;
12821339
if (entity.onGround) {
1283-
f9 = entity.world.getType(getBlockPositionBE(blockposition_b, entity.locX, bb.minY - 1.0D, entity.locZ))
1340+
f9 = entity.world
1341+
.getType(getBlockPositionBE(blockposition_b, entity.locX, bb.minY - 1.0D, entity.locZ))
12841342
.getBlock().n() * 0.91F;
12851343
}
12861344
if (entity.z_()) {
@@ -1352,35 +1410,29 @@ public static void flyingMoveLogic(EntityLiving entity, float f, float f1, float
13521410
private static BlockPosition.b getBlockPositionBE(BlockPosition.b blockPos, double x, double y, double z) {
13531411
try {
13541412
return blockPos.c(x, y, z);
1355-
}
1356-
catch (NoSuchMethodError ex) {
1413+
} catch (NoSuchMethodError ex) {
13571414
try {
13581415
return (BlockPosition.b) BLOCK_POSITION_B_D.invoke(blockPos, x, y, z);
1359-
}
1360-
catch (Throwable ex2) {
1416+
} catch (Throwable ex2) {
13611417
ex2.printStackTrace();
13621418
return null;
13631419
}
13641420
}
13651421
}
13661422

1367-
private static final Method BLOCK_POSITION_B_D = NMS.getMethod(BlockPosition.b.class, "e", false, double.class, double.class, double.class);
1368-
13691423
public static BossBar getBossBar(org.bukkit.entity.Entity entity) {
13701424
BossBattleServer bserver = null;
13711425
try {
13721426
if (entity.getType() == EntityType.WITHER) {
13731427
try {
13741428
bserver = ((EntityWither) NMSImpl.getHandle(entity)).bossBattle;
1375-
}
1376-
catch (NoSuchFieldError ex) {
1429+
} catch (NoSuchFieldError ex) {
13771430
bserver = (BossBattleServer) WITHER_BOSS_BAR_FIELD.get(NMSImpl.getHandle(entity));
13781431
}
13791432
} else if (entity.getType() == EntityType.ENDER_DRAGON) {
13801433
try {
13811434
bserver = ((EnderDragonBattle) ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity))).bossBattle;
1382-
}
1383-
catch (NoSuchFieldError ex) {
1435+
} catch (NoSuchFieldError ex) {
13841436
bserver = (BossBattleServer) ENDERDRAGON_BATTLE_BAR_FIELD
13851437
.get(ENDERDRAGON_BATTLE_FIELD.get(NMSImpl.getHandle(entity)));
13861438
}
@@ -1443,18 +1495,15 @@ public static void initNetworkManager(NetworkManager network) {
14431495
};
14441496
try {
14451497
network.socketAddress = socketAddress;
1446-
}
1447-
catch (NoSuchFieldError ex) {
1498+
} catch (NoSuchFieldError ex) {
14481499
if (NETWORK_ADDRESS == null) {
14491500
return;
14501501
}
14511502
try {
14521503
NETWORK_ADDRESS.set(network, socketAddress);
1453-
}
1454-
catch (IllegalArgumentException e) {
1504+
} catch (IllegalArgumentException e) {
14551505
e.printStackTrace();
1456-
}
1457-
catch (IllegalAccessException e) {
1506+
} catch (IllegalAccessException e) {
14581507
e.printStackTrace();
14591508
}
14601509
}
@@ -1570,6 +1619,8 @@ public static void updateNavigation(NavigationAbstract navigation) {
15701619
private static final Set<EntityType> BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH,
15711620
EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME,
15721621
EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST);
1622+
private static final Method BLOCK_POSITION_B_D = NMS.getMethod(BlockPosition.b.class, "e", false, double.class,
1623+
double.class, double.class);
15731624
private static final Field CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getField(CraftBossBar.class, "handle");
15741625
private static final float DEFAULT_SPEED = 1F;
15751626
private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c", false);

0 commit comments

Comments
 (0)