First commit
This commit is contained in:
		
							
								
								
									
										116
									
								
								src/me/libraryaddict/disguise/DisguiseAPI.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/me/libraryaddict/disguise/DisguiseAPI.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
package me.libraryaddict.disguise;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.Disguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.MobDisguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.PlayerDisguise;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.*;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
public class DisguiseAPI {
 | 
			
		||||
 | 
			
		||||
    private static ConcurrentHashMap<String, Disguise> disguises = new ConcurrentHashMap<String, Disguise>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Player
 | 
			
		||||
     *            - The player to disguise
 | 
			
		||||
     * @param Disguise
 | 
			
		||||
     *            - The disguise to wear
 | 
			
		||||
     */
 | 
			
		||||
    public static void disguiseToAll(Player p, Disguise disguise) {
 | 
			
		||||
        disguises.put(p.getName(), disguise);
 | 
			
		||||
        for (Player player : Bukkit.getOnlinePlayers()) {
 | 
			
		||||
            if (p.getWorld() != player.getWorld())
 | 
			
		||||
                continue;
 | 
			
		||||
            player.hidePlayer(p);
 | 
			
		||||
            player.showPlayer(p);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Player
 | 
			
		||||
     *            - The player who is being disguised
 | 
			
		||||
     * @param Player
 | 
			
		||||
     *            - The player who is watching the disguised
 | 
			
		||||
     * @param Disguise
 | 
			
		||||
     *            - The disguise he is wearing
 | 
			
		||||
     */
 | 
			
		||||
    public static void disguiseToPlayer(Player disguiser, Player observer, Disguise disguise) {
 | 
			
		||||
        disguises.put(disguiser.getName(), disguise);
 | 
			
		||||
        Packet29DestroyEntity destroyPacket = new Packet29DestroyEntity(new int[] { disguiser.getEntityId() });
 | 
			
		||||
        Packet spawnPacket = null;
 | 
			
		||||
        if (disguise.getType().isMob()) {
 | 
			
		||||
 | 
			
		||||
            EntityLiving entityLiving = ((MobDisguise) disguise).getEntityLiving(((CraftPlayer) disguiser).getHandle().world,
 | 
			
		||||
                    disguiser.getLocation(), disguiser.getEntityId());
 | 
			
		||||
            spawnPacket = new Packet24MobSpawn(entityLiving);
 | 
			
		||||
 | 
			
		||||
        } else if (disguise.getType().isMisc()) {
 | 
			
		||||
 | 
			
		||||
            Entity entity = disguise.getEntity(((CraftPlayer) disguiser).getHandle().world, disguiser.getLocation(),
 | 
			
		||||
                    disguiser.getEntityId());
 | 
			
		||||
            spawnPacket = new Packet23VehicleSpawn(entity, 0);
 | 
			
		||||
 | 
			
		||||
        } else if (disguise.getType().isPlayer()) {
 | 
			
		||||
 | 
			
		||||
            EntityHuman entityHuman = ((CraftPlayer) disguiser).getHandle();
 | 
			
		||||
            spawnPacket = new Packet20NamedEntitySpawn(entityHuman);
 | 
			
		||||
            ((Packet20NamedEntitySpawn) spawnPacket).b = ((PlayerDisguise) disguise).getName();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        ((CraftPlayer) observer).getHandle().playerConnection.sendPacket(destroyPacket);
 | 
			
		||||
        ((CraftPlayer) observer).getHandle().playerConnection.sendPacket(spawnPacket);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Disguiser
 | 
			
		||||
     * @return Disguise
 | 
			
		||||
     */
 | 
			
		||||
    public static Disguise getDisguise(Player p) {
 | 
			
		||||
        return getDisguise(p.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Disguiser
 | 
			
		||||
     * @return Disguise
 | 
			
		||||
     */
 | 
			
		||||
    public static Disguise getDisguise(String name) {
 | 
			
		||||
        return disguises.get(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Disguiser
 | 
			
		||||
     * @return Boolean - If the disguiser is disguised
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isDisguised(Player p) {
 | 
			
		||||
        return isDisguised(p.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Disguiser
 | 
			
		||||
     * @return boolean - If the disguiser is disguised
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isDisguised(String name) {
 | 
			
		||||
        return disguises.containsKey(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param Disguiser
 | 
			
		||||
     *            - Undisguises him
 | 
			
		||||
     */
 | 
			
		||||
    public static void undisguiseToAll(Player p) {
 | 
			
		||||
        disguises.remove(p.getName());
 | 
			
		||||
        for (Player player : Bukkit.getOnlinePlayers()) {
 | 
			
		||||
            if (p.getWorld() != player.getWorld())
 | 
			
		||||
                continue;
 | 
			
		||||
            player.hidePlayer(p);
 | 
			
		||||
            player.showPlayer(p);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								src/me/libraryaddict/disguise/DisguiseCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/me/libraryaddict/disguise/DisguiseCommand.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
package me.libraryaddict.disguise;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.Disguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.DisguiseType;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.MiscDisguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.MobDisguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.PlayerDisguise;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.lang.StringUtils;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandExecutor;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
public class DisguiseCommand implements CommandExecutor {
 | 
			
		||||
 | 
			
		||||
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
 | 
			
		||||
        if (sender.isOp()) {
 | 
			
		||||
            Player p = (Player) sender;
 | 
			
		||||
            if (args.length == 0) {
 | 
			
		||||
                ArrayList<String> names = new ArrayList<String>();
 | 
			
		||||
                for (DisguiseType type : DisguiseType.values()) {
 | 
			
		||||
                    names.add(type.name().toLowerCase());
 | 
			
		||||
                }
 | 
			
		||||
                Collections.sort(names);
 | 
			
		||||
                sender.sendMessage(ChatColor.RED + "You can use the disguises: " + ChatColor.GREEN
 | 
			
		||||
                        + StringUtils.join(names, ChatColor.RED + ", " + ChatColor.GREEN));
 | 
			
		||||
            } else if (args[0].equalsIgnoreCase("undiguise") || args[0].equalsIgnoreCase("undis")
 | 
			
		||||
                    || args[0].equalsIgnoreCase("un")) {
 | 
			
		||||
                if (DisguiseAPI.isDisguised(p.getName())) {
 | 
			
		||||
                    DisguiseAPI.undisguiseToAll(p);
 | 
			
		||||
                    sender.sendMessage(ChatColor.RED + "You are no longer disguised");
 | 
			
		||||
                } else
 | 
			
		||||
                    sender.sendMessage(ChatColor.RED + "You are not disguised!");
 | 
			
		||||
            } else if (args[0].equalsIgnoreCase("player")) {
 | 
			
		||||
                if (args.length > 1) {
 | 
			
		||||
                    String name = ChatColor.translateAlternateColorCodes('&',
 | 
			
		||||
                            StringUtils.join(args, " ").substring(args[0].length() + 1));
 | 
			
		||||
                    PlayerDisguise disguise = new PlayerDisguise(name);
 | 
			
		||||
                    DisguiseAPI.disguiseToAll(p, disguise);
 | 
			
		||||
                    sender.sendMessage(ChatColor.RED + "Now disguised as the player '" + ChatColor.GREEN + name + ChatColor.RESET
 | 
			
		||||
                            + ChatColor.RED + "'");
 | 
			
		||||
                } else
 | 
			
		||||
                    sender.sendMessage(ChatColor.RED + "You need to provide a player name");
 | 
			
		||||
            } else {
 | 
			
		||||
                DisguiseType type;
 | 
			
		||||
                try {
 | 
			
		||||
                    type = DisguiseType.valueOf(args[0].toUpperCase());
 | 
			
		||||
                } catch (Exception ex) {
 | 
			
		||||
                    sender.sendMessage(ChatColor.RED + "Failed to find disguise: " + ChatColor.GREEN + args[0]
 | 
			
		||||
                            + "\n/disguise player <Name>\n/disguise <Mob Name>\n/disguise undisguise/un/undis");
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
                boolean adult = true;
 | 
			
		||||
                if (args.length > 1) {
 | 
			
		||||
                    if (args[1].equalsIgnoreCase("true")) {
 | 
			
		||||
                        adult = false;
 | 
			
		||||
                    } else if (!args[1].equalsIgnoreCase("false")) {
 | 
			
		||||
                        sender.sendMessage(ChatColor.RED + "Set baby: " + ChatColor.GREEN + args[1] + ChatColor.RED
 | 
			
		||||
                                + " - Thats not true or false..");
 | 
			
		||||
                        return true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Disguise disguise;
 | 
			
		||||
                if (type.isMob())
 | 
			
		||||
                    disguise = new MobDisguise(type, adult);
 | 
			
		||||
                else
 | 
			
		||||
                    disguise = new MiscDisguise(type);
 | 
			
		||||
                DisguiseAPI.disguiseToAll(p, disguise);
 | 
			
		||||
                sender.sendMessage(ChatColor.RED + "Now disguised as a " + type.name().toLowerCase() + "!");
 | 
			
		||||
            }
 | 
			
		||||
        } else
 | 
			
		||||
            sender.sendMessage(ChatColor.RED + "You do not have permission");
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								src/me/libraryaddict/disguise/DisguiseTypes/Disguise.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/me/libraryaddict/disguise/DisguiseTypes/Disguise.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
package me.libraryaddict.disguise.DisguiseTypes;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.DataWatcher;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.Entity;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityCreeper;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntitySkeleton;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.World;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
 | 
			
		||||
public class Disguise {
 | 
			
		||||
    protected DisguiseType disguiseType;
 | 
			
		||||
    private Entity entity;
 | 
			
		||||
 | 
			
		||||
    protected Disguise(DisguiseType newType) {
 | 
			
		||||
        disguiseType = newType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Entity getEntity(World world, Location loc, int entityId) {
 | 
			
		||||
        Entity entity = null;
 | 
			
		||||
        try {
 | 
			
		||||
            String name = toReadable(disguiseType.name());
 | 
			
		||||
            if (disguiseType == DisguiseType.WITHER_SKELETON) {
 | 
			
		||||
                name = "Skeleton";
 | 
			
		||||
            }
 | 
			
		||||
            if (disguiseType == DisguiseType.CHARGED_CREEPER) {
 | 
			
		||||
                name = "Creeper";
 | 
			
		||||
            }
 | 
			
		||||
            if (disguiseType == DisguiseType.TNT_PRIMED) {
 | 
			
		||||
                name = "TNTPrimed";
 | 
			
		||||
            }
 | 
			
		||||
            Class entityClass = Class.forName("net.minecraft.server.v1_5_R3.Entity" + name);
 | 
			
		||||
            Constructor<?> contructor = entityClass.getDeclaredConstructor(World.class);
 | 
			
		||||
            entity = (Entity) contructor.newInstance(world);
 | 
			
		||||
            if (disguiseType == DisguiseType.WITHER_SKELETON) {
 | 
			
		||||
                ((EntitySkeleton) entity).setSkeletonType(1);
 | 
			
		||||
            }
 | 
			
		||||
            if (disguiseType == DisguiseType.CHARGED_CREEPER) {
 | 
			
		||||
                ((EntityCreeper) entity).setPowered(true);
 | 
			
		||||
            }
 | 
			
		||||
            Field field = Entity.class.getDeclaredField("datawatcher");
 | 
			
		||||
            field.setAccessible(true);
 | 
			
		||||
        } catch (Exception ex) {
 | 
			
		||||
            ex.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
        entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
 | 
			
		||||
        entity.id = entityId;
 | 
			
		||||
        this.entity = entity;
 | 
			
		||||
        return entity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DisguiseType getType() {
 | 
			
		||||
        return disguiseType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DataWatcher getDataWatcher() {
 | 
			
		||||
        return entity.getDataWatcher();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Entity getEntity() {
 | 
			
		||||
        return entity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String toReadable(String string) {
 | 
			
		||||
        String[] strings = string.split("_");
 | 
			
		||||
        string = "";
 | 
			
		||||
        for (String s : strings)
 | 
			
		||||
            string += s.substring(0, 1) + s.substring(1).toLowerCase();
 | 
			
		||||
        return string;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package me.libraryaddict.disguise.DisguiseTypes;
 | 
			
		||||
 | 
			
		||||
public enum DisguiseType {
 | 
			
		||||
    BAT(EntityType.MOB), BLAZE(EntityType.MOB), CAVE_SPIDER(EntityType.MOB), CHARGED_CREEPER(EntityType.MOB), CHICKEN(
 | 
			
		||||
            EntityType.MOB), COW(EntityType.MOB), CREEPER(EntityType.MOB), ENDER_CRYSTAL(EntityType.MISC), ENDER_DRAGON(
 | 
			
		||||
            EntityType.MOB), ENDERMAN(EntityType.MOB), GHAST(EntityType.MOB), GIANT_ZOMBIE(EntityType.MOB), IRON_GOLEM(EntityType.MOB), MAGMA_CUBE(
 | 
			
		||||
            EntityType.MOB), MUSHROOM_COW(EntityType.MOB), OCELOT(EntityType.MOB), PIG(EntityType.MOB), PIG_ZOMBIE(EntityType.MOB), PLAYER(
 | 
			
		||||
            EntityType.PLAYER), TNT_PRIMED(EntityType.MISC), SHEEP(EntityType.MOB), SILVERFISH(EntityType.MOB), SKELETON(
 | 
			
		||||
            EntityType.MOB), SLIME(EntityType.MOB), SNOWMAN(EntityType.MOB), SPIDER(EntityType.MOB), SQUID(EntityType.MOB), VILLAGER(
 | 
			
		||||
            EntityType.MOB), WITCH(EntityType.MOB), WITHER(EntityType.MOB), WITHER_SKELETON(EntityType.MOB), WOLF(EntityType.MOB), ZOMBIE(
 | 
			
		||||
            EntityType.MOB);
 | 
			
		||||
 | 
			
		||||
    public static enum EntityType {
 | 
			
		||||
        MISC, MOB, PLAYER;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static DisguiseType getType(org.bukkit.entity.EntityType entityType) {
 | 
			
		||||
        return DisguiseType.valueOf(entityType.name());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private EntityType entityType;
 | 
			
		||||
 | 
			
		||||
    private DisguiseType(EntityType newType) {
 | 
			
		||||
        entityType = newType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isMisc() {
 | 
			
		||||
        return entityType == EntityType.MISC;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isMob() {
 | 
			
		||||
        return entityType == EntityType.MOB;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isPlayer() {
 | 
			
		||||
        return entityType == EntityType.PLAYER;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package me.libraryaddict.disguise.DisguiseTypes;
 | 
			
		||||
 | 
			
		||||
public class MiscDisguise extends Disguise {
 | 
			
		||||
 | 
			
		||||
    public MiscDisguise(DisguiseType disguiseType) {
 | 
			
		||||
        super(disguiseType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								src/me/libraryaddict/disguise/DisguiseTypes/MobDisguise.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/me/libraryaddict/disguise/DisguiseTypes/MobDisguise.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
package me.libraryaddict.disguise.DisguiseTypes;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.server.v1_5_R3.Entity;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityAgeable;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityLiving;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityZombie;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.World;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
 | 
			
		||||
public class MobDisguise extends Disguise {
 | 
			
		||||
 | 
			
		||||
    private boolean adult;
 | 
			
		||||
 | 
			
		||||
    public MobDisguise(DisguiseType disguiseType, boolean isAdult) {
 | 
			
		||||
        super(disguiseType);
 | 
			
		||||
        adult = isAdult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public EntityLiving getEntityLiving(World w, Location loc, int id) {
 | 
			
		||||
        Entity entity = getEntity(w, loc, id);
 | 
			
		||||
        if (!adult) {
 | 
			
		||||
            if (entity instanceof EntityAgeable)
 | 
			
		||||
                ((EntityAgeable) entity).setAge(-24000);
 | 
			
		||||
            else if (entity instanceof EntityZombie)
 | 
			
		||||
                ((EntityZombie) entity).setBaby(true);
 | 
			
		||||
        }
 | 
			
		||||
        if (entity instanceof EntityLiving)
 | 
			
		||||
            return (EntityLiving) entity;
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isAdult() {
 | 
			
		||||
        return adult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAdult(boolean setAdult) {
 | 
			
		||||
        adult = setAdult;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package me.libraryaddict.disguise.DisguiseTypes;
 | 
			
		||||
 | 
			
		||||
public class PlayerDisguise extends Disguise {
 | 
			
		||||
    private String playerName;
 | 
			
		||||
 | 
			
		||||
    public PlayerDisguise(String name) {
 | 
			
		||||
        super(DisguiseType.PLAYER);
 | 
			
		||||
        if (name.length() > 16)
 | 
			
		||||
            name = name.substring(0, 16);
 | 
			
		||||
        playerName = name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return playerName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								src/me/libraryaddict/disguise/LibsDisguises.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/me/libraryaddict/disguise/LibsDisguises.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
package me.libraryaddict.disguise;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.Disguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.MiscDisguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.MobDisguise;
 | 
			
		||||
import me.libraryaddict.disguise.DisguiseTypes.PlayerDisguise;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.DataWatcher;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.Entity;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityLiving;
 | 
			
		||||
import net.minecraft.server.v1_5_R3.EntityPlayer;
 | 
			
		||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
			
		||||
 | 
			
		||||
import com.comphenix.protocol.Packets;
 | 
			
		||||
import com.comphenix.protocol.ProtocolLibrary;
 | 
			
		||||
import com.comphenix.protocol.events.ConnectionSide;
 | 
			
		||||
import com.comphenix.protocol.events.ListenerPriority;
 | 
			
		||||
import com.comphenix.protocol.events.PacketAdapter;
 | 
			
		||||
import com.comphenix.protocol.events.PacketEvent;
 | 
			
		||||
import com.comphenix.protocol.reflect.StructureModifier;
 | 
			
		||||
 | 
			
		||||
public class LibsDisguises extends JavaPlugin {
 | 
			
		||||
 | 
			
		||||
    public void onEnable() {
 | 
			
		||||
        getCommand("disguise").setExecutor(new DisguiseCommand());
 | 
			
		||||
        ProtocolLibrary.getProtocolManager().addPacketListener(
 | 
			
		||||
                new PacketAdapter(this, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, Packets.Server.NAMED_ENTITY_SPAWN,
 | 
			
		||||
                        Packets.Server.ENTITY_METADATA) {
 | 
			
		||||
                    public void onPacketSending(PacketEvent event) {
 | 
			
		||||
                        StructureModifier<Object> mods = event.getPacket().getModifier();
 | 
			
		||||
                        try {
 | 
			
		||||
                            Player observer = event.getPlayer();
 | 
			
		||||
                            org.bukkit.entity.Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0);
 | 
			
		||||
                            if (entity instanceof Player) {
 | 
			
		||||
                                Player watched = (Player) entity;
 | 
			
		||||
                                if (DisguiseAPI.isDisguised(watched.getName())) {
 | 
			
		||||
                                    Disguise disguise = DisguiseAPI.getDisguise(watched);
 | 
			
		||||
                                    if (event.getPacketID() == Packets.Server.NAMED_ENTITY_SPAWN) {
 | 
			
		||||
                                        if (disguise.getType().isMob()) {
 | 
			
		||||
                                            event.setCancelled(true);
 | 
			
		||||
                                            DisguiseAPI.disguiseToPlayer(watched, observer, (MobDisguise) disguise);
 | 
			
		||||
                                        } else if (disguise.getType().isMisc()) {
 | 
			
		||||
                                            event.setCancelled(true);
 | 
			
		||||
                                            DisguiseAPI.disguiseToPlayer(watched, observer, (MiscDisguise) disguise);
 | 
			
		||||
                                        } else if (disguise.getType().isPlayer()) {
 | 
			
		||||
                                            String name = (String) mods.read(1);
 | 
			
		||||
                                            if (!name.equals(((PlayerDisguise) disguise).getName())) {
 | 
			
		||||
                                                event.setCancelled(true);
 | 
			
		||||
                                                DisguiseAPI.disguiseToPlayer(watched, observer, (PlayerDisguise) disguise);
 | 
			
		||||
                                            }
 | 
			
		||||
                                        }
 | 
			
		||||
                                    } else if (!disguise.getType().isPlayer()) {
 | 
			
		||||
                                        mods.write(1, modifyDataWatcher(disguise, watched));
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } catch (Exception e) {
 | 
			
		||||
                            e.printStackTrace();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private List modifyDataWatcher(Disguise disguise, Player p) {
 | 
			
		||||
        Entity e = disguise.getEntity();
 | 
			
		||||
        EntityPlayer hE = ((CraftPlayer) p).getHandle();
 | 
			
		||||
        e.setAirTicks(hE.getAirTicks());
 | 
			
		||||
        e.fireTicks = p.getFireTicks();
 | 
			
		||||
        a(e.getDataWatcher(), 0, e.fireTicks > 0);
 | 
			
		||||
        e.setSprinting(p.isSprinting());
 | 
			
		||||
        e.setSneaking(p.isSneaking());
 | 
			
		||||
        if (e instanceof EntityLiving) {
 | 
			
		||||
            EntityLiving lE = (EntityLiving) e;
 | 
			
		||||
            lE.setInvisible(hE.isInvisible());
 | 
			
		||||
            lE.effects = hE.effects;
 | 
			
		||||
            lE.updateEffects = true;
 | 
			
		||||
            try {
 | 
			
		||||
                Method method = EntityLiving.class.getDeclaredMethod("bA");
 | 
			
		||||
                method.setAccessible(true);
 | 
			
		||||
                method.invoke(lE);
 | 
			
		||||
            } catch (Exception e1) {
 | 
			
		||||
                e1.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return e.getDataWatcher().b();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void a(DataWatcher datawatcher, int i, boolean flag) {
 | 
			
		||||
        byte b0 = datawatcher.getByte(0);
 | 
			
		||||
        if (flag) {
 | 
			
		||||
            datawatcher.watch(0, Byte.valueOf((byte) (b0 | 1 << i)));
 | 
			
		||||
        } else {
 | 
			
		||||
            datawatcher.watch(0, Byte.valueOf((byte) (b0 & ~(1 << i))));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user