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:
@@ -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());
|
||||
}
|
||||
|
Reference in New Issue
Block a user