Read description

Completely redone how the disguising works.
Sends packets through protocollib now.
Doesn't hide the players anymore. It changes entity trackers.
You can now disguise any entity.
Added painting disguise.
Added disguisesound which stores sounds for each disguise.
Any disguise makes a sound? Its replaced with the proper sound.
Added ability to turn off and on the sounds
Added ItemFrameWatcher and PlayerWatcher
This commit is contained in:
Andrew
2013-05-29 10:29:36 +12:00
parent 89959fb89e
commit 09b4955e23
8 changed files with 601 additions and 268 deletions

View File

@@ -1,23 +1,21 @@
package me.libraryaddict.disguise;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import me.libraryaddict.disguise.DisguiseTypes.Disguise;
import me.libraryaddict.disguise.DisguiseTypes.DisguiseType;
import me.libraryaddict.disguise.DisguiseTypes.PlayerDisguise;
import net.minecraft.server.v1_5_R3.WatchableObject;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_5_R3.CraftSound;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import com.comphenix.protocol.Packets;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.ConnectionSide;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
@@ -27,135 +25,86 @@ import com.comphenix.protocol.reflect.StructureModifier;
public class LibsDisguises extends JavaPlugin {
public void onEnable() {
ProtocolLibrary.getProtocolManager().addPacketListener(
new PacketAdapter(this, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, Packets.Server.NAMED_ENTITY_SPAWN,
Packets.Server.ENTITY_METADATA, Packets.Server.NAMED_SOUND_EFFECT, Packets.Server.ARM_ANIMATION,
Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT) {
@Override
public void onPacketSending(PacketEvent event) {
StructureModifier<Object> mods = event.getPacket().getModifier();
try {
Player observer = event.getPlayer();
if (event.getPacketID() == Packets.Server.NAMED_SOUND_EFFECT) {
if (!DisguiseAPI.playSounds())
return;
String soundName = (String) mods.read(0);
if (soundName.startsWith("step.") || soundName.equals("damage.hit")) {
Disguise dis = null;
Location soundLoc = new Location(observer.getWorld(), (Integer) mods.read(1), (Integer) mods
.read(2), (Integer) mods.read(3));
for (Player player : Bukkit.getOnlinePlayers()) {
if (DisguiseAPI.isDisguised(player)) {
Location loc = player.getLocation();
Location dLoc = new Location(observer.getWorld(), (int) (loc.getX() * 8), (int) (loc
.getY() * 8), (int) (loc.getZ() * 8));
if (dLoc.equals(soundLoc)) {
dis = DisguiseAPI.getDisguise(player);
break;
}
}
}
if (dis != null) {
if (dis.getType().isPlayer())
return;
if (dis.getType().isMisc()) {
event.setCancelled(true);
return;
}
String sound = null;
try {
Field field = CraftSound.class.getDeclaredField("sounds");
field.setAccessible(true);
List<String> sounds = Arrays.asList((String[]) field.get(null));
String mobName = dis.getType().name().toLowerCase().replace("_", "");
if (dis.getType() == DisguiseType.WITHER_SKELETON)
mobName = "skeleton";
else if (dis.getType() == DisguiseType.CAVE_SPIDER)
mobName = "spider";
else if (dis.getType() == DisguiseType.ENDERMAN)
mobName = "endermen";
else if (dis.getType() == DisguiseType.MUSHROOM_COW)
mobName = "cow";
if (soundName.startsWith("step.")) {
if (sounds.contains("mob." + mobName + ".walk"))
sound = "mob." + mobName + ".walk";
else if (sounds.contains("mob." + mobName + ".step"))
sound = "mob." + mobName + ".step";
} else if (soundName.equals("damage.hit")) {
if (dis.getType() == DisguiseType.SNOWMAN
|| dis.getType() == DisguiseType.VILLAGER
|| dis.getType() == DisguiseType.WITCH) {
event.setCancelled(true);
return;
}
if (dis.getType() == DisguiseType.PIG_ZOMBIE)
sound = "mob.zombiepig.zpighurt";
else if (dis.getType() == DisguiseType.GHAST)
sound = "mob.ghast.scream";
else if (dis.getType() == DisguiseType.OCELOT)
sound = "mob.cat.hitt";
else if (mobName.equals("slime"))
sound = "mob.slime.attack";
else if (sounds.contains("mob." + mobName + ".hit"))
sound = "mob." + mobName + ".hit";
else if (sounds.contains("mob." + mobName + ".hurt"))
sound = "mob." + mobName + ".hurt";
else if (sounds.contains("mob." + mobName + ".say"))
sound = "mob." + mobName + ".say";
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (sound != null) {
mods.write(0, sound);
}
}
DisguiseAPI.init(this);
DisguiseAPI.enableSounds(true);
final ProtocolManager manager = ProtocolLibrary.getProtocolManager();
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL,
Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ENTITY_METADATA, Packets.Server.ARM_ANIMATION,
Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT,
Packets.Server.ADD_EXP_ORB, Packets.Server.VEHICLE_SPAWN, Packets.Server.MOB_SPAWN,
Packets.Server.ENTITY_PAINTING, Packets.Server.COLLECT) {
@Override
public void onPacketSending(PacketEvent event) {
StructureModifier<Object> mods = event.getPacket().getModifier();
try {
Player observer = event.getPlayer();
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == event.getPacketID() ? 1 : 0));
if (DisguiseAPI.isDisguised(entity)) {
Disguise disguise = DisguiseAPI.getDisguise(entity);
if (event.getPacketID() == Packets.Server.ENTITY_METADATA) {
if (!(entity instanceof Player && disguise.getType().isPlayer()))
if (disguise.hasWatcher())
mods.write(1, disguise.getWatcher().convert((List<WatchableObject>) mods.read(1)));
} else if (event.getPacketID() == Packets.Server.NAMED_ENTITY_SPAWN) {
if (disguise.getType().isPlayer()) {
String name = (String) mods.read(1);
if (!name.equals(((PlayerDisguise) disguise).getName())) {
// manager.sendServerPacket(observer, disguise.constructDestroyPacket(entity.getEntityId()));
event.setPacket(disguise.constructPacket(entity));
}
} else {
StructureModifier<Entity> entityModifer = event.getPacket()
.getEntityModifier(observer.getWorld());
org.bukkit.entity.Entity entity = entityModifer.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.ENTITY_METADATA
&& !disguise.getType().isPlayer()) {
if (disguise.hasWatcher()) {
mods.write(1, disguise.getWatcher().convert((List<WatchableObject>) mods.read(1)));
}
} else if (event.getPacketID() == Packets.Server.NAMED_ENTITY_SPAWN) {
if (disguise.getType().isPlayer()) {
String name = (String) mods.read(1);
if (!name.equals(((PlayerDisguise) disguise).getName())) {
event.setCancelled(true);
DisguiseAPI.disguiseToPlayer(watched, observer, disguise);
}
} else {
event.setCancelled(true);
DisguiseAPI.disguiseToPlayer(watched, observer, disguise);
}
} else if (event.getPacketID() == Packets.Server.ARM_ANIMATION) {
if (disguise.getType().isMisc()) {
event.setCancelled(true);
}
} else {
if (disguise.getType() == DisguiseType.ENDER_DRAGON) {
byte value = (Byte) mods.read(4);
mods.write(4, (byte) (value - 128));
} else if (disguise.getType().isMisc()) {
byte value = (Byte) mods.read(4);
mods.write(4, (byte) (value + 64));
}
}
}
}
// manager.sendServerPacket(observer, disguise.constructDestroyPacket(entity.getEntityId()));
event.setPacket(disguise.constructPacket(entity));
}
} else if (event.getPacketID() == Packets.Server.MOB_SPAWN
|| event.getPacketID() == Packets.Server.ADD_EXP_ORB
|| event.getPacketID() == Packets.Server.VEHICLE_SPAWN
|| event.getPacketID() == Packets.Server.ENTITY_PAINTING) {
// manager.sendServerPacket(observer, disguise.constructDestroyPacket(entity.getEntityId()));
event.setPacket(disguise.constructPacket(entity));
} else if (event.getPacketID() == Packets.Server.ARM_ANIMATION
|| event.getPacketID() == Packets.Server.COLLECT) {
if (disguise.getType().isMisc()) {
event.setCancelled(true);
}
} else if (Packets.Server.REL_ENTITY_MOVE_LOOK == event.getPacketID()
|| Packets.Server.ENTITY_LOOK == event.getPacketID()
|| Packets.Server.ENTITY_TELEPORT == event.getPacketID()) {
if (disguise.getType() == DisguiseType.ENDER_DRAGON) {
byte value = (Byte) mods.read(4);
mods.write(4, (byte) (value - 128));
} else if (disguise.getType().isMisc()) {
byte value = (Byte) mods.read(4);
if (disguise.getType() != DisguiseType.PAINTING)
mods.write(4, (byte) (value + 64));
else
mods.write(4, (byte) -(value += 128));
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.CLIENT_SIDE, ListenerPriority.NORMAL,
Packets.Client.USE_ENTITY) {
@Override
public void onPacketReceiving(PacketEvent event) {
try {
Player observer = event.getPlayer();
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
org.bukkit.entity.Entity entity = entityModifer.read(1);
if (DisguiseAPI.isDisguised(entity)
&& (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow)) {
event.setCancelled(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
getCommand("disguise").setExecutor(new DisguiseCommand());
getCommand("undisguise").setExecutor(new UndisguiseCommand());
}