- Cleaned up code

- Future proofed code via reflection again (DamageSource in PacketsManager)
This commit is contained in:
NavidK0 2016-01-22 00:41:45 -05:00
parent 8955290dc7
commit 758df7990e
18 changed files with 212 additions and 239 deletions

View File

@ -9,7 +9,7 @@ println 'Compiling LibsDisguises via Gradle ver. ' + gradle.gradleVersion
sourceCompatibility = '1.7' sourceCompatibility = '1.7'
ext.spigotVersion = '1.8.8-R0.1-SNAPSHOT' ext.spigotVersion = '1.8.8-R0.1-SNAPSHOT'
ext.disguisesVersion = '8.6.7' ext.disguisesVersion = '8.6.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

View File

@ -1,12 +1,5 @@
package me.libraryaddict.disguise; package me.libraryaddict.disguise;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.AnimalColor;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
@ -20,7 +13,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.ReflectionManager; import me.libraryaddict.disguise.utilities.ReflectionManager;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -33,6 +25,13 @@ import org.bukkit.inventory.HorseInventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
public class DisguiseAPI { public class DisguiseAPI {
public static Disguise constructDisguise(Entity entity) { public static Disguise constructDisguise(Entity entity) {
@ -47,7 +46,7 @@ public class DisguiseAPI {
} else if (disguiseType.isMob()) { } else if (disguiseType.isMob()) {
disguise = new MobDisguise(disguiseType); disguise = new MobDisguise(disguiseType);
} else { } else {
disguise = new PlayerDisguise(((Player) entity).getName()); disguise = new PlayerDisguise(entity.getName());
} }
FlagWatcher watcher = disguise.getWatcher(); FlagWatcher watcher = disguise.getWatcher();
if (entity instanceof LivingEntity) { if (entity instanceof LivingEntity) {
@ -105,14 +104,14 @@ public class DisguiseAPI {
if (!(toCast.isInstance(value))) { if (!(toCast.isInstance(value))) {
if (toCast == float.class) { if (toCast == float.class) {
if (value instanceof Float) { if (value instanceof Float) {
value = ((Float) value); value = value;
} else { } else {
double d = (Double) value; double d = (Double) value;
value = (float) d; value = (float) d;
} }
} else if (toCast == double.class) { } else if (toCast == double.class) {
if (value instanceof Double) { if (value instanceof Double) {
value = ((Double) value); value = value;
} else { } else {
float d = (Float) value; float d = (Float) value;
value = (double) d; value = (double) d;

View File

@ -1,21 +1,20 @@
package me.libraryaddict.disguise.commands; package me.libraryaddict.disguise.commands;
import java.util.ArrayList;
import java.util.HashMap;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.BaseDisguiseCommand; import me.libraryaddict.disguise.utilities.BaseDisguiseCommand;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashMap;
public class DisguiseCommand extends BaseDisguiseCommand { public class DisguiseCommand extends BaseDisguiseCommand {
@Override @Override
@ -38,9 +37,9 @@ public class DisguiseCommand extends BaseDisguiseCommand {
} }
if (DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { if (DisguiseConfig.isNameOfPlayerShownAboveDisguise()) {
if (disguise.getWatcher() instanceof LivingWatcher) { if (disguise.getWatcher() instanceof LivingWatcher) {
((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) sender).getDisplayName()); disguise.getWatcher().setCustomName(((Player) sender).getDisplayName());
if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) { if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) {
((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); disguise.getWatcher().setCustomNameVisible(true);
} }
} }
} }

View File

@ -1,8 +1,5 @@
package me.libraryaddict.disguise.commands; package me.libraryaddict.disguise.commands;
import java.util.ArrayList;
import java.util.HashMap;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
@ -16,6 +13,9 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashMap;
public class DisguisePlayerCommand extends BaseDisguiseCommand { public class DisguisePlayerCommand extends BaseDisguiseCommand {
@Override @Override
@ -59,9 +59,9 @@ public class DisguisePlayerCommand extends BaseDisguiseCommand {
} }
if (DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { if (DisguiseConfig.isNameOfPlayerShownAboveDisguise()) {
if (disguise.getWatcher() instanceof LivingWatcher) { if (disguise.getWatcher() instanceof LivingWatcher) {
((LivingWatcher) disguise.getWatcher()).setCustomName(player.getDisplayName()); disguise.getWatcher().setCustomName(player.getDisplayName());
if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) { if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) {
((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); disguise.getWatcher().setCustomNameVisible(true);
} }
} }
} }

View File

@ -1,9 +1,5 @@
package me.libraryaddict.disguise.commands; package me.libraryaddict.disguise.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
@ -20,6 +16,10 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class DisguiseRadiusCommand extends BaseDisguiseCommand { public class DisguiseRadiusCommand extends BaseDisguiseCommand {
private int maxRadius = 30; private int maxRadius = 30;
@ -124,9 +124,9 @@ public class DisguiseRadiusCommand extends BaseDisguiseCommand {
disguise = disguise.clone(); disguise = disguise.clone();
if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) {
if (disguise.getWatcher() instanceof LivingWatcher) { if (disguise.getWatcher() instanceof LivingWatcher) {
((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) entity).getDisplayName()); disguise.getWatcher().setCustomName(((Player) entity).getDisplayName());
if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) { if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) {
((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); disguise.getWatcher().setCustomNameVisible(true);
} }
} }
} }

View File

@ -16,7 +16,7 @@ public enum AnimalColor {
private int value; private int value;
private AnimalColor(int newValue) { AnimalColor(int newValue) {
value = newValue; value = newValue;
} }

View File

@ -1,7 +1,5 @@
package me.libraryaddict.disguise.disguisetypes; package me.libraryaddict.disguise.disguisetypes;
import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -10,6 +8,8 @@ import org.bukkit.entity.Horse;
import org.bukkit.entity.Skeleton; import org.bukkit.entity.Skeleton;
import org.bukkit.entity.Zombie; import org.bukkit.entity.Zombie;
import java.lang.reflect.Method;
public enum DisguiseType { public enum DisguiseType {
ARMOR_STAND(78), ARMOR_STAND(78),
@ -195,7 +195,7 @@ public enum DisguiseType {
private EntityType entityType; private EntityType entityType;
private Class<? extends FlagWatcher> watcherClass; private Class<? extends FlagWatcher> watcherClass;
private DisguiseType(int... ints) { DisguiseType(int... ints) {
for (int i = 0; i < ints.length; i++) { for (int i = 0; i < ints.length; i++) {
int value = ints[i]; int value = ints[i];
switch (i) { switch (i) {

View File

@ -1,27 +1,25 @@
package me.libraryaddict.disguise.disguisetypes; package me.libraryaddict.disguise.disguisetypes;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedWatchableObject; import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.ReflectionManager; import me.libraryaddict.disguise.utilities.ReflectionManager;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class FlagWatcher { public class FlagWatcher {
@ -31,7 +29,7 @@ public class FlagWatcher {
// The ints is for bukkit. Not nms slots. // The ints is for bukkit. Not nms slots.
private int slotNo = 0; private int slotNo = 0;
private SlotType(int no) { SlotType(int no) {
slotNo = no; slotNo = no;
} }
@ -217,7 +215,7 @@ public class FlagWatcher {
} }
public boolean isCustomNameVisible() { public boolean isCustomNameVisible() {
return (Byte) getValue(3, (byte) 0) == 1; return (byte) getValue(3, (byte) 0) == 1;
} }
public boolean isEntityAnimationsAdded() { public boolean isEntityAnimationsAdded() {

View File

@ -15,7 +15,7 @@ public enum RabbitType {
private int type; private int type;
private RabbitType(int type) { RabbitType(int type) {
this.type = type; this.type = type;
} }

View File

@ -1,19 +1,18 @@
package me.libraryaddict.disguise.disguisetypes; package me.libraryaddict.disguise.disguisetypes;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.ReflectionManager;
import org.bukkit.entity.Player;
public abstract class TargetedDisguise extends Disguise { public abstract class TargetedDisguise extends Disguise {
public enum TargetType { public enum TargetType {
HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS
} }
private List<String> disguiseViewers = new ArrayList<>(); private List<String> disguiseViewers = new ArrayList<>();

View File

@ -1,9 +1,8 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import org.bukkit.inventory.ItemStack;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import org.bukkit.inventory.ItemStack;
public class MinecartWatcher extends FlagWatcher { public class MinecartWatcher extends FlagWatcher {
@ -37,7 +36,7 @@ public class MinecartWatcher extends FlagWatcher {
public void setBlockInCart(ItemStack item) { public void setBlockInCart(ItemStack item) {
int id = item.getTypeId(); int id = item.getTypeId();
int data = item.getDurability(); int data = item.getDurability();
setValue(20, (int) (id & 0xffff | data << 16)); setValue(20, id & 0xffff | data << 16);
setValue(22, (byte) 1); setValue(22, (byte) 1);
sendData(20, 22); sendData(20, 22);
} }

View File

@ -1,10 +1,10 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import java.util.Random;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.RabbitType; import me.libraryaddict.disguise.disguisetypes.RabbitType;
import java.util.Random;
public class RabbitWatcher extends AgeableWatcher { public class RabbitWatcher extends AgeableWatcher {
public RabbitWatcher(Disguise disguise) { public RabbitWatcher(Disguise disguise) {
@ -13,7 +13,7 @@ public class RabbitWatcher extends AgeableWatcher {
} }
public RabbitType getType() { public RabbitType getType() {
return RabbitType.getType((Integer) getValue(18, (int) 0)); return RabbitType.getType((Integer) getValue(18, 0));
} }
public void setType(RabbitType type) { public void setType(RabbitType type) {

View File

@ -1,16 +1,5 @@
package me.libraryaddict.disguise.utilities; package me.libraryaddict.disguise.utilities;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.AnimalColor;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
@ -19,7 +8,6 @@ import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import me.libraryaddict.disguise.disguisetypes.MobDisguise; import me.libraryaddict.disguise.disguisetypes.MobDisguise;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.disguisetypes.RabbitType; import me.libraryaddict.disguise.disguisetypes.RabbitType;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
@ -32,6 +20,14 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;
public abstract class BaseDisguiseCommand implements CommandExecutor { public abstract class BaseDisguiseCommand implements CommandExecutor {
public class DisguiseParseException extends Exception { public class DisguiseParseException extends Exception {
@ -506,7 +502,7 @@ public abstract class BaseDisguiseCommand implements CommandExecutor {
if (int.class == param) { if (int.class == param) {
// Parse to integer // Parse to integer
if (isNumeric(valueString)) { if (isNumeric(valueString)) {
value = (int) Integer.parseInt(valueString); value = Integer.parseInt(valueString);
} else { } else {
throw parseToException("number", valueString, methodName); throw parseToException("number", valueString, methodName);
} }
@ -515,7 +511,7 @@ public abstract class BaseDisguiseCommand implements CommandExecutor {
if (isDouble(valueString)) { if (isDouble(valueString)) {
float obj = Float.parseFloat(valueString); float obj = Float.parseFloat(valueString);
if (param == float.class) { if (param == float.class) {
value = (float) obj; value = obj;
} else if (param == double.class) { } else if (param == double.class) {
value = (double) obj; value = (double) obj;
} }

View File

@ -1,12 +1,10 @@
package me.libraryaddict.disguise.utilities; package me.libraryaddict.disguise.utilities;
import org.bukkit.Sound;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
import org.bukkit.Sound;
/** /**
* Only living disguises go in here! * Only living disguises go in here!
*/ */
@ -74,7 +72,7 @@ public enum DisguiseSound {
public enum SoundType { public enum SoundType {
CANCEL, DEATH, HURT, IDLE, STEP; CANCEL, DEATH, HURT, IDLE, STEP
} }
public static DisguiseSound getType(String name) { public static DisguiseSound getType(String name) {
@ -89,7 +87,7 @@ public enum DisguiseSound {
private float damageSoundVolume = 1F; private float damageSoundVolume = 1F;
private HashMap<SoundType, String> disguiseSounds = new HashMap<>(); private HashMap<SoundType, String> disguiseSounds = new HashMap<>();
private DisguiseSound(Object... sounds) { DisguiseSound(Object... sounds) {
for (int i = 0; i < sounds.length; i++) { for (int i = 0; i < sounds.length; i++) {
Object obj = sounds[i]; Object obj = sounds[i];
String s; String s;

View File

@ -4,6 +4,6 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile;
public interface LibsProfileLookup { public interface LibsProfileLookup {
public void onLookup(WrappedGameProfile gameProfile); void onLookup(WrappedGameProfile gameProfile);
} }

View File

@ -28,7 +28,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher;
import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
import net.minecraft.server.v1_8_R3.DamageSource;
import org.bukkit.Art; import org.bukkit.Art;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -55,9 +54,9 @@ import java.util.Random;
import java.util.UUID; import java.util.UUID;
public class PacketsManager { public class PacketsManager {
/** /**
* This is a fix for the stupidity that is "I can't separate the sounds from the sounds the player heard, and the sounds of the entity tracker heard" * This is a fix for the stupidity that is
* "I can't separate the sounds from the sounds the player heard, and the sounds of the entity tracker heard"
*/ */
private static boolean cancelSound; private static boolean cancelSound;
private static PacketListener clientInteractEntityListener; private static PacketListener clientInteractEntityListener;
@ -78,9 +77,8 @@ public class PacketsManager {
PacketType.Play.Client.USE_ENTITY) { PacketType.Play.Client.USE_ENTITY) {
@Override @Override
public void onPacketReceiving(PacketEvent event) { public void onPacketReceiving(PacketEvent event) {
if (event.isCancelled()) { if (event.isCancelled())
return; return;
}
try { try {
Player observer = event.getPlayer(); Player observer = event.getPlayer();
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
@ -105,7 +103,7 @@ public class PacketsManager {
} }
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
}; };
@ -116,26 +114,19 @@ public class PacketsManager {
/** /**
* Construct the packets I need to spawn in the disguise * Construct the packets I need to spawn in the disguise
*
* @param player
* @param disguise
* @param disguisedEntity
* @return
*/ */
public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) { public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) {
if (disguise.getEntity() == null) { if (disguise.getEntity() == null)
disguise.setEntity(disguisedEntity); disguise.setEntity(disguisedEntity);
}
Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity);
ArrayList<PacketContainer> packets = new ArrayList<>(); ArrayList<PacketContainer> packets = new ArrayList<PacketContainer>();
// This sends the armor packets so that the player isn't naked. // This sends the armor packets so that the player isn't naked.
// Please note it only sends the packets that wouldn't be sent normally // Please note it only sends the packets that wouldn't be sent normally
if (DisguiseConfig.isEquipmentPacketsEnabled()) { if (DisguiseConfig.isEquipmentPacketsEnabled()) {
for (int nmsSlot = 0; nmsSlot < 5; nmsSlot++) { for (int nmsSlot = 0; nmsSlot < 5; nmsSlot++) {
int armorSlot = nmsSlot - 1; int armorSlot = nmsSlot - 1;
if (armorSlot < 0) { if (armorSlot < 0)
armorSlot = 4; armorSlot = 4;
}
ItemStack itemstack = disguise.getWatcher().getItemStack(armorSlot); ItemStack itemstack = disguise.getWatcher().getItemStack(armorSlot);
if (itemstack != null && itemstack.getTypeId() != 0) { if (itemstack != null && itemstack.getTypeId() != 0) {
ItemStack item = null; ItemStack item = null;
@ -160,7 +151,7 @@ public class PacketsManager {
if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) {
if (disguise.getWatcher() instanceof LivingWatcher) { if (disguise.getWatcher() instanceof LivingWatcher) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES); PacketContainer packet = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES);
List<WrappedAttribute> attributes = new ArrayList<>(); List<WrappedAttribute> attributes = new ArrayList<WrappedAttribute>();
Builder builder = WrappedAttribute.newBuilder().attributeKey("generic.maxHealth"); Builder builder = WrappedAttribute.newBuilder().attributeKey("generic.maxHealth");
if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) {
builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth());
@ -219,6 +210,7 @@ public class PacketsManager {
mods.write(5, pitch); mods.write(5, pitch);
} else if (disguise.getType().isPlayer()) { } else if (disguise.getType().isPlayer()) {
spawnPackets[0] = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN); spawnPackets[0] = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN);
StructureModifier<String> stringMods = spawnPackets[0].getStrings(); StructureModifier<String> stringMods = spawnPackets[0].getStrings();
WrappedGameProfile gameProfile; WrappedGameProfile gameProfile;
@ -270,12 +262,11 @@ public class PacketsManager {
} }
} }
ArrayList<PacketContainer> newPackets = new ArrayList<>(); ArrayList<PacketContainer> newPackets = new ArrayList<PacketContainer>();
newPackets.add(null); newPackets.add(null);
for (PacketContainer spawnPacket : spawnPackets) { for (int i = 0; i < spawnPackets.length; i++) {
if (spawnPacket != null) { if (spawnPackets[i] != null) { // Get rid of empty packet '1' if it exists.
// Get rid of empty packet '1' if it exists. newPackets.add(spawnPackets[i]);
newPackets.add(spawnPacket);
} }
} }
spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]); spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]);
@ -287,9 +278,10 @@ public class PacketsManager {
spawnPackets[0].getModifier().write(1, playerList); spawnPackets[0].getModifier().write(1, playerList);
PacketContainer delayedPacket = spawnPackets[0].shallowClone(); PacketContainer delayedPacket = spawnPackets[0].shallowClone();
delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4));
delayedPackets = new PacketContainer[]{delayedPacket}; delayedPackets = new PacketContainer[] { delayedPacket };
} else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) {
DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType()); DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType());
Vector vec = disguisedEntity.getVelocity(); Vector vec = disguisedEntity.getVelocity();
spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING); spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING);
@ -300,24 +292,18 @@ public class PacketsManager {
double d2 = vec.getX(); double d2 = vec.getX();
double d3 = vec.getY(); double d3 = vec.getY();
double d4 = vec.getZ(); double d4 = vec.getZ();
if (d2 < -d1) { if (d2 < -d1)
d2 = -d1; d2 = -d1;
} if (d3 < -d1)
if (d3 < -d1) {
d3 = -d1; d3 = -d1;
} if (d4 < -d1)
if (d4 < -d1) {
d4 = -d1; d4 = -d1;
} if (d2 > d1)
if (d2 > d1) {
d2 = d1; d2 = d1;
} if (d3 > d1)
if (d3 > d1) {
d3 = d1; d3 = d1;
} if (d4 > d1)
if (d4 > d1) {
d4 = d1; d4 = d1;
}
mods.write(2, values.getEntitySize(loc.getX())); mods.write(2, values.getEntitySize(loc.getX()));
mods.write(3, (int) Math.floor(loc.getY() * 32D)); mods.write(3, (int) Math.floor(loc.getY() * 32D));
mods.write(4, values.getEntitySize(loc.getZ())); mods.write(4, values.getEntitySize(loc.getZ()));
@ -328,12 +314,13 @@ public class PacketsManager {
mods.write(9, pitch); mods.write(9, pitch);
spawnPackets[0].getDataWatcherModifier().write(0, spawnPackets[0].getDataWatcherModifier().write(0,
createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()));
} else if (disguise.getType().isMisc()) { } else if (disguise.getType().isMisc()) {
MiscDisguise msc = (MiscDisguise) disguise;
int id = disguise.getType().getEntityId(); int id = disguise.getType().getEntityId();
int data = msc.getData(); int data = ((MiscDisguise) disguise).getData();
if (disguise.getType() == DisguiseType.FALLING_BLOCK) { if (disguise.getType() == DisguiseType.FALLING_BLOCK) {
data = msc.getId() + (msc.getData() << 12); data = (((MiscDisguise) disguise).getId() | data << 16);
} else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == 0) { } else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == 0) {
// If the MiscDisguise data isn't set. Then no entity id was provided, so default to the owners entity id // If the MiscDisguise data isn't set. Then no entity id was provided, so default to the owners entity id
data = disguisedEntity.getEntityId(); data = disguisedEntity.getEntityId();
@ -366,7 +353,7 @@ public class PacketsManager {
mods.write(0, disguisedEntity.getEntityId()); mods.write(0, disguisedEntity.getEntityId());
mods.write(1, yaw); mods.write(1, yaw);
} }
return new PacketContainer[][]{spawnPackets, delayedPackets}; return new PacketContainer[][] { spawnPackets, delayedPackets };
} }
/** /**
@ -382,7 +369,7 @@ public class PacketsManager {
newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue());
} }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(System.out); ex.printStackTrace();
} }
return newWatcher; return newWatcher;
} }
@ -487,9 +474,8 @@ public class PacketsManager {
} }
switch (disguise.getType()) { switch (disguise.getType()) {
case BAT: case BAT:
if (entity instanceof LivingEntity) { if (entity instanceof LivingEntity)
return yMod + ((LivingEntity) entity).getEyeHeight(); return yMod + ((LivingEntity) entity).getEyeHeight();
}
case MINECART: case MINECART:
case MINECART_COMMAND: case MINECART_COMMAND:
case MINECART_CHEST: case MINECART_CHEST:
@ -536,8 +522,6 @@ public class PacketsManager {
/** /**
* Creates the packet listeners * Creates the packet listeners
*
* @param plugin
*/ */
public static void init(LibsDisguises plugin) { public static void init(LibsDisguises plugin) {
libsDisguises = plugin; libsDisguises = plugin;
@ -563,7 +547,8 @@ public class PacketsManager {
DisguiseSound entitySound = null; DisguiseSound entitySound = null;
Disguise disguise = null; Disguise disguise = null;
Entity[] entities = soundLoc.getChunk().getEntities(); Entity[] entities = soundLoc.getChunk().getEntities();
for (Entity entity : entities) { for (int i = 0; i < entities.length; i++) {
Entity entity = entities[i];
Disguise entityDisguise = DisguiseAPI.getDisguise(observer, entity); Disguise entityDisguise = DisguiseAPI.getDisguise(observer, entity);
if (entityDisguise != null) { if (entityDisguise != null) {
Location loc = entity.getLocation(); Location loc = entity.getLocation();
@ -583,7 +568,7 @@ public class PacketsManager {
obj = null; obj = null;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
if (obj == null) { if (obj == null) {
@ -595,11 +580,12 @@ public class PacketsManager {
nmsEntity) == ReflectionManager.getNmsField("EntityLiving", nmsEntity) == ReflectionManager.getNmsField("EntityLiving",
"maxNoDamageTicks").getInt(nmsEntity); "maxNoDamageTicks").getInt(nmsEntity);
} else { } else {
hasInvun = (Boolean) ReflectionManager.getNmsMethod("Entity", "isInvulnerable", DamageSource.class) Class clazz = ReflectionManager.getNmsClass("DamageSource");
.invoke(nmsEntity, DamageSource.GENERIC); hasInvun = (Boolean) ReflectionManager.getNmsMethod("Entity", "isInvulnerable", clazz)
.invoke(nmsEntity, ReflectionManager.getNmsField(clazz, "GENERIC"));
} }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(System.out); ex.printStackTrace();
} }
soundType = entitySound.getType(soundName, !hasInvun); soundType = entitySound.getType(soundName, !hasInvun);
} }
@ -617,9 +603,8 @@ public class PacketsManager {
if (disguise.isSoundsReplaced()) { if (disguise.isSoundsReplaced()) {
String sound = null; String sound = null;
DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name()); DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name());
if (dSound != null) { if (dSound != null)
sound = dSound.getSound(soundType); sound = dSound.getSound(soundType);
}
if (sound == null) { if (sound == null) {
event.setCancelled(true); event.setCancelled(true);
@ -637,7 +622,7 @@ public class PacketsManager {
.invoke(step)); .invoke(step));
} }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(System.out); ex.printStackTrace();
} }
// There is no else statement. Because seriously. This should never be null. Unless // There is no else statement. Because seriously. This should never be null. Unless
// someone is // someone is
@ -665,9 +650,8 @@ public class PacketsManager {
float pitch = (Integer) mods.read(5); float pitch = (Integer) mods.read(5);
if (baby) { if (baby) {
// If the pitch is not the expected // If the pitch is not the expected
if (pitch > 97 || pitch < 111) { if (pitch > 97 || pitch < 111)
return; return;
}
pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.5F; pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.5F;
// Min = 1.5 // Min = 1.5
// Cap = 97.5 // Cap = 97.5
@ -675,9 +659,8 @@ public class PacketsManager {
// Cap = 110.5 // Cap = 110.5
} else { } else {
// If the pitch is not the expected // If the pitch is not the expected
if (pitch >= 63 || pitch <= 76) { if (pitch >= 63 || pitch <= 76)
return; return;
}
pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.0F; pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.0F;
// Min = 1 // Min = 1
// Cap = 63 // Cap = 63
@ -685,12 +668,10 @@ public class PacketsManager {
// Cap = 75.6 // Cap = 75.6
} }
pitch *= 63; pitch *= 63;
if (pitch < 0) { if (pitch < 0)
pitch = 0; pitch = 0;
} if (pitch > 255)
if (pitch > 255) {
pitch = 255; pitch = 255;
}
mods.write(5, (int) pitch); mods.write(5, (int) pitch);
} }
} }
@ -708,9 +689,8 @@ public class PacketsManager {
if (disguise != null && !disguise.getType().isPlayer() if (disguise != null && !disguise.getType().isPlayer()
&& (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) { && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) {
DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); DisguiseSound disSound = DisguiseSound.getType(entity.getType().name());
if (disSound == null) { if (disSound == null)
return; return;
}
SoundType soundType = null; SoundType soundType = null;
Object obj = null; Object obj = null;
if (entity instanceof LivingEntity) { if (entity instanceof LivingEntity) {
@ -722,7 +702,7 @@ public class PacketsManager {
obj = null; obj = null;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
if (obj == null) { if (obj == null) {
@ -732,9 +712,8 @@ public class PacketsManager {
|| (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) { || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) {
if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) { if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) {
cancelSound = !cancelSound; cancelSound = !cancelSound;
if (cancelSound) { if (cancelSound)
return; return;
}
} }
disSound = DisguiseSound.getType(disguise.getType().name()); disSound = DisguiseSound.getType(disguise.getType().name());
if (disSound != null) { if (disSound != null) {
@ -751,24 +730,20 @@ public class PacketsManager {
float pitch; float pitch;
if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) { if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) {
pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.5F; pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.5F;
} else { } else
pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.0F; pitch = (new Random().nextFloat() - new Random().nextFloat()) * 0.2F + 1.0F;
} if (disguise.getType() == DisguiseType.BAT)
if (disguise.getType() == DisguiseType.BAT) {
pitch *= 95F; pitch *= 95F;
}
pitch *= 63; pitch *= 63;
if (pitch < 0) { if (pitch < 0)
pitch = 0; pitch = 0;
} if (pitch > 255)
if (pitch > 255) {
pitch = 255; pitch = 255;
}
mods.write(5, (int) pitch); mods.write(5, (int) pitch);
try { try {
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
} }
@ -788,9 +763,8 @@ public class PacketsManager {
PacketType.Play.Server.UPDATE_ATTRIBUTES, PacketType.Play.Server.ENTITY_STATUS) { PacketType.Play.Server.UPDATE_ATTRIBUTES, PacketType.Play.Server.ENTITY_STATUS) {
@Override @Override
public void onPacketSending(PacketEvent event) { public void onPacketSending(PacketEvent event) {
if (event.isCancelled()) { if (event.isCancelled())
return; return;
}
final Player observer = event.getPlayer(); final Player observer = event.getPlayer();
if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) { if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) {
if (DisguiseAPI.isSelfDisguised(observer)) { if (DisguiseAPI.isSelfDisguised(observer)) {
@ -799,7 +773,7 @@ public class PacketsManager {
PacketContainer[] packets = transformed == null ? null : transformed[0]; PacketContainer[] packets = transformed == null ? null : transformed[0];
final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1]; final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1];
if (packets == null) { if (packets == null) {
packets = new PacketContainer[]{event.getPacket()}; packets = new PacketContainer[] { event.getPacket() };
} }
for (PacketContainer packet : packets) { for (PacketContainer packet : packets) {
if (packet.getType() != PacketType.Play.Server.PLAYER_INFO) { if (packet.getType() != PacketType.Play.Server.PLAYER_INFO) {
@ -811,19 +785,18 @@ public class PacketsManager {
try { try {
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
if (delayedPackets != null && delayedPackets.length > 0) { if (delayedPackets != null && delayedPackets.length > 0) {
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
@Override
public void run() { public void run() {
try { try {
for (PacketContainer packet : delayedPackets) { for (PacketContainer packet : delayedPackets) {
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
} }
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
}, 2); }, 2);
@ -834,9 +807,8 @@ public class PacketsManager {
if (watch.getIndex() == 0) { if (watch.getIndex() == 0) {
byte b = (Byte) watch.getValue(); byte b = (Byte) watch.getValue();
byte a = (byte) (b | 1 << 5); byte a = (byte) (b | 1 << 5);
if ((b & 1 << 3) != 0) { if ((b & 1 << 3) != 0)
a = (byte) (a | 1 << 3); a = (byte) (a | 1 << 3);
}
watch.setValue(a); watch.setValue(a);
} }
} }
@ -845,17 +817,16 @@ public class PacketsManager {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
StructureModifier<Object> mods = packet.getModifier(); StructureModifier<Object> mods = packet.getModifier();
mods.write(0, observer.getEntityId()); mods.write(0, observer.getEntityId());
List<WrappedWatchableObject> watchableList = new ArrayList<>(); List<WrappedWatchableObject> watchableList = new ArrayList<WrappedWatchableObject>();
byte b = (byte) 1 << 5; byte b = (byte) 1 << 5;
if (observer.isSprinting()) { if (observer.isSprinting())
b = (byte) (b | 1 << 3); b = (byte) (b | 1 << 3);
}
watchableList.add(new WrappedWatchableObject(0, b)); watchableList.add(new WrappedWatchableObject(0, b));
packet.getWatchableCollectionModifier().write(0, watchableList); packet.getWatchableCollectionModifier().write(0, watchableList);
try { try {
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} else if (event.getPacketType() == PacketType.Play.Server.ANIMATION) { } else if (event.getPacketType() == PacketType.Play.Server.ANIMATION) {
if (event.getPacket().getIntegers().read(1) != 2) { if (event.getPacket().getIntegers().read(1) != 2) {
@ -888,9 +859,8 @@ public class PacketsManager {
PacketType.Play.Client.SET_CREATIVE_SLOT, PacketType.Play.Client.WINDOW_CLICK) { PacketType.Play.Client.SET_CREATIVE_SLOT, PacketType.Play.Client.WINDOW_CLICK) {
@Override @Override
public void onPacketReceiving(final PacketEvent event) { public void onPacketReceiving(final PacketEvent event) {
if (event.isCancelled()) { if (event.isCancelled())
return; return;
}
if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory) if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory)
&& event.getPlayer().getVehicle() == null) { && event.getPlayer().getVehicle() == null) {
Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer());
@ -914,7 +884,7 @@ public class PacketsManager {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
false); false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
} }
@ -933,13 +903,14 @@ public class PacketsManager {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
false); false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
} }
} }
} }
} // 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
else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) { else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) {
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.
@ -957,7 +928,7 @@ public class PacketsManager {
try { try {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
org.bukkit.inventory.ItemStack newHeld = event.getPlayer().getInventory() org.bukkit.inventory.ItemStack newHeld = event.getPlayer().getInventory()
@ -972,7 +943,7 @@ public class PacketsManager {
try { try {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
} }
@ -986,7 +957,6 @@ public class PacketsManager {
// Rather than predict the clients actions // Rather than predict the clients actions
// Lets just update the entire inventory.. // Lets just update the entire inventory..
Bukkit.getScheduler().runTask(libsDisguises, new Runnable() { Bukkit.getScheduler().runTask(libsDisguises, new Runnable() {
@Override
public void run() { public void run() {
event.getPlayer().updateInventory(); event.getPlayer().updateInventory();
} }
@ -1014,7 +984,7 @@ public class PacketsManager {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
false); false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
// Else if its a hotbar slot // Else if its a hotbar slot
@ -1032,7 +1002,7 @@ public class PacketsManager {
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet,
false); false);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
} }
@ -1174,7 +1144,7 @@ public class PacketsManager {
if (mainListener != null) { if (mainListener != null) {
ProtocolLibrary.getProtocolManager().removePacketListener(mainListener); ProtocolLibrary.getProtocolManager().removePacketListener(mainListener);
} }
List<PacketType> packetsToListen = new ArrayList<>(); List<PacketType> packetsToListen = new ArrayList<PacketType>();
// Add spawn packets // Add spawn packets
{ {
packetsToListen.add(PacketType.Play.Server.NAMED_ENTITY_SPAWN); packetsToListen.add(PacketType.Play.Server.NAMED_ENTITY_SPAWN);
@ -1220,9 +1190,8 @@ public class PacketsManager {
mainListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, packetsToListen) { mainListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, packetsToListen) {
@Override @Override
public void onPacketSending(PacketEvent event) { public void onPacketSending(PacketEvent event) {
if (event.isCancelled()) { if (event.isCancelled())
return; return;
}
final Player observer = event.getPlayer(); final Player observer = event.getPlayer();
// First get the entity, the one sending this packet // First get the entity, the one sending this packet
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
@ -1230,9 +1199,8 @@ public class PacketsManager {
.read((PacketType.Play.Server.COLLECT == event.getPacketType() ? 1 : 0)); .read((PacketType.Play.Server.COLLECT == event.getPacketType() ? 1 : 0));
// If the entity is the same as the sender. Don't disguise! // If the entity is the same as the sender. Don't disguise!
// Prevents problems and there is no advantage to be gained. // Prevents problems and there is no advantage to be gained.
if (entity == observer) { if (entity == observer)
return; return;
}
PacketContainer[][] packets = transformPacket(event.getPacket(), event.getPlayer(), entity); PacketContainer[][] packets = transformPacket(event.getPacket(), event.getPlayer(), entity);
if (packets != null) { if (packets != null) {
event.setCancelled(true); event.setCancelled(true);
@ -1243,20 +1211,19 @@ public class PacketsManager {
final PacketContainer[] delayed = packets[1]; final PacketContainer[] delayed = packets[1];
if (delayed.length > 0) { if (delayed.length > 0) {
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
@Override
public void run() { public void run() {
try { try {
for (PacketContainer packet : delayed) { for (PacketContainer packet : delayed) {
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
} }
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
} }
}, 2); }, 2);
} }
} catch (InvocationTargetException ex) { } catch (InvocationTargetException ex) {
ex.printStackTrace(System.out); ex.printStackTrace();
} }
} }
} }
@ -1292,12 +1259,8 @@ public class PacketsManager {
} }
/** /**
* Transform the packet magically into the one I have always dreamed off. My true luv!!! This will return null if its not transformed * Transform the packet magically into the one I have always dreamed off. My true luv!!! This will return null if its not
* * transformed
* @param sentPacket
* @param observer
* @param entity
* @return
*/ */
public static PacketContainer[][] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) { public static PacketContainer[][] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) {
PacketContainer[] packets = null; PacketContainer[] packets = null;
@ -1306,14 +1269,14 @@ public class PacketsManager {
Disguise disguise = DisguiseAPI.getDisguise(observer, entity); Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
// If disguised. // If disguised.
if (disguise != null) { if (disguise != null) {
packets = new PacketContainer[]{sentPacket}; packets = new PacketContainer[] { sentPacket };
// This packet sends attributes // This packet sends attributes
if (sentPacket.getType() == PacketType.Play.Server.UPDATE_ATTRIBUTES) { if (sentPacket.getType() == PacketType.Play.Server.UPDATE_ATTRIBUTES) {
if (disguise.isMiscDisguise()) { if (disguise.isMiscDisguise()) {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} else { } else {
List<WrappedAttribute> attributes = new ArrayList<>(); List<WrappedAttribute> attributes = new ArrayList<WrappedAttribute>();
for (WrappedAttribute attribute : sentPacket.getAttributeCollectionModifier().read(0)) { for (WrappedAttribute attribute : sentPacket.getAttributeCollectionModifier().read(0)) {
if (attribute.getAttributeKey().equals("generic.maxHealth")) { if (attribute.getAttributeKey().equals("generic.maxHealth")) {
packets[0] = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES); packets[0] = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES);
@ -1341,7 +1304,9 @@ public class PacketsManager {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} }
} }
} // Else if the packet is sending entity metadata }
// Else if the packet is sending entity metadata
else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_METADATA) { else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_METADATA) {
if (DisguiseConfig.isMetadataPacketsEnabled()) { if (DisguiseConfig.isMetadataPacketsEnabled()) {
List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert( List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert(
@ -1354,7 +1319,9 @@ public class PacketsManager {
} else { } else {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} }
} // Else if the packet is spawning.. }
// Else if the packet is spawning..
else if (sentPacket.getType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN else if (sentPacket.getType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB
@ -1363,7 +1330,9 @@ public class PacketsManager {
PacketContainer[][] spawnPackets = constructSpawnPackets(observer, disguise, entity); PacketContainer[][] spawnPackets = constructSpawnPackets(observer, disguise, entity);
packets = spawnPackets[0]; packets = spawnPackets[0];
delayedPackets = spawnPackets[1]; delayedPackets = spawnPackets[1];
} // Else if the disguise is attempting to send players a forbidden packet }
// Else if the disguise is attempting to send players a forbidden packet
else if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) { else if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) {
if (disguise.getType().isMisc() if (disguise.getType().isMisc()
|| (packets[0].getIntegers().read(1) == 2 && (!disguise.getType() || (packets[0].getIntegers().read(1) == 2 && (!disguise.getType()
@ -1371,7 +1340,9 @@ public class PacketsManager {
.getWatcher()).isSleeping())))) { .getWatcher()).isSleeping())))) {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} }
} else if (sentPacket.getType() == PacketType.Play.Server.COLLECT) { }
else if (sentPacket.getType() == PacketType.Play.Server.COLLECT) {
if (disguise.getType().isMisc()) { if (disguise.getType().isMisc()) {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} else if (DisguiseConfig.isBedPacketsEnabled() && disguise.getType().isPlayer() } else if (DisguiseConfig.isBedPacketsEnabled() && disguise.getType().isPlayer()
@ -1380,9 +1351,11 @@ public class PacketsManager {
StructureModifier<Integer> mods = newPacket.getIntegers(); StructureModifier<Integer> mods = newPacket.getIntegers();
mods.write(0, disguise.getEntity().getEntityId()); mods.write(0, disguise.getEntity().getEntityId());
mods.write(1, 3); mods.write(1, 3);
packets = new PacketContainer[]{newPacket, sentPacket}; packets = new PacketContainer[] { newPacket, sentPacket };
} }
} // Else if the disguise is moving. }
// Else if the disguise is moving.
else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_MOVE_LOOK else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_MOVE_LOOK
|| sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK || sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK
|| sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT || sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT
@ -1435,11 +1408,12 @@ public class PacketsManager {
} }
} }
} }
} else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_EQUIPMENT) { }
else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_EQUIPMENT) {
int slot = (Integer) packets[0].getModifier().read(1) - 1; int slot = (Integer) packets[0].getModifier().read(1) - 1;
if (slot < 0) { if (slot < 0)
slot = 4; slot = 4;
}
org.bukkit.inventory.ItemStack itemstack = disguise.getWatcher().getItemStack(slot); org.bukkit.inventory.ItemStack itemstack = disguise.getWatcher().getItemStack(slot);
if (itemstack != null) { if (itemstack != null) {
packets[0] = packets[0].shallowClone(); packets[0] = packets[0].shallowClone();
@ -1450,7 +1424,7 @@ public class PacketsManager {
ItemStack heldItem = packets[0].getItemModifier().read(0); ItemStack heldItem = packets[0].getItemModifier().read(0);
if (heldItem != null && heldItem.getType() != Material.AIR) { if (heldItem != null && heldItem.getType() != Material.AIR) {
// Convert the datawatcher // Convert the datawatcher
List<WrappedWatchableObject> list = new ArrayList<>(); List<WrappedWatchableObject> list = new ArrayList<WrappedWatchableObject>();
if (DisguiseConfig.isMetadataPacketsEnabled()) { if (DisguiseConfig.isMetadataPacketsEnabled()) {
list.add(new WrappedWatchableObject(0, WrappedDataWatcher.getEntityWatcher(entity).getByte(0))); list.add(new WrappedWatchableObject(0, WrappedDataWatcher.getEntityWatcher(entity).getByte(0)));
list = disguise.getWatcher().convert(list); list = disguise.getWatcher().convert(list);
@ -1474,20 +1448,26 @@ public class PacketsManager {
} }
// Send the unblock before the itemstack change so that the 2nd metadata packet works. Why? Scheduler // Send the unblock before the itemstack change so that the 2nd metadata packet works. Why? Scheduler
// delay. // delay.
packets = new PacketContainer[]{packetUnblock, packets[0], packetBlock}; packets = new PacketContainer[] { packetUnblock, packets[0], packetBlock };
// Silly mojang made the right clicking datawatcher value only valid for one use. So I have to reset // Silly mojang made the right clicking datawatcher value only valid for one use. So I have to reset
// it. // it.
} }
} }
} else if (sentPacket.getType() == PacketType.Play.Server.BED) { }
else if (sentPacket.getType() == PacketType.Play.Server.BED) {
if (!disguise.getType().isPlayer()) { if (!disguise.getType().isPlayer()) {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} }
} else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_STATUS) { }
else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_STATUS) {
if (packets[0].getBytes().read(0) == (byte) 3) { if (packets[0].getBytes().read(0) == (byte) 3) {
packets = new PacketContainer[0]; packets = new PacketContainer[0];
} }
} else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_HEAD_ROTATION) { }
else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_HEAD_ROTATION) {
if (disguise.getType().isPlayer() && entity.getType() != EntityType.PLAYER) { if (disguise.getType().isPlayer() && entity.getType() != EntityType.PLAYER) {
Location loc = entity.getLocation(); Location loc = entity.getLocation();
byte pitch = getPitch(disguise.getType(), DisguiseType.getType(entity.getType()), byte pitch = getPitch(disguise.getType(), DisguiseType.getType(entity.getType()),
@ -1501,16 +1481,18 @@ public class PacketsManager {
look.getIntegers().write(0, entity.getEntityId()); look.getIntegers().write(0, entity.getEntityId());
look.getBytes().write(3, yaw); look.getBytes().write(3, yaw);
look.getBytes().write(4, pitch); look.getBytes().write(4, pitch);
packets = new PacketContainer[]{look, rotation}; packets = new PacketContainer[] { look, rotation };
} }
} else { }
else {
packets = null; packets = null;
} }
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(System.out); e.printStackTrace();
} }
return packets == null ? null : new PacketContainer[][]{packets, delayedPackets}; return packets == null ? null : new PacketContainer[][] { packets, delayedPackets };
} }
} }

View File

@ -1,5 +1,17 @@
package me.libraryaddict.disguise.utilities; package me.libraryaddict.disguise.utilities;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.google.common.collect.ImmutableMap;
import org.bukkit.Art;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -14,20 +26,6 @@ import java.util.UUID;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.google.common.collect.ImmutableMap;
import org.bukkit.Art;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import org.bukkit.potion.PotionEffect;
public class ReflectionManager { public class ReflectionManager {
public enum LibVersion { public enum LibVersion {
@ -202,19 +200,23 @@ public class ReflectionManager {
Class<?> entityClass = getNmsClass("Entity" + entityName); Class<?> entityClass = getNmsClass("Entity" + entityName);
Object entityObject; Object entityObject;
Object world = getWorld(Bukkit.getWorlds().get(0)); Object world = getWorld(Bukkit.getWorlds().get(0));
if (entityName.equals("Player")) { switch (entityName) {
Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); case "Player":
Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World")) Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null);
.newInstance(world); Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World"))
WrappedGameProfile gameProfile = getGameProfile(null, "LibsDisguises"); .newInstance(world);
entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), WrappedGameProfile gameProfile = getGameProfile(null, "LibsDisguises");
gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"),
gameProfile.getHandle(), playerinteractmanager); gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world,
} else if (entityName.equals("EnderPearl")) { gameProfile.getHandle(), playerinteractmanager);
entityObject = entityClass.getConstructor(getNmsClass("World"), getNmsClass("EntityLiving")) break;
.newInstance(world, createEntityInstance("Cow")); case "EnderPearl":
} else { entityObject = entityClass.getConstructor(getNmsClass("World"), getNmsClass("EntityLiving"))
entityObject = entityClass.getConstructor(getNmsClass("World")).newInstance(world); .newInstance(world, createEntityInstance("Cow"));
break;
default:
entityObject = entityClass.getConstructor(getNmsClass("World")).newInstance(world);
break;
} }
return entityObject; return entityObject;
} catch (Exception e) { } catch (Exception e) {
@ -397,6 +399,7 @@ public class ReflectionManager {
} }
public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile profileWithSkin) { public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile profileWithSkin) {
try { try {
WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName);
gameProfile.getProperties().putAll(profileWithSkin.getProperties()); gameProfile.getProperties().putAll(profileWithSkin.getProperties());

View File

@ -1,6 +1,6 @@
name: LibsDisguises name: LibsDisguises
main: me.libraryaddict.disguise.LibsDisguises main: me.libraryaddict.disguise.LibsDisguises
version: 8.6.7 version: 8.6.8
author: libraryaddict author: libraryaddict
authors: [Byteflux, Navid K.] authors: [Byteflux, Navid K.]
depend: [ProtocolLib] depend: [ProtocolLib]