From 35dccc82438e880ded946299f79e9ab24d75e175 Mon Sep 17 00:00:00 2001 From: fullwall Date: Mon, 1 Dec 2014 13:40:46 +0800 Subject: [PATCH] Fix player invisibility (note: they will appear on the tab list for now) --- .../java/net/citizensnpcs/EventListen.java | 14 ++++++ .../npc/entity/EntityHumanNPC.java | 4 +- .../npc/entity/HumanController.java | 46 +++++++++++-------- .../npc/entity/PigZombieController.java | 3 +- .../net/citizensnpcs/trait/Controllable.java | 24 ++++++---- 5 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index 4ce3082aa..d20e7b018 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -29,10 +29,13 @@ import net.citizensnpcs.trait.Controllable; import net.citizensnpcs.trait.CurrentLocation; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.NMS; +import net.minecraft.server.v1_8_R1.EnumPlayerInfoAction; +import net.minecraft.server.v1_8_R1.PacketPlayOutPlayerInfo; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -49,6 +52,7 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.world.ChunkLoadEvent; @@ -272,6 +276,16 @@ public class EventListen implements Listener { Bukkit.getPluginManager().callEvent(rightClickEvent); } + @EventHandler(ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + for (NPC npc : getAllNPCs()) { + if (npc.isSpawned() && npc.getEntity().getType() == EntityType.PLAYER) { + NMS.sendToOnline(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, ((CraftPlayer) npc + .getEntity()).getHandle())); + } + } + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerQuit(PlayerQuitEvent event) { Editor.leave(event.getPlayer()); diff --git a/src/main/java/net/citizensnpcs/npc/entity/EntityHumanNPC.java b/src/main/java/net/citizensnpcs/npc/entity/EntityHumanNPC.java index d43c64c8d..91c31cc2c 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/EntityHumanNPC.java +++ b/src/main/java/net/citizensnpcs/npc/entity/EntityHumanNPC.java @@ -299,9 +299,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder { break; } } - NMS.sendToOnline(getListPacket(getBukkitEntity(), true)); + // NMS.sendToOnline(getListPacket(getBukkitEntity(), true)); if (otherOnline != null) { - NMS.sendToOnline(getListPacket(otherOnline, false)); + // NMS.sendToOnline(getListPacket(otherOnline, false)); } NMS.sendPacketsNearby(getBukkitEntity(), current, packets); } diff --git a/src/main/java/net/citizensnpcs/npc/entity/HumanController.java b/src/main/java/net/citizensnpcs/npc/entity/HumanController.java index 47c12bdf4..6587202be 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/HumanController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/HumanController.java @@ -27,6 +27,7 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_8_R1.CraftServer; import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -83,8 +84,8 @@ public class HumanController extends AbstractEntityController { npc.data().get("removefromplayerlist", removeFromPlayerList)); } }, 1); - NMS.sendToOnline(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, handle)); handle.getBukkitEntity().setSleepingIgnored(true); + NMS.sendToOnline(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, handle)); return handle.getBukkitEntity(); } @@ -93,6 +94,13 @@ public class HumanController extends AbstractEntityController { return (Player) super.getBukkitEntity(); } + @Override + public void remove() { + NMS.sendToOnline(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, + ((CraftPlayer) getBukkitEntity()).getHandle())); + super.remove(); + } + private void updateSkin(final NPC npc, final WorldServer nmsWorld, GameProfile profile) { String skinUUID = npc.data().get(NPC.PLAYER_SKIN_UUID_METADATA); if (skinUUID == null) { @@ -130,8 +138,8 @@ public class HumanController extends AbstractEntityController { private GameProfile fillProfileProperties(YggdrasilAuthenticationService auth, GameProfile profile, boolean requireSecure) throws Exception { URL url = HttpAuthenticationService.constantURL(new StringBuilder() - .append("https://sessionserver.mojang.com/session/minecraft/profile/") - .append(UUIDTypeAdapter.fromUUID(profile.getId())).toString()); + .append("https://sessionserver.mojang.com/session/minecraft/profile/") + .append(UUIDTypeAdapter.fromUUID(profile.getId())).toString()); url = HttpAuthenticationService.concatenateURL(url, new StringBuilder().append("unsigned=").append(!requireSecure).toString()); MinecraftProfilePropertiesResponse response = (MinecraftProfilePropertiesResponse) MAKE_REQUEST.invoke( @@ -158,7 +166,7 @@ public class HumanController extends AbstractEntityController { if (cached != null) { if (Messaging.isDebugging()) { Messaging - .debug("Using cached skin texture for NPC " + npc.getName() + " UUID " + npc.getUniqueId()); + .debug("Using cached skin texture for NPC " + npc.getName() + " UUID " + npc.getUniqueId()); } skinProfile = new GameProfile(UUID.fromString(realUUID), ""); skinProfile.getProperties().put("textures", cached); @@ -170,7 +178,7 @@ public class HumanController extends AbstractEntityController { } catch (Exception e) { if ((e.getMessage() != null && e.getMessage().contains("too many requests")) || (e.getCause() != null && e.getCause().getMessage() != null && e.getCause().getMessage() - .contains("too many requests"))) { + .contains("too many requests"))) { SKIN_THREAD.delay(); SKIN_THREAD.addRunnable(this); } @@ -260,21 +268,21 @@ public class HumanController extends AbstractEntityController { .getGameProfileRepository(); repo.findProfilesByNames(new String[] { ChatColor.stripColor(reportedUUID) }, Agent.MINECRAFT, new ProfileLookupCallback() { - @Override - public void onProfileLookupFailed(GameProfile arg0, Exception arg1) { - } + @Override + public void onProfileLookupFailed(GameProfile arg0, Exception arg1) { + } - @Override - public void onProfileLookupSucceeded(final GameProfile profile) { - UUID_CACHE.put(reportedUUID, profile.getId().toString()); - if (Messaging.isDebugging()) { - Messaging.debug("Fetched UUID " + profile.getId() + " for NPC " + npc.getName() - + " UUID " + npc.getUniqueId()); - } - npc.data().setPersistent(CACHED_SKIN_UUID_METADATA, profile.getId().toString()); - npc.data().setPersistent(CACHED_SKIN_UUID_NAME_METADATA, profile.getName()); - } - }); + @Override + public void onProfileLookupSucceeded(final GameProfile profile) { + UUID_CACHE.put(reportedUUID, profile.getId().toString()); + if (Messaging.isDebugging()) { + Messaging.debug("Fetched UUID " + profile.getId() + " for NPC " + npc.getName() + + " UUID " + npc.getUniqueId()); + } + npc.data().setPersistent(CACHED_SKIN_UUID_METADATA, profile.getId().toString()); + npc.data().setPersistent(CACHED_SKIN_UUID_NAME_METADATA, profile.getName()); + } + }); return npc.data().get(CACHED_SKIN_UUID_METADATA, reportedUUID); } } diff --git a/src/main/java/net/citizensnpcs/npc/entity/PigZombieController.java b/src/main/java/net/citizensnpcs/npc/entity/PigZombieController.java index b9c5c605a..7df52f544 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/PigZombieController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/PigZombieController.java @@ -118,8 +118,9 @@ public class PigZombieController extends MobEntityController { return; } if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) { - if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) { super.g(x, y, z); + } return; } Vector vector = new Vector(x, y, z); diff --git a/src/main/java/net/citizensnpcs/trait/Controllable.java b/src/main/java/net/citizensnpcs/trait/Controllable.java index 76fd26ff9..3e504ef7c 100644 --- a/src/main/java/net/citizensnpcs/trait/Controllable.java +++ b/src/main/java/net/citizensnpcs/trait/Controllable.java @@ -212,17 +212,18 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab return enabled; } - private double updateHorizontalSpeed(net.minecraft.server.v1_8_R1.Entity handle, double speed, float speedMod) { + private double updateHorizontalSpeed(net.minecraft.server.v1_8_R1.Entity handle, + net.minecraft.server.v1_8_R1.Entity passenger, double speed, float speedMod) { double oldSpeed = Math.sqrt(handle.motX * handle.motX + handle.motZ * handle.motZ); - double horizontal = ((EntityLiving) handle.passenger).aY; + double horizontal = ((EntityLiving) passenger).aY; if (horizontal > 0.0D) { - double dXcos = -Math.sin(handle.passenger.yaw * Math.PI / 180.0F); - double dXsin = Math.cos(handle.passenger.yaw * Math.PI / 180.0F); + double dXcos = -Math.sin(passenger.yaw * Math.PI / 180.0F); + double dXsin = Math.cos(passenger.yaw * Math.PI / 180.0F); handle.motX += dXcos * speed * 0.5; handle.motZ += dXsin * speed * 0.5; } - handle.motX += handle.passenger.motX * speedMod; - handle.motZ += handle.passenger.motZ * speedMod; + handle.motX += passenger.motX * speedMod; + handle.motZ += passenger.motZ * speedMod; double newSpeed = Math.sqrt(handle.motX * handle.motX + handle.motZ * handle.motZ); if (newSpeed > 0.35D) { @@ -259,12 +260,13 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab @Override public void run(Player rider) { net.minecraft.server.v1_8_R1.Entity handle = getHandle(); + net.minecraft.server.v1_8_R1.Entity passenger = ((CraftPlayer) rider).getHandle(); boolean onGround = handle.onGround; float speedMod = npc.getNavigator().getDefaultParameters() .modifiedSpeed((onGround ? GROUND_SPEED : AIR_SPEED)); - this.speed = updateHorizontalSpeed(handle, speed, speedMod); + speed = updateHorizontalSpeed(handle, passenger, speed, speedMod); - boolean shouldJump = NMS.shouldJump(handle.passenger); + boolean shouldJump = NMS.shouldJump(passenger); if (shouldJump) { if (handle.onGround && jumpTicks == 0) { getHandle().motY = JUMP_VELOCITY; @@ -353,8 +355,10 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab return; } net.minecraft.server.v1_8_R1.Entity handle = getHandle(); - this.speed = updateHorizontalSpeed(handle, this.speed, 1F); - boolean shouldJump = NMS.shouldJump(handle.passenger); + net.minecraft.server.v1_8_R1.Entity passenger = ((CraftPlayer) rider).getHandle(); + + speed = updateHorizontalSpeed(handle, passenger, speed, 1F); + boolean shouldJump = NMS.shouldJump(passenger); if (shouldJump) { handle.motY = 0.3F; }