Inventory listener should work fully now. Some sanity checks added for updating disguises when configs change
This commit is contained in:
parent
58f39401d2
commit
3f2be04de7
@ -1,30 +1,12 @@
|
|||||||
package me.libraryaddict.disguise;
|
package me.libraryaddict.disguise;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import me.libraryaddict.disguise.disguisetypes.Disguise;
|
import me.libraryaddict.disguise.disguisetypes.Disguise;
|
||||||
import me.libraryaddict.disguise.events.DisguiseEvent;
|
import me.libraryaddict.disguise.events.DisguiseEvent;
|
||||||
import me.libraryaddict.disguise.events.UndisguiseEvent;
|
import me.libraryaddict.disguise.events.UndisguiseEvent;
|
||||||
import net.minecraft.server.v1_6_R3.AttributeMapServer;
|
|
||||||
import net.minecraft.server.v1_6_R3.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_6_R3.EntityInsentient;
|
|
||||||
import net.minecraft.server.v1_6_R3.EntityLiving;
|
|
||||||
import net.minecraft.server.v1_6_R3.EntityPlayer;
|
import net.minecraft.server.v1_6_R3.EntityPlayer;
|
||||||
import net.minecraft.server.v1_6_R3.EntityTrackerEntry;
|
import net.minecraft.server.v1_6_R3.EntityTrackerEntry;
|
||||||
import net.minecraft.server.v1_6_R3.ItemStack;
|
|
||||||
import net.minecraft.server.v1_6_R3.MobEffect;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet17EntityLocationAction;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet20NamedEntitySpawn;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet28EntityVelocity;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet35EntityHeadRotation;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet39AttachEntity;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet40EntityMetadata;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet41MobEffect;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet44UpdateAttributes;
|
|
||||||
import net.minecraft.server.v1_6_R3.Packet5EntityEquipment;
|
|
||||||
import net.minecraft.server.v1_6_R3.WorldServer;
|
import net.minecraft.server.v1_6_R3.WorldServer;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -233,8 +215,7 @@ public class DisguiseAPI {
|
|||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
// TODO Restore their currently held item
|
player.updateInventory();
|
||||||
// TODO Restore their armor
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +264,7 @@ public class DisguiseAPI {
|
|||||||
// Remove the old disguise, else we have weird disguises around the place
|
// Remove the old disguise, else we have weird disguises around the place
|
||||||
removeSelfDisguise(player);
|
removeSelfDisguise(player);
|
||||||
// If the disguised player can't see himself. Return
|
// If the disguised player can't see himself. Return
|
||||||
if (!disguise.viewSelfDisguise())
|
if (!disguise.viewSelfDisguise() || !PacketsManager.isViewDisguisesListenerEnabled())
|
||||||
return;
|
return;
|
||||||
try {
|
try {
|
||||||
// Grab the entity ID the fake disguise will use
|
// Grab the entity ID the fake disguise will use
|
||||||
@ -297,6 +278,11 @@ public class DisguiseAPI {
|
|||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
PacketsManager.sendSelfDisguise(player);
|
PacketsManager.sendSelfDisguise(player);
|
||||||
|
if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) {
|
||||||
|
if (PacketsManager.isInventoryListenerEnabled()) {
|
||||||
|
player.updateInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,8 +74,8 @@ public class LibsDisguises extends JavaPlugin {
|
|||||||
DisguiseAPI.setVelocitySent(getConfig().getBoolean("SendVelocity"));
|
DisguiseAPI.setVelocitySent(getConfig().getBoolean("SendVelocity"));
|
||||||
DisguiseAPI.setViewDisguises(getConfig().getBoolean("ViewDisguises"));
|
DisguiseAPI.setViewDisguises(getConfig().getBoolean("ViewDisguises"));
|
||||||
DisguiseAPI.setHearSelfDisguise(getConfig().getBoolean("HearSelfDisguise"));
|
DisguiseAPI.setHearSelfDisguise(getConfig().getBoolean("HearSelfDisguise"));
|
||||||
// DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor"));
|
DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor"));
|
||||||
// DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem"));
|
DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem"));
|
||||||
if (DisguiseAPI.isHidingArmorFromSelf() || DisguiseAPI.isHidingHeldItemFromSelf()) {
|
if (DisguiseAPI.isHidingArmorFromSelf() || DisguiseAPI.isHidingHeldItemFromSelf()) {
|
||||||
DisguiseAPI.setInventoryListenerEnabled(true);
|
DisguiseAPI.setInventoryListenerEnabled(true);
|
||||||
}
|
}
|
||||||
|
@ -81,6 +81,7 @@ public class PacketsManager {
|
|||||||
private static PacketListener viewDisguisesListener;
|
private static PacketListener viewDisguisesListener;
|
||||||
private static boolean viewDisguisesListenerEnabled;
|
private static boolean viewDisguisesListenerEnabled;
|
||||||
private static LibsDisguises libsDisguises;
|
private static LibsDisguises libsDisguises;
|
||||||
|
private static DisguiseAPI disguiseAPI = new DisguiseAPI();
|
||||||
|
|
||||||
protected static void addPacketListeners(final JavaPlugin libsDisguises) {
|
protected static void addPacketListeners(final JavaPlugin libsDisguises) {
|
||||||
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
||||||
@ -696,11 +697,13 @@ public class PacketsManager {
|
|||||||
// If the server is setting the slot
|
// If the server is setting the slot
|
||||||
// Need to set it to air if its in a place it shouldn't be.
|
// Need to set it to air if its in a place it shouldn't be.
|
||||||
// Things such as picking up a item, spawned in item. Plugin sets the item. etc. Will fire this
|
// Things such as picking up a item, spawned in item. Plugin sets the item. etc. Will fire this
|
||||||
|
/**
|
||||||
|
* Done
|
||||||
|
*/
|
||||||
case Packets.Server.SET_SLOT: {
|
case Packets.Server.SET_SLOT: {
|
||||||
// The raw slot
|
// The raw slot
|
||||||
// nms code has the start of the hotbar being 36.
|
// nms code has the start of the hotbar being 36.
|
||||||
int slot = event.getPacket().getIntegers().read(1);
|
int slot = event.getPacket().getIntegers().read(1);
|
||||||
Bukkit.broadcastMessage("Set slot: " + slot);
|
|
||||||
// If the slot is a armor slot
|
// If the slot is a armor slot
|
||||||
if (slot >= 5 && slot <= 8) {
|
if (slot >= 5 && slot <= 8) {
|
||||||
if (disguise.isHidingArmorFromSelf()) {
|
if (disguise.isHidingArmorFromSelf()) {
|
||||||
@ -730,11 +733,10 @@ public class PacketsManager {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Don't think that we will ever need this.
|
/**
|
||||||
// We will see.
|
* Done
|
||||||
|
*/
|
||||||
case Packets.Server.WINDOW_ITEMS: {
|
case Packets.Server.WINDOW_ITEMS: {
|
||||||
// TODO Find out how this works
|
|
||||||
// It seems to 'update' the inventory.. Screw you..
|
|
||||||
event.setPacket(event.getPacket().deepClone());
|
event.setPacket(event.getPacket().deepClone());
|
||||||
StructureModifier<Object> mods = event.getPacket().getModifier();
|
StructureModifier<Object> mods = event.getPacket().getModifier();
|
||||||
ItemStack[] items = (ItemStack[]) mods.read(1);
|
ItemStack[] items = (ItemStack[]) mods.read(1);
|
||||||
@ -771,13 +773,10 @@ public class PacketsManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// TODO Add a listener for player click event.
|
|
||||||
// Items placed do not have the server confirm it
|
|
||||||
// So I need to set the item slot
|
|
||||||
inventoryListenerClient = new PacketAdapter(libsDisguises, ConnectionSide.CLIENT_SIDE, ListenerPriority.HIGHEST,
|
inventoryListenerClient = new PacketAdapter(libsDisguises, ConnectionSide.CLIENT_SIDE, ListenerPriority.HIGHEST,
|
||||||
Packets.Client.BLOCK_ITEM_SWITCH, Packets.Client.SET_CREATIVE_SLOT, Packets.Client.WINDOW_CLICK) {
|
Packets.Client.BLOCK_ITEM_SWITCH, Packets.Client.SET_CREATIVE_SLOT, Packets.Client.WINDOW_CLICK) {
|
||||||
@Override
|
@Override
|
||||||
public void onPacketReceiving(PacketEvent event) {
|
public void onPacketReceiving(final PacketEvent event) {
|
||||||
Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer());
|
Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer());
|
||||||
// If player is disguised, views self disguises and has a inventory modifier
|
// If player is disguised, views self disguises and has a inventory modifier
|
||||||
if (disguise != null && disguise.viewSelfDisguise()
|
if (disguise != null && disguise.viewSelfDisguise()
|
||||||
@ -827,9 +826,6 @@ public class PacketsManager {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// If the player switched item, aka he moved from slot 1 to slot 2
|
// If the player switched item, aka he moved from slot 1 to slot 2
|
||||||
// TODO Listen for this server sided, sometimes it may force him back to a old slot
|
|
||||||
// ^ But I think the client sends the packet again..
|
|
||||||
// This currently works fine
|
|
||||||
case Packets.Client.BLOCK_ITEM_SWITCH: {
|
case Packets.Client.BLOCK_ITEM_SWITCH: {
|
||||||
if (disguise.isHidingHeldItemFromSelf()) {
|
if (disguise.isHidingHeldItemFromSelf()) {
|
||||||
// From logging, it seems that both bukkit and nms uses the same thing for the slot switching.
|
// From logging, it seems that both bukkit and nms uses the same thing for the slot switching.
|
||||||
@ -869,91 +865,20 @@ public class PacketsManager {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Packets.Client.WINDOW_CLICK:
|
case Packets.Client.WINDOW_CLICK: {
|
||||||
// Seems like the cases are never met..
|
|
||||||
// Probably slot mismatches again
|
|
||||||
{
|
|
||||||
int slot = event.getPacket().getIntegers().read(1);
|
int slot = event.getPacket().getIntegers().read(1);
|
||||||
org.bukkit.inventory.ItemStack clickedItem;
|
org.bukkit.inventory.ItemStack clickedItem;
|
||||||
if (event.getPacket().getIntegers().read(3) == 1) {
|
if (event.getPacket().getIntegers().read(3) == 1) {
|
||||||
// Its a shift click
|
// Its a shift click
|
||||||
// TODO Make the item appear in the right place
|
|
||||||
// Also set the armor/item in hand to air cos the client is stupid.
|
|
||||||
clickedItem = event.getPacket().getItemModifier().read(0);
|
clickedItem = event.getPacket().getItemModifier().read(0);
|
||||||
if (clickedItem != null && clickedItem.getType() != Material.AIR) {
|
if (clickedItem != null && clickedItem.getType() != Material.AIR) {
|
||||||
org.bukkit.inventory.ItemStack armorItem = null;
|
// Rather than predict the clients actions
|
||||||
int armorSlot = 0;
|
// Lets just update the entire inventory..
|
||||||
switch (clickedItem.getType()) {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
|
||||||
case LEATHER_BOOTS:
|
public void run() {
|
||||||
case GOLD_BOOTS:
|
event.getPlayer().updateInventory();
|
||||||
case CHAINMAIL_BOOTS:
|
|
||||||
case IRON_BOOTS:
|
|
||||||
case DIAMOND_BOOTS:
|
|
||||||
armorSlot = 8;
|
|
||||||
armorItem = event.getPlayer().getInventory().getBoots();
|
|
||||||
break;
|
|
||||||
case LEATHER_LEGGINGS:
|
|
||||||
case GOLD_LEGGINGS:
|
|
||||||
case CHAINMAIL_LEGGINGS:
|
|
||||||
case IRON_LEGGINGS:
|
|
||||||
case DIAMOND_LEGGINGS:
|
|
||||||
armorSlot = 7;
|
|
||||||
armorItem = event.getPlayer().getInventory().getLeggings();
|
|
||||||
break;
|
|
||||||
case LEATHER_CHESTPLATE:
|
|
||||||
case GOLD_CHESTPLATE:
|
|
||||||
case CHAINMAIL_CHESTPLATE:
|
|
||||||
case IRON_CHESTPLATE:
|
|
||||||
case DIAMOND_CHESTPLATE:
|
|
||||||
armorSlot = 6;
|
|
||||||
armorItem = event.getPlayer().getInventory().getChestplate();
|
|
||||||
break;
|
|
||||||
case LEATHER_HELMET:
|
|
||||||
case GOLD_HELMET:
|
|
||||||
case CHAINMAIL_HELMET:
|
|
||||||
case IRON_HELMET:
|
|
||||||
case DIAMOND_HELMET:
|
|
||||||
armorSlot = 5;
|
|
||||||
armorItem = event.getPlayer().getInventory().getHelmet();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Its a piece of armor they clicked on..
|
|
||||||
if (armorSlot > 0) {
|
|
||||||
if (armorItem == null || armorItem.getType() == Material.AIR) {
|
|
||||||
PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT);
|
|
||||||
StructureModifier<Object> mods = packet.getModifier();
|
|
||||||
mods.write(0, 0);
|
|
||||||
mods.write(1, armorSlot);
|
|
||||||
mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0)));
|
|
||||||
try {
|
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
|
|
||||||
false);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
org.bukkit.inventory.ItemStack heldItem = event.getPlayer().getItemInHand();
|
|
||||||
// If its not a piece of armor they clicked on
|
|
||||||
// Then it can't go into a armor slot
|
|
||||||
// So it has to go into the held item..
|
|
||||||
// But the held item is full.
|
|
||||||
if (heldItem == null || heldItem.getType() == Material.AIR) {
|
|
||||||
PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT);
|
|
||||||
StructureModifier<Object> mods = packet.getModifier();
|
|
||||||
mods.write(0, 0);
|
|
||||||
mods.write(1, 36 + event.getPlayer().getInventory().getHeldItemSlot());
|
|
||||||
mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0)));
|
|
||||||
try {
|
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
|
|
||||||
false);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
@ -1134,7 +1059,6 @@ public class PacketsManager {
|
|||||||
public static void setInventoryListenerEnabled(boolean enabled) {
|
public static void setInventoryListenerEnabled(boolean enabled) {
|
||||||
if (inventoryModifierEnabled != enabled) {
|
if (inventoryModifierEnabled != enabled) {
|
||||||
inventoryModifierEnabled = enabled;
|
inventoryModifierEnabled = enabled;
|
||||||
// TODO Update all disguises to update their inventories.
|
|
||||||
if (inventoryModifierEnabled) {
|
if (inventoryModifierEnabled) {
|
||||||
ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerClient);
|
ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerClient);
|
||||||
ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerServer);
|
ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerServer);
|
||||||
@ -1142,18 +1066,41 @@ public class PacketsManager {
|
|||||||
ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerClient);
|
ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerClient);
|
||||||
ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerServer);
|
ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerServer);
|
||||||
}
|
}
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
|
Disguise disguise = DisguiseAPI.getDisguise(player);
|
||||||
|
if (disguise != null) {
|
||||||
|
if (viewDisguisesListenerEnabled && disguise.viewSelfDisguise()
|
||||||
|
&& (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) {
|
||||||
|
player.updateInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setViewDisguisesListener(boolean enabled) {
|
public static void setViewDisguisesListener(boolean enabled) {
|
||||||
if (viewDisguisesListenerEnabled != enabled) {
|
if (viewDisguisesListenerEnabled != enabled) {
|
||||||
viewDisguisesListenerEnabled = enabled;
|
viewDisguisesListenerEnabled = enabled;
|
||||||
// TODO Remove all self disguises, or add them.
|
|
||||||
if (viewDisguisesListenerEnabled) {
|
if (viewDisguisesListenerEnabled) {
|
||||||
ProtocolLibrary.getProtocolManager().addPacketListener(viewDisguisesListener);
|
ProtocolLibrary.getProtocolManager().addPacketListener(viewDisguisesListener);
|
||||||
} else {
|
} else {
|
||||||
ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener);
|
ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener);
|
||||||
}
|
}
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
|
Disguise disguise = DisguiseAPI.getDisguise(player);
|
||||||
|
if (disguise != null) {
|
||||||
|
if (disguise.viewSelfDisguise()) {
|
||||||
|
if (enabled) {
|
||||||
|
disguiseAPI.setupFakeDisguise(disguise);
|
||||||
|
} else {
|
||||||
|
disguiseAPI.removeVisibleDisguise(player);
|
||||||
|
}
|
||||||
|
if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) {
|
||||||
|
player.updateInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ public class Disguise {
|
|||||||
/**
|
/**
|
||||||
* Set the entity of the disguise. Only used for internal things.
|
* Set the entity of the disguise. Only used for internal things.
|
||||||
*/
|
*/
|
||||||
public void setEntity(final org.bukkit.entity.Entity entity) {
|
public void setEntity(org.bukkit.entity.Entity entity) {
|
||||||
if (this.entity != null)
|
if (this.entity != null)
|
||||||
throw new RuntimeException("This disguise is already in use! Try .clone()");
|
throw new RuntimeException("This disguise is already in use! Try .clone()");
|
||||||
this.entity = entity;
|
this.entity = entity;
|
||||||
@ -417,12 +417,18 @@ public class Disguise {
|
|||||||
|
|
||||||
public void setHideArmorFromSelf(boolean hideArmor) {
|
public void setHideArmorFromSelf(boolean hideArmor) {
|
||||||
this.hideArmorFromSelf = hideArmor;
|
this.hideArmorFromSelf = hideArmor;
|
||||||
// TODO Update their armor if player
|
if (entity instanceof Player) {
|
||||||
|
((Player) entity).updateInventory();
|
||||||
|
}
|
||||||
|
// TODO Stop using this as a shortcut >.>
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHideHeldItemFromSelf(boolean hideHeldItem) {
|
public void setHideHeldItemFromSelf(boolean hideHeldItem) {
|
||||||
this.hideHeldItemFromSelf = hideHeldItem;
|
this.hideHeldItemFromSelf = hideHeldItem;
|
||||||
// TODO Update their held item if player
|
if (entity instanceof Player) {
|
||||||
|
((Player) entity).updateInventory();
|
||||||
|
}
|
||||||
|
// TODO Stop using this as a shortcut >.>
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setReplaceSounds(boolean areSoundsReplaced) {
|
public void setReplaceSounds(boolean areSoundsReplaced) {
|
||||||
|
Loading…
Reference in New Issue
Block a user