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

View File

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

10
pom.xml
View File

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

View File

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

View File

@ -39,6 +39,18 @@ public class LibsDisguises extends JavaPlugin {
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);
DisguiseUtilities.init(this);
@ -426,6 +438,8 @@ public class LibsDisguises extends JavaPlugin {
continue;
}
disguiseType.setTypeId(ReflectionManager.getEntityType(nmsEntity));
Entity bukkitEntity = ReflectionManager.getBukkitEntity(nmsEntity);
int entitySize = 0;
@ -449,36 +463,34 @@ public class LibsDisguises extends JavaPlugin {
MetaIndex flagType = MetaIndex.getFlag(watcherClass, watch.getIndex());
if (flagType == null) {
System.err.println("Error finding the FlagType for " + disguiseType.name() + "! Index " +
watch.getIndex() + " can't be found!");
System.err.println(
"Value is " + watch.getRawValue() + " (" + watch.getRawValue().getClass() + ") (" +
nmsEntity.getClass() + ") & " + watcherClass.getSimpleName());
System.err.println("Lib's Disguises will continue to load, but this will not work properly!");
System.err.println("[LibsDisguises] MetaIndex not found for " + disguiseType + "! Index: " +
watch.getIndex());
System.err.println("[LibsDisguises] Value: " + watch.getRawValue() + " (" +
watch.getRawValue().getClass() + ") (" + nmsEntity.getClass() + ") & " +
watcherClass.getSimpleName());
continue;
}
indexes.remove(flagType);
Object obj1 = ReflectionManager.convertInvalidItem(flagType.getDefault());
Object obj2 = ReflectionManager.convertInvalidItem(watch.getValue());
Object ourValue = ReflectionManager.convertInvalidMeta(flagType.getDefault());
Object nmsValue = ReflectionManager.convertInvalidMeta(watch.getValue());
if (obj1 != obj2 && ((obj1 == null || obj2 == null) || obj1.getClass() != obj2.getClass())) {
System.err.println("Mismatch of " + "FlagType's for " + disguiseType.name() + "! Index " +
watch.getIndex() + " has the wrong classtype!");
System.err.println("MetaIndex has the " + "default of " + flagType.getDefault() + " (" +
if (ourValue != nmsValue &&
((ourValue == null || nmsValue == null) || ourValue.getClass() != nmsValue.getClass())) {
System.err.println("[LibsDisguises] MetaIndex mismatch for " + disguiseType + "! Index: " +
watch.getIndex());
System.err.println("[LibsDisguises] MetaIndex: " + flagType.getDefault() + " (" +
flagType.getDefault().getClass() + ") (" + nmsEntity.getClass() + ") & " +
watcherClass.getSimpleName());
System.err.println("Where the internals is " + watch.getRawValue() + " (" +
watch.getRawValue().getClass());
System.err.println("Lib's Disguises will continue to load, but this will not work properly!");
System.err.println("[LibsDisguises] Minecraft: " + watch.getRawValue() + " (" +
watch.getRawValue().getClass() + ")");
}
}
for (MetaIndex index : indexes) {
System.out.println(
disguiseType + " has MetaIndex remaining! " + index.getFlagWatcher().getSimpleName() +
" at index " + index.getIndex());
System.out.println("[LibsDisguises] " + disguiseType + " has MetaIndex remaining! " +
index.getFlagWatcher().getSimpleName() + " at index " + index.getIndex());
}
DisguiseSound sound = DisguiseSound.getType(disguiseType.name());

View File

@ -181,7 +181,8 @@ public enum DisguiseType {
ZOMBIE_VILLAGER;
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.
for (DisguiseType type : values()) {
@ -191,7 +192,8 @@ public enum DisguiseType {
String name;
/* 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.
case ITEM_FRAME:
break;
@ -231,6 +233,7 @@ public enum DisguiseType {
private EntityType entityType;
private int objectId = -1, defaultData = 0;
private int typeId;
private Class<? extends FlagWatcher> watcherClass;
@ -284,7 +287,11 @@ public enum DisguiseType {
* @return
*/
public int getTypeId() {
return (int) getEntityType().getTypeId();
return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
}
public Class<? extends FlagWatcher> getWatcherClass() {

View File

@ -4,12 +4,17 @@ import com.comphenix.protocol.PacketType.Play.Server;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
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.WrappedWatchableObject;
import com.google.common.base.Strings;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
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.entity.LivingEntity;
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.
if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null && getDisguise()
.getEntity() instanceof Player) {
if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null &&
getDisguise().getEntity() instanceof Player) {
for (WrappedWatchableObject watch : newList) {
// Its a health packet
if (watch.getIndex() == 6) {
@ -194,7 +199,15 @@ public class FlagWatcher {
}
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() {
@ -329,8 +342,8 @@ public class FlagWatcher {
Object value = entityValues.get(data.getIndex());
if (isEntityAnimationsAdded() && DisguiseConfig
.isMetadataPacketsEnabled() && data == MetaIndex.ENTITY_META) {
if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() &&
data == MetaIndex.ENTITY_META) {
value = addEntityAnimations((byte) value,
WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
}
@ -391,11 +404,16 @@ public class FlagWatcher {
}
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);
}
setData(MetaIndex.ENTITY_CUSTOM_NAME, name);
setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.of(WrappedChatComponent.fromText(name)));
}
sendData(MetaIndex.ENTITY_CUSTOM_NAME);
}
@ -454,8 +472,8 @@ public class FlagWatcher {
}
protected void sendItemStack(EquipmentSlot slot, ItemStack itemStack) {
if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this || getDisguise()
.getEntity() == null)
if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this ||
getDisguise().getEntity() == null)
return;
if (itemStack == null && getDisguise().getEntity() instanceof LivingEntity) {

View File

@ -1,15 +1,14 @@
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.Vector3F;
import com.comphenix.protocol.wrappers.WrappedBlockData;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtBase;
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 org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.inventory.ItemStack;
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,
false);
public static MetaIndex<Integer> AREA_EFFECT_PARTICLE = new MetaIndex<>(AreaEffectCloudWatcher.class, 3, 0);
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<Particle> AREA_EFFECT_PARTICLE = new MetaIndex<>(AreaEffectCloudWatcher.class,
3, Particle.SPELL_MOB);
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_SHAKE = new MetaIndex<>(BoatWatcher.class, 6, 0);
public static MetaIndex<Boolean> CREEPER_IGNITED = new MetaIndex<>(CreeperWatcher.class, 2, 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));
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);
@ -92,11 +90,12 @@ public class MetaIndex<Y> {
public static MetaIndex<Boolean> ENDERMAN_AGRESSIVE = new MetaIndex<>(EndermanWatcher.class, 1, false);
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<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);
@ -132,7 +131,7 @@ public class MetaIndex<Y> {
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,
Optional.<UUID>absent());
Optional.empty());
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<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);
@ -191,11 +190,11 @@ public class MetaIndex<Y> {
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,
NbtFactory.ofCompound("None"));
public static MetaIndex<NbtBase> PLAYER_LEFT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 4,
NbtFactory.ofWrapper(NbtType.TAG_COMPOUND, "None"));
public static MetaIndex<NbtCompound> PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5,
NbtFactory.ofCompound("None"));
public static MetaIndex<NbtBase> PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5,
NbtFactory.ofWrapper(NbtType.TAG_COMPOUND, "None"));
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<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);
@ -225,7 +224,7 @@ public class MetaIndex<Y> {
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,
Optional.<UUID>absent());
Optional.empty());
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_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_VILLAGER_PROFESSION = new MetaIndex<>(ZombieVillagerWatcher.class, 1, 0);
@ -273,10 +274,13 @@ public class MetaIndex<Y> {
catch (Exception ex) {
SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, new ItemStack(Material.POTION));
}
setValues();
orderMetaIndexes();
}
public static void eliminateBlankIndexes() {
@Deprecated
private static void eliminateBlankIndexes() {
ArrayList<Entry<Class, ArrayList<MetaIndex>>> list = new ArrayList<>();
for (MetaIndex index : values()) {
@ -292,6 +296,7 @@ public class MetaIndex<Y> {
if (entry == null) {
entry = new AbstractMap.SimpleEntry(index.getFlagWatcher(), new ArrayList<MetaIndex>());
list.add(entry);
}
@ -299,12 +304,7 @@ public class MetaIndex<Y> {
}
for (Entry<Class, ArrayList<MetaIndex>> entry : list) {
Collections.sort(entry.getValue(), new Comparator<MetaIndex>() {
@Override
public int compare(MetaIndex o1, MetaIndex o2) {
return o1.getIndex() - o2.getIndex();
}
});
entry.getValue().sort(Comparator.comparingInt(MetaIndex::getIndex));
for (MetaIndex ind : entry.getValue()) {
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()) {
if (flagType.getFlagWatcher() == FlagWatcher.class)
continue;
@ -349,10 +349,10 @@ public class MetaIndex<Y> {
continue;
if (found != null) {
System.err.println(entry.getKey()
.getSimpleName() + " has multiple FlagType's registered for the index " + i + " (" + type
.getFlagWatcher().getSimpleName() + ", " + found.getFlagWatcher()
.getSimpleName() + ")");
System.err.println(
entry.getKey().getSimpleName() + " has multiple FlagType's registered for the index " +
i + " (" + type.getFlagWatcher().getSimpleName() + ", " +
found.getFlagWatcher().getSimpleName() + ")");
continue loop;
}
@ -377,15 +377,16 @@ public class MetaIndex<Y> {
MetaIndex index = (MetaIndex) field.get(null);
toPrint.add(index.getFlagWatcher().getSimpleName() + " " + field.getName() + " " + index
.getIndex() + " " + index.getDefault().getClass().getSimpleName());
toPrint.add(
index.getFlagWatcher().getSimpleName() + " " + field.getName() + " " + index.getIndex() + " " +
index.getDefault().getClass().getSimpleName());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
Collections.sort(toPrint, String.CASE_INSENSITIVE_ORDER);
toPrint.sort(String.CASE_INSENSITIVE_ORDER);
for (String s : toPrint) {
System.out.println(s);
@ -416,12 +417,7 @@ public class MetaIndex<Y> {
list.add(type);
}
Collections.sort(list, new Comparator<MetaIndex>() {
@Override
public int compare(MetaIndex o1, MetaIndex o2) {
return Integer.compare(o1.getIndex(), o2.getIndex());
}
});
list.sort(Comparator.comparingInt(MetaIndex::getIndex));
return list;
}
@ -460,15 +456,15 @@ public class MetaIndex<Y> {
}
for (MetaIndex metaIndex : values()) {
if (metaIndex == null || metaIndex.getFlagWatcher() != index.getFlagWatcher() || metaIndex
.getIndex() != index.getIndex()) {
if (metaIndex == null || metaIndex.getFlagWatcher() != index.getFlagWatcher() ||
metaIndex.getIndex() != index.getIndex()) {
continue;
}
System.err.println("[LibsDisguises] MetaIndex " + metaIndex.getFlagWatcher()
.getSimpleName() + " at index " + metaIndex
.getIndex() + " has already registered this! (" + metaIndex.getDefault() + "," + index
.getDefault() + ")");
System.err.println(
"[LibsDisguises] MetaIndex " + metaIndex.getFlagWatcher().getSimpleName() + " at index " +
metaIndex.getIndex() + " has already registered this! (" + metaIndex.getDefault() +
"," + index.getDefault() + ")");
}
values()[i] = metaIndexes[a];

View File

@ -1,16 +1,16 @@
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.FallingBlockWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.PaintingWatcher;
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 {
private int id = -1, data = 0;
@ -19,6 +19,18 @@ public class MiscDisguise extends TargetedDisguise {
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) {
this(disguiseType, id, disguiseType.getDefaultData());
}
@ -28,34 +40,37 @@ public class MiscDisguise extends TargetedDisguise {
if (!disguiseType.isMisc()) {
throw new InvalidParameterException(
"Expected a non-living DisguiseType while constructing MiscDisguise. Received " + disguiseType + " instead. Please use " + (
disguiseType.isPlayer() ? "PlayerDisguise" : "MobDisguise") + " instead");
"Expected a non-living DisguiseType while constructing MiscDisguise. Received " + disguiseType +
" 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();
this.id = getType().getTypeId();
this.data = getType().getDefaultData();
switch (disguiseType) {
switch (getType()) {
// The only disguises which should use a custom data.
case PAINTING:
((PaintingWatcher) getWatcher()).setArt(Art.values()[Math.max(0, id) % Art.values().length]);
break;
case FALLING_BLOCK:
((FallingBlockWatcher) getWatcher()).setBlock(
new ItemStack(Math.max(1, id), 1, (short) Math.max(0, data)));
((FallingBlockWatcher) getWatcher()).setBlock(itemStack);
break;
case SPLASH_POTION:
((SplashPotionWatcher) getWatcher()).setPotionId(Math.max(0, id));
break;
case DROPPED_ITEM:
if (id > 0) {
((DroppedItemWatcher) getWatcher()).setItemStack(new ItemStack(id, Math.max(1, data)));
}
((DroppedItemWatcher) getWatcher()).setItemStack(itemStack);
break;
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 SPECTRAL_ARROW:
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() {
if (getType() == DisguiseType.FALLING_BLOCK) {
return ((FallingBlockWatcher) getWatcher()).getBlock().getTypeId();
return ((FallingBlockWatcher) getWatcher()).getBlock().getType().ordinal();
}
return id;
}

View File

@ -1,12 +1,11 @@
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.MetaIndex;
import java.util.Optional;
import java.util.UUID;
public abstract class AbstractHorseWatcher extends AgeableWatcher {
public AbstractHorseWatcher(Disguise disguise) {
super(disguise);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,20 +10,11 @@ public class PigWatcher extends AgeableWatcher {
}
public boolean isSaddled() {
return (boolean) getData(MetaIndex.PIG_SADDLED);
return getData(MetaIndex.PIG_SADDLED);
}
public void setSaddled(boolean isSaddled) {
setData(MetaIndex.PIG_SADDLED, isSaddled);
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);
}*/
}

View File

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

View File

@ -1,12 +1,11 @@
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.MetaIndex;
import java.util.Optional;
import java.util.UUID;
public class TameableWatcher extends AgeableWatcher
{
public TameableWatcher(Disguise disguise)

View File

@ -39,4 +39,12 @@ public class ZombieWatcher extends InsentientWatcher {
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);
}
}

View File

@ -7,6 +7,7 @@ import me.libraryaddict.disguise.disguisetypes.*;
import org.bukkit.Art;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
@ -22,6 +23,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Objects;
public class DisguiseParser {
public static class DisguiseParseException extends Exception {
@ -110,13 +112,7 @@ public class DisguiseParser {
if (disguiseType != other.disguiseType)
return false;
if (permName == null) {
if (other.permName != null)
return false;
} else if (!permName.equals(other.permName))
return false;
return true;
return Objects.equals(permName, other.permName);
}
}
@ -585,6 +581,7 @@ public class DisguiseParser {
disguise = new MobDisguise(disguisePerm.getType(), adult);
} else if (disguisePerm.isMisc()) {
// Its a misc, we are going to use the MiscDisguise constructor.
ItemStack itemStack = new ItemStack(Material.STONE);
int miscId = -1;
int miscData = -1;
String secondArg = null;
@ -607,6 +604,7 @@ public class DisguiseParser {
disguisePerm.getType() == DisguiseType.DROPPED_ITEM) {
for (Material mat : Material.values()) {
if (mat.name().replace("_", "").equalsIgnoreCase(args[1].replace("_", ""))) {
itemStack = new ItemStack(mat);
miscId = mat.getId();
break;
}
@ -681,11 +679,16 @@ public class DisguiseParser {
doCheck(sender, optionPermissions, usedOptions);
}
}
// Construct the disguise
if (disguisePerm.getType() == DisguiseType.DROPPED_ITEM) {
disguise = new MiscDisguise(itemStack);
} else {
disguise = new MiscDisguise(disguisePerm.getType(), miscId, miscData);
}
}
}
}
// Copy strings to their new range
String[] newArgs = new String[args.length - toSkip];
@ -888,6 +891,7 @@ public class DisguiseParser {
break;
}
}
if (value == null) {
throw new Exception();
}
@ -907,8 +911,26 @@ public class DisguiseParser {
catch (Exception ex) {
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);
} 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 {
String[] split = string.split(":", -1);
int itemId = -1;
if (split[0].isEmpty() || split[0].equalsIgnoreCase("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;
int amount = 1;
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) {
itemStack.addUnsafeEnchantment(Enchantment.DURABILITY, 1);

View File

@ -23,8 +23,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher;
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 org.apache.logging.log4j.util.Strings;
import org.bukkit.Bukkit;
@ -50,10 +48,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.*;
import java.util.*;
import java.util.regex.Pattern;
@ -81,7 +76,6 @@ public class DisguiseUtilities {
private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File(
"plugins/LibsDisguises/SavedDisguises");
private static Gson gson;
private static BackwardMethods methods;
private static boolean pluginsUsed, commandsUsed;
private static long libsDisguisesCalled;
@ -851,7 +845,6 @@ public class DisguiseUtilities {
public static void init(LibsDisguises disguises) {
libsDisguises = disguises;
methods = BackwardsSupport.getMethods();
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MetaIndex.class, new SerializerMetaIndex());
@ -867,21 +860,43 @@ public class DisguiseUtilities {
try {
Object server = ReflectionManager.getNmsMethod("MinecraftServer", "getServer").invoke(null);
Object world = ((List) server.getClass().getField("worlds").get(server)).get(0);
Class chunkClass = ReflectionManager.getNmsClass("Chunk");
Object bedChunk = null;
Object bedChunk = ReflectionManager.getNmsClass("Chunk")
.getConstructor(ReflectionManager.getNmsClass("World"), int.class, int.class)
.newInstance(world, 0, 0);
for (Constructor constructor : chunkClass.getConstructors()) {
if (constructor.getParameterTypes().length != 8)
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);
Object chunkSection = ReflectionManager.getNmsClass("ChunkSection").getConstructor(int.class, boolean.class)
.newInstance(0, true);
Object block = ReflectionManager.getNmsClass("Block").getMethod("getById", int.class)
.invoke(null, Material.BED_BLOCK.getId());
Class blockClass = ReflectionManager.getNmsClass("Block");
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()
.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);
@ -889,10 +904,12 @@ public class DisguiseUtilities {
for (BlockFace face : new BlockFace[]{BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH}) {
int x = 1 + face.getModX();
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);
@ -1018,9 +1035,7 @@ public class DisguiseUtilities {
}
catch (
Exception ex)
{
Exception ex) {
ex.printStackTrace();
}
}

View File

@ -38,7 +38,7 @@ public class LibsPremium {
public static void check(String version) {
thisPluginIsPaidFor = isPremium();
if (!isPremium() && version.contains("SNAPSHOT")) {
if (!isPremium()) {
File[] files = new File("plugins/LibsDisguises/").listFiles();
if (files == null)
@ -58,7 +58,7 @@ public class LibsPremium {
thisPluginIsPaidFor = (Boolean) m.invoke(null);
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;
} else {

View File

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

View File

@ -7,12 +7,12 @@ import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Art;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.TreeSpecies;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Horse;
import org.bukkit.entity.Ocelot;
import org.bukkit.entity.Villager;
import org.bukkit.entity.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MainHand;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.EulerAngle;
@ -49,10 +49,6 @@ public class ReflectionFlagWatchers {
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) {
this(name, description);
this.enums = new String[enums.length];
@ -143,14 +139,6 @@ public class ReflectionFlagWatchers {
static {
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");
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(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(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");
try {
new ParamInfo("org.bukkit.inventory.MainHand", "Main Hand", "Set the main hand for an entity");
new ParamInfo("org.bukkit.entity.Llama.Color", "Llama Color",
"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
}
new ParamInfo(MainHand.class, "Main Hand", "Set the main hand for an entity");
new ParamInfo(Llama.Color.class, "Llama Color", "View all the colors you can use for a llama color");
new ParamInfo(Parrot.Variant.class, "Parrot Variant", "View the different colors a parrot can be");
new ParamInfo(Particle.class, "Particle", "The different particles of Minecraft");
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(BlockPosition.class, "Block Position (num,num,num)", "Three numbers separated by a ,");
new ParamInfo(WrappedGameProfile.class, "GameProfile",
"Get the gameprofile here https://sessionserver.mojang" +
new ParamInfo(WrappedGameProfile.class, "GameProfile", "Get the gameprofile here https://sessionserver.mojang" +
".com/session/minecraft/profile/PLAYER_UUID_GOES_HERE?unsigned=false");
Collections.sort(paramList, new Comparator<ParamInfo>() {

View File

@ -5,11 +5,8 @@ import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtWrapper;
import com.google.common.base.Optional;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.bukkit.*;
import org.bukkit.entity.*;
import org.bukkit.inventory.EquipmentSlot;
@ -17,6 +14,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import java.lang.reflect.*;
import java.util.Optional;
import java.util.UUID;
public class ReflectionManager {
@ -780,7 +778,7 @@ public class ReflectionManager {
return null;
}
public static Object convertInvalidItem(Object value) {
public static Object convertInvalidMeta(Object value) {
if (value instanceof Optional) {
Optional opt = (Optional) value;
@ -810,7 +808,7 @@ public class ReflectionManager {
val = getNmsItem((ItemStack) val);
if (val == null)
return Optional.absent();
return Optional.empty();
else
return Optional.of(val);
}
@ -844,32 +842,39 @@ public class ReflectionManager {
}
} else if (value instanceof ItemStack) {
return getNmsItem((ItemStack) value);
} else if (value instanceof Double)
} else if (value instanceof Double) {
return ((Double) value).floatValue();
else if (value instanceof NbtCompound)
} else if (value instanceof NbtWrapper) {
return ((NbtWrapper) value).getHandle();
} else if (value instanceof Particle) {
return getParticleType((Particle) 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() {
String version = Bukkit.getVersion();
version = version.substring(version.lastIndexOf(" ") + 1, version.length() - 1);
return version;
}
/**
* This creates a DataWatcherItem usable with WrappedWatchableObject
*
* @param id
* @param value
* @return
*/
private static Object createDataWatcherItem(int id, Object value) {
public static WrappedDataWatcherObject createDataWatcherObject(int id, Object value) {
if (value == null)
return null;
value = convertInvalidItem(value);
value = convertInvalidMeta(value);
Serializer serializer;
@ -880,7 +885,8 @@ public class ReflectionManager {
getNmsClass("IBlockData").isInstance(opt.get()) ? getNmsClass("IBlockData") : opt.get().getClass() :
UUID.class), true);
} else {
serializer = Registry.get(value.getClass());
serializer = Registry.get(getNmsClass("ParticleParam").isInstance(value) ? getNmsClass("ParticleParam") :
value.getClass());
}
if (serializer == null) {
@ -894,12 +900,23 @@ public class ReflectionManager {
"! 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);
try {
return construct.newInstance(watcherObject.getHandle(), value);
return construct.newInstance(watcherObject.getHandle(), convertInvalidMeta(value));
}
catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
@ -908,6 +925,28 @@ public class ReflectionManager {
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) {
Object watcherItem = createDataWatcherItem(index, obj);
@ -921,11 +960,41 @@ public class ReflectionManager {
return id + (data << 12);
}
public static ImmutablePair<Integer, Integer> getFromCombinedId(int combinedId) {
int j = combinedId & 4095;
int k = combinedId >> 12 & 15;
public static int getCombinedIdByItemStack(ItemStack itemStack) {
try {
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) {

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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)));
}

View File

@ -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;
}

View File

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

View File

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

View File

@ -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 {
}

View File

@ -1,19 +1,10 @@
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.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.StructureModifier;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig;
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.watchers.SheepWatcher;
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 PacketListenerClientInteract(LibsDisguises plugin) {
@ -43,19 +38,20 @@ public class PacketListenerClientInteract extends PacketAdapter {
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);
}
for (ItemStack item : new ItemStack[]{observer.getInventory().getItemInMainHand(),
observer.getInventory().getItemInOffHand()}) {
if (item == null || item.getType() != Material.INK_SACK)
if (item == null || item.getType() != Material.INK_SAC)
continue;
Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
if (disguise == null || (disguise.getType() != DisguiseType.SHEEP && disguise
.getType() != DisguiseType.WOLF))
if (disguise == null ||
(disguise.getType() != DisguiseType.SHEEP && disguise.getType() != DisguiseType.WOLF))
continue;
AnimalColor color = AnimalColor.getColor(item.getDurability());

View File

@ -17,6 +17,7 @@ import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.ReflectionManager;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
import java.lang.reflect.InvocationTargetException;
@ -153,14 +154,14 @@ public class PacketListenerSounds extends PacketAdapter {
} else {
if (sound.equals("step.grass")) {
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));
Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "getId", int.class)
.invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), typeId);
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(1, ReflectionManager.getSoundCategory(disguise.getType()));

View File

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

View File

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