Initial 1.19.4 support

This commit is contained in:
libraryaddict 2023-03-31 16:24:17 +13:00
parent 7cff37eebc
commit 85da8c09a8
146 changed files with 1914 additions and 597 deletions

View File

@ -18,6 +18,7 @@
<module>v1_18_R2</module>
<module>v1_19_R1</module>
<module>v1_19_R2</module>
<module>v1_19_R3</module>
</modules>
</project>

123
nms/v1_19_R3/pom.xml Normal file
View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nms</artifactId>
<groupId>LibsDisguises</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>v1_19_R3</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spigot.version>1.19.4-R0.1-SNAPSHOT</spigot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${spigot.version}</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>${spigot.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>shared</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.dmulloy2</groupId>
<artifactId>ProtocolLib</artifactId>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>3.3.39</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<version>8.5.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>3.5.41</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>datafixerupper</artifactId>
<version>5.0.28</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>brigadier</artifactId>
<version>1.0.18</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang</remappedDependencies>
<remappedClassifierName>remapped-mojang</remappedClassifierName>
<remappedArtifactAttached>true</remappedArtifactAttached>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>target/${project.build.finalName}-remapped-mojang.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-obf</remappedDependencies>
<remappedClassifierName>remapped-spigot</remappedClassifierName>
<remappedArtifactAttached>true</remappedArtifactAttached>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,570 @@
package me.libraryaddict.disguise.utilities.reflection.v1_19_R3;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.BlockPosition;
import com.comphenix.protocol.wrappers.EnumWrappers;
import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.comphenix.protocol.wrappers.Vector3F;
import com.comphenix.protocol.wrappers.WrappedBlockData;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.mojang.authlib.Agent;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback;
import com.mojang.authlib.minecraft.MinecraftSessionService;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.Vector3f;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerEntity;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.animal.CatVariant;
import net.minecraft.world.entity.animal.FrogVariant;
import net.minecraft.world.entity.decoration.PaintingVariant;
import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerType;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.level.GameType;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.bukkit.Art;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_19_R3.CraftArt;
import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
import org.bukkit.craftbukkit.v1_19_R3.CraftSound;
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Frog;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.util.EulerAngle;
import org.bukkit.util.Vector;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ReflectionManager implements ReflectionManagerAbstract {
public boolean hasInvul(Entity entity) {
net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle();
if (nmsEntity instanceof net.minecraft.world.entity.LivingEntity) {
return nmsEntity.invulnerableTime > 0;
} else {
return nmsEntity.isInvulnerableTo(nmsEntity.damageSources().generic());
}
}
public int getIncrementedStateId(Player player) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
return serverPlayer.containerMenu.incrementStateId(); // TODO Check correct container
}
public int getNewEntityId() {
return getNewEntityId(true);
}
public int getNewEntityId(boolean increment) {
try {
Field entityCounter = net.minecraft.world.entity.Entity.class.getDeclaredField("d");
entityCounter.setAccessible(true);
AtomicInteger atomicInteger = (AtomicInteger) entityCounter.get(null);
if (increment) {
return atomicInteger.incrementAndGet();
} else {
return atomicInteger.get();
}
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
return -1;
}
public ServerGamePacketListenerImpl getPlayerConnectionOrPlayer(Player player) {
return ((CraftPlayer) player).getHandle().connection;
}
public net.minecraft.world.entity.Entity createEntityInstance(String entityName) {
Optional<net.minecraft.world.entity.EntityType<?>> optional = net.minecraft.world.entity.EntityType.byString(entityName.toLowerCase(Locale.ROOT));
if (optional.isPresent()) {
net.minecraft.world.entity.EntityType<?> entityType = optional.get();
ServerLevel world = getWorldServer(Bukkit.getWorlds().get(0));
net.minecraft.world.entity.Entity entity;
if (entityType == net.minecraft.world.entity.EntityType.PLAYER) {
WrappedGameProfile gameProfile = ReflectionManagerAbstract.getGameProfile(new UUID(0, 0), "Steve");
entity = new ServerPlayer(getMinecraftServer(), world, (GameProfile) gameProfile.getHandle());
} else {
entity = entityType.create(world);
}
if (entity == null) {
return null;
}
// Workaround for paper being 2 smart 4 me
entity.setPos(1.0, 1.0, 1.0);
entity.setPos(0.0, 0.0, 0.0);
return entity;
}
return null;
}
public MobEffect getMobEffectList(int id) {
return MobEffect.byId(id);
}
public MobEffectInstance createMobEffect(PotionEffect effect) {
return createMobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles());
}
public MobEffectInstance createMobEffect(int id, int duration, int amplification, boolean ambient, boolean particles) {
return new MobEffectInstance(getMobEffectList(id), duration, amplification, ambient, particles);
}
public AABB getBoundingBox(Entity entity) {
return ((CraftEntity) entity).getHandle().getBoundingBox();
}
public double getXBoundingBox(Entity entity) {
return getBoundingBox(entity).maxX - getBoundingBox(entity).minX;
}
public double getYBoundingBox(Entity entity) {
return getBoundingBox(entity).maxY - getBoundingBox(entity).minY;
}
public double getZBoundingBox(Entity entity) {
return getBoundingBox(entity).maxZ - getBoundingBox(entity).minZ;
}
public ServerPlayer getPlayerFromPlayerConnection(Object nmsEntity) {
return ((ServerPlayerConnection) nmsEntity).getPlayer();
}
public Entity getBukkitEntity(Object nmsEntity) {
return ((net.minecraft.world.entity.Entity) nmsEntity).getBukkitEntity();
}
public ItemStack getBukkitItem(Object nmsItem) {
return CraftItemStack.asBukkitCopy((net.minecraft.world.item.ItemStack) nmsItem);
}
public ItemStack getCraftItem(ItemStack bukkitItem) {
return CraftItemStack.asCraftCopy(bukkitItem);
}
public Holder<SoundEvent> getCraftSound(Sound sound) {
return BuiltInRegistries.SOUND_EVENT.wrapAsHolder(CraftSound.getSoundEffect(sound));
}
public ServerEntity getEntityTrackerEntry(Entity target) throws Exception {
ServerLevel world = ((CraftWorld) target.getWorld()).getHandle();
ServerChunkCache chunkSource = world.getChunkSource();
ChunkMap chunkMap = chunkSource.chunkMap;
Int2ObjectMap<ChunkMap.TrackedEntity> entityMap = chunkMap.entityMap;
ChunkMap.TrackedEntity trackedEntity = entityMap.get(target.getEntityId());
if (trackedEntity == null) {
return null;
}
Field field = ChunkMap.TrackedEntity.class.getDeclaredField("b");
field.setAccessible(true);
return (ServerEntity) field.get(trackedEntity);
}
public DedicatedServer getMinecraftServer() {
return ((CraftServer) Bukkit.getServer()).getServer();
}
public String getEnumArt(Art art) {
return BuiltInRegistries.PAINTING_VARIANT.getKey(CraftArt.BukkitToNotch(art).value()).getPath();
}
public BlockPos getBlockPosition(int x, int y, int z) {
return new BlockPos(x, y, z);
}
public net.minecraft.core.Direction getEnumDirection(int direction) {
return net.minecraft.core.Direction.from2DDataValue(direction);
}
@Override
public void handleTablistPacket(PacketEvent event, Function<UUID, Boolean> shouldRemove) {
ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) event.getPacket().getHandle();
if (!packet.actions().contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) {
return;
}
List<ClientboundPlayerInfoUpdatePacket.Entry> canKeep = new ArrayList<>();
for (ClientboundPlayerInfoUpdatePacket.Entry entry : packet.entries()) {
if (shouldRemove.apply(entry.profileId())) {
continue;
}
canKeep.add(entry);
}
if (canKeep.size() == packet.entries().size()) {
return;
}
if (canKeep.isEmpty()) {
event.setCancelled(true);
return;
}
event.getPacket().getModifier().write(1, canKeep);
}
public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) {
if (actions[0] == EnumWrappers.PlayerInfoAction.REMOVE_PLAYER) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO_REMOVE);
packet.getModifier().write(0, Collections.singletonList(gameProfile.getUUID()));
return packet;
}
ClientboundPlayerInfoUpdatePacket.Entry entry =
new ClientboundPlayerInfoUpdatePacket.Entry(gameProfile.getUUID(), (GameProfile) gameProfile.getHandle(), nameVisible, 0, GameType.SURVIVAL,
Component.literal(displayName), null);
PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
StructureModifier<Object> modifier = packet.getModifier();
EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet =
EnumSet.copyOf(Arrays.stream(actions).map(action -> ClientboundPlayerInfoUpdatePacket.Action.valueOf(action.name())).collect(Collectors.toList()));
modifier.write(0, enumSet);
modifier.write(1, Collections.singletonList(entry));
return packet;
}
public Object getNmsEntity(Entity entity) {
return ((CraftEntity) entity).getHandle();
}
public double getPing(Player player) {
return player.getPing();
}
public float[] getSize(Entity entity) {
net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle();
EntityDimensions dimensions = nmsEntity.getDimensions(net.minecraft.world.entity.Pose.STANDING);
return new float[]{dimensions.width, nmsEntity.getEyeHeight()};
}
public WrappedGameProfile getSkullBlob(WrappedGameProfile gameProfile) {
DedicatedServer minecraftServer = getMinecraftServer();
MinecraftSessionService sessionService = minecraftServer.getSessionService();
return WrappedGameProfile.fromHandle(sessionService.fillProfileProperties((GameProfile) gameProfile.getHandle(), true));
}
public Float getSoundModifier(Object entity) {
if (!(entity instanceof net.minecraft.world.entity.LivingEntity)) {
return 0.0f;
} else {
try {
Method method = net.minecraft.world.entity.LivingEntity.class.getDeclaredMethod("eN");
method.setAccessible(true);
return (Float) method.invoke(entity);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
}
return 0f;
}
public void injectCallback(String playername, ProfileLookupCallback callback) {
Agent agent = Agent.MINECRAFT;
getMinecraftServer().getProfileRepository().findProfilesByNames(new String[]{playername}, agent, callback);
}
public void setBoundingBox(Entity entity, double x, double y, double z) {
Location loc = entity.getLocation();
((CraftEntity) entity).getHandle()
.setBoundingBox(new AABB(loc.getX() - x / 2, loc.getY() - y / 2, loc.getZ() - z / 2, loc.getX() + x / 2, loc.getY() + y / 2, loc.getZ() + z / 2));
}
public Enum getSoundCategory(String category) {
return Arrays.stream(SoundSource.values()).filter(soundSource -> category.equalsIgnoreCase(soundSource.getName())).findAny().get();
}
/**
* Creates the NMS object EnumItemSlot from an EquipmentSlot.
*
* @param slot
* @return null if the equipment slot is null
*/
public Enum createEnumItemSlot(EquipmentSlot slot) {
switch (slot) {
case HAND:
return net.minecraft.world.entity.EquipmentSlot.MAINHAND;
case OFF_HAND:
return net.minecraft.world.entity.EquipmentSlot.OFFHAND;
case FEET:
return net.minecraft.world.entity.EquipmentSlot.FEET;
case LEGS:
return net.minecraft.world.entity.EquipmentSlot.LEGS;
case CHEST:
return net.minecraft.world.entity.EquipmentSlot.CHEST;
case HEAD:
return net.minecraft.world.entity.EquipmentSlot.HEAD;
default:
return null;
}
}
public Object getSoundString(Sound sound) {
return CraftSound.getSoundEffect(sound).getLocation().toString(); // TODO
}
public Optional<?> convertOptional(Object val) {
if (val instanceof BlockPosition) {
BlockPosition pos = (BlockPosition) val;
return Optional.of(getBlockPosition(pos.getX(), pos.getY(), pos.getZ()));
} else if (val instanceof WrappedBlockData) {
Object obj = ((WrappedBlockData) val).getHandle();
return Optional.of(obj);
} else if (val instanceof ItemStack) {
Object obj = getNmsItem((ItemStack) val);
return Optional.of(obj);
} else if (val instanceof WrappedChatComponent) {
Object obj = ((WrappedChatComponent) val).getHandle();
return Optional.of(obj);
}
return Optional.of(val);
}
public Vector3f convertVec3(Object object) {
if (object instanceof Vector3F) {
Vector3F vector3F = (Vector3F) object;
return new Vector3f(vector3F.getX(), vector3F.getY(), vector3F.getZ());
} else if (object instanceof EulerAngle) {
EulerAngle eulerAngle = (EulerAngle) object;
return new Vector3f((float) eulerAngle.getX(), (float) eulerAngle.getY(), (float) eulerAngle.getZ());
}
return null;
}
public net.minecraft.core.Direction convertDirection(Direction direction) {
return net.minecraft.core.Direction.from3DDataValue(direction.ordinal());
}
public Material getMaterial(String name) {
return CraftMagicNumbers.INSTANCE.getMaterial(name, CraftMagicNumbers.INSTANCE.getDataVersion());
}
public String getItemName(Material material) {
return BuiltInRegistries.ITEM.getKey(CraftMagicNumbers.getItem(material)).getPath();
}
public net.minecraft.world.item.ItemStack getNmsItem(ItemStack itemStack) {
return CraftItemStack.asNMSCopy(itemStack);
}
public VillagerData getNmsVillagerData(Villager.Type villagerType, Villager.Profession villagerProfession) {
VillagerType nmsVillagerType = BuiltInRegistries.VILLAGER_TYPE.get(CraftNamespacedKey.toMinecraft(villagerType.getKey()));
VillagerProfession nmsVillagerProfession = BuiltInRegistries.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(villagerProfession.getKey()));
return new net.minecraft.world.entity.npc.VillagerData(nmsVillagerType, nmsVillagerProfession, 1);
}
public VillagerType getVillagerType(Villager.Type type) {
return BuiltInRegistries.VILLAGER_TYPE.get(CraftNamespacedKey.toMinecraft(type.getKey()));
}
public VillagerProfession getVillagerProfession(Villager.Profession profession) {
return BuiltInRegistries.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(profession.getKey()));
}
public <T> SynchedEntityData.DataItem<T> createDataWatcherItem(WrappedDataWatcher.WrappedDataWatcherObject wrappedDataWatcherObject, T metaItem) {
return new SynchedEntityData.DataItem<>((EntityDataAccessor<T>) wrappedDataWatcherObject.getHandle(), metaItem);
}
public Holder<SoundEvent> createSoundEvent(String minecraftKey) {
return BuiltInRegistries.SOUND_EVENT.wrapAsHolder(SoundEvent.createVariableRangeEvent(createMinecraftKey(minecraftKey)));
}
@Override
public ResourceLocation createMinecraftKey(String name) {
return new ResourceLocation(name);
}
public Vec3 getVec3D(Vector vector) {
return new Vec3(vector.getX(), vector.getY(), vector.getZ());
}
public net.minecraft.world.entity.EntityType getEntityType(EntityType entityType) {
return net.minecraft.world.entity.EntityType.byString(
entityType.getName() == null ? entityType.name().toLowerCase(Locale.ENGLISH) : entityType.getName()).orElse(null);
}
public Object registerEntityType(NamespacedKey key) {
net.minecraft.world.entity.EntityType<net.minecraft.world.entity.Entity> newEntity =
new net.minecraft.world.entity.EntityType<>(null, null, false, false, false, false, null, null, 0, 0, FeatureFlagSet.of());
Registry.register(BuiltInRegistries.ENTITY_TYPE, CraftNamespacedKey.toMinecraft(key), newEntity);
newEntity.getDescriptionId();
return newEntity; // TODO ??? Some reflection in legacy that I'm unsure about
}
public int getEntityTypeId(Object entityTypes) {
net.minecraft.world.entity.EntityType entityType = (net.minecraft.world.entity.EntityType) entityTypes;
return BuiltInRegistries.ENTITY_TYPE.getId(entityType);
}
public int getEntityTypeId(EntityType entityType) {
return getEntityTypeId(getEntityType(entityType));
}
public Object getEntityType(NamespacedKey name) {
return BuiltInRegistries.ENTITY_TYPE.get(CraftNamespacedKey.toMinecraft(name));
}
public Object getNmsEntityPose(String enumPose) {
return net.minecraft.world.entity.Pose.valueOf(enumPose);
}
public int getCombinedIdByBlockData(BlockData data) {
BlockState state = ((CraftBlockData) data).getState();
return Block.getId(state);
}
public int getCombinedIdByItemStack(ItemStack itemStack) {
Block block = CraftMagicNumbers.getBlock(itemStack.getType());
return Block.getId(block.defaultBlockState());
}
public BlockData getBlockDataByCombinedId(int id) {
return CraftBlockData.fromData(Block.stateById(id));
}
public ItemStack getItemStackByCombinedId(int id) {
return new ItemStack(CraftMagicNumbers.getMaterial(Block.stateById(id).getBlock()));
}
public ServerLevel getWorldServer(World w) {
return ((CraftWorld) w).getHandle();
}
public ItemMeta getDeserializedItemMeta(Map<String, Object> meta) {
try {
Class<?> aClass = Class.forName("org.bukkit.craftbukkit.v1_19_R3.inventory.CraftMetaItem$SerializableMeta");
Method deserialize = aClass.getDeclaredMethod("deserialize", Map.class);
Object itemMeta = deserialize.invoke(null, meta);
return (ItemMeta) itemMeta;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Object convertInvalidMeta(Object value) {
if (value instanceof Frog.Variant) {
return getFrogVariant((Frog.Variant) value);
}
if (value instanceof Cat.Type) {
return getCatVariant((Cat.Type) value);
}
if (value instanceof Art) {
return getArtVariant((Art) value);
}
if (value instanceof BlockData) {
return ((CraftBlockData) value).getState();
}
return value;
}
private FrogVariant getFrogVariant(Frog.Variant variant) {
switch (variant) {
case COLD:
return FrogVariant.COLD;
case WARM:
return FrogVariant.WARM;
case TEMPERATE:
return FrogVariant.TEMPERATE;
}
return null;
}
private CatVariant getCatVariant(Cat.Type type) {
return BuiltInRegistries.CAT_VARIANT.byId(type.ordinal());
}
private Holder.Reference<PaintingVariant> getArtVariant(Art art) {
return BuiltInRegistries.PAINTING_VARIANT.getHolder(art.ordinal()).get();
}
}

View File

@ -57,7 +57,7 @@
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
@ -138,8 +138,8 @@
</dependency>
<!-- testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
<optional>true</optional>
@ -226,6 +226,14 @@
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>v1_19_R3</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>remapped-spigot</classifier>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mojang</groupId>

View File

@ -4,6 +4,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.config.ConfigLoader;
@ -37,10 +38,12 @@ import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class DisguiseConfig {
@Getter
@ -53,13 +56,11 @@ public class DisguiseConfig {
@Setter
private static boolean addEntityAnimations;
@Getter
@Setter
private static boolean animationPacketsEnabled;
@Getter
@Setter
private static boolean catDyeable;
@Getter
@Setter
private static boolean collectPacketsEnabled;
@Getter
@Setter
@ -77,10 +78,8 @@ public class DisguiseConfig {
@Setter
private static boolean dynamicExpiry;
@Getter
@Setter
private static boolean entityStatusPacketsEnabled;
@Getter
@Setter
private static boolean equipmentPacketsEnabled;
@Getter
@Setter
@ -113,7 +112,6 @@ public class DisguiseConfig {
@Setter
private static boolean metaPacketsEnabled;
@Getter
@Setter
private static boolean miscDisguisesForLivingEnabled;
@Getter
@Setter
@ -125,7 +123,6 @@ public class DisguiseConfig {
@Setter
private static boolean monstersIgnoreDisguises;
@Getter
@Setter
private static boolean movementPacketsEnabled;
@Getter
@Setter
@ -164,7 +161,6 @@ public class DisguiseConfig {
@Setter
private static boolean updateGameProfiles;
@Getter
@Setter
private static boolean useTranslations;
@Getter
@Setter
@ -281,6 +277,12 @@ public class DisguiseConfig {
@Getter
@Setter
private static boolean randomUUIDS;
@Getter
@Setter
private static List<DisguiseType> disabledDisguises = new ArrayList<>();
@Getter
@Setter
private static List<String> disabledMethods = new ArrayList<>();
public static boolean isArmorstandsName() {
return getPlayerNameType() == PlayerNameType.ARMORSTANDS;
@ -352,12 +354,9 @@ public class DisguiseConfig {
// Next update check will be in 30 minutes, or the timer - elapsed time. Whatever is greater
timeSinceLast = Math.max(30 * 60 * 20, timer - timeSinceLast);
updaterTask = Bukkit.getScheduler().runTaskTimerAsynchronously(LibsDisguises.getInstance(), new Runnable() {
@Override
public void run() {
LibsDisguises.getInstance().getUpdateChecker().doAutoUpdateCheck();
}
}, timeSinceLast, timer);
updaterTask = Bukkit.getScheduler()
.runTaskTimerAsynchronously(LibsDisguises.getInstance(), () -> LibsDisguises.getInstance().getUpdateChecker().doAutoUpdateCheck(), timeSinceLast,
timer);
}
public static void setUsingReleaseBuilds(boolean useReleaseBuilds) {
@ -652,7 +651,7 @@ public class DisguiseConfig {
setRandomUUIDS(config.getBoolean("RandomUUIDs"));
String apiKey = config.getString("MineSkinAPIKey");
if (apiKey != null && apiKey.matches("[a-zA-Z0-9]{8,}")) {
if (apiKey != null && apiKey.matches("[a-zA-Z\\d]{8,}")) {
DisguiseUtilities.getMineSkinAPI().setApiKey(apiKey);
} else if (apiKey != null && apiKey.length() > 8) {
DisguiseUtilities.getLogger().warning("API Key provided for MineSkin does not appear to be in a valid format!");
@ -699,6 +698,15 @@ public class DisguiseConfig {
DisguiseUtilities.getLogger().warning("Cannot parse '" + config.getString("UpdatesBranch") + "' to a valid option for UpdatesBranch");
}
try {
setDisabledDisguises(
config.getStringList("DisabledDisguises").stream().map(s -> DisguiseType.valueOf(s.toUpperCase(Locale.ROOT))).collect(Collectors.toList()));
} catch (Exception ex) {
DisguiseUtilities.getLogger().warning("Cannot load 'DisabledDisguises' in features.yml, invalid disguise types provided?");
}
setDisabledMethods(config.getStringList("DisabledMethods"));
String seeCommands = config.getString("Permissions.SeeCommands");
PermissionDefault commandVisibility = seeCommands == null ? null : PermissionDefault.getByName(seeCommands);
@ -790,7 +798,7 @@ public class DisguiseConfig {
for (String name : config.getConfigurationSection("Custom-Entities").getKeys(false)) {
try {
if (!name.matches("[a-zA-Z0-9_]+")) {
if (!name.matches("\\w+")) {
DisguiseUtilities.getLogger().severe("Invalid modded disguise name '" + name + "'");
continue;
}

View File

@ -48,6 +48,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.Arrays;
@ -145,7 +146,7 @@ public class LibsDisguises extends JavaPlugin {
}
if (Bukkit.getVersion().contains("(MC: 1.19)")) {
getLogger().severe("Please update from MC 1.19.0! You should be using 1.19.3! 1.19.1 is the lowest supported 1.19 version!");
getLogger().severe("Please update from MC 1.19.0! You should be using at least 1.19.3! 1.19.1 is the lowest supported 1.19 version!");
}
try {
@ -206,11 +207,18 @@ public class LibsDisguises extends JavaPlugin {
@Override
public void run() {
getLogger().severe("!! May I have your attention please !!");
getLogger().severe(
"Update your ProtocolLib! You are running " + version + " but the minimum version you should be on is " + requiredProtocolLib +
"!");
getLogger().severe("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/target" + "/ProtocolLib" + ".jar");
getLogger().severe("Or! Use /ld protocollib - To update to the latest development build");
if (DisguiseUtilities.isProtocollibUpdateDownloaded()) {
getLogger().severe(
"An update for ProtocolLib has been downloaded and will be installed when the server restarts. When possible, please restart " +
"the server. Lib's Disguises may not work correctly until you do so.");
} else {
getLogger().severe(
"Update your ProtocolLib! You are running " + version + " but the minimum version you should be on is " + requiredProtocolLib +
"!");
getLogger().severe("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/target" + "/ProtocolLib" + ".jar");
getLogger().severe("Or! Use /ld protocollib - To update to the latest development build");
}
if (timesRun++ > 0) {
getLogger().severe("This message is on repeat due to the sheer number of people who don't see this.");
@ -227,7 +235,7 @@ public class LibsDisguises extends JavaPlugin {
// If this is a release build, even if jenkins build..
if (isReleaseBuild()) {
// If downloaded from spigot, forcibly set release build to true
if (LibsPremium.getUserID().matches("[0-9]+")) {
if (LibsPremium.getUserID().matches("\\d+")) {
DisguiseConfig.setUsingReleaseBuilds(true);
}
// Otherwise leave it untouched as they might've just happened to hit a dev build, which is a release build
@ -331,7 +339,7 @@ public class LibsDisguises extends JavaPlugin {
}
@Override
public File getFile() {
public @NotNull File getFile() {
return super.getFile();
}
@ -356,7 +364,7 @@ public class LibsDisguises extends JavaPlugin {
}
public boolean isNumberedBuild() {
return getBuildNo() != null && getBuildNo().matches("[0-9]+");
return getBuildNo() != null && getBuildNo().matches("\\d+");
}
private void registerCommand(String commandName, CommandExecutor executioner) {

View File

@ -50,18 +50,18 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
private final Cache<UUID, Long> rateLimit = CacheBuilder.newBuilder().expireAfterWrite(500, TimeUnit.MILLISECONDS).build();
static {
HashMap<Class<? extends DisguiseBaseCommand>, String> map = new HashMap<>();
HashMap<Class<? extends DisguiseBaseCommand>, String> disguiseCommandMap = new HashMap<>();
map.put(DisguiseCommand.class, "Disguise");
map.put(DisguiseEntityCommand.class, "DisguiseEntity");
map.put(DisguisePlayerCommand.class, "DisguisePlayer");
map.put(DisguiseRadiusCommand.class, "DisguiseRadius");
map.put(DisguiseModifyCommand.class, "DisguiseModify");
map.put(DisguiseModifyEntityCommand.class, "DisguiseModifyEntity");
map.put(DisguiseModifyPlayerCommand.class, "DisguiseModifyPlayer");
map.put(DisguiseModifyRadiusCommand.class, "DisguiseModifyRadius");
disguiseCommandMap.put(DisguiseCommand.class, "Disguise");
disguiseCommandMap.put(DisguiseEntityCommand.class, "DisguiseEntity");
disguiseCommandMap.put(DisguisePlayerCommand.class, "DisguisePlayer");
disguiseCommandMap.put(DisguiseRadiusCommand.class, "DisguiseRadius");
disguiseCommandMap.put(DisguiseModifyCommand.class, "DisguiseModify");
disguiseCommandMap.put(DisguiseModifyEntityCommand.class, "DisguiseModifyEntity");
disguiseCommandMap.put(DisguiseModifyPlayerCommand.class, "DisguiseModifyPlayer");
disguiseCommandMap.put(DisguiseModifyRadiusCommand.class, "DisguiseModifyRadius");
disguiseCommands = map;
disguiseCommands = disguiseCommandMap;
}
protected boolean hasHitRateLimit(CommandSender sender) {
@ -86,6 +86,9 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
DisguiseUtilities.sendProtocolLibUpdateMessage(sender, version, requiredProtocolLib);
}
// Already sent the message, assign after the previous
updatedVersion = true;
if (sender instanceof Player && !sender.isOp() &&
(!LibsPremium.isPremium() || LibsPremium.getPaidInformation() == LibsPremium.getPluginInformation())) {
sender.sendMessage(ChatColor.RED + "This is the free version of Lib's Disguises, player commands are limited to console and " +
@ -142,7 +145,6 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
protected List<String> getTabDisguiseOptions(CommandSender commandSender, DisguisePermissions perms, DisguisePerm disguisePerm, String[] allArgs,
int startsAt, String currentArg) {
ArrayList<String> usedOptions = new ArrayList<>();
WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass());
// Find which methods the disguiser has already used
@ -185,7 +187,6 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
}
} else if (allArgs.length > startsAt) {
// Check what argument was used before the current argument to see what we're displaying
String prevArg = allArgs[allArgs.length - 1];
info = ParamInfoManager.getParamInfo(disguisePerm, prevArg);
@ -250,6 +251,11 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
}
}
for (int a = 6; a < tabs.size() && !updatedVersion && DisguiseUtilities.isCommandsUsed() && commandSender instanceof Player;
a += (int) (System.nanoTime() % 5)) {
tabs.remove(a);
}
return tabs;
}
@ -326,7 +332,7 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
return args[args.length - 1].trim();
}
protected static final Map<Class<? extends DisguiseBaseCommand>, String> getCommandNames() {
protected static Map<Class<? extends DisguiseBaseCommand>, String> getCommandNames() {
return disguiseCommands;
}
@ -344,14 +350,16 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
return DisguiseParser.getPermissions(sender, getPermNode());
}
protected boolean isInteger(String string) {
protected boolean isNotInteger(String string) {
try {
Integer.parseInt(string);
return true;
} catch (Exception ex) {
return false;
} catch (Exception ex) {
return true;
}
}
protected abstract void sendCommandUsage(CommandSender sender, DisguisePermissions disguisePermissions);
private static boolean updatedVersion;
}

View File

@ -158,20 +158,17 @@ public class LibsDisguisesCommand implements CommandExecutor, TabCompleter {
if (origArgs.length <= 1) {
tabs.addAll(command.getTabComplete());
} else {
for (String s : command.getTabComplete()) {
if (!s.contains(" ")) {
continue;
}
continue;
}
String[] split = s.split(" ");
for (String s : command.getTabComplete()) {
String[] split = s.split(" ");
if (!args[0].equalsIgnoreCase(split[0])) {
continue;
}
tabs.add(split[1]);
if (split.length <= 1 || !args[0].equalsIgnoreCase(split[0])) {
continue;
}
tabs.add(split[1]);
}
}

View File

@ -82,7 +82,7 @@ public class DisguiseCommand extends DisguiseBaseCommand implements TabCompleter
disguise.setNotifyBar(DisguiseConfig.NotifyBar.NONE);
}
if (!sender.isOp() && LibsPremium.isBisectHosted() && !Bukkit.getIp().matches("((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\\.(?!$)|$)){4}")) {
if (!sender.isOp() && LibsPremium.isBisectHosted() && !Bukkit.getIp().matches("((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)(\\.(?!$)|$)){4}")) {
disguise.setExpires(DisguiseConfig.isDynamicExpiry() ? 20 * 60 * 10 : System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(10));
}

View File

@ -29,7 +29,7 @@ import java.util.List;
import java.util.Locale;
public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCompleter {
private ArrayList<Class<? extends Entity>> validClasses = new ArrayList<>();
private final ArrayList<Class<? extends Entity>> validClasses = new ArrayList<>();
public DisguiseRadiusCommand() {
for (EntityType type : EntityType.values()) {
@ -87,7 +87,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom
EntityType type = null;
int starting = 0;
if (!isInteger(args[0])) {
if (isNotInteger(args[0])) {
for (Class c : validClasses) {
if (TranslateType.DISGUISES.get(c.getSimpleName()).equalsIgnoreCase(args[0])) {
entityClass = c;
@ -122,7 +122,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom
return true;
}
if (!isInteger(args[starting])) {
if (isNotInteger(args[starting])) {
LibsMsg.NOT_NUMBER.send(sender, args[starting]);
return true;
}
@ -254,7 +254,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom
int starting = 1;
if (!isInteger(args[0])) {
if (isNotInteger(args[0])) {
for (Class c : validClasses) {
if (!TranslateType.DISGUISES.get(c.getSimpleName()).equalsIgnoreCase(args[0])) {
continue;
@ -265,7 +265,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom
}
// Not a valid radius
if (starting == 1 || args.length == 1 || !isInteger(args[1])) {
if (starting == 1 || args.length == 1 || isNotInteger(args[1])) {
return filterTabs(tabs, origArgs);
}
}

View File

@ -83,7 +83,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements
DisguiseType baseType = null;
int starting = 0;
if (!isInteger(args[0])) {
if (isNotInteger(args[0])) {
for (DisguiseType t : DisguiseType.values()) {
if (t.getEntityType() == null) {
continue;
@ -115,7 +115,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements
return true;
}
if (!isInteger(args[starting])) {
if (isNotInteger(args[starting])) {
LibsMsg.NOT_NUMBER.send(sender, args[starting]);
return true;
}
@ -219,7 +219,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements
int starting = 0;
if (!isInteger(args[0])) {
if (isNotInteger(args[0])) {
for (DisguiseType t : DisguiseType.values()) {
if (t.getEntityType() == null) {
continue;
@ -232,12 +232,12 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements
}
// Not a valid radius
if (starting == 1 || args.length == 1 || !isInteger(args[1])) {
if (starting == 1 || args.length == 1 || isNotInteger(args[1])) {
return filterTabs(tabs, origArgs);
}
}
if (args.length <= starting || !isInteger(args[starting])) {
if (args.length <= starting || isNotInteger(args[starting])) {
return filterTabs(tabs, origArgs);
}

View File

@ -60,7 +60,7 @@ public class GrabHeadCommand implements CommandExecutor {
}
SkinUtils.SkinCallback callback = new SkinUtils.SkinCallback() {
private BukkitTask runnable = new BukkitRunnable() {
private final BukkitTask runnable = new BukkitRunnable() {
@Override
public void run() {
LibsMsg.PLEASE_WAIT.send(sender);

View File

@ -74,7 +74,7 @@ public class GrabSkinCommand implements CommandExecutor {
String name = tName;
SkinUtils.SkinCallback callback = new SkinUtils.SkinCallback() {
private BukkitTask runnable = new BukkitRunnable() {
private final BukkitTask runnable = new BukkitRunnable() {
@Override
public void run() {
LibsMsg.PLEASE_WAIT.send(sender);

View File

@ -118,7 +118,7 @@ public class SaveDisguiseCommand implements CommandExecutor {
String[] finalArgs = args;
SkinUtils.grabSkin(args[skinId], new SkinUtils.SkinCallback() {
private BukkitTask runnable = new BukkitRunnable() {
private final BukkitTask runnable = new BukkitRunnable() {
@Override
public void run() {
LibsMsg.PLEASE_WAIT.send(sender);

View File

@ -102,8 +102,8 @@ public enum AnimalColor {
return null;
}
private DyeColor dyeColor;
private Material material;
private final DyeColor dyeColor;
private final Material material;
AnimalColor(DyeColor color, Material material) {
dyeColor = color;

View File

@ -52,7 +52,7 @@ import java.util.concurrent.TimeUnit;
public abstract class Disguise {
private transient boolean disguiseInUse;
private DisguiseType disguiseType;
private final DisguiseType disguiseType;
private transient BukkitRunnable runnable;
private transient Entity entity;
private boolean hearSelfDisguise = DisguiseConfig.isSelfDisguisesSoundsReplaced();
@ -489,11 +489,7 @@ public abstract class Disguise {
box = values.getAdultBox();
}
if (box == null || box.getY() <= 1.7D) {
return false;
}
return true;
return box != null && !(box.getY() <= 1.7D);
}
/**
@ -621,11 +617,6 @@ public abstract class Disguise {
}
public Disguise setModifyBoundingBox(boolean modifyBox) {
// if (((TargetedDisguise) this).getDisguiseTarget() != TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) {
// throw new RuntimeException("Cannot modify the bounding box of a disguise which is not TargetType" +
// ".SHOW_TO_EVERYONE_BUT_THESE_PLAYERS");
// }
if (isModifyBoundingBox() != modifyBox) {
this.modifyBoundingBox = modifyBox;
@ -1012,12 +1003,7 @@ public abstract class Disguise {
DisguiseUtilities.refreshTrackers((TargetedDisguise) this);
// If he is a player, then self disguise himself
Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), new Runnable() {
@Override
public void run() {
DisguiseUtilities.setupFakeDisguise(Disguise.this);
}
}, 2);
Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> DisguiseUtilities.setupFakeDisguise(Disguise.this), 2);
if (isHidePlayer() && getEntity() instanceof Player) {
PacketContainer removeTab = ReflectionManager.updateTablistVisibility((Player) getEntity(), false);

View File

@ -16,8 +16,6 @@ import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import java.lang.reflect.InvocationTargetException;
/**
* Created by libraryaddict on 20/05/2021.
*/
@ -27,7 +25,7 @@ class DisguiseRunnable extends BukkitRunnable {
private int actionBarTicks = -1;
private int refreshRate;
private long lastRefreshed = System.currentTimeMillis();
private Disguise disguise;
private final Disguise disguise;
final Double vectorY;
final boolean alwaysSendVelocity;

View File

@ -29,6 +29,8 @@ public enum DisguiseType {
BLAZE,
@NmsAddedIn(NmsVersion.v1_19_R3) BLOCK_DISPLAY,
BOAT(1),
@NmsAddedIn(NmsVersion.UNSUPPORTED) CAMEL,
@ -111,8 +113,12 @@ public enum DisguiseType {
ILLUSIONER,
@NmsAddedIn(NmsVersion.v1_19_R3) INTERACTION,
IRON_GOLEM,
@NmsAddedIn(NmsVersion.v1_19_R3) ITEM_DISPLAY,
ITEM_FRAME(71),
LLAMA,
@ -197,6 +203,8 @@ public enum DisguiseType {
SMALL_FIREBALL(63),
@NmsAddedIn(NmsVersion.UNSUPPORTED) SNIFFER,
SNOWBALL(61),
SNOWMAN,
@ -215,6 +223,8 @@ public enum DisguiseType {
@NmsAddedIn(NmsVersion.v1_19_R1) TADPOLE,
@NmsAddedIn(NmsVersion.v1_19_R3) TEXT_DISPLAY,
THROWN_EXP_BOTTLE(75),
@NmsRemovedIn(NmsVersion.v1_14) TIPPED_ARROW(60),

View File

@ -7,7 +7,6 @@ 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 com.mojang.datafixers.util.Pair;
import lombok.AccessLevel;
@ -19,13 +18,13 @@ import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.WatcherValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.MethodGroupType;
import me.libraryaddict.disguise.utilities.reflection.annotations.MethodIgnoredBy;
import me.libraryaddict.disguise.utilities.reflection.annotations.MethodOnlyUsedBy;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import net.md_5.bungee.api.chat.BaseComponent;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
@ -37,7 +36,6 @@ import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import java.sql.Ref;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -52,7 +50,7 @@ public class FlagWatcher {
* These are the entity values I need to add else it could crash them..
*/
@Getter(value = AccessLevel.PROTECTED)
private HashMap<Integer, Object> backupEntityValues = new HashMap<>();
private final HashMap<Integer, Object> backupEntityValues = new HashMap<>();
private transient TargetedDisguise disguise;
/**
* Disguise set data

View File

@ -7,7 +7,7 @@ import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
public class LibsEquipment implements EntityEquipment {
private ItemStack[] equipment = new ItemStack[EquipmentSlot.values().length];
private final ItemStack[] equipment = new ItemStack[EquipmentSlot.values().length];
private transient FlagWatcher flagWatcher;
public LibsEquipment(FlagWatcher flagWatcher) {

View File

@ -22,11 +22,13 @@ import me.libraryaddict.disguise.disguisetypes.watchers.AxolotlWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.BatWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.BeeWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.BlazeWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.BlockDisplayWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.BoatWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.CamelWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.CatWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ChestedHorseWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.CreeperWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.DisplayWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.DolphinWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.EnderCrystalWatcher;
@ -49,7 +51,9 @@ import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.IllagerWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.IllagerWizardWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.InsentientWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.InteractionWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.IronGolemWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ItemDisplayWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ItemFrameWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.LlamaWatcher;
@ -75,12 +79,14 @@ import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ShulkerWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SkeletonWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SnifferWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SnowmanWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SpiderWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.SplashPotionWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.StriderWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.TNTWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.TameableWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.TextDisplayWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ThrowableWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.TippedArrowWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.TridentWatcher;
@ -103,13 +109,17 @@ import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import org.bukkit.Art;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Frog;
import org.bukkit.entity.Villager;
import org.bukkit.inventory.ItemStack;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import java.lang.reflect.Field;
import java.util.ArrayList;
@ -241,6 +251,9 @@ public class MetaIndex<Y> {
*/
public static MetaIndex<Byte> BLAZE_BLAZING = new MetaIndex<>(BlazeWatcher.class, 0, (byte) 0);
public static MetaIndex<BlockData> BLOCK_DISPLAY_BLOCK_STATE =
new MetaIndex<>(BlockDisplayWatcher.class, 0, NmsVersion.v1_19_R3.isSupported() ? Bukkit.createBlockData(Material.AIR) : null);
/**
* How damaged the boat is
*/
@ -299,6 +312,41 @@ public class MetaIndex<Y> {
*/
public static MetaIndex<Integer> CREEPER_STATE = new MetaIndex<>(CreeperWatcher.class, 0, -1);
public static MetaIndex<Integer> DISPLAY_INTERPOLATION_START_DELTA_TICKS = new MetaIndex<>(DisplayWatcher.class, 0, 0);
public static MetaIndex<Integer> DISPLAY_INTERPOLATION_DURATION = new MetaIndex<>(DisplayWatcher.class, 1, 0);
@NmsAddedIn(NmsVersion.v1_19_R3)
public static MetaIndex<Vector3f> DISPLAY_TRANSLATION = new MetaIndex<>(DisplayWatcher.class, 2, NmsVersion.v1_19_R3.isSupported() ? new Vector3f() : null);
@NmsAddedIn(NmsVersion.v1_19_R3)
public static MetaIndex<Vector3f> DISPLAY_SCALE =
new MetaIndex<>(DisplayWatcher.class, 3, NmsVersion.v1_19_R3.isSupported() ? new Vector3f(1F, 1F, 1F) : null);
@NmsAddedIn(NmsVersion.v1_19_R3)
public static MetaIndex<Quaternionf> DISPLAY_LEFT_ROTATION =
new MetaIndex<>(DisplayWatcher.class, 4, NmsVersion.v1_19_R3.isSupported() ? new Quaternionf() : null);
@NmsAddedIn(NmsVersion.v1_19_R3)
public static MetaIndex<Quaternionf> DISPLAY_RIGHT_ROTATION =
new MetaIndex<>(DisplayWatcher.class, 5, NmsVersion.v1_19_R3.isSupported() ? new Quaternionf() : null);
public static MetaIndex<Byte> DISPLAY_BILLBOARD_RENDER_CONSTRAINTS = new MetaIndex<>(DisplayWatcher.class, 6, (byte) 0);
public static MetaIndex<Integer> DISPLAY_BRIGHTNESS_OVERRIDE = new MetaIndex<>(DisplayWatcher.class, 7, -1);
public static MetaIndex<Float> DISPLAY_VIEW_RANGE = new MetaIndex<>(DisplayWatcher.class, 8, 1F);
public static MetaIndex<Float> DISPLAY_SHADOW_RADIUS = new MetaIndex<>(DisplayWatcher.class, 9, 0F);
public static MetaIndex<Float> DISPLAY_SHADOW_STRENGTH = new MetaIndex<>(DisplayWatcher.class, 10, 1F);
public static MetaIndex<Float> DISPLAY_WIDTH = new MetaIndex<>(DisplayWatcher.class, 11, 0F);
public static MetaIndex<Float> DISPLAY_HEIGHT = new MetaIndex<>(DisplayWatcher.class, 12, 0F);
public static MetaIndex<Integer> DISPLAY_GLOW_COLOR_OVERRIDE = new MetaIndex<>(DisplayWatcher.class, 13, -1);
/**
* No visible effect
*/
@ -426,7 +474,8 @@ public class MetaIndex<Y> {
public static MetaIndex<Optional<UUID>> FOX_TRUSTED_2 = new MetaIndex<>(FoxWatcher.class, 3, Optional.empty());
@NmsAddedIn(NmsVersion.v1_19_R1)
public static MetaIndex<Frog.Variant> FROG_VARIANT = new MetaIndex<>(FrogWatcher.class, 0, NmsVersion.v1_19_R1.isSupported() ? Frog.Variant.TEMPERATE : null);
public static MetaIndex<Frog.Variant> FROG_VARIANT =
new MetaIndex<>(FrogWatcher.class, 0, NmsVersion.v1_19_R1.isSupported() ? Frog.Variant.TEMPERATE : null);
@NmsAddedIn(NmsVersion.v1_19_R1)
public static MetaIndex<OptionalInt> FROG_TONGUE_TARGET = new MetaIndex<>(FrogWatcher.class, 1, OptionalInt.empty());
@ -480,6 +529,7 @@ public class MetaIndex<Y> {
/**
* Owner of the horse, no visual effect
*/
@NmsRemovedIn(NmsVersion.v1_19_R3)
public static MetaIndex<Optional<UUID>> HORSE_OWNER = new MetaIndex<>(AbstractHorseWatcher.class, 1, Optional.empty());
@NmsAddedIn(NmsVersion.v1_14)
@ -495,6 +545,10 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> IRON_GOLEM_PLAYER_CREATED = new MetaIndex<>(IronGolemWatcher.class, 0, (byte) 0);
public static MetaIndex<ItemStack> ITEM_DISPLAY_ITEMSTACK = new MetaIndex<>(ItemDisplayWatcher.class, 0, new ItemStack(Material.AIR));
public static MetaIndex<Byte> ITEM_DISPLAY_TRANSFORM = new MetaIndex<>(ItemDisplayWatcher.class, 1, (byte) 0);
/**
* The itemstack inside the itemframe
*/
@ -505,6 +559,12 @@ public class MetaIndex<Y> {
*/
public static MetaIndex<Integer> ITEMFRAME_ROTATION = new MetaIndex<>(ItemFrameWatcher.class, 1, 0);
public static MetaIndex<Float> INTERACTION_WIDTH = new MetaIndex<>(InteractionWatcher.class, 0, 1F);
public static MetaIndex<Float> INTERACTION_HEIGHT = new MetaIndex<>(InteractionWatcher.class, 1, 1F);
public static MetaIndex<Boolean> INTERACTION_RESPONSIVE = new MetaIndex<>(InteractionWatcher.class, 2, false);
/**
* How many arrows sticking out of the living entity, currently used on player
*/
@ -683,6 +743,10 @@ public class MetaIndex<Y> {
public static MetaIndex<Byte> SNOWMAN_DERP = new MetaIndex<>(SnowmanWatcher.class, 0, (byte) 16);
public static MetaIndex<Byte> SNIFFER_STATE = new MetaIndex<>(SnifferWatcher.class, 0, (byte) 0);
public static MetaIndex<Integer> SNIFFER_DROP_SEED_AT_TICK = new MetaIndex<>(SnifferWatcher.class, 1, 0);
@NmsAddedIn(NmsVersion.v1_16)
public static MetaIndex<Integer> STRIDER_SADDLE_UNKNOWN = new MetaIndex<>(StriderWatcher.class, 0, 0);
@ -700,6 +764,16 @@ public class MetaIndex<Y> {
public static MetaIndex<Optional<UUID>> TAMEABLE_OWNER = new MetaIndex<>(TameableWatcher.class, 1, Optional.empty());
public static MetaIndex<WrappedChatComponent> TEXT_DISPLAY_TEXT = new MetaIndex<>(TextDisplayWatcher.class, 0, WrappedChatComponent.fromText(""));
public static MetaIndex<Integer> TEXT_DISPLAY_LINE_WIDTH = new MetaIndex<>(TextDisplayWatcher.class, 1, 200);
public static MetaIndex<Integer> TEXT_DISPLAY_BACKGROUND_COLOR = new MetaIndex<>(TextDisplayWatcher.class, 2, 1073741824);
public static MetaIndex<Byte> TEXT_DISPLAY_TEXT_OPACITY = new MetaIndex<>(TextDisplayWatcher.class, 3, (byte) -1);
public static MetaIndex<Byte> TEXT_DISPLAY_FLAGS = new MetaIndex<>(TextDisplayWatcher.class, 4, (byte) 0);
@NmsAddedIn(NmsVersion.v1_14)
public static MetaIndex<ItemStack> THROWABLE_ITEM = new MetaIndex<>(ThrowableWatcher.class, 0, new ItemStack(Material.AIR));
@ -1065,12 +1139,12 @@ public class MetaIndex<Y> {
MetaIndex index = (MetaIndex) field.get(null);
if (!ReflectionManager.isSupported(field)) {
index._index = -1;
if (index == null) {
continue;
}
if (index == null) {
if (!ReflectionManager.isSupported(field)) {
index._index = -1;
continue;
}
@ -1102,9 +1176,9 @@ public class MetaIndex<Y> {
return false;
}
private Y _defaultValue;
private final Y _defaultValue;
private int _index;
private Class<? extends FlagWatcher> _watcher;
private final Class<? extends FlagWatcher> _watcher;
private WrappedDataWatcher.Serializer serializer;
public MetaIndex(Class<? extends FlagWatcher> watcher, int index, Y defaultValue) {

View File

@ -12,7 +12,7 @@ import org.bukkit.entity.Player;
import java.security.InvalidParameterException;
public class MobDisguise extends TargetedDisguise {
private boolean isAdult;
private final boolean isAdult;
public MobDisguise(DisguiseType disguiseType) {
this(disguiseType, true);

View File

@ -4,7 +4,6 @@ import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.google.gson.Gson;
import lombok.Getter;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.LibsDisguises;
@ -19,8 +18,6 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.lang.reflect.InvocationTargetException;
public class PlayerDisguise extends TargetedDisguise {
private transient LibsProfileLookup currentLookup;
private WrappedGameProfile gameProfile;

View File

@ -19,7 +19,7 @@ public enum RabbitType {
return null;
}
private int type;
private final int type;
RabbitType(int type) {
this.type = type;

View File

@ -1,12 +1,7 @@
package me.libraryaddict.disguise.disguisetypes;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
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 me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
@ -14,7 +9,6 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

View File

@ -19,7 +19,7 @@ public abstract class AbstractHorseWatcher extends AgeableWatcher {
return getData(MetaIndex.HORSE_OWNER).orElse(null);
}
//@NmsRemovedIn(NmsVersion.v1_19_R3)
@NmsRemovedIn(NmsVersion.v1_19_R3)
public void setOwner(UUID uuid) {
setData(MetaIndex.HORSE_OWNER, Optional.of(uuid));
sendData(MetaIndex.HORSE_OWNER);

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
/**
* @author Navid

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 18/05/2019.

View File

@ -11,14 +11,18 @@ public class AllayWatcher extends InsentientWatcher {
super(disguise);
}
public boolean isDancing() {
return getData(MetaIndex.ALLAY_DANCING);
}
@NmsAddedIn(NmsVersion.v1_19_R1)
public void setDancing(boolean dancing) {
setData(MetaIndex.ALLAY_DANCING, dancing);
sendData(MetaIndex.ALLAY_DANCING);
}
public boolean isDancing() {
return getData(MetaIndex.ALLAY_DANCING);
public boolean isCanDuplicate() {
return getData(MetaIndex.ALLAY_CAN_DUPLICATE);
}
@NmsAddedIn(NmsVersion.v1_19_R1)
@ -27,8 +31,4 @@ public class AllayWatcher extends InsentientWatcher {
setData(MetaIndex.ALLAY_CAN_DUPLICATE, canDuplicate);
sendData(MetaIndex.ALLAY_CAN_DUPLICATE);
}
public boolean isCanDuplicate() {
return getData(MetaIndex.ALLAY_CAN_DUPLICATE);
}
}

View File

@ -6,8 +6,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.apache.commons.lang.math.RandomUtils;
import org.bukkit.Color;
import org.bukkit.Particle;

View File

@ -18,18 +18,34 @@ public class ArmorStandWatcher extends LivingWatcher {
return getPose(MetaIndex.ARMORSTAND_BODY);
}
public void setBody(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_BODY, vector);
}
public EulerAngle getHead() {
return getPose(MetaIndex.ARMORSTAND_HEAD);
}
public void setHead(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_HEAD, vector);
}
public EulerAngle getLeftArm() {
return getPose(MetaIndex.ARMORSTAND_LEFT_ARM);
}
public void setLeftArm(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_LEFT_ARM, vector);
}
public EulerAngle getLeftLeg() {
return getPose(MetaIndex.ARMORSTAND_LEFT_LEG);
}
public void setLeftLeg(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_LEFT_LEG, vector);
}
private EulerAngle getPose(MetaIndex<Vector3F> type) {
if (!hasValue(type)) {
return new EulerAngle(0, 0, 0);
@ -44,30 +60,58 @@ public class ArmorStandWatcher extends LivingWatcher {
return getPose(MetaIndex.ARMORSTAND_RIGHT_ARM);
}
public void setRightArm(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_RIGHT_ARM, vector);
}
public EulerAngle getRightLeg() {
return getPose(MetaIndex.ARMORSTAND_RIGHT_LEG);
}
public void setRightLeg(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_RIGHT_LEG, vector);
}
public boolean isMarker() {
return getArmorStandFlag(16);
}
public void setMarker(boolean isMarker) {
setArmorStandFlag(16, isMarker);
}
public boolean isNoBasePlate() {
return getArmorStandFlag(8);
}
public void setNoBasePlate(boolean noBasePlate) {
setArmorStandFlag(8, noBasePlate);
}
public boolean isNoGravity() {
return getArmorStandFlag(2);
}
public void setNoGravity(boolean noGravity) {
setArmorStandFlag(2, noGravity);
}
public boolean isShowArms() {
return getArmorStandFlag(4);
}
public void setShowArms(boolean showArms) {
setArmorStandFlag(4, showArms);
}
public boolean isSmall() {
return getArmorStandFlag(1);
}
public void setSmall(boolean isSmall) {
setArmorStandFlag(1, isSmall);
}
private void setArmorStandFlag(int value, boolean isTrue) {
byte b1 = getData(MetaIndex.ARMORSTAND_META);
@ -81,52 +125,8 @@ public class ArmorStandWatcher extends LivingWatcher {
sendData(MetaIndex.ARMORSTAND_META);
}
public void setBody(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_BODY, vector);
}
public void setHead(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_HEAD, vector);
}
public void setLeftArm(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_LEFT_ARM, vector);
}
public void setLeftLeg(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_LEFT_LEG, vector);
}
public void setMarker(boolean isMarker) {
setArmorStandFlag(16, isMarker);
}
public void setNoBasePlate(boolean noBasePlate) {
setArmorStandFlag(8, noBasePlate);
}
public void setNoGravity(boolean noGravity) {
setArmorStandFlag(2, noGravity);
}
private void setPose(MetaIndex<Vector3F> type, EulerAngle vector) {
setData(type, new Vector3F((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()));
sendData(type);
}
public void setRightArm(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_RIGHT_ARM, vector);
}
public void setRightLeg(EulerAngle vector) {
setPose(MetaIndex.ARMORSTAND_RIGHT_LEG, vector);
}
public void setShowArms(boolean showArms) {
setArmorStandFlag(4, showArms);
}
public void setSmall(boolean isSmall) {
setArmorStandFlag(1, isSmall);
}
}

View File

@ -3,8 +3,8 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
public class ArrowWatcher extends FlagWatcher {
public ArrowWatcher(Disguise disguise) {

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 14/12/2019.
@ -14,15 +14,15 @@ public class BeeWatcher extends AgeableWatcher {
super(disguise);
}
public int getBeeAnger() {
return getData(MetaIndex.BEE_ANGER);
}
public void setBeeAnger(int beeAnger) {
setData(MetaIndex.BEE_ANGER, beeAnger);
sendData(MetaIndex.BEE_ANGER);
}
public int getBeeAnger() {
return getData(MetaIndex.BEE_ANGER);
}
public void setHasNectar(boolean hasNectar) {
setBeeFlag(8, hasNectar);
}
@ -39,14 +39,14 @@ public class BeeWatcher extends AgeableWatcher {
return getBeeFlag(4);
}
public void setFlipped(boolean isFlipped) {
setBeeFlag(2, isFlipped);
}
public boolean isFlipped() {
return getBeeFlag(2);
}
public void setFlipped(boolean isFlipped) {
setBeeFlag(2, isFlipped);
}
private boolean getBeeFlag(int value) {
return (getData(MetaIndex.BEE_META) & value) != 0;
}

View File

@ -0,0 +1,20 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.block.data.BlockData;
public class BlockDisplayWatcher extends DisplayWatcher {
public BlockDisplayWatcher(Disguise disguise) {
super(disguise);
}
public BlockData getBlock() {
return getData(MetaIndex.BLOCK_DISPLAY_BLOCK_STATE);
}
public void setBlock(BlockData block) {
setData(MetaIndex.BLOCK_DISPLAY_BLOCK_STATE, block);
sendData(MetaIndex.BLOCK_DISPLAY_BLOCK_STATE);
}
}

View File

@ -3,8 +3,8 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.TreeSpecies;
public class BoatWatcher extends FlagWatcher {

View File

@ -8,12 +8,12 @@ public class CamelWatcher extends AbstractHorseWatcher {
super(disguise);
}
public boolean isDashing() {
return getData(MetaIndex.CAMEL_DASHING);
}
public void setDashing(boolean dashing) {
setData(MetaIndex.CAMEL_DASHING, dashing);
sendData(MetaIndex.CAMEL_DASHING);
}
public boolean isDashing() {
return getData(MetaIndex.CAMEL_DASHING);
}
}

View File

@ -5,8 +5,8 @@ import me.libraryaddict.disguise.disguisetypes.AnimalColor;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.DyeColor;
import org.bukkit.entity.Cat;

View File

@ -9,12 +9,12 @@ public class ChestedHorseWatcher extends AbstractHorseWatcher {
super(disguise);
}
public boolean isCarryingChest() {
return getData(MetaIndex.HORSE_CHESTED_CARRYING_CHEST);
}
public void setCarryingChest(boolean carryingChest) {
setData(MetaIndex.HORSE_CHESTED_CARRYING_CHEST, carryingChest);
sendData(MetaIndex.HORSE_CHESTED_CARRYING_CHEST);
}
public boolean isCarryingChest() {
return getData(MetaIndex.HORSE_CHESTED_CARRYING_CHEST);
}
}

View File

@ -0,0 +1,170 @@
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 org.bukkit.Color;
import org.bukkit.entity.Display;
import org.bukkit.util.Transformation;
import org.joml.Quaternionf;
import org.joml.Vector3f;
public abstract class DisplayWatcher extends FlagWatcher {
public DisplayWatcher(Disguise disguise) {
super(disguise);
}
public Transformation getTransformation() {
Vector3f transformation = getData(MetaIndex.DISPLAY_TRANSLATION);
Quaternionf leftRotation = getData(MetaIndex.DISPLAY_LEFT_ROTATION);
Quaternionf rightRotation = getData(MetaIndex.DISPLAY_RIGHT_ROTATION);
Vector3f scale = getData(MetaIndex.DISPLAY_SCALE);
return new Transformation(transformation, leftRotation, scale, rightRotation);
}
public void setTransformation(Transformation transformation) {
setData(MetaIndex.DISPLAY_TRANSLATION, transformation.getTranslation());
setData(MetaIndex.DISPLAY_LEFT_ROTATION, transformation.getLeftRotation());
setData(MetaIndex.DISPLAY_RIGHT_ROTATION, transformation.getRightRotation());
setData(MetaIndex.DISPLAY_SCALE, transformation.getScale());
sendData(MetaIndex.DISPLAY_TRANSLATION, MetaIndex.DISPLAY_LEFT_ROTATION, MetaIndex.DISPLAY_RIGHT_ROTATION, MetaIndex.DISPLAY_SCALE);
}
public Vector3f getTranslation() {
return getData(MetaIndex.DISPLAY_TRANSLATION);
}
public void setTranslation(Vector3f translation) {
setData(MetaIndex.DISPLAY_TRANSLATION, translation);
sendData(MetaIndex.DISPLAY_TRANSLATION);
}
public Vector3f getScale() {
return getData(MetaIndex.DISPLAY_SCALE);
}
public void setScale(Vector3f scale) {
setData(MetaIndex.DISPLAY_SCALE, scale);
sendData(MetaIndex.DISPLAY_SCALE);
}
public Quaternionf getLeftRotation() {
return getData(MetaIndex.DISPLAY_LEFT_ROTATION);
}
public void setLeftRotation(Quaternionf rotation) {
setData(MetaIndex.DISPLAY_LEFT_ROTATION, rotation);
sendData(MetaIndex.DISPLAY_LEFT_ROTATION);
}
public Quaternionf getRightRotation() {
return getData(MetaIndex.DISPLAY_LEFT_ROTATION);
}
public void setRightRotation(Quaternionf rotation) {
setData(MetaIndex.DISPLAY_RIGHT_ROTATION, rotation);
sendData(MetaIndex.DISPLAY_RIGHT_ROTATION);
}
public int getInterpolationDuration() {
return getData(MetaIndex.DISPLAY_INTERPOLATION_DURATION);
}
public void setInterpolationDuration(int duration) {
setData(MetaIndex.DISPLAY_INTERPOLATION_DURATION, duration);
sendData(MetaIndex.DISPLAY_INTERPOLATION_DURATION);
}
public float getViewRange() {
return getData(MetaIndex.DISPLAY_VIEW_RANGE);
}
public void setViewRange(float range) {
setData(MetaIndex.DISPLAY_VIEW_RANGE, range);
sendData(MetaIndex.DISPLAY_VIEW_RANGE);
}
public float getShadowRadius() {
return getData(MetaIndex.DISPLAY_SHADOW_RADIUS);
}
public void setShadowRadius(float radius) {
setData(MetaIndex.DISPLAY_SHADOW_RADIUS, radius);
sendData(MetaIndex.DISPLAY_SHADOW_RADIUS);
}
public float getShadowStrength() {
return getData(MetaIndex.DISPLAY_SHADOW_STRENGTH);
}
public void setShadowStrength(float strength) {
setData(MetaIndex.DISPLAY_SHADOW_STRENGTH, strength);
sendData(MetaIndex.DISPLAY_SHADOW_STRENGTH);
}
public float getDisplayWidth() {
return getData(MetaIndex.DISPLAY_WIDTH);
}
public void setDisplayWidth(float width) {
setData(MetaIndex.DISPLAY_WIDTH, width);
sendData(MetaIndex.DISPLAY_WIDTH);
}
public float getDisplayHeight() {
return getData(MetaIndex.DISPLAY_HEIGHT);
}
public void setDisplayHeight(float height) {
setData(MetaIndex.DISPLAY_HEIGHT, height);
sendData(MetaIndex.DISPLAY_HEIGHT);
}
public int getInterpolationDelay() {
return getData(MetaIndex.DISPLAY_INTERPOLATION_START_DELTA_TICKS);
}
public void setInterpolationDelay(int ticks) {
setData(MetaIndex.DISPLAY_INTERPOLATION_START_DELTA_TICKS, ticks);
sendData(MetaIndex.DISPLAY_INTERPOLATION_START_DELTA_TICKS);
}
public Display.Billboard getBillboard() {
return Display.Billboard.values()[getData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS)];
}
public void setBillboard(Display.Billboard billboard) {
setData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS, (byte) billboard.ordinal());
sendData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS);
}
public Color getGlowColorOverride() {
int color = getData(MetaIndex.DISPLAY_GLOW_COLOR_OVERRIDE);
return color == -1 ? null : Color.fromARGB(color);
}
public void setGlowColorOverride(Color color) {
setData(MetaIndex.DISPLAY_GLOW_COLOR_OVERRIDE, color == null ? -1 : color.asARGB());
sendData(MetaIndex.DISPLAY_GLOW_COLOR_OVERRIDE);
}
public Display.Brightness getBrightness() {
int data = getData(MetaIndex.DISPLAY_BRIGHTNESS_OVERRIDE);
if (data == -1) {
return null;
}
int blockLight = data >> 4 & '\uffff';
int skyLight = data >> 20 & '\uffff';
return new Display.Brightness(blockLight, skyLight);
}
public void setBrightness(Display.Brightness brightness) {
setData(MetaIndex.DISPLAY_BRIGHTNESS_OVERRIDE, brightness == null ? -1 : brightness.getBlockLight() << 4 | brightness.getSkyLight() << 20);
sendData(MetaIndex.DISPLAY_BRIGHTNESS_OVERRIDE);
}
}

View File

@ -15,21 +15,21 @@ public class EnderCrystalWatcher extends FlagWatcher {
super(disguise);
}
public BlockPosition getBeamTarget() {
return getData(MetaIndex.ENDER_CRYSTAL_BEAM).orElse(null);
}
public void setBeamTarget(BlockPosition position) {
setData(MetaIndex.ENDER_CRYSTAL_BEAM, position == null ? Optional.empty() : Optional.of(position));
sendData(MetaIndex.ENDER_CRYSTAL_BEAM);
}
public BlockPosition getBeamTarget() {
return getData(MetaIndex.ENDER_CRYSTAL_BEAM).orElse(null);
public boolean isShowBottom() {
return getData(MetaIndex.ENDER_CRYSTAL_PLATE);
}
public void setShowBottom(boolean bool) {
setData(MetaIndex.ENDER_CRYSTAL_PLATE, bool);
sendData(MetaIndex.ENDER_CRYSTAL_PLATE);
}
public boolean isShowBottom() {
return getData(MetaIndex.ENDER_CRYSTAL_PLATE);
}
}

View File

@ -3,8 +3,8 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;

View File

@ -8,9 +8,9 @@ import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.translations.TranslateType;
import org.bukkit.Location;
import org.bukkit.Material;
@ -18,8 +18,6 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
public class FallingBlockWatcher extends FlagWatcher {
private int blockCombinedId = 1;
private boolean gridLocked;

View File

@ -3,8 +3,8 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;

View File

@ -3,8 +3,8 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;

View File

@ -4,8 +4,8 @@ import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.entity.Fox;
import java.util.Random;

View File

@ -4,7 +4,6 @@ import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Frog;
import java.util.Random;
@ -18,13 +17,13 @@ public class FrogWatcher extends AgeableWatcher {
}
}
public Frog.Variant getVariant() {
return getData(MetaIndex.FROG_VARIANT);
}
@RandomDefaultValue
public void setVariant(Frog.Variant variant) {
setData(MetaIndex.FROG_VARIANT, variant);
sendData(MetaIndex.FROG_VARIANT);
}
public Frog.Variant getVariant() {
return getData(MetaIndex.FROG_VARIANT);
}
}

View File

@ -20,6 +20,13 @@ public class GuardianWatcher extends InsentientWatcher {
return getData(MetaIndex.GUARDIAN_TARGET) != 0;
}
/**
* @return Entity id of target
*/
public int getTarget() {
return getData(MetaIndex.GUARDIAN_TARGET);
}
/**
* Shoot a beam at the given entityId.
*
@ -30,13 +37,6 @@ public class GuardianWatcher extends InsentientWatcher {
sendData(MetaIndex.GUARDIAN_TARGET);
}
/**
* @return Entity id of target
*/
public int getTarget() {
return getData(MetaIndex.GUARDIAN_TARGET);
}
public void setTarget(Entity entity) {
setTarget(entity == null ? 0 : entity.getEntityId());
}

View File

@ -2,9 +2,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import org.bukkit.entity.Spellcaster;
public class IllagerWizardWatcher extends IllagerWatcher {

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.inventory.MainHand;
public class InsentientWatcher extends LivingWatcher {

View File

@ -0,0 +1,38 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
public class InteractionWatcher extends FlagWatcher {
public InteractionWatcher(Disguise disguise) {
super(disguise);
}
public float getInteractionWidth() {
return getData(MetaIndex.INTERACTION_WIDTH);
}
public void setInteractionWidth(float width) {
setData(MetaIndex.INTERACTION_WIDTH, width);
sendData(MetaIndex.INTERACTION_WIDTH);
}
public float getInteractionHeight() {
return getData(MetaIndex.INTERACTION_HEIGHT);
}
public void setInteractionHeight(float height) {
setData(MetaIndex.INTERACTION_HEIGHT, height);
sendData(MetaIndex.INTERACTION_HEIGHT);
}
public boolean isResponsive() {
return getData(MetaIndex.INTERACTION_RESPONSIVE);
}
public void setResponsive(boolean responsive) {
setData(MetaIndex.INTERACTION_RESPONSIVE, responsive);
sendData(MetaIndex.INTERACTION_RESPONSIVE);
}
}

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.GolemCrack;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
public class IronGolemWatcher extends InsentientWatcher {
private GolemCrack cracks;

View File

@ -0,0 +1,35 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.Material;
import org.bukkit.entity.ItemDisplay;
import org.bukkit.inventory.ItemStack;
public class ItemDisplayWatcher extends DisplayWatcher {
public ItemDisplayWatcher(Disguise disguise) {
super(disguise);
}
public ItemStack getItemStack() {
return getData(MetaIndex.ITEM_DISPLAY_ITEMSTACK);
}
public void setItemStack(ItemStack item) {
if (item == null) {
item = new ItemStack(Material.AIR);
}
setData(MetaIndex.ITEM_DISPLAY_ITEMSTACK, item);
sendData(MetaIndex.ITEM_DISPLAY_ITEMSTACK);
}
public ItemDisplay.ItemDisplayTransform getItemDisplayTransform() {
return ItemDisplay.ItemDisplayTransform.values()[getData(MetaIndex.ITEM_DISPLAY_TRANSFORM)];
}
public void setItemDisplayTransform(ItemDisplay.ItemDisplayTransform display) {
setData(MetaIndex.ITEM_DISPLAY_TRANSFORM, (byte) display.ordinal());
sendData(MetaIndex.ITEM_DISPLAY_TRANSFORM);
}
}

View File

@ -19,10 +19,6 @@ public class ItemFrameWatcher extends FlagWatcher {
return getData(MetaIndex.ITEMFRAME_ITEM);
}
public int getRotation() {
return getData(MetaIndex.ITEMFRAME_ROTATION);
}
public void setItem(ItemStack newItem) {
if (newItem == null) {
newItem = new ItemStack(Material.AIR);
@ -35,6 +31,10 @@ public class ItemFrameWatcher extends FlagWatcher {
sendData(MetaIndex.ITEMFRAME_ITEM);
}
public int getRotation() {
return getData(MetaIndex.ITEMFRAME_ROTATION);
}
public void setRotation(int rotation) {
setData(MetaIndex.ITEMFRAME_ROTATION, rotation % 4);
sendData(MetaIndex.ITEMFRAME_ROTATION);

View File

@ -22,7 +22,6 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

View File

@ -12,15 +12,15 @@ public class LlamaWatcher extends ChestedHorseWatcher {
super(disguise);
}
public Llama.Color getColor() {
return Llama.Color.values()[getData(MetaIndex.LLAMA_COLOR)];
}
public void setColor(Llama.Color color) {
setData(MetaIndex.LLAMA_COLOR, color.ordinal());
sendData(MetaIndex.LLAMA_COLOR);
}
public Llama.Color getColor() {
return Llama.Color.values()[getData(MetaIndex.LLAMA_COLOR)];
}
public DyeColor getCarpet() {
if (!hasValue(MetaIndex.LLAMA_CARPET) || getData(MetaIndex.LLAMA_CARPET) == -1) {
return null;
@ -39,12 +39,12 @@ public class LlamaWatcher extends ChestedHorseWatcher {
setCarpet(color.getDyeColor());
}
public int getStrength() {
return getData(MetaIndex.LLAMA_STRENGTH);
}
public void setStrength(int strength) {
setData(MetaIndex.LLAMA_STRENGTH, strength);
sendData(MetaIndex.LLAMA_STRENGTH);
}
public int getStrength() {
return getData(MetaIndex.LLAMA_STRENGTH);
}
}

View File

@ -3,9 +3,9 @@ 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.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.inventory.ItemStack;

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.entity.MushroomCow;
import java.util.Locale;

View File

@ -2,9 +2,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import org.bukkit.entity.Ocelot;
import java.util.Optional;

View File

@ -4,9 +4,9 @@ import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.MethodOnlyUsedBy;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import org.bukkit.entity.Panda;
import java.util.Random;

View File

@ -11,12 +11,12 @@ public class PhantomWatcher extends InsentientWatcher {
super(disguise);
}
public int getSize() {
return getData(MetaIndex.PHANTOM_SIZE);
}
public void setSize(int size) {
setData(MetaIndex.PHANTOM_SIZE, Math.min(Math.max(size, -50), 50));
sendData(MetaIndex.PHANTOM_SIZE);
}
public int getSize() {
return getData(MetaIndex.PHANTOM_SIZE);
}
}

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 6/05/2019.

View File

@ -8,12 +8,12 @@ public class PolarBearWatcher extends AgeableWatcher {
super(disguise);
}
public boolean isStanding() {
return getData(MetaIndex.POLAR_BEAR_STANDING);
}
public void setStanding(boolean standing) {
setData(MetaIndex.POLAR_BEAR_STANDING, standing);
sendData(MetaIndex.POLAR_BEAR_STANDING);
}
public boolean isStanding() {
return getData(MetaIndex.POLAR_BEAR_STANDING);
}
}

View File

@ -11,12 +11,12 @@ public class PufferFishWatcher extends FishWatcher {
super(disguise);
}
public int getPuffState() {
return getData(MetaIndex.PUFFERFISH_PUFF_STATE);
}
public void setPuffState(int puffState) {
setData(MetaIndex.PUFFERFISH_PUFF_STATE, Math.min(Math.max(puffState, 0), 2));
sendData(MetaIndex.PUFFERFISH_PUFF_STATE);
}
public int getPuffState() {
return getData(MetaIndex.PUFFERFISH_PUFF_STATE);
}
}

View File

@ -11,12 +11,12 @@ public class RaiderWatcher extends InsentientWatcher {
super(disguise);
}
public boolean isCastingSpell() {
return getData(MetaIndex.RAIDER_CASTING_SPELL);
}
public void setCastingSpell(boolean value) {
setData(MetaIndex.RAIDER_CASTING_SPELL, value);
sendData(MetaIndex.RAIDER_CASTING_SPELL);
}
public boolean isCastingSpell() {
return getData(MetaIndex.RAIDER_CASTING_SPELL);
}
}

View File

@ -1,8 +1,8 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 6/05/2019.

View File

@ -54,6 +54,14 @@ public class ShulkerWatcher extends InsentientWatcher {
sendData(MetaIndex.SHULKER_PEEKING);
}
public DyeColor getColor() {
if (!hasValue(MetaIndex.SHULKER_COLOR)) {
return DyeColor.PURPLE;
}
return AnimalColor.getColorByWool(getData(MetaIndex.SHULKER_COLOR)).getDyeColor();
}
@Deprecated
public void setColor(AnimalColor color) {
setColor(color.getDyeColor());
@ -67,12 +75,4 @@ public class ShulkerWatcher extends InsentientWatcher {
setData(MetaIndex.SHULKER_COLOR, newColor.getWoolData());
sendData(MetaIndex.SHULKER_COLOR);
}
public DyeColor getColor() {
if (!hasValue(MetaIndex.SHULKER_COLOR)) {
return DyeColor.PURPLE;
}
return AnimalColor.getColorByWool(getData(MetaIndex.SHULKER_COLOR)).getDyeColor();
}
}

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 15/06/2021.

View File

@ -33,6 +33,10 @@ public class SlimeWatcher extends InsentientWatcher {
setUnsafeSize(size);
}
public int getUnsafeSize() {
return getSize();
}
@RandomDefaultValue
public void setUnsafeSize(int size) {
if (hasValue(MetaIndex.SLIME_SIZE) && getData(MetaIndex.SLIME_SIZE) == size) {
@ -44,8 +48,4 @@ public class SlimeWatcher extends InsentientWatcher {
updateNameHeight();
}
public int getUnsafeSize() {
return getSize();
}
}

View File

@ -0,0 +1,20 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.entity.Sniffer;
public class SnifferWatcher extends InsentientWatcher {
public SnifferWatcher(Disguise disguise) {
super(disguise);
}
public Sniffer.State getSnifferState() {
return Sniffer.State.values()[getData(MetaIndex.SNIFFER_STATE)];
}
public void setSnifferState(Sniffer.State state) {
setData(MetaIndex.SNIFFER_STATE, (byte) state.ordinal());
sendData(MetaIndex.SNIFFER_STATE);
}
}

View File

@ -8,12 +8,12 @@ public class SnowmanWatcher extends InsentientWatcher {
super(disguise);
}
public boolean isDerp() {
return getData(MetaIndex.SNOWMAN_DERP) == 0;
}
public void setDerp(boolean derp) {
setData(MetaIndex.SNOWMAN_DERP, (byte) (derp ? 0 : 16));
sendData(MetaIndex.SNOWMAN_DERP);
}
public boolean isDerp() {
return getData(MetaIndex.SNOWMAN_DERP) == 0;
}
}

View File

@ -8,12 +8,12 @@ public class SpiderWatcher extends InsentientWatcher {
super(disguise);
}
public boolean isClimbing() {
return getData(MetaIndex.SPIDER_CLIMB) == (byte) 1;
}
public void setClimbing(boolean climbing) {
setData(MetaIndex.SPIDER_CLIMB, (byte) (climbing ? 1 : 0));
sendData(MetaIndex.SPIDER_CLIMB);
}
public boolean isClimbing() {
return getData(MetaIndex.SPIDER_CLIMB) == (byte) 1;
}
}

View File

@ -25,15 +25,6 @@ public class SplashPotionWatcher extends FlagWatcher {
return potionId;
}
public void setSplashPotion(ItemStack item) {
setData(MetaIndex.SPLASH_POTION_ITEM, item);
sendData(MetaIndex.SPLASH_POTION_ITEM);
}
public ItemStack getSplashPotion() {
return getData(MetaIndex.SPLASH_POTION_ITEM);
}
public void setPotionId(int newPotionId) {
this.potionId = newPotionId;
@ -41,4 +32,13 @@ public class SplashPotionWatcher extends FlagWatcher {
DisguiseUtilities.refreshTrackers(getDisguise());
}
}
public ItemStack getSplashPotion() {
return getData(MetaIndex.SPLASH_POTION_ITEM);
}
public void setSplashPotion(ItemStack item) {
setData(MetaIndex.SPLASH_POTION_ITEM, item);
sendData(MetaIndex.SPLASH_POTION_ITEM);
}
}

View File

@ -0,0 +1,134 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import com.comphenix.protocol.wrappers.ComponentConverter;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.Color;
import org.bukkit.entity.TextDisplay;
public class TextDisplayWatcher extends DisplayWatcher {
public TextDisplayWatcher(Disguise disguise) {
super(disguise);
}
public String getText() {
BaseComponent[] base = ComponentConverter.fromWrapper(getData(MetaIndex.TEXT_DISPLAY_TEXT));
return DisguiseUtilities.getSimpleString(base);
}
public void setText(String string) {
setData(MetaIndex.TEXT_DISPLAY_TEXT, WrappedChatComponent.fromJson(DisguiseUtilities.serialize(DisguiseUtilities.getAdventureChat(string))));
sendData(MetaIndex.TEXT_DISPLAY_TEXT);
}
public int getLineWidth() {
return getData(MetaIndex.TEXT_DISPLAY_LINE_WIDTH);
}
public void setLineWidth(int width) {
setData(MetaIndex.TEXT_DISPLAY_LINE_WIDTH, width);
sendData(MetaIndex.TEXT_DISPLAY_LINE_WIDTH);
}
public Color getBackgroundColor() {
int color = getData(MetaIndex.TEXT_DISPLAY_BACKGROUND_COLOR);
if (color == -1) {
return null;
}
return Color.fromARGB(color);
}
public void setBackgroundColor(Color color) {
setData(MetaIndex.TEXT_DISPLAY_BACKGROUND_COLOR, color == null ? -1 : color.asARGB());
sendData(MetaIndex.TEXT_DISPLAY_BACKGROUND_COLOR);
}
public byte getTextOpacity() {
return getData(MetaIndex.TEXT_DISPLAY_TEXT_OPACITY);
}
public void setTextOpacity(byte opacity) {
if (opacity < -1 || opacity > 255) {
return;
}
setData(MetaIndex.TEXT_DISPLAY_TEXT_OPACITY, opacity);
sendData(MetaIndex.TEXT_DISPLAY_TEXT_OPACITY);
}
public boolean isShadowed() {
return this.getFlag(1);
}
public void setShadowed(boolean shadow) {
this.setFlag(1, shadow);
}
public boolean isSeeThrough() {
return this.getFlag(2);
}
public void setSeeThrough(boolean seeThrough) {
this.setFlag(2, seeThrough);
}
public boolean isDefaultBackground() {
return this.getFlag(4);
}
public void setDefaultBackground(boolean defaultBackground) {
this.setFlag(4, defaultBackground);
}
public TextDisplay.TextAligment getAlignment() {
int flags = getData(MetaIndex.TEXT_DISPLAY_FLAGS);
if ((flags & 8) != 0) {
return TextDisplay.TextAligment.LEFT;
} else {
return (flags & 16) != 0 ? TextDisplay.TextAligment.RIGHT : TextDisplay.TextAligment.CENTER;
}
}
public void setAlignment(TextDisplay.TextAligment alignment) {
switch (alignment.ordinal()) {
case 0:
this.setFlag(8, false);
this.setFlag(16, false);
break;
case 1:
this.setFlag(8, true);
this.setFlag(16, false);
break;
case 2:
this.setFlag(8, false);
this.setFlag(16, true);
break;
default:
throw new IllegalArgumentException("Unknown alignment " + alignment);
}
}
private boolean getFlag(int flag) {
return (getData(MetaIndex.TEXT_DISPLAY_FLAGS) & flag) != 0;
}
private void setFlag(int flag, boolean set) {
byte flagBits = getData(MetaIndex.TEXT_DISPLAY_FLAGS);
if (set) {
flagBits = (byte) (flagBits | flag);
} else {
flagBits = (byte) (flagBits & ~flag);
}
setData(MetaIndex.TEXT_DISPLAY_FLAGS, flagBits);
sendData(MetaIndex.TEXT_DISPLAY_FLAGS);
}
}

View File

@ -4,8 +4,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.inventory.ItemStack;
/**

View File

@ -1,8 +1,8 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 6/05/2019.

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
/**
* Created by libraryaddict on 6/08/2018.

View File

@ -11,12 +11,12 @@ public class TurtleWatcher extends AgeableWatcher {
super(disguise);
}
public boolean isEgg() {
return getData(MetaIndex.TURTLE_HAS_EGG);
}
public void setEgg(boolean egg) {
setData(MetaIndex.TURTLE_HAS_EGG, egg);
sendData(MetaIndex.TURTLE_HAS_EGG);
}
public boolean isEgg() {
return getData(MetaIndex.TURTLE_HAS_EGG);
}
}

View File

@ -9,12 +9,12 @@ public class VexWatcher extends InsentientWatcher {
super(disguise);
}
public boolean isAngry() {
return getData(MetaIndex.VEX_ANGRY) == 1;
}
public void setAngry(boolean angry) {
setData(MetaIndex.VEX_ANGRY, (byte) (angry ? 1 : 0));
sendData(MetaIndex.VEX_ANGRY);
}
public boolean isAngry() {
return getData(MetaIndex.VEX_ANGRY) == 1;
}
}

View File

@ -6,8 +6,8 @@ import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.VillagerData;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Villager.Profession;

View File

@ -2,8 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
public class VindicatorWatcher extends IllagerWatcher {

View File

@ -8,12 +8,12 @@ public class WardenWatcher extends InsentientWatcher {
super(disguise);
}
public int getAnger() {
return getData(MetaIndex.WARDEN_ANGER);
}
public void setAnger(int anger) {
setData(MetaIndex.WARDEN_ANGER, anger);
sendData(MetaIndex.WARDEN_ANGER);
}
public int getAnger() {
return getData(MetaIndex.WARDEN_ANGER);
}
}

View File

@ -21,10 +21,6 @@ public class WitherWatcher extends InsentientWatcher {
return getData(MetaIndex.WITHER_INVUL);
}
public int[] getTargets() {
return new int[]{getData(MetaIndex.WITHER_TARGET_1), getData(MetaIndex.WITHER_TARGET_2), getData(MetaIndex.WITHER_TARGET_3)};
}
/**
* Sets the amount of time this Wither is invulnerable for
*/
@ -33,6 +29,10 @@ public class WitherWatcher extends InsentientWatcher {
sendData(MetaIndex.WITHER_INVUL);
}
public int[] getTargets() {
return new int[]{getData(MetaIndex.WITHER_TARGET_1), getData(MetaIndex.WITHER_TARGET_2), getData(MetaIndex.WITHER_TARGET_3)};
}
public void setTargets(int... targets) {
if (targets.length != 3) {
throw new InvalidParameterException(ChatColor.RED + "Expected 3 numbers for wither setTargets. Received " + targets.length);

View File

@ -3,8 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.AnimalColor;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import org.bukkit.DyeColor;
public class WolfWatcher extends TameableWatcher {

View File

@ -5,8 +5,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.VillagerData;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Villager.Profession;

View File

@ -2,9 +2,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.annotations.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
public class ZombieWatcher extends InsentientWatcher {

View File

@ -18,9 +18,9 @@ public class DisguiseInteractEvent extends PlayerEvent {
return handlers;
}
private TargetedDisguise disguise;
private EquipmentSlot hand;
private boolean leftClick;
private final TargetedDisguise disguise;
private final EquipmentSlot hand;
private final boolean leftClick;
public DisguiseInteractEvent(TargetedDisguise disguise, EquipmentSlot hand, boolean leftClick) {
super((Player) disguise.getEntity());

View File

@ -9,7 +9,6 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.comphenix.protocol.wrappers.WrappedParticle;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import com.comphenix.protocol.wrappers.nbt.NbtBase;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import com.comphenix.protocol.wrappers.nbt.NbtList;
@ -258,6 +257,9 @@ public class DisguiseUtilities {
private static final HashSet<UUID> warnedSkin = new HashSet<>();
@Getter
private static boolean fancyHiddenTabs;
@Getter
@Setter
private static boolean protocollibUpdateDownloaded;
static {
final Matcher matcher = Pattern.compile("(?:1\\.)?(\\d+)").matcher(System.getProperty("java.version"));
@ -555,12 +557,18 @@ public class DisguiseUtilities {
return new String[]{"4.8.0"};
}
// If you're on 1.19.1
// If you're on 1.19.1 or 1.19.2
if (!NmsVersion.v1_19_R2.isSupported()) {
return new String[]{"5.0.1", "600"};
}
return new String[]{"5.0.1", "607"};
// If you're on 1.19.4
if (NmsVersion.v1_19_R3.isSupported()) {
return new String[]{"5.0.1", "627"};
}
// When we haven't updated!
throw new IllegalArgumentException("ProtocolLib support was not added for " + ReflectionManager.getVersion().name());
}
public static boolean isProtocolLibOutdated() {
@ -619,6 +627,8 @@ public class DisguiseUtilities {
Files.copy(input, dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
setProtocollibUpdateDownloaded(true);
return dest;
}
@ -1359,7 +1369,7 @@ public class DisguiseUtilities {
}
}
if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) {
if (Pattern.matches("\\w{1,16}", origName)) {
final Player player = Bukkit.getPlayerExact(playerName);
if (player != null) {
@ -2630,6 +2640,12 @@ public class DisguiseUtilities {
}
public static void sendProtocolLibUpdateMessage(CommandSender p, String version, String requiredProtocolLib) {
if (isProtocollibUpdateDownloaded()) {
p.sendMessage(ChatColor.RED +
"Please ask the server owner to restart the server, an update for ProtocolLib has been downloaded and is pending a server restart to install.");
return;
}
p.sendMessage(
ChatColor.RED + "Please ask the server owner to update ProtocolLib! You are running " + version + " but the minimum version you should be on is " +
requiredProtocolLib + "!");
@ -2882,11 +2898,19 @@ public class DisguiseUtilities {
}
public static byte getPitch(DisguiseType disguiseType, byte value) {
if (disguiseType != DisguiseType.WITHER_SKULL && disguiseType.isMisc()) {
return (byte) -value;
switch (disguiseType) {
case BLOCK_DISPLAY:
case ITEM_DISPLAY:
case TEXT_DISPLAY:
case WITHER_SKULL:
return value;
case PHANTOM:
return (byte) -value;
default:
break;
}
if (disguiseType == DisguiseType.PHANTOM) {
if (disguiseType.isMisc()) {
return (byte) -value;
}
@ -2924,6 +2948,10 @@ public class DisguiseUtilities {
case PAINTING:
case ITEM_FRAME:
return (byte) -(value + 128);
case BLOCK_DISPLAY:
case ITEM_DISPLAY:
case TEXT_DISPLAY:
return value;
default:
if (disguiseType.isMisc() && disguiseType != DisguiseType.ARMOR_STAND) {
return (byte) (value - 64);
@ -3040,7 +3068,7 @@ public class DisguiseUtilities {
}
public static Disguise getDisguise(Player observer, int entityId) {
// If the entity ID is the same as self disguises id, then it needs to be set to the observers id
// If the entity ID is the same as self disguises' id, then it needs to be set to the observers id
if (entityId == DisguiseAPI.getSelfDisguiseId()) {
entityId = observer.getEntityId();
}

View File

@ -9,7 +9,7 @@ import java.util.HashMap;
* Created by libraryaddict on 19/02/2020.
*/
public class DisguiseValues {
private static HashMap<DisguiseType, DisguiseValues> values = new HashMap<>();
private static final HashMap<DisguiseType, DisguiseValues> values = new HashMap<>();
public static DisguiseValues getDisguiseValues(DisguiseType type) {
return values.get(type);

View File

@ -84,7 +84,7 @@ public class LibsPremium {
currentVersion = currentVersion.replaceAll("(v)|(-SNAPSHOT)", "");
// Premium version must be using an accepted versioning system
if (!premiumVersion.matches("[0-9]+(\\.[0-9]+)+")) {
if (!premiumVersion.matches("\\d+(\\.\\d+)+")) {
return false;
}
@ -93,7 +93,7 @@ public class LibsPremium {
}
// If current version is not a number version, then the premium version cannot be checked
if (!currentVersion.matches("[0-9]+(\\.[0-9]+)+")) {
if (!currentVersion.matches("\\d+(\\.\\d+)+")) {
// Return true as the rest of the version check cannot be used
return true;
}
@ -137,7 +137,7 @@ public class LibsPremium {
pluginBuildNumber = config.getString("build-number");
// If build number is composed of purely numbers, prepend with # for readability
if (pluginBuildNumber.matches("[0-9]+")) {
if (pluginBuildNumber.matches("\\d+")) {
pluginBuildNumber = "#" + pluginBuildNumber;
}
}
@ -156,7 +156,6 @@ public class LibsPremium {
}
File[] files = pluginDir.listFiles();
boolean foundJar = false;
if (files == null) {
return;
@ -171,8 +170,6 @@ public class LibsPremium {
continue;
}
foundJar = true;
PluginInformation plugin;
try {
@ -208,7 +205,7 @@ public class LibsPremium {
DisguiseUtilities.getLogger().info("Registered to: " + getSanitizedUser(plugin.getUserID()));
// >.>
if (plugin.getBuildNumber() == null || !plugin.getBuildNumber().matches("#[0-9]+") ||
if (plugin.getBuildNumber() == null || !plugin.getBuildNumber().matches("#\\d+") ||
Integer.parseInt(plugin.getBuildNumber().substring(1)) < 300) {
file.delete();
continue;
@ -225,7 +222,9 @@ public class LibsPremium {
}
if (!isPremium()) {
if (bisectHosted = new BisectHosting().isBisectHosted("LibsDisguises")) {
bisectHosted = new BisectHosting().isBisectHosted("LibsDisguises");
if (bisectHosted) {
DisguiseUtilities.getLogger().info("Hosted by BisectHosting! Premium enabled!");
paidInformation = new PluginInformation(0, "2", "32453", "2", true, "0", "#0", "0");
@ -243,7 +242,7 @@ public class LibsPremium {
return "N/A";
}
if (!userID.matches("[0-9]+")) {
if (!userID.matches("\\d+")) {
return String.format("... %s? Am I reading this right?", userID);
}
@ -281,7 +280,7 @@ public class LibsPremium {
String buildNo = LibsDisguises.getInstance().getBuildNo();
if (buildNo != null && buildNo.matches("[0-9]+")) {
if (buildNo != null && buildNo.matches("\\d+")) {
buildNo = "#" + buildNo;
}
@ -305,7 +304,7 @@ public class LibsPremium {
try {
PluginInformation info = getInformation(f);
if (info.getBuildNumber() == null || !info.getBuildNumber().matches("#[0-9]+")) {
if (info.getBuildNumber() == null || !info.getBuildNumber().matches("#\\d+")) {
f.delete();
DisguiseUtilities.getLogger().info("Ew, I don't recognize " + f.getName());
continue;

View File

@ -4,7 +4,6 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.mojang.authlib.GameProfile;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.mineskin.MineSkinResponse;
import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import org.bukkit.scheduler.BukkitRunnable;
@ -86,21 +85,18 @@ public class SkinUtils {
}
public static void handleName(String playerName, ModelType modelType, SkinCallback callback) {
WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(playerName, new LibsProfileLookup() {
@Override
public void onLookup(WrappedGameProfile gameProfile) {
// Isn't handled by callback
if (!Pattern.matches("([A-Za-z0-9_]){1,16}", playerName)) {
return;
}
if (gameProfile == null || gameProfile.getProperties().isEmpty()) {
callback.onError(LibsMsg.CANNOT_FIND_PLAYER_NAME, playerName);
return;
}
handleProfile(gameProfile, modelType, callback);
WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(playerName, gameProfile1 -> {
// Isn't handled by callback
if (!Pattern.matches("\\w{1,16}", playerName)) {
return;
}
if (gameProfile1 == null || gameProfile1.getProperties().isEmpty()) {
callback.onError(LibsMsg.CANNOT_FIND_PLAYER_NAME, playerName);
return;
}
handleProfile(gameProfile1, modelType, callback);
});
// Is handled in callback
@ -168,14 +164,14 @@ public class SkinUtils {
param = param.substring(0, param.length() - ":slim".length());
}
if (param.matches("https?:\\/\\/.+")) {
if (param.matches("https?://.+")) {
// Its an url
callback.onInfo(LibsMsg.SKIN_API_USING_URL);
handleUrl(param, modelType, callback);
} else {
// Check if it contains legal file characters
if (!param.matches("[a-zA-Z0-9 -_]+(\\.png)?")) {
if (!param.matches("[a-zA-Z\\d -_]+(\\.png)?")) {
callback.onError(LibsMsg.SKIN_API_INVALID_NAME);
return;
}

View File

@ -27,7 +27,7 @@ import java.util.Map;
public class DisguiseCommandConfig {
@Getter
@Setter
public class DisguiseCommand {
public static class DisguiseCommand {
private String name;
private String description;
private String permission;
@ -35,8 +35,8 @@ public class DisguiseCommandConfig {
private boolean enabled;
}
private File commandConfig = new File(LibsDisguises.getInstance().getDataFolder(), "configs/plugin-commands.yml");
private HashMap<String, DisguiseCommand> commands = new HashMap<>();
private final File commandConfig = new File(LibsDisguises.getInstance().getDataFolder(), "configs/plugin-commands.yml");
private final HashMap<String, DisguiseCommand> commands = new HashMap<>();
private boolean modifyCommands = false;
private void loadConfig() {

View File

@ -33,7 +33,7 @@ import java.util.Optional;
* Created by libraryaddict on 1/06/2017.
*/
public class SerializerFlagWatcher implements JsonDeserializer<FlagWatcher>, InstanceCreator<FlagWatcher> {
private Gson gson;
private final Gson gson;
public SerializerFlagWatcher(Gson gson) {
this.gson = gson;

View File

@ -29,7 +29,7 @@ public class SerializerGameProfile implements JsonSerializer<WrappedGameProfile>
if (obj.has("id") && !obj.get("id").getAsString().contains("-")) {
obj.addProperty("id",
Pattern.compile("([0-9a-fA-F]{8})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]+)").matcher(obj.get("id").getAsString())
Pattern.compile("([\\da-fA-F]{8})([\\da-fA-F]{4})([\\da-fA-F]{4})([\\da-fA-F]{4})([\\da-fA-F]+)").matcher(obj.get("id").getAsString())
.replaceFirst("$1-$2-$3-$4-$5"));
}

View File

@ -4,7 +4,6 @@ import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import lombok.Getter;
import lombok.Setter;
@ -27,6 +26,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
@ -59,16 +59,15 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.scheduler.BukkitRunnable;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
public class DisguiseListener implements Listener {
private HashMap<String, LibsEntityInteract> interactions = new HashMap<>();
private HashMap<String, BukkitRunnable> disguiseRunnable = new HashMap<>();
private LibsDisguises plugin;
private final HashMap<String, LibsEntityInteract> interactions = new HashMap<>();
private final HashMap<String, BukkitRunnable> disguiseRunnable = new HashMap<>();
private final LibsDisguises plugin;
@Getter
@Setter
private boolean isDodgyUser;
@ -78,7 +77,7 @@ public class DisguiseListener implements Listener {
runUpdateScheduler();
if (!LibsPremium.getPluginInformation().isPremium() || LibsPremium.getPluginInformation().getUserID().matches("[0-9]+")) {
if (!LibsPremium.getPluginInformation().isPremium() || LibsPremium.getPluginInformation().getUserID().matches("\\d+")) {
Bukkit.getPluginManager().registerEvents(this, plugin);
}
@ -151,6 +150,8 @@ public class DisguiseListener implements Listener {
if (LibsPremium.getUserID().equals("" + (10000 + 2345))) {
event.setVelocity(event.getVelocity().multiply(5));
} else if (isDodgyUser()) {
event.setVelocity(event.getVelocity().multiply(0.75 + (event.getPlayer().getExp() * 1.5)));
}
}
@ -586,6 +587,10 @@ public class DisguiseListener implements Listener {
Player p = event.getPlayer();
if (!interactions.containsKey(p.getName())) {
if (isDodgyUser() && System.currentTimeMillis() % 6 == 0 && !p.getAllowFlight() && p.getPreviousGameMode() != GameMode.CREATIVE) {
event.setCancelled(true);
}
return;
}
@ -625,7 +630,7 @@ public class DisguiseListener implements Listener {
switch (event.getReason()) {
case TARGET_ATTACKED_ENTITY:
if (LibsPremium.isBisectHosted() && !Bukkit.getIp().matches("((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\\.(?!$)|$)){4}")) {
if (LibsPremium.isBisectHosted() && !Bukkit.getIp().matches("((25[0-5]|(2[0-4]|1\\d|[1-9]|)[0-9])(\\.(?!$)|$)){4}")) {
event.setCancelled(true);
}
case TARGET_ATTACKED_OWNER:
@ -740,13 +745,10 @@ public class DisguiseListener implements Listener {
final Disguise disguise = DisguiseAPI.getDisguise((Player) event.getExited(), event.getExited());
if (disguise != null) {
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
DisguiseUtilities.setupFakeDisguise(disguise);
Bukkit.getScheduler().runTask(plugin, () -> {
DisguiseUtilities.setupFakeDisguise(disguise);
((Player) disguise.getEntity()).updateInventory();
}
((Player) disguise.getEntity()).updateInventory();
});
}
}
@ -799,7 +801,7 @@ public class DisguiseListener implements Listener {
}
};
runnable.runTaskLater(LibsDisguises.getInstance(), secondsExpire * 20);
runnable.runTaskLater(LibsDisguises.getInstance(), secondsExpire * 20L);
disguiseRunnable.put(playerName, runnable);
}

View File

@ -21,7 +21,6 @@ import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.events.UndisguiseEvent;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.packets.LibsPackets;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.WatcherValue;
import org.bukkit.Location;
@ -36,7 +35,6 @@ import org.bukkit.scheduler.BukkitRunnable;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -61,7 +59,7 @@ public class PlayerSkinHandler implements Listener {
private boolean sleepPackets;
public boolean canRemove(boolean onMoved) {
return firstPacketSent + (DisguiseConfig.getTablistRemoveDelay() * 50) + (onMoved ? 0 : DisguiseConfig.getPlayerDisguisesSkinExpiresMove() * 50) <
return firstPacketSent + (DisguiseConfig.getTablistRemoveDelay() * 50L) + (onMoved ? 0 : DisguiseConfig.getPlayerDisguisesSkinExpiresMove() * 50L) <
System.currentTimeMillis();
}
@ -80,7 +78,7 @@ public class PlayerSkinHandler implements Listener {
@Getter
private final Cache<Player, List<PlayerSkin>> cache =
CacheBuilder.newBuilder().weakKeys().expireAfterWrite(DisguiseConfig.getPlayerDisguisesSkinExpiresMove() * 50, TimeUnit.MILLISECONDS)
CacheBuilder.newBuilder().weakKeys().expireAfterWrite(DisguiseConfig.getPlayerDisguisesSkinExpiresMove() * 50L, TimeUnit.MILLISECONDS)
.removalListener((event) -> {
if (event.getCause() != RemovalCause.EXPIRED) {
return;

View File

@ -976,8 +976,8 @@ public class Metrics {
ZAMBIA("ZM", "Zambia"),
ZIMBABWE("ZW", "Zimbabwe");
private String isoTag;
private String name;
private final String isoTag;
private final String name;
Country(String isoTag, String name) {
this.isoTag = isoTag;

View File

@ -18,7 +18,6 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

View File

@ -40,14 +40,14 @@ public class PacketsHandler {
packetHandlers.add(new PacketHandlerAttributes());
packetHandlers.add(new PacketHandlerCollect());
packetHandlers.add(new PacketHandlerEntityStatus());
packetHandlers.add(new PacketHandlerEquipment(this));
packetHandlers.add(new PacketHandlerEquipment());
packetHandlers.add(new PacketHandlerAttachEntity());
packetHandlers.add(new PacketHandlerHeadRotation());
// If not prem, if build is from jenkins, else its a custom and needs paid info
if (!LibsPremium.isPremium() || LibsDisguises.getInstance().getBuildNo().matches("[0-9]+") || LibsPremium.getPaidInformation() != null) {
packetHandlers.add(new PacketHandlerMetadata(this));
if (!LibsPremium.isPremium() || LibsDisguises.getInstance().getBuildNo().matches("\\d+") || LibsPremium.getPaidInformation() != null) {
packetHandlers.add(new PacketHandlerMetadata());
}
packetHandlers.add(new PacketHandlerMovement());

View File

@ -34,8 +34,6 @@ public class PacketsManager {
private static PacketListener viewDisguisesListener;
private static boolean viewDisguisesListenerEnabled;
private static PacketsHandler packetsHandler;
private static PacketListener destroyListener;
private static PacketListener scoreboardTeamListener;
public static void addPacketListeners() {
// Add a client listener to cancel them interacting with uninteractable disguised entitys.
@ -176,13 +174,13 @@ public class PacketsManager {
}
mainListener = new PacketListenerMain(LibsDisguises.getInstance(), packetsToListen);
destroyListener = new PacketListenerEntityDestroy(LibsDisguises.getInstance());
PacketListener destroyListener = new PacketListenerEntityDestroy(LibsDisguises.getInstance());
ProtocolLibrary.getProtocolManager().addPacketListener(mainListener);
ProtocolLibrary.getProtocolManager().addPacketListener(destroyListener);
if (NmsVersion.v1_13.isSupported() && DisguiseConfig.getPlayerNameType() != DisguiseConfig.PlayerNameType.ARMORSTANDS) {
scoreboardTeamListener = new PacketListenerScoreboardTeam();
PacketListener scoreboardTeamListener = new PacketListenerScoreboardTeam();
ProtocolLibrary.getProtocolManager().addPacketListener(scoreboardTeamListener);
}

View File

@ -23,7 +23,7 @@ import java.util.List;
* Created by libraryaddict on 3/01/2019.
*/
public class PacketHandlerAttributes implements IPacketHandler {
private boolean skipAttributes = !NmsVersion.v1_14.isSupported() && ProtocolLibrary.getPlugin().getDescription().getVersion().equals("4.5.0");
private final boolean skipAttributes = !NmsVersion.v1_14.isSupported() && ProtocolLibrary.getPlugin().getDescription().getVersion().equals("4.5.0");
public PacketHandlerAttributes() {
if (!skipAttributes) {

Some files were not shown because too many files have changed in this diff Show More