Fix dying while disguised creating problems

This commit is contained in:
libraryaddict 2018-02-16 15:00:34 +13:00
parent ebb1fa3c35
commit f4bc01f916
2 changed files with 89 additions and 99 deletions

View File

@ -394,16 +394,9 @@ public class DisguiseListener implements Listener {
DisguiseUtilities.saveDisguises(player.getUniqueId(), disguises); DisguiseUtilities.saveDisguises(player.getUniqueId(), disguises);
} }
@EventHandler @EventHandler
public void onRespawn(PlayerRespawnEvent event) { public void onRespawn(PlayerRespawnEvent event) {
Disguise[] disguises = DisguiseAPI.getDisguises(event.getPlayer());
for (Disguise disguise : disguises) {
if (disguise.isRemoveDisguiseOnDeath()) {
disguise.removeDisguise();
}
}
if (DisguiseConfig.isBedPacketsEnabled()) { if (DisguiseConfig.isBedPacketsEnabled()) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();

View File

@ -203,11 +203,6 @@ public abstract class Disguise {
if (isRemoveDisguiseOnDeath()) { if (isRemoveDisguiseOnDeath()) {
removeDisguise(); removeDisguise();
} else {
entity = null;
watcher = getWatcher().clone(disguise);
task.cancel();
task = null;
} }
} }
} else { } else {
@ -489,105 +484,105 @@ public abstract class Disguise {
* @return removeDiguise * @return removeDiguise
*/ */
public boolean removeDisguise() { public boolean removeDisguise() {
if (disguiseInUse) { if (!isDisguiseInUse())
UndisguiseEvent event = new UndisguiseEvent(entity, this); return false;
Bukkit.getPluginManager().callEvent(event); UndisguiseEvent event = new UndisguiseEvent(entity, this);
if (!event.isCancelled() || (getEntity() instanceof Player && !((Player) getEntity()).isOnline())) { Bukkit.getPluginManager().callEvent(event);
disguiseInUse = false;
if (task != null) { // If this disguise is not in use, and the entity isnt a player
task.cancel(); if (event.isCancelled() && (!(getEntity() instanceof Player) || ((Player) getEntity()).isOnline()))
task = null; return false;
disguiseInUse = false;
if (task != null) {
task.cancel();
task = null;
}
// If this disguise has a entity set
if (getEntity() != null) {
if (this instanceof PlayerDisguise) {
PlayerDisguise disguise = (PlayerDisguise) this;
if (disguise.isDisplayedInTab()) {
PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER);
deleteTab.getPlayerInfoDataLists().write(0, Collections.singletonList(
new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL,
WrappedChatComponent.fromText(disguise.getName()))));
try {
for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player) ||
(!isSelfDisguiseVisible() && getEntity() == player))
continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, deleteTab);
}
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
// If this disguise is active
// Remove the disguise from the current disguises.
if (DisguiseUtilities.removeDisguise((TargetedDisguise) this)) {
if (getEntity() instanceof Player) {
DisguiseUtilities.removeSelfDisguise((Player) getEntity());
} }
HashMap<UUID, HashSet<TargetedDisguise>> disguises = DisguiseUtilities.getDisguises(); // Better refresh the entity to undisguise it
if (getEntity().isValid()) {
// If this disguise has a entity set DisguiseUtilities.refreshTrackers((TargetedDisguise) this);
if (getEntity() != null) {
if (this instanceof PlayerDisguise) {
PlayerDisguise disguise = (PlayerDisguise) this;
if (disguise.isDisplayedInTab()) {
PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER);
deleteTab.getPlayerInfoDataLists().write(0, Collections.singletonList(
new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL,
WrappedChatComponent.fromText(disguise.getName()))));
try {
for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player))
continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, deleteTab);
}
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
// If this disguise is active
// Remove the disguise from the current disguises.
if (DisguiseUtilities.removeDisguise((TargetedDisguise) this)) {
if (getEntity() instanceof Player) {
DisguiseUtilities.removeSelfDisguise((Player) getEntity());
}
// Better refresh the entity to undisguise it
if (getEntity().isValid()) {
DisguiseUtilities.refreshTrackers((TargetedDisguise) this);
} else {
DisguiseUtilities.destroyEntity((TargetedDisguise) this);
}
}
if (isHidePlayer() && getEntity() instanceof Player && ((Player) getEntity()).isOnline()) {
PlayerInfoData playerInfo = new PlayerInfoData(
ReflectionManager.getGameProfile((Player) getEntity()), 0,
NativeGameMode.fromBukkit(((Player) getEntity()).getGameMode()), WrappedChatComponent
.fromText(DisguiseUtilities.getPlayerListName((Player) getEntity())));
PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER);
addTab.getPlayerInfoDataLists().write(0, Collections.singletonList(playerInfo));
try {
for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player))
continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
}
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} else { } else {
// Loop through the disguises because it could be used with a unknown entity id. DisguiseUtilities.destroyEntity((TargetedDisguise) this);
HashMap<Integer, HashSet<TargetedDisguise>> future = DisguiseUtilities.getFutureDisguises(); }
}
Iterator<Integer> itel = DisguiseUtilities.getFutureDisguises().keySet().iterator(); if (isHidePlayer() && getEntity() instanceof Player && ((Player) getEntity()).isOnline()) {
PlayerInfoData playerInfo = new PlayerInfoData(ReflectionManager.getGameProfile((Player) getEntity()),
0, NativeGameMode.fromBukkit(((Player) getEntity()).getGameMode()),
WrappedChatComponent.fromText(DisguiseUtilities.getPlayerListName((Player) getEntity())));
while (itel.hasNext()) { PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
int id = itel.next();
if (future.get(id).remove(this) && future.get(id).isEmpty()) { addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER);
itel.remove(); addTab.getPlayerInfoDataLists().write(0, Collections.singletonList(playerInfo));
}
try {
for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player) ||
(!isSelfDisguiseVisible() && getEntity() == player))
continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
} }
} }
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} else {
// Loop through the disguises because it could be used with a unknown entity id.
HashMap<Integer, HashSet<TargetedDisguise>> future = DisguiseUtilities.getFutureDisguises();
return true; Iterator<Integer> itel = DisguiseUtilities.getFutureDisguises().keySet().iterator();
while (itel.hasNext()) {
int id = itel.next();
if (future.get(id).remove(this) && future.get(id).isEmpty()) {
itel.remove();
}
} }
} }
return false; return true;
} }
/** /**
@ -804,7 +799,8 @@ public abstract class Disguise {
try { try {
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player)) if (!((TargetedDisguise) this).canSee(player) ||
(!isSelfDisguiseVisible() && getEntity() == player))
continue; continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab); ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
@ -844,7 +840,8 @@ public abstract class Disguise {
try { try {
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
if (!((TargetedDisguise) this).canSee(player)) if (!((TargetedDisguise) this).canSee(player) ||
(!isSelfDisguiseVisible() && getEntity() == player))
continue; continue;
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab); ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);