Update plugin to 1.13, bump maven version, bump java version to 1.8

This commit is contained in:
libraryaddict 2018-08-05 20:34:02 +12:00
parent 992385c2d9
commit 49d716f285
36 changed files with 425 additions and 548 deletions

@ -129,3 +129,5 @@ permissions:
description: See the /disguisemodifyradius command in tab-completion description: See the /disguisemodifyradius command in tab-completion
libsdisguises.seecmd.disguisemodifyentity: libsdisguises.seecmd.disguisemodifyentity:
description: See the /disguisemodifyentity command in tab-completion description: See the /disguisemodifyentity command in tab-completion
api-version: 1.13

10
pom.xml

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>LibsDisguises</groupId> <groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId> <artifactId>LibsDisguises</artifactId>
<version>9.5.2-SNAPSHOT</version> <version>9.6.0-SNAPSHOT</version>
<build> <build>
<sourceDirectory>src</sourceDirectory> <sourceDirectory>src</sourceDirectory>
@ -28,8 +28,8 @@
<properties> <properties>
<maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
@ -43,12 +43,12 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.12-pre6-SNAPSHOT</version> <version>1.13-R0.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.12-pre6-SNAPSHOT</version> <version>1.13-R0.1-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>

@ -7,6 +7,7 @@ import com.comphenix.protocol.wrappers.EnumWrappers.NativeGameMode;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.PlayerInfoData; import com.comphenix.protocol.wrappers.PlayerInfoData;
import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;

@ -39,6 +39,18 @@ public class LibsDisguises extends JavaPlugin {
LibsPremium.check(getDescription().getVersion()); LibsPremium.check(getDescription().getVersion());
if (ReflectionManager.getMinecraftVersion().startsWith("1.13")) {
if (!LibsPremium.isPremium()) {
System.out.println("[LibsDisguises] You must purchase the plugin to use 1.13!");
System.out.println(
"[LibsDisguises] This will be released free two weeks after all bugs have been fixed!");
System.out.println(
"[LibsDisguises] If you've already purchased the plugin, place the purchased jar inside the " +
"Lib's Disguises plugin folder");
return;
}
}
PacketsManager.init(this); PacketsManager.init(this);
DisguiseUtilities.init(this); DisguiseUtilities.init(this);
@ -426,6 +438,8 @@ public class LibsDisguises extends JavaPlugin {
continue; continue;
} }
disguiseType.setTypeId(ReflectionManager.getEntityType(nmsEntity));
Entity bukkitEntity = ReflectionManager.getBukkitEntity(nmsEntity); Entity bukkitEntity = ReflectionManager.getBukkitEntity(nmsEntity);
int entitySize = 0; int entitySize = 0;
@ -449,36 +463,34 @@ public class LibsDisguises extends JavaPlugin {
MetaIndex flagType = MetaIndex.getFlag(watcherClass, watch.getIndex()); MetaIndex flagType = MetaIndex.getFlag(watcherClass, watch.getIndex());
if (flagType == null) { if (flagType == null) {
System.err.println("Error finding the FlagType for " + disguiseType.name() + "! Index " + System.err.println("[LibsDisguises] MetaIndex not found for " + disguiseType + "! Index: " +
watch.getIndex() + " can't be found!"); watch.getIndex());
System.err.println( System.err.println("[LibsDisguises] Value: " + watch.getRawValue() + " (" +
"Value is " + watch.getRawValue() + " (" + watch.getRawValue().getClass() + ") (" + watch.getRawValue().getClass() + ") (" + nmsEntity.getClass() + ") & " +
nmsEntity.getClass() + ") & " + watcherClass.getSimpleName()); watcherClass.getSimpleName());
System.err.println("Lib's Disguises will continue to load, but this will not work properly!");
continue; continue;
} }
indexes.remove(flagType); indexes.remove(flagType);
Object obj1 = ReflectionManager.convertInvalidItem(flagType.getDefault()); Object ourValue = ReflectionManager.convertInvalidMeta(flagType.getDefault());
Object obj2 = ReflectionManager.convertInvalidItem(watch.getValue()); Object nmsValue = ReflectionManager.convertInvalidMeta(watch.getValue());
if (obj1 != obj2 && ((obj1 == null || obj2 == null) || obj1.getClass() != obj2.getClass())) { if (ourValue != nmsValue &&
System.err.println("Mismatch of " + "FlagType's for " + disguiseType.name() + "! Index " + ((ourValue == null || nmsValue == null) || ourValue.getClass() != nmsValue.getClass())) {
watch.getIndex() + " has the wrong classtype!"); System.err.println("[LibsDisguises] MetaIndex mismatch for " + disguiseType + "! Index: " +
System.err.println("MetaIndex has the " + "default of " + flagType.getDefault() + " (" + watch.getIndex());
System.err.println("[LibsDisguises] MetaIndex: " + flagType.getDefault() + " (" +
flagType.getDefault().getClass() + ") (" + nmsEntity.getClass() + ") & " + flagType.getDefault().getClass() + ") (" + nmsEntity.getClass() + ") & " +
watcherClass.getSimpleName()); watcherClass.getSimpleName());
System.err.println("Where the internals is " + watch.getRawValue() + " (" + System.err.println("[LibsDisguises] Minecraft: " + watch.getRawValue() + " (" +
watch.getRawValue().getClass()); watch.getRawValue().getClass() + ")");
System.err.println("Lib's Disguises will continue to load, but this will not work properly!");
} }
} }
for (MetaIndex index : indexes) { for (MetaIndex index : indexes) {
System.out.println( System.out.println("[LibsDisguises] " + disguiseType + " has MetaIndex remaining! " +
disguiseType + " has MetaIndex remaining! " + index.getFlagWatcher().getSimpleName() + index.getFlagWatcher().getSimpleName() + " at index " + index.getIndex());
" at index " + index.getIndex());
} }
DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); DisguiseSound sound = DisguiseSound.getType(disguiseType.name());

@ -181,7 +181,8 @@ public enum DisguiseType {
ZOMBIE_VILLAGER; ZOMBIE_VILLAGER;
static { static {
// We set the entity type in this so that we can safely ignore disguisetypes which don't exist in older versions of MC. // We set the entity type in this so that we can safely ignore disguisetypes which don't exist in older
// versions of MC.
// Without erroring up everything. // Without erroring up everything.
for (DisguiseType type : values()) { for (DisguiseType type : values()) {
@ -191,7 +192,8 @@ public enum DisguiseType {
String name; String name;
/* switch (type) { /* switch (type) {
// Disguise item frame isn't supported. So we don't give it a entity type which should prevent it from being.. // Disguise item frame isn't supported. So we don't give it a entity type which should prevent it
from being..
// Usable. // Usable.
case ITEM_FRAME: case ITEM_FRAME:
break; break;
@ -231,6 +233,7 @@ public enum DisguiseType {
private EntityType entityType; private EntityType entityType;
private int objectId = -1, defaultData = 0; private int objectId = -1, defaultData = 0;
private int typeId;
private Class<? extends FlagWatcher> watcherClass; private Class<? extends FlagWatcher> watcherClass;
@ -284,7 +287,11 @@ public enum DisguiseType {
* @return * @return
*/ */
public int getTypeId() { public int getTypeId() {
return (int) getEntityType().getTypeId(); return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
} }
public Class<? extends FlagWatcher> getWatcherClass() { public Class<? extends FlagWatcher> getWatcherClass() {

@ -4,12 +4,17 @@ import com.comphenix.protocol.PacketType.Play.Server;
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.ComponentConverter;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
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 com.google.common.base.Strings;
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 net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -152,8 +157,8 @@ public class FlagWatcher {
} }
} }
// Here we check for if there is a health packet that says they died. // Here we check for if there is a health packet that says they died.
if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null && getDisguise() if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null &&
.getEntity() instanceof Player) { getDisguise().getEntity() instanceof Player) {
for (WrappedWatchableObject watch : newList) { for (WrappedWatchableObject watch : newList) {
// Its a health packet // Its a health packet
if (watch.getIndex() == 6) { if (watch.getIndex() == 6) {
@ -194,7 +199,15 @@ public class FlagWatcher {
} }
public String getCustomName() { public String getCustomName() {
return (String) getData(MetaIndex.ENTITY_CUSTOM_NAME); Optional<WrappedChatComponent> optional = getData(MetaIndex.ENTITY_CUSTOM_NAME);
if (optional.isPresent()) {
BaseComponent[] base = ComponentConverter.fromWrapper(optional.get());
return TextComponent.toLegacyText(base);
}
return null;
} }
protected TargetedDisguise getDisguise() { protected TargetedDisguise getDisguise() {
@ -329,8 +342,8 @@ public class FlagWatcher {
Object value = entityValues.get(data.getIndex()); Object value = entityValues.get(data.getIndex());
if (isEntityAnimationsAdded() && DisguiseConfig if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() &&
.isMetadataPacketsEnabled() && data == MetaIndex.ENTITY_META) { data == MetaIndex.ENTITY_META) {
value = addEntityAnimations((byte) value, value = addEntityAnimations((byte) value,
WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
} }
@ -391,11 +404,16 @@ public class FlagWatcher {
} }
public void setCustomName(String name) { public void setCustomName(String name) {
if (name != null && name.length() > 64) { if (Strings.isNullOrEmpty(name)) {
setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.<WrappedChatComponent>empty());
} else {
if (name.length() > 64) {
name = name.substring(0, 64); name = name.substring(0, 64);
} }
setData(MetaIndex.ENTITY_CUSTOM_NAME, name); setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.of(WrappedChatComponent.fromText(name)));
}
sendData(MetaIndex.ENTITY_CUSTOM_NAME); sendData(MetaIndex.ENTITY_CUSTOM_NAME);
} }
@ -454,8 +472,8 @@ public class FlagWatcher {
} }
protected void sendItemStack(EquipmentSlot slot, ItemStack itemStack) { protected void sendItemStack(EquipmentSlot slot, ItemStack itemStack) {
if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this || getDisguise() if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this ||
.getEntity() == null) getDisguise().getEntity() == null)
return; return;
if (itemStack == null && getDisguise().getEntity() instanceof LivingEntity) { if (itemStack == null && getDisguise().getEntity() instanceof LivingEntity) {

@ -1,15 +1,14 @@
package me.libraryaddict.disguise.disguisetypes; package me.libraryaddict.disguise.disguisetypes;
import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.*;
import com.comphenix.protocol.wrappers.EnumWrappers.Direction; import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.comphenix.protocol.wrappers.Vector3F; import com.comphenix.protocol.wrappers.nbt.NbtBase;
import com.comphenix.protocol.wrappers.WrappedBlockData;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtFactory; import com.comphenix.protocol.wrappers.nbt.NbtFactory;
import com.google.common.base.Optional; import com.comphenix.protocol.wrappers.nbt.NbtType;
import me.libraryaddict.disguise.disguisetypes.watchers.*; import me.libraryaddict.disguise.disguisetypes.watchers.*;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -27,11 +26,8 @@ public class MetaIndex<Y> {
public static MetaIndex<Boolean> AREA_EFFECT_IGNORE_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 2, public static MetaIndex<Boolean> AREA_EFFECT_IGNORE_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 2,
false); false);
public static MetaIndex<Integer> AREA_EFFECT_PARTICLE = new MetaIndex<>(AreaEffectCloudWatcher.class, 3, 0); public static MetaIndex<Particle> AREA_EFFECT_PARTICLE = new MetaIndex<>(AreaEffectCloudWatcher.class,
3, Particle.SPELL_MOB);
public static MetaIndex<Integer> AREA_EFFECT_PARTICLE_PARAM_1 = new MetaIndex<>(AreaEffectCloudWatcher.class, 4, 0);
public static MetaIndex<Integer> AREA_EFFECT_PARTICLE_PARAM_2 = new MetaIndex<>(AreaEffectCloudWatcher.class, 5, 0);
public static MetaIndex<Float> AREA_EFFECT_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 0, 0F); public static MetaIndex<Float> AREA_EFFECT_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 0, 0F);
@ -73,6 +69,8 @@ public class MetaIndex<Y> {
public static MetaIndex<Integer> BOAT_TYPE = new MetaIndex<>(BoatWatcher.class, 3, 0); public static MetaIndex<Integer> BOAT_TYPE = new MetaIndex<>(BoatWatcher.class, 3, 0);
public static MetaIndex<Integer> BOAT_SHAKE = new MetaIndex<>(BoatWatcher.class, 6, 0);
public static MetaIndex<Boolean> CREEPER_IGNITED = new MetaIndex<>(CreeperWatcher.class, 2, false); public static MetaIndex<Boolean> CREEPER_IGNITED = new MetaIndex<>(CreeperWatcher.class, 2, false);
public static MetaIndex<Boolean> CREEPER_POWERED = new MetaIndex<>(CreeperWatcher.class, 1, false); public static MetaIndex<Boolean> CREEPER_POWERED = new MetaIndex<>(CreeperWatcher.class, 1, false);
@ -83,7 +81,7 @@ public class MetaIndex<Y> {
new ItemStack(Material.STONE)); new ItemStack(Material.STONE));
public static MetaIndex<Optional<BlockPosition>> ENDER_CRYSTAL_BEAM = new MetaIndex<>(EnderCrystalWatcher.class, 0, public static MetaIndex<Optional<BlockPosition>> ENDER_CRYSTAL_BEAM = new MetaIndex<>(EnderCrystalWatcher.class, 0,
Optional.<BlockPosition>absent()); Optional.empty());
public static MetaIndex<Boolean> ENDER_CRYSTAL_PLATE = new MetaIndex<>(EnderCrystalWatcher.class, 1, false); public static MetaIndex<Boolean> ENDER_CRYSTAL_PLATE = new MetaIndex<>(EnderCrystalWatcher.class, 1, false);
@ -92,11 +90,12 @@ public class MetaIndex<Y> {
public static MetaIndex<Boolean> ENDERMAN_AGRESSIVE = new MetaIndex<>(EndermanWatcher.class, 1, false); public static MetaIndex<Boolean> ENDERMAN_AGRESSIVE = new MetaIndex<>(EndermanWatcher.class, 1, false);
public static MetaIndex<Optional<WrappedBlockData>> ENDERMAN_ITEM = new MetaIndex<>(EndermanWatcher.class, 0, public static MetaIndex<Optional<WrappedBlockData>> ENDERMAN_ITEM = new MetaIndex<>(EndermanWatcher.class, 0,
Optional.<WrappedBlockData>absent()); Optional.empty());
public static MetaIndex<Integer> ENTITY_AIR_TICKS = new MetaIndex<>(FlagWatcher.class, 1, 0); public static MetaIndex<Integer> ENTITY_AIR_TICKS = new MetaIndex<>(FlagWatcher.class, 1, 0);
public static MetaIndex<String> ENTITY_CUSTOM_NAME = new MetaIndex<>(FlagWatcher.class, 2, ""); public static MetaIndex<Optional<WrappedChatComponent>> ENTITY_CUSTOM_NAME = new MetaIndex<>(FlagWatcher.class, 2,
Optional.empty());
public static MetaIndex<Boolean> ENTITY_CUSTOM_NAME_VISIBLE = new MetaIndex<>(FlagWatcher.class, 3, false); public static MetaIndex<Boolean> ENTITY_CUSTOM_NAME_VISIBLE = new MetaIndex<>(FlagWatcher.class, 3, false);
@ -132,7 +131,7 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> HORSE_META = new MetaIndex<>(AbstractHorseWatcher.class, 0, (byte) 0); public static MetaIndex<Byte> HORSE_META = new MetaIndex<>(AbstractHorseWatcher.class, 0, (byte) 0);
public static MetaIndex<Optional<UUID>> HORSE_OWNER = new MetaIndex<>(AbstractHorseWatcher.class, 1, public static MetaIndex<Optional<UUID>> HORSE_OWNER = new MetaIndex<>(AbstractHorseWatcher.class, 1,
Optional.<UUID>absent()); Optional.empty());
public static MetaIndex<Byte> ILLAGER_META = new MetaIndex<>(IllagerWatcher.class, 0, (byte) 0); public static MetaIndex<Byte> ILLAGER_META = new MetaIndex<>(IllagerWatcher.class, 0, (byte) 0);
@ -181,7 +180,7 @@ public class MetaIndex<Y> {
public static MetaIndex<Boolean> PIG_SADDLED = new MetaIndex<>(PigWatcher.class, 0, false); public static MetaIndex<Boolean> PIG_SADDLED = new MetaIndex<>(PigWatcher.class, 0, false);
public static MetaIndex<Integer> PIG_UNKNOWN = new MetaIndex<>(PigWatcher.class, 1, 0); public static MetaIndex<Integer> PIG_BOOST = new MetaIndex<>(PigWatcher.class, 1, 0);
public static MetaIndex<Float> PLAYER_ABSORPTION = new MetaIndex<>(PlayerWatcher.class, 0, 0F); public static MetaIndex<Float> PLAYER_ABSORPTION = new MetaIndex<>(PlayerWatcher.class, 0, 0F);
@ -191,11 +190,11 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> PLAYER_SKIN = new MetaIndex<>(PlayerWatcher.class, 2, (byte) 127); public static MetaIndex<Byte> PLAYER_SKIN = new MetaIndex<>(PlayerWatcher.class, 2, (byte) 127);
public static MetaIndex<NbtCompound> PLAYER_LEFT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 4, public static MetaIndex<NbtBase> PLAYER_LEFT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 4,
NbtFactory.ofCompound("None")); NbtFactory.ofWrapper(NbtType.TAG_COMPOUND, "None"));
public static MetaIndex<NbtCompound> PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5, public static MetaIndex<NbtBase> PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5,
NbtFactory.ofCompound("None")); NbtFactory.ofWrapper(NbtType.TAG_COMPOUND, "None"));
public static MetaIndex<Boolean> POLAR_BEAR_STANDING = new MetaIndex<>(PolarBearWatcher.class, 0, false); public static MetaIndex<Boolean> POLAR_BEAR_STANDING = new MetaIndex<>(PolarBearWatcher.class, 0, false);
@ -204,7 +203,7 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> SHEEP_WOOL = new MetaIndex<>(SheepWatcher.class, 0, (byte) 0); public static MetaIndex<Byte> SHEEP_WOOL = new MetaIndex<>(SheepWatcher.class, 0, (byte) 0);
public static MetaIndex<Optional<BlockPosition>> SHULKER_ATTACHED = new MetaIndex<>(ShulkerWatcher.class, 1, public static MetaIndex<Optional<BlockPosition>> SHULKER_ATTACHED = new MetaIndex<>(ShulkerWatcher.class, 1,
Optional.<BlockPosition>absent()); Optional.empty());
public static MetaIndex<Byte> SHULKER_COLOR = new MetaIndex<>(ShulkerWatcher.class, 3, (byte) 10); public static MetaIndex<Byte> SHULKER_COLOR = new MetaIndex<>(ShulkerWatcher.class, 3, (byte) 10);
@ -225,7 +224,7 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> TAMEABLE_META = new MetaIndex<>(TameableWatcher.class, 0, (byte) 0); public static MetaIndex<Byte> TAMEABLE_META = new MetaIndex<>(TameableWatcher.class, 0, (byte) 0);
public static MetaIndex<Optional<UUID>> TAMEABLE_OWNER = new MetaIndex<>(TameableWatcher.class, 1, public static MetaIndex<Optional<UUID>> TAMEABLE_OWNER = new MetaIndex<>(TameableWatcher.class, 1,
Optional.<UUID>absent()); Optional.empty());
public static MetaIndex<Integer> TIPPED_ARROW_COLOR = new MetaIndex<>(ArrowWatcher.class, 1, Color.WHITE.asRGB()); public static MetaIndex<Integer> TIPPED_ARROW_COLOR = new MetaIndex<>(ArrowWatcher.class, 1, Color.WHITE.asRGB());
@ -259,6 +258,8 @@ public class MetaIndex<Y> {
public static MetaIndex<Boolean> ZOMBIE_BABY = new MetaIndex<>(ZombieWatcher.class, 0, false); public static MetaIndex<Boolean> ZOMBIE_BABY = new MetaIndex<>(ZombieWatcher.class, 0, false);
public static MetaIndex<Boolean> ZOMBIE_CONVERTING_DROWNED = new MetaIndex<>(ZombieWatcher.class, 3, false);
public static MetaIndex<Integer> ZOMBIE_PLACEHOLDER = new MetaIndex<>(ZombieWatcher.class, 1, 0); public static MetaIndex<Integer> ZOMBIE_PLACEHOLDER = new MetaIndex<>(ZombieWatcher.class, 1, 0);
public static MetaIndex<Integer> ZOMBIE_VILLAGER_PROFESSION = new MetaIndex<>(ZombieVillagerWatcher.class, 1, 0); public static MetaIndex<Integer> ZOMBIE_VILLAGER_PROFESSION = new MetaIndex<>(ZombieVillagerWatcher.class, 1, 0);
@ -273,10 +274,13 @@ public class MetaIndex<Y> {
catch (Exception ex) { catch (Exception ex) {
SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, new ItemStack(Material.POTION)); SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, new ItemStack(Material.POTION));
} }
setValues(); setValues();
orderMetaIndexes();
} }
public static void eliminateBlankIndexes() { @Deprecated
private static void eliminateBlankIndexes() {
ArrayList<Entry<Class, ArrayList<MetaIndex>>> list = new ArrayList<>(); ArrayList<Entry<Class, ArrayList<MetaIndex>>> list = new ArrayList<>();
for (MetaIndex index : values()) { for (MetaIndex index : values()) {
@ -292,6 +296,7 @@ public class MetaIndex<Y> {
if (entry == null) { if (entry == null) {
entry = new AbstractMap.SimpleEntry(index.getFlagWatcher(), new ArrayList<MetaIndex>()); entry = new AbstractMap.SimpleEntry(index.getFlagWatcher(), new ArrayList<MetaIndex>());
list.add(entry); list.add(entry);
} }
@ -299,12 +304,7 @@ public class MetaIndex<Y> {
} }
for (Entry<Class, ArrayList<MetaIndex>> entry : list) { for (Entry<Class, ArrayList<MetaIndex>> entry : list) {
Collections.sort(entry.getValue(), new Comparator<MetaIndex>() { entry.getValue().sort(Comparator.comparingInt(MetaIndex::getIndex));
@Override
public int compare(MetaIndex o1, MetaIndex o2) {
return o1.getIndex() - o2.getIndex();
}
});
for (MetaIndex ind : entry.getValue()) { for (MetaIndex ind : entry.getValue()) {
ind._index = entry.getValue().indexOf(ind); ind._index = entry.getValue().indexOf(ind);
@ -312,7 +312,7 @@ public class MetaIndex<Y> {
} }
} }
public static void orderMetaIndexes() { private static void orderMetaIndexes() {
for (MetaIndex flagType : values()) { for (MetaIndex flagType : values()) {
if (flagType.getFlagWatcher() == FlagWatcher.class) if (flagType.getFlagWatcher() == FlagWatcher.class)
continue; continue;
@ -349,10 +349,10 @@ public class MetaIndex<Y> {
continue; continue;
if (found != null) { if (found != null) {
System.err.println(entry.getKey() System.err.println(
.getSimpleName() + " has multiple FlagType's registered for the index " + i + " (" + type entry.getKey().getSimpleName() + " has multiple FlagType's registered for the index " +
.getFlagWatcher().getSimpleName() + ", " + found.getFlagWatcher() i + " (" + type.getFlagWatcher().getSimpleName() + ", " +
.getSimpleName() + ")"); found.getFlagWatcher().getSimpleName() + ")");
continue loop; continue loop;
} }
@ -377,15 +377,16 @@ public class MetaIndex<Y> {
MetaIndex index = (MetaIndex) field.get(null); MetaIndex index = (MetaIndex) field.get(null);
toPrint.add(index.getFlagWatcher().getSimpleName() + " " + field.getName() + " " + index toPrint.add(
.getIndex() + " " + index.getDefault().getClass().getSimpleName()); index.getFlagWatcher().getSimpleName() + " " + field.getName() + " " + index.getIndex() + " " +
index.getDefault().getClass().getSimpleName());
} }
} }
catch (Exception ex) { catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
Collections.sort(toPrint, String.CASE_INSENSITIVE_ORDER); toPrint.sort(String.CASE_INSENSITIVE_ORDER);
for (String s : toPrint) { for (String s : toPrint) {
System.out.println(s); System.out.println(s);
@ -416,12 +417,7 @@ public class MetaIndex<Y> {
list.add(type); list.add(type);
} }
Collections.sort(list, new Comparator<MetaIndex>() { list.sort(Comparator.comparingInt(MetaIndex::getIndex));
@Override
public int compare(MetaIndex o1, MetaIndex o2) {
return Integer.compare(o1.getIndex(), o2.getIndex());
}
});
return list; return list;
} }
@ -460,15 +456,15 @@ public class MetaIndex<Y> {
} }
for (MetaIndex metaIndex : values()) { for (MetaIndex metaIndex : values()) {
if (metaIndex == null || metaIndex.getFlagWatcher() != index.getFlagWatcher() || metaIndex if (metaIndex == null || metaIndex.getFlagWatcher() != index.getFlagWatcher() ||
.getIndex() != index.getIndex()) { metaIndex.getIndex() != index.getIndex()) {
continue; continue;
} }
System.err.println("[LibsDisguises] MetaIndex " + metaIndex.getFlagWatcher() System.err.println(
.getSimpleName() + " at index " + metaIndex "[LibsDisguises] MetaIndex " + metaIndex.getFlagWatcher().getSimpleName() + " at index " +
.getIndex() + " has already registered this! (" + metaIndex.getDefault() + "," + index metaIndex.getIndex() + " has already registered this! (" + metaIndex.getDefault() +
.getDefault() + ")"); "," + index.getDefault() + ")");
} }
values()[i] = metaIndexes[a]; values()[i] = metaIndexes[a];

@ -1,16 +1,16 @@
package me.libraryaddict.disguise.disguisetypes; package me.libraryaddict.disguise.disguisetypes;
import java.security.InvalidParameterException;
import org.bukkit.Art;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.PaintingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.PaintingWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SplashPotionWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.SplashPotionWatcher;
import org.bukkit.Art;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.security.InvalidParameterException;
public class MiscDisguise extends TargetedDisguise { public class MiscDisguise extends TargetedDisguise {
private int id = -1, data = 0; private int id = -1, data = 0;
@ -19,6 +19,18 @@ public class MiscDisguise extends TargetedDisguise {
this(disguiseType, -1, disguiseType.getDefaultData()); this(disguiseType, -1, disguiseType.getDefaultData());
} }
public MiscDisguise(Material material, int data) {
super(DisguiseType.DROPPED_ITEM);
apply(0, 0, new ItemStack(material, 1, (short) data));
}
public MiscDisguise(ItemStack itemStack) {
super(DisguiseType.DROPPED_ITEM);
apply(0, 0, itemStack);
}
public MiscDisguise(DisguiseType disguiseType, int id) { public MiscDisguise(DisguiseType disguiseType, int id) {
this(disguiseType, id, disguiseType.getDefaultData()); this(disguiseType, id, disguiseType.getDefaultData());
} }
@ -28,34 +40,37 @@ public class MiscDisguise extends TargetedDisguise {
if (!disguiseType.isMisc()) { if (!disguiseType.isMisc()) {
throw new InvalidParameterException( throw new InvalidParameterException(
"Expected a non-living DisguiseType while constructing MiscDisguise. Received " + disguiseType + " instead. Please use " + ( "Expected a non-living DisguiseType while constructing MiscDisguise. Received " + disguiseType +
disguiseType.isPlayer() ? "PlayerDisguise" : "MobDisguise") + " instead"); " instead. Please use " + (disguiseType.isPlayer() ? "PlayerDisguise" : "MobDisguise") +
" instead");
} }
apply(id, data, new ItemStack(Material.STONE));
}
private void apply(int id, int data, ItemStack itemStack) {
createDisguise(); createDisguise();
this.id = getType().getTypeId(); this.id = getType().getTypeId();
this.data = getType().getDefaultData(); this.data = getType().getDefaultData();
switch (disguiseType) {
switch (getType()) {
// The only disguises which should use a custom data. // The only disguises which should use a custom data.
case PAINTING: case PAINTING:
((PaintingWatcher) getWatcher()).setArt(Art.values()[Math.max(0, id) % Art.values().length]); ((PaintingWatcher) getWatcher()).setArt(Art.values()[Math.max(0, id) % Art.values().length]);
break; break;
case FALLING_BLOCK: case FALLING_BLOCK:
((FallingBlockWatcher) getWatcher()).setBlock( ((FallingBlockWatcher) getWatcher()).setBlock(itemStack);
new ItemStack(Math.max(1, id), 1, (short) Math.max(0, data)));
break; break;
case SPLASH_POTION: case SPLASH_POTION:
((SplashPotionWatcher) getWatcher()).setPotionId(Math.max(0, id)); ((SplashPotionWatcher) getWatcher()).setPotionId(Math.max(0, id));
break; break;
case DROPPED_ITEM: case DROPPED_ITEM:
((DroppedItemWatcher) getWatcher()).setItemStack(itemStack);
if (id > 0) {
((DroppedItemWatcher) getWatcher()).setItemStack(new ItemStack(id, Math.max(1, data)));
}
break; break;
case FISHING_HOOK: // Entity ID of whoever is holding fishing rod case FISHING_HOOK: // Entity ID of whoever is holding fishing rod
case ARROW: // Entity ID of shooter. Used for "Is he on this scoreboard team and do I render it moving through his body?" case ARROW: // Entity ID of shooter. Used for "Is he on this scoreboard team and do I render it moving
// through his body?"
case TIPPED_ARROW: case TIPPED_ARROW:
case SPECTRAL_ARROW: case SPECTRAL_ARROW:
case SMALL_FIREBALL: // Unknown. Uses entity id of shooter. 0 if no shooter case SMALL_FIREBALL: // Unknown. Uses entity id of shooter. 0 if no shooter
@ -116,8 +131,9 @@ public class MiscDisguise extends TargetedDisguise {
*/ */
public int getId() { public int getId() {
if (getType() == DisguiseType.FALLING_BLOCK) { if (getType() == DisguiseType.FALLING_BLOCK) {
return ((FallingBlockWatcher) getWatcher()).getBlock().getTypeId(); return ((FallingBlockWatcher) getWatcher()).getBlock().getType().ordinal();
} }
return id; return id;
} }

@ -1,12 +1,11 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import java.util.UUID;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import java.util.Optional;
import java.util.UUID;
public abstract class AbstractHorseWatcher extends AgeableWatcher { public abstract class AbstractHorseWatcher extends AgeableWatcher {
public AbstractHorseWatcher(Disguise disguise) { public AbstractHorseWatcher(Disguise disguise) {
super(disguise); super(disguise);

@ -1,8 +1,9 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.Particle;
/** /**
* @author Navid * @author Navid
@ -27,10 +28,6 @@ public class AreaEffectCloudWatcher extends FlagWatcher {
return getData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS); return getData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS);
} }
public int getParticleId() {
return getData(MetaIndex.AREA_EFFECT_PARTICLE);
}
public void setRadius(float radius) { public void setRadius(float radius) {
if (radius > 30) if (radius > 30)
radius = 30; radius = 30;
@ -49,8 +46,12 @@ public class AreaEffectCloudWatcher extends FlagWatcher {
sendData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS); sendData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS);
} }
public void setParticleId(int particleId) { public void setParticleType(Particle particle) {
setData(MetaIndex.AREA_EFFECT_PARTICLE, particleId); setData(MetaIndex.AREA_EFFECT_PARTICLE, particle);
sendData(MetaIndex.AREA_EFFECT_PARTICLE); sendData(MetaIndex.AREA_EFFECT_PARTICLE);
} }
public Particle getParticleType() {
return getData(MetaIndex.AREA_EFFECT_PARTICLE);
}
} }

@ -1,10 +1,9 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import org.bukkit.TreeSpecies;
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 me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.TreeSpecies;
public class BoatWatcher extends FlagWatcher { public class BoatWatcher extends FlagWatcher {
public BoatWatcher(Disguise disguise) { public BoatWatcher(Disguise disguise) {
@ -45,8 +44,16 @@ public class BoatWatcher extends FlagWatcher {
sendData(MetaIndex.BOAT_TYPE); sendData(MetaIndex.BOAT_TYPE);
} }
public void setBoatShake(int number) {
setData(MetaIndex.BOAT_SHAKE, number);
sendData(MetaIndex.BOAT_SHAKE);
}
public int getBoatShake() {
return getData(MetaIndex.BOAT_SHAKE);
}
public TreeSpecies getBoatType() { public TreeSpecies getBoatType() {
return TreeSpecies.getByData(getData(MetaIndex.BOAT_TYPE).byteValue()); return TreeSpecies.getByData(getData(MetaIndex.BOAT_TYPE).byteValue());
} }
} }

@ -1,11 +1,11 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.BlockPosition;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import java.util.Optional;
/** /**
* @author Navid * @author Navid

@ -1,85 +1,60 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import com.comphenix.protocol.wrappers.WrappedBlockData;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.wrappers.WrappedBlockData; import java.util.Optional;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.Disguise; public class EndermanWatcher extends InsentientWatcher {
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
public class EndermanWatcher extends InsentientWatcher public EndermanWatcher(Disguise disguise) {
{
public EndermanWatcher(Disguise disguise)
{
super(disguise); super(disguise);
} }
@Override @Override
public ItemStack getItemInMainHand() public ItemStack getItemInMainHand() {
{
Optional<WrappedBlockData> value = getData(MetaIndex.ENDERMAN_ITEM); Optional<WrappedBlockData> value = getData(MetaIndex.ENDERMAN_ITEM);
if (value.isPresent()) if (value.isPresent()) {
{
WrappedBlockData pair = value.get(); WrappedBlockData pair = value.get();
Material id = pair.getType(); Material id = pair.getType();
int data = pair.getData(); int data = pair.getData();
return new ItemStack(id, 1, (short) data); return new ItemStack(id, 1, (short) data);
} } else {
else
{
return null; return null;
} }
} }
@Override @Override
public void setItemInMainHand(ItemStack itemstack) public void setItemInMainHand(ItemStack itemstack) {
{ setItemInMainHand(itemstack.getType(), itemstack.getDurability());
setItemInMainHand(itemstack.getTypeId(), itemstack.getDurability());
} }
@Deprecated public void setItemInMainHand(Material type) {
public void setItemInMainHand(int typeId)
{
setItemInMainHand(typeId, 0);
}
public void setItemInMainHand(Material type)
{
setItemInMainHand(type, 0); setItemInMainHand(type, 0);
} }
public void setItemInMainHand(Material type, int data) public void setItemInMainHand(Material type, int data) {
{
Optional<WrappedBlockData> optional; Optional<WrappedBlockData> optional;
if (type == null) if (type == null)
optional = Optional.<WrappedBlockData> absent(); optional = Optional.empty();
else else
optional = Optional.<WrappedBlockData> of(WrappedBlockData.createData(type, data)); optional = Optional.of(WrappedBlockData.createData(type, data));
setData(MetaIndex.ENDERMAN_ITEM, optional); setData(MetaIndex.ENDERMAN_ITEM, optional);
} }
@Deprecated public boolean isAggressive() {
public void setItemInMainHand(int typeId, int data)
{
setItemInMainHand(Material.getMaterial(typeId), data);
}
public boolean isAggressive()
{
return getData(MetaIndex.ENDERMAN_AGRESSIVE); return getData(MetaIndex.ENDERMAN_AGRESSIVE);
} }
public void setAggressive(boolean isAggressive) public void setAggressive(boolean isAggressive) {
{
setData(MetaIndex.ENDERMAN_AGRESSIVE, isAggressive); setData(MetaIndex.ENDERMAN_AGRESSIVE, isAggressive);
sendData(MetaIndex.ENDERMAN_AGRESSIVE); sendData(MetaIndex.ENDERMAN_AGRESSIVE);
} }
} }

@ -26,11 +26,11 @@ public class HorseWatcher extends AbstractHorseWatcher {
switch (horseValue) { switch (horseValue) {
case 1: case 1:
return new ItemStack(Material.IRON_BARDING); return new ItemStack(Material.IRON_HORSE_ARMOR);
case 2: case 2:
return new ItemStack(Material.GOLD_BARDING); return new ItemStack(Material.GOLDEN_HORSE_ARMOR);
case 3: case 3:
return new ItemStack(Material.DIAMOND_BARDING); return new ItemStack(Material.DIAMOND_HORSE_ARMOR);
default: default:
break; break;
} }
@ -67,13 +67,13 @@ public class HorseWatcher extends AbstractHorseWatcher {
if (item != null) { if (item != null) {
Material mat = item.getType(); Material mat = item.getType();
if (mat == Material.IRON_BARDING) { if (mat == Material.IRON_HORSE_ARMOR) {
value = 1; value = 1;
} }
else if (mat == Material.GOLD_BARDING) { else if (mat == Material.GOLDEN_HORSE_ARMOR) {
value = 2; value = 2;
} }
else if (mat == Material.DIAMOND_BARDING) { else if (mat == Material.DIAMOND_HORSE_ARMOR) {
value = 3; value = 3;
} }
} }

@ -1,56 +1,43 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.ReflectionManager;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import me.libraryaddict.disguise.disguisetypes.Disguise; public class MinecartWatcher extends FlagWatcher {
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
public class MinecartWatcher extends FlagWatcher public MinecartWatcher(Disguise disguise) {
{
public MinecartWatcher(Disguise disguise)
{
super(disguise); super(disguise);
} }
public ItemStack getBlockInCart() public ItemStack getBlockInCart() {
{ return ReflectionManager.getItemStackByCombinedId(getData(MetaIndex.MINECART_BLOCK));
int id = (int) getData(MetaIndex.MINECART_BLOCK) & 0xffff;
int data = (int) getData(MetaIndex.MINECART_BLOCK) >> 16;
return new ItemStack(id, 1, (short) data);
} }
public int getBlockYOffset() public int getBlockYOffset() {
{ return getData(MetaIndex.MINECART_BLOCK_Y);
return (int) getData(MetaIndex.MINECART_BLOCK_Y);
} }
public boolean isViewBlockInCart() public boolean isViewBlockInCart() {
{ return getData(MetaIndex.MINECART_BLOCK_VISIBLE);
return (boolean) getData(MetaIndex.MINECART_BLOCK_VISIBLE);
} }
public void setBlockInCart(ItemStack item) public void setBlockInCart(ItemStack item) {
{ setData(MetaIndex.MINECART_BLOCK, ReflectionManager.getCombinedIdByItemStack(item));
int id = item.getTypeId(); setData(MetaIndex.MINECART_BLOCK_VISIBLE, item != null && item.getType() != Material.AIR);
int data = item.getDurability();
setData(MetaIndex.MINECART_BLOCK, id & 0xffff | data << 16); sendData(MetaIndex.MINECART_BLOCK, MetaIndex.MINECART_BLOCK_VISIBLE);
setData(MetaIndex.MINECART_BLOCK_VISIBLE, true); // Show block
sendData(MetaIndex.MINECART_BLOCK);
} }
public void setBlockOffset(int i) public void setBlockOffset(int i) {
{
setData(MetaIndex.MINECART_BLOCK_Y, i); setData(MetaIndex.MINECART_BLOCK_Y, i);
sendData(MetaIndex.MINECART_BLOCK_Y); sendData(MetaIndex.MINECART_BLOCK_Y);
} }
public void setViewBlockInCart(boolean viewBlock) public void setViewBlockInCart(boolean viewBlock) {
{
setData(MetaIndex.MINECART_BLOCK_VISIBLE, viewBlock); setData(MetaIndex.MINECART_BLOCK_VISIBLE, viewBlock);
sendData(MetaIndex.MINECART_BLOCK_VISIBLE); sendData(MetaIndex.MINECART_BLOCK_VISIBLE);
} }

@ -10,20 +10,11 @@ public class PigWatcher extends AgeableWatcher {
} }
public boolean isSaddled() { public boolean isSaddled() {
return (boolean) getData(MetaIndex.PIG_SADDLED); return getData(MetaIndex.PIG_SADDLED);
} }
public void setSaddled(boolean isSaddled) { public void setSaddled(boolean isSaddled) {
setData(MetaIndex.PIG_SADDLED, isSaddled); setData(MetaIndex.PIG_SADDLED, isSaddled);
sendData(MetaIndex.PIG_SADDLED); sendData(MetaIndex.PIG_SADDLED);
} }
/* public int getUnknown() {
return getData(FlagType.PIG_UNKNOWN);
}
public void setUnknown(int unknown) {
setData(FlagType.PIG_UNKNOWN, unknown);
sendData(FlagType.PIG_UNKNOWN);
}*/
} }

@ -1,14 +1,13 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import org.bukkit.block.BlockFace;
import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.BlockPosition;
import com.comphenix.protocol.wrappers.EnumWrappers.Direction; import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.google.common.base.Optional;
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.MetaIndex; import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.block.BlockFace;
import java.util.Optional;
/** /**
* @author Navid * @author Navid

@ -1,12 +1,11 @@
package me.libraryaddict.disguise.disguisetypes.watchers; package me.libraryaddict.disguise.disguisetypes.watchers;
import java.util.UUID;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import java.util.Optional;
import java.util.UUID;
public class TameableWatcher extends AgeableWatcher public class TameableWatcher extends AgeableWatcher
{ {
public TameableWatcher(Disguise disguise) public TameableWatcher(Disguise disguise)

@ -39,4 +39,12 @@ public class ZombieWatcher extends InsentientWatcher {
sendData(MetaIndex.ZOMBIE_AGGRESSIVE); sendData(MetaIndex.ZOMBIE_AGGRESSIVE);
} }
public boolean isConverting() {
return getData(MetaIndex.ZOMBIE_CONVERTING_DROWNED);
}
public void setConverting(boolean converting) {
setData(MetaIndex.ZOMBIE_CONVERTING_DROWNED, converting);
sendData(MetaIndex.ZOMBIE_CONVERTING_DROWNED);
}
} }

@ -7,6 +7,7 @@ import me.libraryaddict.disguise.disguisetypes.*;
import org.bukkit.Art; import org.bukkit.Art;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
@ -22,6 +23,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
public class DisguiseParser { public class DisguiseParser {
public static class DisguiseParseException extends Exception { public static class DisguiseParseException extends Exception {
@ -110,13 +112,7 @@ public class DisguiseParser {
if (disguiseType != other.disguiseType) if (disguiseType != other.disguiseType)
return false; return false;
if (permName == null) { return Objects.equals(permName, other.permName);
if (other.permName != null)
return false;
} else if (!permName.equals(other.permName))
return false;
return true;
} }
} }
@ -585,6 +581,7 @@ public class DisguiseParser {
disguise = new MobDisguise(disguisePerm.getType(), adult); disguise = new MobDisguise(disguisePerm.getType(), adult);
} else if (disguisePerm.isMisc()) { } else if (disguisePerm.isMisc()) {
// Its a misc, we are going to use the MiscDisguise constructor. // Its a misc, we are going to use the MiscDisguise constructor.
ItemStack itemStack = new ItemStack(Material.STONE);
int miscId = -1; int miscId = -1;
int miscData = -1; int miscData = -1;
String secondArg = null; String secondArg = null;
@ -607,6 +604,7 @@ public class DisguiseParser {
disguisePerm.getType() == DisguiseType.DROPPED_ITEM) { disguisePerm.getType() == DisguiseType.DROPPED_ITEM) {
for (Material mat : Material.values()) { for (Material mat : Material.values()) {
if (mat.name().replace("_", "").equalsIgnoreCase(args[1].replace("_", ""))) { if (mat.name().replace("_", "").equalsIgnoreCase(args[1].replace("_", ""))) {
itemStack = new ItemStack(mat);
miscId = mat.getId(); miscId = mat.getId();
break; break;
} }
@ -681,11 +679,16 @@ public class DisguiseParser {
doCheck(sender, optionPermissions, usedOptions); doCheck(sender, optionPermissions, usedOptions);
} }
} }
// Construct the disguise // Construct the disguise
if (disguisePerm.getType() == DisguiseType.DROPPED_ITEM) {
disguise = new MiscDisguise(itemStack);
} else {
disguise = new MiscDisguise(disguisePerm.getType(), miscId, miscData); disguise = new MiscDisguise(disguisePerm.getType(), miscId, miscData);
} }
} }
} }
}
// Copy strings to their new range // Copy strings to their new range
String[] newArgs = new String[args.length - toSkip]; String[] newArgs = new String[args.length - toSkip];
@ -888,6 +891,7 @@ public class DisguiseParser {
break; break;
} }
} }
if (value == null) { if (value == null) {
throw new Exception(); throw new Exception();
} }
@ -907,8 +911,26 @@ public class DisguiseParser {
catch (Exception ex) { catch (Exception ex) {
throw parseToException(param, valueString, methodName); throw parseToException(param, valueString, methodName);
} }
} else if (param.getName().equals("org.bukkit.entity.Parrot$Variant")) { } else if (param == Parrot.Variant.class) {
value = callValueOf(param, valueString, methodName); value = callValueOf(param, valueString, methodName);
} else if (param == Particle.class) {
try {
for (Particle type : Particle.values()) {
if (type.name().replace("_", "")
.equalsIgnoreCase(valueString.replace("_", "").replace(" ", ""))) {
value = type;
break;
}
}
if (value == null) {
throw new Exception();
}
}
catch (Exception ex) {
throw parseToException(param, valueString, methodName);
}
} }
} }
@ -979,21 +1001,13 @@ public class DisguiseParser {
private static ItemStack parseToItemstack(Class param, String method, String string) throws DisguiseParseException { private static ItemStack parseToItemstack(Class param, String method, String string) throws DisguiseParseException {
String[] split = string.split(":", -1); String[] split = string.split(":", -1);
int itemId = -1;
if (split[0].isEmpty() || split[0].equalsIgnoreCase("null")) { if (split[0].isEmpty() || split[0].equalsIgnoreCase("null")) {
return null; return null;
} else if (isInteger(split[0])) {
itemId = Integer.parseInt(split[0]);
} else {
try {
itemId = Material.valueOf(split[0].toUpperCase()).getId();
}
catch (Exception ignored) {
}
} }
if (itemId != -1) { Material material = Material.getMaterial(split[0]);
if (material != null) {
short itemDura = 0; short itemDura = 0;
int amount = 1; int amount = 1;
boolean enchanted = false; boolean enchanted = false;
@ -1018,7 +1032,7 @@ public class DisguiseParser {
} }
} }
ItemStack itemStack = new ItemStack(itemId, amount, itemDura); ItemStack itemStack = new ItemStack(material, amount, itemDura);
if (enchanted) { if (enchanted) {
itemStack.addUnsafeEnchantment(Enchantment.DURABILITY, 1); itemStack.addUnsafeEnchantment(Enchantment.DURABILITY, 1);

@ -23,8 +23,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher;
import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets;
import me.libraryaddict.disguise.utilities.backwards.BackwardMethods;
import me.libraryaddict.disguise.utilities.backwards.BackwardsSupport;
import me.libraryaddict.disguise.utilities.json.*; import me.libraryaddict.disguise.utilities.json.*;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -50,10 +48,7 @@ import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.reflect.Array; import java.lang.reflect.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -81,7 +76,6 @@ public class DisguiseUtilities {
private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File( private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File(
"plugins/LibsDisguises/SavedDisguises"); "plugins/LibsDisguises/SavedDisguises");
private static Gson gson; private static Gson gson;
private static BackwardMethods methods;
private static boolean pluginsUsed, commandsUsed; private static boolean pluginsUsed, commandsUsed;
private static long libsDisguisesCalled; private static long libsDisguisesCalled;
@ -851,7 +845,6 @@ public class DisguiseUtilities {
public static void init(LibsDisguises disguises) { public static void init(LibsDisguises disguises) {
libsDisguises = disguises; libsDisguises = disguises;
methods = BackwardsSupport.getMethods();
GsonBuilder gsonBuilder = new GsonBuilder(); GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MetaIndex.class, new SerializerMetaIndex()); gsonBuilder.registerTypeAdapter(MetaIndex.class, new SerializerMetaIndex());
@ -867,21 +860,43 @@ public class DisguiseUtilities {
try { try {
Object server = ReflectionManager.getNmsMethod("MinecraftServer", "getServer").invoke(null); Object server = ReflectionManager.getNmsMethod("MinecraftServer", "getServer").invoke(null);
Object world = ((List) server.getClass().getField("worlds").get(server)).get(0); Object world = ((List) server.getClass().getField("worlds").get(server)).get(0);
Class chunkClass = ReflectionManager.getNmsClass("Chunk");
Object bedChunk = null;
Object bedChunk = ReflectionManager.getNmsClass("Chunk") for (Constructor constructor : chunkClass.getConstructors()) {
.getConstructor(ReflectionManager.getNmsClass("World"), int.class, int.class) if (constructor.getParameterTypes().length != 8)
.newInstance(world, 0, 0); continue;
Field cSection = bedChunk.getClass().getDeclaredField("sections"); bedChunk = constructor
.newInstance(world, 0, 0, Array.newInstance(ReflectionManager.getNmsClass("BiomeBase"), 0),
null, null, null, 0L);
break;
}
if (bedChunk == null) {
throw new IllegalStateException("[LibsDisguises] Cannot find constructor to create world chunk");
}
Field cSection = chunkClass.getDeclaredField("sections");
cSection.setAccessible(true); cSection.setAccessible(true);
Object chunkSection = ReflectionManager.getNmsClass("ChunkSection").getConstructor(int.class, boolean.class) Object chunkSection = ReflectionManager.getNmsClass("ChunkSection").getConstructor(int.class, boolean.class)
.newInstance(0, true); .newInstance(0, true);
Object block = ReflectionManager.getNmsClass("Block").getMethod("getById", int.class) Class blockClass = ReflectionManager.getNmsClass("Block");
.invoke(null, Material.BED_BLOCK.getId());
Object block = blockClass.getMethod("getByName", String.class).invoke(null, "white_bed");
Object blockData = ReflectionManager.getNmsMethod(blockClass, "getBlockData").invoke(block);
Method method = null;
for (Method method1 : blockData.getClass().getMethods()) {
if (!method1.getName().equals("set") || method1.getParameterTypes().length != 2)
continue;
method = method1;
break;
}
Method fromLegacyData = block.getClass().getMethod("fromLegacyData", int.class);
Method setType = chunkSection.getClass() Method setType = chunkSection.getClass()
.getMethod("setType", int.class, int.class, int.class, ReflectionManager.getNmsClass("IBlockData")); .getMethod("setType", int.class, int.class, int.class, ReflectionManager.getNmsClass("IBlockData"));
Method setSky = chunkSection.getClass().getMethod("a", int.class, int.class, int.class, int.class); Method setSky = chunkSection.getClass().getMethod("a", int.class, int.class, int.class, int.class);
@ -889,10 +904,12 @@ public class DisguiseUtilities {
for (BlockFace face : new BlockFace[]{BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH}) { for (BlockFace face : new BlockFace[]{BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH}) {
int x = 1 + face.getModX(); int x = 1 + face.getModX();
int z = 1 + face.getModZ(); int z = 1 + face.getModZ();
setType.invoke(chunkSection, x, 0, z, fromLegacyData.invoke(block, face.ordinal())); Object data = method.invoke(blockData, block.getClass().getField("FACING").get(null),
ReflectionManager.getEnumDirection(face.ordinal()));
setType.invoke(chunkSection, x, 0, z, data);
} }
Object[] array = (Object[]) Array.newInstance(chunkSection.getClass(), 16); Object[] array = (Object[]) Array.newInstance(chunkSection.getClass(), 16);
@ -1018,9 +1035,7 @@ public class DisguiseUtilities {
} }
catch ( catch (
Exception ex) Exception ex) {
{
ex.printStackTrace(); ex.printStackTrace();
} }
} }

@ -38,7 +38,7 @@ public class LibsPremium {
public static void check(String version) { public static void check(String version) {
thisPluginIsPaidFor = isPremium(); thisPluginIsPaidFor = isPremium();
if (!isPremium() && version.contains("SNAPSHOT")) { if (!isPremium()) {
File[] files = new File("plugins/LibsDisguises/").listFiles(); File[] files = new File("plugins/LibsDisguises/").listFiles();
if (files == null) if (files == null)
@ -58,7 +58,7 @@ public class LibsPremium {
thisPluginIsPaidFor = (Boolean) m.invoke(null); thisPluginIsPaidFor = (Boolean) m.invoke(null);
if (isPremium()) { if (isPremium()) {
System.out.println("[LibsDisguises] Found a premium Lib's Disguises jar"); System.out.println("[LibsDisguises] Found a premium Lib's Disguises jar, premium enabled!");
break; break;
} else { } else {

@ -501,11 +501,8 @@ public class PacketsManager {
if (watchableObject.getValue() == null) if (watchableObject.getValue() == null)
continue; continue;
if (Registry.get(watchableObject.getValue().getClass()) == null) WrappedDataWatcherObject obj = ReflectionManager
continue; .createDataWatcherObject(watchableObject.getIndex(), watchableObject.getValue());
WrappedDataWatcherObject obj = new WrappedDataWatcherObject(watchableObject.getIndex(),
Registry.get(watchableObject.getValue().getClass()));
newWatcher.setObject(obj, watchableObject.getValue()); newWatcher.setObject(obj, watchableObject.getValue());
} }

@ -7,12 +7,12 @@ import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Art; import org.bukkit.Art;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.TreeSpecies; import org.bukkit.TreeSpecies;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.entity.Horse; import org.bukkit.entity.*;
import org.bukkit.entity.Ocelot;
import org.bukkit.entity.Villager;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MainHand;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.EulerAngle; import org.bukkit.util.EulerAngle;
@ -49,10 +49,6 @@ public class ReflectionFlagWatchers {
this.description = description; this.description = description;
} }
public ParamInfo(String className, String name, String description) throws ClassNotFoundException {
this(Class.forName(className), name, description);
}
public ParamInfo(Class paramClass, Enum[] enums, String name, String description) { public ParamInfo(Class paramClass, Enum[] enums, String name, String description) {
this(name, description); this(name, description);
this.enums = new String[enums.length]; this.enums = new String[enums.length];
@ -143,14 +139,6 @@ public class ReflectionFlagWatchers {
static { static {
new ParamInfo(AnimalColor.class, "Animal Color", "View all the colors you can use for an animal color"); new ParamInfo(AnimalColor.class, "Animal Color", "View all the colors you can use for an animal color");
new ParamInfo(Art.class, "Art", "View all the paintings you can use for a painting disguise"); new ParamInfo(Art.class, "Art", "View all the paintings you can use for a painting disguise");
try {
new ParamInfo("org.bukkit.entity.Llama.Color", "Llama Color",
"View all the colors you can use for a llama color");
}
catch (Exception ex) {
}
new ParamInfo(Horse.Color.class, "Horse Color", "View all the colors you can use for a horses color"); new ParamInfo(Horse.Color.class, "Horse Color", "View all the colors you can use for a horses color");
new ParamInfo(Ocelot.Type.class, "Ocelot Type", "View all the ocelot types you can use for ocelots"); new ParamInfo(Ocelot.Type.class, "Ocelot Type", "View all the ocelot types you can use for ocelots");
@ -162,21 +150,10 @@ public class ReflectionFlagWatchers {
new ParamInfo(RabbitType.class, "Rabbit Type", "View the kinds of rabbits you can turn into"); new ParamInfo(RabbitType.class, "Rabbit Type", "View the kinds of rabbits you can turn into");
new ParamInfo(TreeSpecies.class, "Tree Species", "View the different types of tree species"); new ParamInfo(TreeSpecies.class, "Tree Species", "View the different types of tree species");
new ParamInfo(EulerAngle.class, "Euler Angle (X,Y,Z)", "Set the X,Y,Z directions on an armorstand"); new ParamInfo(EulerAngle.class, "Euler Angle (X,Y,Z)", "Set the X,Y,Z directions on an armorstand");
new ParamInfo(MainHand.class, "Main Hand", "Set the main hand for an entity");
try { new ParamInfo(Llama.Color.class, "Llama Color", "View all the colors you can use for a llama color");
new ParamInfo("org.bukkit.inventory.MainHand", "Main Hand", "Set the main hand for an entity"); new ParamInfo(Parrot.Variant.class, "Parrot Variant", "View the different colors a parrot can be");
new ParamInfo("org.bukkit.entity.Llama.Color", "Llama Color", new ParamInfo(Particle.class, "Particle", "The different particles of Minecraft");
"View all the colors you can use for a llama color");
}
catch (Exception ex) {
}
try {
new ParamInfo("org.bukkit.entity.Parrot$Variant", "Parrot Variant",
"View the different colors a parrot can be");
}
catch (ClassNotFoundException ex) {// Dont handle
}
ArrayList<String> potionEnums = new ArrayList<>(); ArrayList<String> potionEnums = new ArrayList<>();
@ -229,8 +206,7 @@ public class ReflectionFlagWatchers {
new ParamInfo(int[].class, "number,number,number..", "Numbers separated by an ,"); new ParamInfo(int[].class, "number,number,number..", "Numbers separated by an ,");
new ParamInfo(BlockPosition.class, "Block Position (num,num,num)", "Three numbers separated by a ,"); new ParamInfo(BlockPosition.class, "Block Position (num,num,num)", "Three numbers separated by a ,");
new ParamInfo(WrappedGameProfile.class, "GameProfile", new ParamInfo(WrappedGameProfile.class, "GameProfile", "Get the gameprofile here https://sessionserver.mojang" +
"Get the gameprofile here https://sessionserver.mojang" +
".com/session/minecraft/profile/PLAYER_UUID_GOES_HERE?unsigned=false"); ".com/session/minecraft/profile/PLAYER_UUID_GOES_HERE?unsigned=false");
Collections.sort(paramList, new Comparator<ParamInfo>() { Collections.sort(paramList, new Comparator<ParamInfo>() {

@ -5,11 +5,8 @@ import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtWrapper; import com.comphenix.protocol.wrappers.nbt.NbtWrapper;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
@ -17,6 +14,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public class ReflectionManager { public class ReflectionManager {
@ -780,7 +778,7 @@ public class ReflectionManager {
return null; return null;
} }
public static Object convertInvalidItem(Object value) { public static Object convertInvalidMeta(Object value) {
if (value instanceof Optional) { if (value instanceof Optional) {
Optional opt = (Optional) value; Optional opt = (Optional) value;
@ -810,7 +808,7 @@ public class ReflectionManager {
val = getNmsItem((ItemStack) val); val = getNmsItem((ItemStack) val);
if (val == null) if (val == null)
return Optional.absent(); return Optional.empty();
else else
return Optional.of(val); return Optional.of(val);
} }
@ -844,32 +842,39 @@ public class ReflectionManager {
} }
} else if (value instanceof ItemStack) { } else if (value instanceof ItemStack) {
return getNmsItem((ItemStack) value); return getNmsItem((ItemStack) value);
} else if (value instanceof Double) } else if (value instanceof Double) {
return ((Double) value).floatValue(); return ((Double) value).floatValue();
else if (value instanceof NbtCompound) } else if (value instanceof NbtWrapper) {
return ((NbtWrapper) value).getHandle(); return ((NbtWrapper) value).getHandle();
} else if (value instanceof Particle) {
return getParticleType((Particle) value);
}
return value; return value;
} }
private static Object getParticleType(Particle particle) {
try {
return getCraftClass("CraftParticle").getMethod("toNMS", Particle.class).invoke(null, particle);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getMinecraftVersion() { public static String getMinecraftVersion() {
String version = Bukkit.getVersion(); String version = Bukkit.getVersion();
version = version.substring(version.lastIndexOf(" ") + 1, version.length() - 1); version = version.substring(version.lastIndexOf(" ") + 1, version.length() - 1);
return version; return version;
} }
/** public static WrappedDataWatcherObject createDataWatcherObject(int id, Object value) {
* This creates a DataWatcherItem usable with WrappedWatchableObject
*
* @param id
* @param value
* @return
*/
private static Object createDataWatcherItem(int id, Object value) {
if (value == null) if (value == null)
return null; return null;
value = convertInvalidItem(value); value = convertInvalidMeta(value);
Serializer serializer; Serializer serializer;
@ -880,7 +885,8 @@ public class ReflectionManager {
getNmsClass("IBlockData").isInstance(opt.get()) ? getNmsClass("IBlockData") : opt.get().getClass() : getNmsClass("IBlockData").isInstance(opt.get()) ? getNmsClass("IBlockData") : opt.get().getClass() :
UUID.class), true); UUID.class), true);
} else { } else {
serializer = Registry.get(value.getClass()); serializer = Registry.get(getNmsClass("ParticleParam").isInstance(value) ? getNmsClass("ParticleParam") :
value.getClass());
} }
if (serializer == null) { if (serializer == null) {
@ -894,12 +900,23 @@ public class ReflectionManager {
"! Are you running " + "the latest " + "version of " + "ProtocolLib?"); "! Are you running " + "the latest " + "version of " + "ProtocolLib?");
} }
WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer); return new WrappedDataWatcherObject(id, serializer);
}
/**
* This creates a DataWatcherItem usable with WrappedWatchableObject
*
* @param id
* @param value
* @return
*/
public static Object createDataWatcherItem(int id, Object value) {
WrappedDataWatcherObject watcherObject = createDataWatcherObject(id, value);
Constructor construct = getNmsConstructor("DataWatcher$Item", getNmsClass("DataWatcherObject"), Object.class); Constructor construct = getNmsConstructor("DataWatcher$Item", getNmsClass("DataWatcherObject"), Object.class);
try { try {
return construct.newInstance(watcherObject.getHandle(), value); return construct.newInstance(watcherObject.getHandle(), convertInvalidMeta(value));
} }
catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();
@ -908,6 +925,28 @@ public class ReflectionManager {
return null; return null;
} }
public static int getEntityType(Object nmsEntity) {
try {
Class classType = getNmsClass("EntityTypes");
for (Method m : getNmsClass("Entity").getMethods()) {
if (m.getReturnType() != classType) {
continue;
}
Object entityType = m.invoke(nmsEntity);
Object registry = classType.getField("REGISTRY").get(null);
return (int) registry.getClass().getMethod("a", Object.class).invoke(registry, entityType);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}
public static WrappedWatchableObject createWatchable(int index, Object obj) { public static WrappedWatchableObject createWatchable(int index, Object obj) {
Object watcherItem = createDataWatcherItem(index, obj); Object watcherItem = createDataWatcherItem(index, obj);
@ -921,11 +960,41 @@ public class ReflectionManager {
return id + (data << 12); return id + (data << 12);
} }
public static ImmutablePair<Integer, Integer> getFromCombinedId(int combinedId) { public static int getCombinedIdByItemStack(ItemStack itemStack) {
int j = combinedId & 4095; try {
int k = combinedId >> 12 & 15; Object nmsItem = getNmsItem(itemStack);
Object item = getNmsMethod("ItemStack", "getItem").invoke(nmsItem);
Class blockClass = getNmsClass("Block");
return new ImmutablePair<>(j, k); Object nmsBlock = getNmsMethod(blockClass, "asBlock", getNmsClass("Item")).invoke(null, item);
return (int) getNmsMethod(blockClass, "getBlockData").invoke(nmsBlock);
}
catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}
public static ItemStack getItemStackByCombinedId(int id) {
try {
Method idMethod = getNmsMethod("Block", "getByCombinedId", int.class);
Object iBlockData = idMethod.invoke(null, id);
Class iBlockClass = getNmsClass("IBlockData");
Method getBlock = getNmsMethod(iBlockClass, "getBlock");
Object block = getBlock.invoke(iBlockData);
Method getItem = getNmsMethod("Block", "t", iBlockClass);
return getBukkitItem(getItem.invoke(block, iBlockData));
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
} }
public static Object getWorldServer(World w) { public static Object getWorldServer(World w) {

@ -1,22 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards;
import me.libraryaddict.disguise.utilities.DisguiseSound;
import java.util.HashMap;
/**
* Created by libraryaddict on 8/06/2017.
*/
public class BackwardMethods {
public boolean isOrderedIndexes() {
return true;
}
public void doReplaceSounds() {
}
public void replace(String old, String newString) {
DisguiseSound.replace(old, newString);
}
}

@ -1,108 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.ReflectionManager;
import me.libraryaddict.disguise.utilities.backwards.metadata.Version_1_10;
import me.libraryaddict.disguise.utilities.backwards.metadata.Version_1_11;
import me.libraryaddict.disguise.utilities.backwards.metadata.Version_1_9;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
/**
* Created by libraryaddict on 8/06/2017.
*/
public class BackwardsSupport {
public static BackwardMethods getMethods() {
try {
String version = ReflectionManager.getMinecraftVersion();
Class<? extends BackwardMethods> methods = BackwardMethods.class;
if (version.equals("1.9") || version.equals("1.9.1") || version.equals("1.9.2") || version
.equals("1.9.3") || version.equals("1.9.4")) {
methods = Version_1_9.class;
} else if (version.equals("1.10") || version.equals("1.10.1") || version.equals("1.10.2")) {
methods = Version_1_10.class;
} else if (version.equals("1.11") || version.equals("1.11.1") || version.equals("1.11.2")) {
methods = Version_1_11.class;
}
if (methods != BackwardMethods.class) {
if (!LibsPremium.isPremium()) {
System.out.println("[LibsDisguises] You must purchase the plugin to use backwards compatibility!");
methods = BackwardMethods.class;
} else {
System.out.println("[LibsDisguises] Enabled backwards support for " + version);
}
}
return setupMetadata(methods);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static void getIndexes(Class backwardsClass, BackwardMethods backwards,
HashMap<String, MetaIndex> newIndexes) throws IllegalAccessException {
for (Field field : backwardsClass.getDeclaredFields()) {
if (field.getType() != MetaIndex.class)
continue;
field.setAccessible(true);
if (newIndexes.containsKey(field.getName()))
continue;
if (MetaIndex.setMetaIndex(field.getName(), (MetaIndex) field.get(backwards))) {
newIndexes.put(field.getName(), MetaIndex.ENTITY_META);
continue;
}
newIndexes.put(field.getName(), (MetaIndex) field.get(backwards));
}
backwardsClass = backwardsClass.getSuperclass();
if (backwardsClass.getSimpleName().contains("Version_"))
getIndexes(backwardsClass, backwards, newIndexes);
}
private static BackwardMethods setupMetadata(Class<? extends BackwardMethods> backwardsClass) {
try {
BackwardMethods backwards = backwardsClass.newInstance();
HashMap<String, MetaIndex> newIndexes = new HashMap<>();
getIndexes(backwardsClass, backwards, newIndexes);
MetaIndex.setValues();
HashSet<MetaIndex> indexes = new HashSet<>(newIndexes.values());
indexes.remove(MetaIndex.ENTITY_META); // We do the hashmap stuff to prevent multiple versions
// registering the same meta index
MetaIndex.addMetaIndexes(indexes.toArray(new MetaIndex[0]));
if (backwards.isOrderedIndexes()) {
MetaIndex.eliminateBlankIndexes();
MetaIndex.orderMetaIndexes();
}
backwards.doReplaceSounds();
return backwards;
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}

@ -1,22 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards.metadata;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
/**
* Created by libraryaddict on 9/06/2017.
* <p>
* Supports 1.10.0 1.10.1 and 1.10.2
*/
public class Version_1_10 extends Version_1_11 {
private MetaIndex ILLAGER_META;
private MetaIndex ILLAGER_SPELL_TICKS;
private MetaIndex<Integer> HORSE_VARIANT = new MetaIndex<>(HorseWatcher.class, 1, 0);
private MetaIndex<Byte> SHULKER_COLOR;
private MetaIndex<Optional<ItemStack>> DROPPED_ITEM = new MetaIndex<>(DroppedItemWatcher.class, 0,
Optional.of(new ItemStack(Material.STONE)));
}

@ -1,18 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards.metadata;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
import me.libraryaddict.disguise.utilities.backwards.BackwardMethods;
/**
* Created by libraryaddict on 8/06/2017.
* Supports 1.11.0 1.11.1 and 1.11.2
*/
public class Version_1_11 extends BackwardMethods {
private MetaIndex ILLAGER_META;
private MetaIndex PARROT_VARIANT;
private MetaIndex PLAYER_LEFT_SHOULDER_ENTITY;
private MetaIndex PLAYER_RIGHT_SHOULDER_ENTITY;
}

@ -1,7 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards.metadata;
/**
* Created by libraryaddict on 24/06/2017.
*/
public class Version_1_7 {
}

@ -1,7 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards.metadata;
/**
* Created by libraryaddict on 24/06/2017.
*/
public class Version_1_8 {
}

@ -1,9 +0,0 @@
package me.libraryaddict.disguise.utilities.backwards.metadata;
/**
* Created by libraryaddict on 24/06/2017.
* <p>
* Intended for 1.9, 1.9.1, 1.9.2, 1.9.3, 1.9.4
*/
public class Version_1_9 extends Version_1_10 {
}

@ -1,19 +1,10 @@
package me.libraryaddict.disguise.utilities.packetlisteners; package me.libraryaddict.disguise.utilities.packetlisteners;
import org.bukkit.Material;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.reflect.StructureModifier;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.LibsDisguises;
@ -22,6 +13,10 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
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.DisguiseUtilities;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.inventory.ItemStack;
public class PacketListenerClientInteract extends PacketAdapter { public class PacketListenerClientInteract extends PacketAdapter {
public PacketListenerClientInteract(LibsDisguises plugin) { public PacketListenerClientInteract(LibsDisguises plugin) {
@ -43,19 +38,20 @@ public class PacketListenerClientInteract extends PacketAdapter {
Entity entity = entityModifer.read(0); Entity entity = entityModifer.read(0);
if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow || entity == observer) { if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow ||
entity == observer) {
event.setCancelled(true); event.setCancelled(true);
} }
for (ItemStack item : new ItemStack[]{observer.getInventory().getItemInMainHand(), for (ItemStack item : new ItemStack[]{observer.getInventory().getItemInMainHand(),
observer.getInventory().getItemInOffHand()}) { observer.getInventory().getItemInOffHand()}) {
if (item == null || item.getType() != Material.INK_SACK) if (item == null || item.getType() != Material.INK_SAC)
continue; continue;
Disguise disguise = DisguiseAPI.getDisguise(observer, entity); Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
if (disguise == null || (disguise.getType() != DisguiseType.SHEEP && disguise if (disguise == null ||
.getType() != DisguiseType.WOLF)) (disguise.getType() != DisguiseType.SHEEP && disguise.getType() != DisguiseType.WOLF))
continue; continue;
AnimalColor color = AnimalColor.getColor(item.getDurability()); AnimalColor color = AnimalColor.getColor(item.getDurability());

@ -17,6 +17,7 @@ import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
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.Location; import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@ -153,14 +154,14 @@ public class PacketListenerSounds extends PacketAdapter {
} else { } else {
if (sound.equals("step.grass")) { if (sound.equals("step.grass")) {
try { try {
int typeId = observer.getWorld().getBlockTypeIdAt((int) Math.floor(soundCords[0] / 8D), Block block = observer.getWorld().getBlockAt((int) Math.floor(soundCords[0] / 8D),
(int) Math.floor(soundCords[1] / 8D), (int) Math.floor(soundCords[2] / 8D)); (int) Math.floor(soundCords[1] / 8D), (int) Math.floor(soundCords[2] / 8D));
Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "getId", int.class)
.invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), typeId);
if (block != null) { if (block != null) {
Object step = ReflectionManager.getNmsField("Block", "stepSound").get(block); Object nmsBlock = ReflectionManager.getCraftMethod("block.CraftBlock", "getNMSBlock")
.invoke(block);
Object step = ReflectionManager.getNmsMethod("Block", "getStepSound").invoke(nmsBlock);
mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "d").invoke(step)); mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "d").invoke(step));
mods.write(1, ReflectionManager.getSoundCategory(disguise.getType())); mods.write(1, ReflectionManager.getSoundCategory(disguise.getType()));

@ -1,10 +0,0 @@
package org.bukkit.inventory;
public enum EquipmentSlot {
HAND,
OFF_HAND,
FEET,
LEGS,
CHEST,
HEAD
}

@ -1,6 +0,0 @@
package org.bukkit.inventory;
public enum MainHand {
LEFT,
RIGHT
}