Less bugs. Still writing

This commit is contained in:
Andrew 2013-05-30 05:17:48 +12:00
parent c78843aa2a
commit 19b61395ee
21 changed files with 304 additions and 144 deletions

View File

@ -1,6 +1,5 @@
package me.libraryaddict.disguise; package me.libraryaddict.disguise;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import me.libraryaddict.disguise.DisguiseTypes.Disguise; import me.libraryaddict.disguise.DisguiseTypes.Disguise;
@ -16,7 +15,9 @@ import org.bukkit.Location;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_5_R3.CraftSound; import org.bukkit.craftbukkit.v1_5_R3.CraftSound;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftLivingEntity;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -44,6 +45,7 @@ public class DisguiseAPI {
*/ */
public static void disguiseToAll(Entity entity, Disguise disguise) { public static void disguiseToAll(Entity entity, Disguise disguise) {
disguises.put(entity instanceof Player ? ((Player) entity).getName() : entity.getUniqueId(), disguise); disguises.put(entity instanceof Player ? ((Player) entity).getName() : entity.getUniqueId(), disguise);
disguise.constructWatcher(entity.getType(), entity.getEntityId());
refresh(entity); refresh(entity);
} }
@ -94,7 +96,22 @@ public class DisguiseAPI {
if (loc.equals(soundLoc)) { if (loc.equals(soundLoc)) {
DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); DisguiseSound disSound = DisguiseSound.getType(entity.getType().name());
if (disSound != null) { if (disSound != null) {
soundType = disSound.ownsSound(soundName); if (((CraftEntity) entity).getHandle().dead) {
soundType = SoundType.DEATH;
System.out.print(soundType);
} else {
boolean hasInvun = false;
if (entity instanceof LivingEntity) {
net.minecraft.server.v1_5_R3.EntityLiving e = ((CraftLivingEntity) entity)
.getHandle();
hasInvun = e.noDamageTicks == e.maxNoDamageTicks;
} else {
net.minecraft.server.v1_5_R3.Entity e = ((CraftEntity) entity).getHandle();
hasInvun = e.isInvulnerable();
}
soundType = disSound.getType(soundName, !hasInvun);
System.out.print(soundType + " " + hasInvun);
}
if (soundType != null) { if (soundType != null) {
disguisedEntity = entity; disguisedEntity = entity;
break; break;
@ -107,22 +124,24 @@ public class DisguiseAPI {
} }
} }
if (disguisedEntity != null) { if (disguisedEntity != null) {
// TODO Check if they been damage with invincibility ticks Disguise disguise = DisguiseAPI.getDisguise(disguisedEntity);
Sound sound = null; if (disguise.replaceSounds()) {
DisguiseSound dSound = DisguiseSound.getType(DisguiseAPI.getDisguise(disguisedEntity).getType().name()); Sound sound = null;
if (dSound != null) DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name());
sound = dSound.getSound(soundType); if (dSound != null)
if (sound == null) { sound = dSound.getSound(soundType);
event.setCancelled(true); if (sound == null) {
} else { event.setCancelled(true);
if (sound == Sound.STEP_GRASS) {
World world = ((CraftEntity) disguisedEntity).getHandle().world;
Block b = Block.byId[world.getTypeId(soundLoc.getBlockX(), soundLoc.getBlockY() - 1,
soundLoc.getBlockZ())];
if (b != null)
mods.write(0, b.stepSound.getStepSound());
} else { } else {
mods.write(0, CraftSound.getSound(sound)); if (sound == Sound.STEP_GRASS) {
World world = ((CraftEntity) disguisedEntity).getHandle().world;
Block b = Block.byId[world.getTypeId(soundLoc.getBlockX(), soundLoc.getBlockY() - 1,
soundLoc.getBlockZ())];
if (b != null)
mods.write(0, b.stepSound.getStepSound());
} else {
mods.write(0, CraftSound.getSound(sound));
}
} }
} }
} }
@ -151,7 +170,7 @@ public class DisguiseAPI {
EntityTrackerEntry entry = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) entity).getHandle().world).tracker.trackedEntities EntityTrackerEntry entry = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) entity).getHandle().world).tracker.trackedEntities
.get(entity.getEntityId()); .get(entity.getEntityId());
if (entry != null) { if (entry != null) {
EntityPlayer[] players = (EntityPlayer[]) entry.trackedPlayers.toArray(); EntityPlayer[] players = (EntityPlayer[]) entry.trackedPlayers.toArray(new EntityPlayer[entry.trackedPlayers.size()]);
for (EntityPlayer player : players) { for (EntityPlayer player : players) {
if (entity instanceof Player && !player.getBukkitEntity().canSee((Player) entity)) if (entity instanceof Player && !player.getBukkitEntity().canSee((Player) entity))
continue; continue;

View File

@ -1,24 +1,21 @@
package me.libraryaddict.disguise.DisguiseTypes; package me.libraryaddict.disguise.DisguiseTypes;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Random; import java.util.Random;
import me.libraryaddict.disguise.DisguiseTypes.Watchers.AgeableWatcher; import me.libraryaddict.disguise.DisguiseTypes.Watchers.AgeableWatcher;
import net.minecraft.server.v1_5_R3.Entity; 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.EntityLiving;
import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.EntitySkeleton;
import net.minecraft.server.v1_5_R3.EntityTypes; import net.minecraft.server.v1_5_R3.EntityTypes;
import net.minecraft.server.v1_5_R3.ItemStack; import net.minecraft.server.v1_5_R3.ItemStack;
import net.minecraft.server.v1_5_R3.MathHelper; import net.minecraft.server.v1_5_R3.MathHelper;
import net.minecraft.server.v1_5_R3.MinecraftServer;
import net.minecraft.server.v1_5_R3.PlayerInteractManager;
import net.minecraft.server.v1_5_R3.EnumArt; import net.minecraft.server.v1_5_R3.EnumArt;
import net.minecraft.server.v1_5_R3.World;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@ -30,18 +27,12 @@ import com.comphenix.protocol.reflect.StructureModifier;
public class Disguise { public class Disguise {
protected DisguiseType disguiseType; protected DisguiseType disguiseType;
private Entity entity = null; private boolean replaceSounds;
private FlagWatcher watcher; private FlagWatcher watcher;
protected Disguise(DisguiseType newType) { protected Disguise(DisguiseType newType, boolean doSounds) {
disguiseType = newType; disguiseType = newType;
} replaceSounds = doSounds;
public PacketContainer constructDestroyPacket(int entityId) {
PacketContainer destroyPacket = ProtocolLibrary.getProtocolManager().createPacket(Packets.Server.DESTROY_ENTITY);
StructureModifier<Object> mods = destroyPacket.getModifier();
mods.write(0, new int[] { entityId });
return destroyPacket;
} }
public PacketContainer constructPacket(org.bukkit.entity.Entity e) { public PacketContainer constructPacket(org.bukkit.entity.Entity e) {
@ -76,7 +67,8 @@ public class Disguise {
} else if (getType().isMob()) { } else if (getType().isMob()) {
entity = ((MobDisguise) this).getEntityLiving(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId()); // entity = ((MobDisguise) this).getEntityLiving(((CraftEntity) e).getHandle().world, e.getLocation(),
// e.getEntityId());
double d1 = 3.9D; double d1 = 3.9D;
Vector vec = e.getVelocity(); Vector vec = e.getVelocity();
double d2 = vec.getX(); double d2 = vec.getX();
@ -98,6 +90,31 @@ public class Disguise {
StructureModifier<Object> mods = spawnPacket.getModifier(); StructureModifier<Object> mods = spawnPacket.getModifier();
mods.write(0, e.getEntityId()); mods.write(0, e.getEntityId());
mods.write(1, (byte) EntityTypes.a(entity)); mods.write(1, (byte) EntityTypes.a(entity));
String name = toReadable(disguiseType.name());
if (disguiseType == DisguiseType.WITHER_SKELETON) {
name = "Skeleton";
} else if (disguiseType == DisguiseType.PRIMED_TNT) {
name = "TNTPrimed";
} else if (disguiseType == DisguiseType.MINECART_TNT) {
name = "MinecartTNT";
} else if (disguiseType == DisguiseType.SPLASH_POTION)
name = "Potion";
else if (disguiseType == DisguiseType.GIANT)
name = "Giant Zombie";
else if (disguiseType == DisguiseType.DROPPED_ITEM)
name = "Item";
else if (disguiseType == DisguiseType.FIREBALL)
name = "Large Fireball";
try {
Class entityClass = Class.forName("net.minecraft.server.v1_5_R3.Entity" + name);
Field field = EntityTypes.class.getDeclaredField("e");
field.setAccessible(true);
Map map = (Map) field.get(null);
mods.write(1, map.containsKey(entityClass) ? ((Integer) map.get(entityClass)).intValue() : 0);
} catch (Exception e1) {
e1.printStackTrace();
}
mods.write(2, entity.at.a(loc.getX())); mods.write(2, entity.at.a(loc.getX()));
mods.write(3, (int) Math.floor(loc.getY() * 32D)); mods.write(3, (int) Math.floor(loc.getY() * 32D));
mods.write(4, entity.at.a(loc.getZ())); mods.write(4, entity.at.a(loc.getZ()));
@ -115,7 +132,7 @@ public class Disguise {
} else if (getType().isMisc()) { } else if (getType().isMisc()) {
getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId()); // getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId());
int id = getType().getEntityId(); int id = getType().getEntityId();
int data = 0; int data = 0;
if (((MiscDisguise) this).getId() >= 0) if (((MiscDisguise) this).getId() >= 0)
@ -159,9 +176,9 @@ public class Disguise {
} else if (getType().isPlayer()) { } else if (getType().isPlayer()) {
EntityPlayer entityPlayer = (EntityPlayer) getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), // EntityPlayer entityPlayer = (EntityPlayer) getEntity(((CraftEntity) e).getHandle().world, e.getLocation(),
e.getEntityId()); // e.getEntityId());
entityPlayer.name = ((PlayerDisguise) this).getName(); // entityPlayer.name = ((PlayerDisguise) this).getName();
spawnPacket = manager.createPacket(Packets.Server.NAMED_ENTITY_SPAWN); spawnPacket = manager.createPacket(Packets.Server.NAMED_ENTITY_SPAWN);
StructureModifier<Object> mods = spawnPacket.getModifier(); StructureModifier<Object> mods = spawnPacket.getModifier();
mods.write(0, e.getEntityId()); mods.write(0, e.getEntityId());
@ -182,37 +199,7 @@ public class Disguise {
return spawnPacket; return spawnPacket;
} }
public Entity getEntity(World world, Location loc, int entityId) { public void constructWatcher(EntityType type, int entityId) {
if (entity != null) {
entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
entity.id = entityId;
return entity;
}
try {
if (disguiseType == DisguiseType.PLAYER) {
entity = new EntityPlayer(MinecraftServer.getServer(), world, ((PlayerDisguise) this).getName(),
new PlayerInteractManager(world));
} else {
String name = toReadable(disguiseType.name());
if (disguiseType == DisguiseType.WITHER_SKELETON) {
name = "Skeleton";
} else if (disguiseType == DisguiseType.PRIMED_TNT) {
name = "TNTPrimed";
} else if (disguiseType == DisguiseType.MINECART_TNT) {
name = "MinecartTNT";
}
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);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
entity.id = entityId;
try { try {
String name; String name;
if (getType().isPlayer()) { if (getType().isPlayer()) {
@ -223,16 +210,18 @@ public class Disguise {
Class watcherClass = Class.forName("me.libraryaddict.disguise.DisguiseTypes.Watchers." + name + "Watcher"); Class watcherClass = Class.forName("me.libraryaddict.disguise.DisguiseTypes.Watchers." + name + "Watcher");
Constructor<?> contructor = watcherClass.getDeclaredConstructor(int.class); Constructor<?> contructor = watcherClass.getDeclaredConstructor(int.class);
watcher = (FlagWatcher) contructor.newInstance(entityId); watcher = (FlagWatcher) contructor.newInstance(entityId);
if (watcher instanceof AgeableWatcher && this instanceof MobDisguise) {
((AgeableWatcher) watcher).setValue(12, ((MobDisguise) this).isAdult() ? 0 : -23999);
}
WatcherValues entity = WatcherValues.valueOf(type.name());
WatcherValues disguise = WatcherValues.valueOf(getType().name());
for (int i : entity.getValues()) {
if (disguise.getValue(i) != null && disguise.getValue(i).getClass() != entity.getValue(i).getClass())
watcher.setValue(i, disguise.getValue(i));
}
} catch (Exception ex) { } catch (Exception ex) {
// There is no watcher for this entity // There is no watcher for this entity
} }
if (watcher == null && entity instanceof EntityAgeable && this instanceof MobDisguise) {
watcher = new AgeableWatcher(entityId);
}
if (watcher instanceof AgeableWatcher && this instanceof MobDisguise) {
((AgeableWatcher) watcher).setValue(12, ((MobDisguise) this).isAdult() ? 0 : -23999);
}
return entity;
} }
public DisguiseType getType() { public DisguiseType getType() {
@ -247,6 +236,14 @@ public class Disguise {
return watcher != null; return watcher != null;
} }
public boolean replaceSounds() {
return replaceSounds;
}
public void setReplaceSounds(boolean areSoundsReplaced) {
replaceSounds = areSoundsReplaced;
}
private String toReadable(String string) { private String toReadable(String string) {
String[] strings = string.split("_"); String[] strings = string.split("_");
string = ""; string = "";

View File

@ -12,7 +12,7 @@ public enum DisguiseSound {
BLAZE(Sound.BLAZE_HIT, null, Sound.BLAZE_DEATH, Sound.BLAZE_BREATH), BLAZE(Sound.BLAZE_HIT, null, Sound.BLAZE_DEATH, Sound.BLAZE_BREATH),
CAVE_SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.PIG_IDLE), CAVE_SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.SPIDER_IDLE),
CHICKEN(Sound.CHICKEN_HURT, Sound.CHICKEN_WALK, Sound.CHICKEN_HURT, Sound.CHICKEN_IDLE, Sound.CHICKEN_EGG_POP), CHICKEN(Sound.CHICKEN_HURT, Sound.CHICKEN_WALK, Sound.CHICKEN_HURT, Sound.CHICKEN_IDLE, Sound.CHICKEN_EGG_POP),
@ -28,7 +28,7 @@ public enum DisguiseSound {
GHAST(Sound.GHAST_SCREAM, null, Sound.GHAST_DEATH, Sound.GHAST_MOAN, Sound.GHAST_CHARGE, Sound.GHAST_FIREBALL, GHAST(Sound.GHAST_SCREAM, null, Sound.GHAST_DEATH, Sound.GHAST_MOAN, Sound.GHAST_CHARGE, Sound.GHAST_FIREBALL,
Sound.GHAST_SCREAM2), Sound.GHAST_SCREAM2),
GIANT_ZOMBIE(Sound.HURT_FLESH, Sound.STEP_GRASS, null, null), GIANT(Sound.HURT_FLESH, Sound.STEP_GRASS, null, null),
IRON_GOLEM(Sound.IRONGOLEM_HIT, Sound.IRONGOLEM_WALK, Sound.IRONGOLEM_DEATH, Sound.IRONGOLEM_THROW), IRON_GOLEM(Sound.IRONGOLEM_HIT, Sound.IRONGOLEM_WALK, Sound.IRONGOLEM_DEATH, Sound.IRONGOLEM_THROW),
@ -52,7 +52,7 @@ public enum DisguiseSound {
SLIME(Sound.SLIME_ATTACK, Sound.SLIME_WALK2, null, null, Sound.SLIME_WALK), SLIME(Sound.SLIME_ATTACK, Sound.SLIME_WALK2, null, null, Sound.SLIME_WALK),
SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.PIG_IDLE), SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.SPIDER_IDLE),
WITHER(Sound.WITHER_HURT, null, Sound.WITHER_DEATH, Sound.WITHER_IDLE, Sound.WITHER_SHOOT, Sound.WITHER_SPAWN), WITHER(Sound.WITHER_HURT, null, Sound.WITHER_DEATH, Sound.WITHER_IDLE, Sound.WITHER_SHOOT, Sound.WITHER_SPAWN),
@ -74,8 +74,6 @@ public enum DisguiseSound {
public static DisguiseSound getType(String name) { public static DisguiseSound getType(String name) {
try { try {
if (name.equals("GIANT"))
return DisguiseSound.GIANT_ZOMBIE;
return valueOf(name); return valueOf(name);
} catch (Exception ex) { } catch (Exception ex) {
return null; return null;
@ -124,16 +122,15 @@ public enum DisguiseSound {
} }
/** /**
* Used to check if the original sound is owned by this disguise sound Ofc it won't be correct for commonly shared names. But * Used to check if this sound name is owned by this disguise sound.
* its the best I can possibly do
*/ */
public SoundType ownsSound(String name) { public SoundType getType(String name, boolean ignoreDamage) {
if (isCancelSound(name)) if (isCancelSound(name))
return SoundType.CANCEL; return SoundType.CANCEL;
if (disguiseSounds.get(SoundType.STEP) == Sound.STEP_GRASS && name.startsWith("step.")) if (disguiseSounds.get(SoundType.STEP) == Sound.STEP_GRASS && name.startsWith("step."))
return SoundType.STEP; return SoundType.STEP;
for (SoundType type : SoundType.values()) { for (SoundType type : SoundType.values()) {
if (!disguiseSounds.containsKey(type)) if (!disguiseSounds.containsKey(type) || type == SoundType.DEATH || (ignoreDamage && type == SoundType.HURT))
continue; continue;
Sound s = disguiseSounds.get(type); Sound s = disguiseSounds.get(type);
if (s != null) if (s != null)

View File

@ -5,33 +5,23 @@ public enum DisguiseType {
EntityType.MOB), COW(EntityType.MOB), CREEPER(EntityType.MOB), EGG(EntityType.MISC, 62), ENDER_CRYSTAL( EntityType.MOB), COW(EntityType.MOB), CREEPER(EntityType.MOB), EGG(EntityType.MISC, 62), ENDER_CRYSTAL(
EntityType.MISC, 51), ENDER_DRAGON(EntityType.MOB), ENDER_PEARL(EntityType.MISC, 65), ENDER_SIGNAL(EntityType.MISC, EntityType.MISC, 51), ENDER_DRAGON(EntityType.MOB), ENDER_PEARL(EntityType.MISC, 65), ENDER_SIGNAL(EntityType.MISC,
72), ENDERMAN(EntityType.MOB), EXPERIENCE_ORB(EntityType.MISC), FALLING_BLOCK(EntityType.MISC, 70, 1), FIREWORKS( 72), ENDERMAN(EntityType.MOB), EXPERIENCE_ORB(EntityType.MISC), FALLING_BLOCK(EntityType.MISC, 70, 1), FIREWORKS(
EntityType.MISC, 76), FISHING_HOOK(EntityType.MISC, 90), GHAST(EntityType.MOB), GIANT_ZOMBIE(EntityType.MOB), IRON_GOLEM( EntityType.MISC, 76), FISHING_HOOK(EntityType.MISC, 90), GHAST(EntityType.MOB), GIANT(EntityType.MOB), IRON_GOLEM(
EntityType.MOB), ITEM(EntityType.MISC, 2, 1), ITEM_FRAME(EntityType.MISC, 71), LARGE_FIREBALL(EntityType.MISC, 63, 0), MAGMA_CUBE( EntityType.MOB), DROPPED_ITEM(EntityType.MISC, 2, 1), ITEM_FRAME(EntityType.MISC, 71), FIREBALL(EntityType.MISC, 63,
EntityType.MOB), MINECART_CHEST(EntityType.MISC, 10, 1), MINECART_FURNACE(EntityType.MISC, 10, 2), MINECART_HOPPER( 0), MAGMA_CUBE(EntityType.MOB), MINECART_CHEST(EntityType.MISC, 10, 1), MINECART_FURNACE(EntityType.MISC, 10, 2), MINECART_HOPPER(
EntityType.MISC, 10), MINECART_MOB_SPAWNER(EntityType.MISC, 10, 4), MINECART_RIDEABLE(EntityType.MISC, 10, 0), MINECART_TNT( EntityType.MISC, 10), MINECART_MOB_SPAWNER(EntityType.MISC, 10, 4), MINECART_RIDEABLE(EntityType.MISC, 10, 0), MINECART_TNT(
EntityType.MISC, 10, 3), MUSHROOM_COW(EntityType.MOB), OCELOT(EntityType.MOB), PAINTING(EntityType.MISC), PIG(EntityType.MOB), PIG_ZOMBIE( EntityType.MISC, 10, 3), MUSHROOM_COW(EntityType.MOB), OCELOT(EntityType.MOB), PAINTING(EntityType.MISC), PIG(
EntityType.MOB), PLAYER(EntityType.PLAYER), POTION(EntityType.MISC, 73), PRIMED_TNT(EntityType.MISC, 50), SHEEP( EntityType.MOB), PIG_ZOMBIE(EntityType.MOB), PLAYER(EntityType.PLAYER), SPLASH_POTION(EntityType.MISC, 73), PRIMED_TNT(
EntityType.MOB), SILVERFISH(EntityType.MOB), SKELETON(EntityType.MOB), SLIME(EntityType.MOB), SMALL_FIREBALL( EntityType.MISC, 50), SHEEP(EntityType.MOB), SILVERFISH(EntityType.MOB), SKELETON(EntityType.MOB), SLIME(
EntityType.MISC, 64, 0), SNOWBALL(EntityType.MISC, 61), SNOWMAN(EntityType.MOB), SPIDER(EntityType.MOB), SQUID( EntityType.MOB), SMALL_FIREBALL(EntityType.MISC, 64, 0), SNOWBALL(EntityType.MISC, 61), SNOWMAN(EntityType.MOB), SPIDER(
EntityType.MOB), THROWN_EXP_BOTTLE(EntityType.MISC, 75), VILLAGER(EntityType.MOB), WITCH(EntityType.MOB), WITHER( EntityType.MOB), SQUID(EntityType.MOB), THROWN_EXP_BOTTLE(EntityType.MISC, 75), VILLAGER(EntityType.MOB), WITCH(
EntityType.MOB), WITHER_SKELETON(EntityType.MOB), WITHER_SKULL(EntityType.MISC, 66), WOLF(EntityType.MOB), ZOMBIE( EntityType.MOB), WITHER(EntityType.MOB), WITHER_SKELETON(EntityType.MOB), WITHER_SKULL(EntityType.MISC, 66), WOLF(
EntityType.MOB); EntityType.MOB), ZOMBIE(EntityType.MOB);
public static enum EntityType { public static enum EntityType {
MISC, MOB, PLAYER; MISC, MOB, PLAYER;
} }
public static DisguiseType getType(org.bukkit.entity.EntityType entityType) { public static DisguiseType getType(org.bukkit.entity.EntityType entityType) {
if (entityType == org.bukkit.entity.EntityType.SPLASH_POTION)
return DisguiseType.POTION;
else if (entityType == org.bukkit.entity.EntityType.GIANT)
return DisguiseType.GIANT_ZOMBIE;
else if (entityType == org.bukkit.entity.EntityType.DROPPED_ITEM)
return DisguiseType.ITEM;
else if (entityType == org.bukkit.entity.EntityType.FIREBALL)
return DisguiseType.LARGE_FIREBALL;
else if (entityType == org.bukkit.entity.EntityType.SMALL_FIREBALL)
return DisguiseType.LARGE_FIREBALL;
return DisguiseType.valueOf(entityType.name()); return DisguiseType.valueOf(entityType.name());
} }

View File

@ -26,6 +26,7 @@ public abstract class FlagWatcher {
} }
private int entityId; private int entityId;
private HashMap<Integer, Object> entityValues = new HashMap<Integer, Object>(); private HashMap<Integer, Object> entityValues = new HashMap<Integer, Object>();
private HashMap<Integer, Object> softReplace = new HashMap<Integer, Object>();
protected FlagWatcher(int entityId) { protected FlagWatcher(int entityId) {
this.entityId = entityId; this.entityId = entityId;
@ -65,6 +66,10 @@ public abstract class FlagWatcher {
watch.a(value); watch.a(value);
} }
} }
} else if (softReplace.containsKey(watch.a())) {
if (watch.b().getClass() == softReplace.get(watch.a()).getClass()) {
}
} }
newList.add(watch); newList.add(watch);
} }
@ -83,6 +88,31 @@ public abstract class FlagWatcher {
return newList; return newList;
} }
private WatchableObject processWatcher(WatchableObject watch, HashMap<Integer, Object> map) {
boolean doD = watch.d();
watch = new WatchableObject(watch.c(), watch.a(), watch.b());
if (!doD)
watch.a(false);
if (map.get(watch.a()) == null) {
return watch;
} else {
Object value = map.get(watch.a());
if (watch.b().getClass() != value.getClass()) {
watch.a(value);
try {
Field field = WatchableObject.class.getDeclaredField("a");
field.setAccessible(true);
field.set(watch, classTypes.get(value.getClass()));
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
watch.a(value);
}
}
return watch;
}
public void displayName(boolean display) { public void displayName(boolean display) {
if ((Byte) getValue(6) != (display ? 1 : 0)) { if ((Byte) getValue(6) != (display ? 1 : 0)) {
setValue(6, (byte) (display ? 1 : 0)); setValue(6, (byte) (display ? 1 : 0));

View File

@ -5,13 +5,11 @@ public class MiscDisguise extends Disguise {
private int id = -1; private int id = -1;
public MiscDisguise(DisguiseType disguiseType) { public MiscDisguise(DisguiseType disguiseType) {
super(disguiseType); this(disguiseType, true, -1, -1);
id = disguiseType.getDefaultId();
data = disguiseType.getDefaultData();
} }
public MiscDisguise(DisguiseType disguiseType, int id, int data) { public MiscDisguise(DisguiseType disguiseType, boolean replaceSounds, int id, int data) {
super(disguiseType); super(disguiseType, replaceSounds);
if (id == -1) if (id == -1)
id = disguiseType.getDefaultId(); id = disguiseType.getDefaultId();
if (data == -1) if (data == -1)
@ -20,6 +18,10 @@ public class MiscDisguise extends Disguise {
this.data = data; this.data = data;
} }
public MiscDisguise(DisguiseType disguiseType, int id, int data) {
this(disguiseType, true, id, data);
}
public int getData() { public int getData() {
return data; return data;
} }

View File

@ -1,40 +1,26 @@
package me.libraryaddict.disguise.DisguiseTypes; package me.libraryaddict.disguise.DisguiseTypes;
import net.minecraft.server.v1_5_R3.Entity; import me.libraryaddict.disguise.DisguiseTypes.Watchers.AgeableWatcher;
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 { public class MobDisguise extends Disguise {
private boolean adult; private boolean isAdult;
public MobDisguise(DisguiseType disguiseType, boolean isAdult) { public MobDisguise(DisguiseType disguiseType, boolean isAdult) {
super(disguiseType); super(disguiseType, true);
adult = isAdult;
} }
protected EntityLiving getEntityLiving(World w, Location loc, int id) { public MobDisguise(DisguiseType disguiseType, boolean isAdult, boolean replaceSounds) {
Entity entity = getEntity(w, loc, id); super(disguiseType, replaceSounds);
if (!adult) { this.isAdult = isAdult;
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() { public boolean isAdult() {
return adult; if (getWatcher() != null) {
} if (getWatcher() instanceof AgeableWatcher)
return ((AgeableWatcher) getWatcher()).isAdult();
public void setAdult(boolean setAdult) { return false;
adult = setAdult; }
return isAdult;
} }
} }

View File

@ -4,7 +4,11 @@ public class PlayerDisguise extends Disguise {
private String playerName; private String playerName;
public PlayerDisguise(String name) { public PlayerDisguise(String name) {
super(DisguiseType.PLAYER); this(name, true);
}
public PlayerDisguise(String name, boolean replaceSounds) {
super(DisguiseType.PLAYER, replaceSounds);
if (name.length() > 16) if (name.length() > 16)
name = name.substring(0, 16); name = name.substring(0, 16);
playerName = name; playerName = name;

View File

@ -0,0 +1,43 @@
package me.libraryaddict.disguise.DisguiseTypes;
import java.util.HashMap;
import java.util.Set;
public enum WatcherValues {
ARROW(16, (byte) 0), BAT(16, (byte) 0), BLAZE(16, (byte) 0), BOAT(19, 40, 17, 10, 18, 0), CAVE_SPIDER(), CHICKEN(12, 0), COW(
12, 0), CREEPER(16, (byte) 0, 17, (byte) 0), EGG(), ENDER_CRYSTAL(), ENDER_DRAGON(16, 300), ENDER_PEARL(), ENDER_SIGNAL(), ENDERMAN(
16, (byte) 0, 17, (byte) 1, 18, (byte) 0), EXPERIENCE_ORB(), FALLING_BLOCK(), FIREWORKS(), FISHING_HOOK(), GHAST(16,
(byte) 0), GIANT(), IRON_GOLEM(), DROPPED_ITEM(), ITEM_FRAME(2, 5, 3, (byte) 0), FIREBALL(), MAGMA_CUBE(16, (byte) 0,
18, (byte) 0), MINECART_CHEST(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_FURNACE(16,
(byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_HOPPER(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0,
21, 6, 22, (byte) 0), MINECART_MOB_SPAWNER(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_RIDEABLE(
16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_TNT(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20,
0, 21, 6, 22, (byte) 0), MUSHROOM_COW(12, 0), OCELOT(12, 0, 16, (byte) 0, 17, "", 18, (byte) 0), PAINTING(), PIG(12,
0, 16, (byte) 0), PIG_ZOMBIE(12, 0), PLAYER(8, 0, 9, (byte) 0, 10, (byte) 0), SPLASH_POTION(), PRIMED_TNT(), SHEEP(
12, (byte) 0, 16, (byte) 0), SILVERFISH(), SKELETON(13, (byte) 0), SLIME(16, (byte) 0, 18, (byte) 0), SMALL_FIREBALL(), SNOWBALL(), SNOWMAN(), SPIDER(), SQUID(), THROWN_EXP_BOTTLE(), VILLAGER(
16, 0), WITCH(), WITHER(16, 300), WITHER_SKELETON(13, (byte) 1), WITHER_SKULL(), WOLF(16, (byte) 0, 17, "", 18, 8,
19, (byte) 0, 20, (byte) 14), ZOMBIE(13, (byte) 0);
private HashMap<Integer, Object> values = new HashMap<Integer, Object>();
private WatcherValues(Object... obj) {
for (int i = 0; i < obj.length; i += 2) {
if (!values.containsKey(obj))
values.put((Integer) obj[i], obj[i + 1]);
else
try {
throw new Exception("Values in WatcherValues already contains " + obj + " for " + this.name());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Set<Integer> getValues() {
return values.keySet();
}
public Object getValue(int no) {
return values.get(no);
}
}

View File

@ -2,7 +2,7 @@ package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher;
public class AgeableWatcher extends FlagWatcher { public abstract class AgeableWatcher extends FlagWatcher {
public AgeableWatcher(int entityId) { public AgeableWatcher(int entityId) {
super(entityId); super(entityId);

View File

@ -0,0 +1,21 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher;
public class ArrowWatcher extends FlagWatcher {
protected ArrowWatcher(int entityId) {
super(entityId);
setValue(16, (byte) 0);
}
public void setMoving(boolean moving) {
setValue(16, (byte) (moving ? 1 : 0));
}
public boolean isMoving() {
return (Byte) getValue(16) == 1;
}
}

View File

@ -0,0 +1,9 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
public class ChickenWatcher extends AgeableWatcher {
public ChickenWatcher(int entityId) {
super(entityId);
}
}

View File

@ -0,0 +1,9 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
public class CowWatcher extends AgeableWatcher {
public CowWatcher(int entityId) {
super(entityId);
}
}

View File

@ -6,7 +6,7 @@ public class CreeperWatcher extends FlagWatcher {
public CreeperWatcher(int entityId) { public CreeperWatcher(int entityId) {
super(entityId); super(entityId);
setValue(16, (byte) -1); setValue(16, (byte) 0);
setValue(17, 0); setValue(17, 0);
} }

View File

@ -0,0 +1,11 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher;
public class LivingEntityWatcher extends FlagWatcher {
protected LivingEntityWatcher(int entityId) {
super(entityId);
}
}

View File

@ -0,0 +1,9 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
public class MushroomCowWatcher extends AgeableWatcher {
public MushroomCowWatcher(int entityId) {
super(entityId);
}
}

View File

@ -0,0 +1,9 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
public class PigZombieWatcher extends AgeableWatcher {
public PigZombieWatcher(int entityId) {
super(entityId);
}
}

View File

@ -0,0 +1,12 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher;
public class SkeletonWatcher extends FlagWatcher {
protected SkeletonWatcher(int entityId) {
super(entityId);
setValue(13, (byte) 0);
}
}

View File

@ -0,0 +1,12 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher;
public class WitherSkeletonWatcher extends FlagWatcher {
protected WitherSkeletonWatcher(int entityId) {
super(entityId);
setValue(13, (byte) 1);
}
}

View File

@ -1,8 +1,6 @@
package me.libraryaddict.disguise.DisguiseTypes.Watchers; package me.libraryaddict.disguise.DisguiseTypes.Watchers;
import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; public class ZombieWatcher extends AgeableWatcher {
public class ZombieWatcher extends FlagWatcher {
public ZombieWatcher(int entityId) { public ZombieWatcher(int entityId) {
super(entityId); super(entityId);

View File

@ -33,8 +33,10 @@ public class LibsDisguises extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) { if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
System.out.print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! This plugin depends on it to run!"); System.out
System.out.print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! LibsDisguises is now shutting down!"); .print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! This plugin depends on it to run!");
System.out
.print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! LibsDisguises is now shutting down!");
getPluginLoader().disablePlugin(this); getPluginLoader().disablePlugin(this);
return; return;
} }