Added setSleeping and isSleeping to player watcher

This commit is contained in:
libraryaddict 2013-12-24 18:20:50 +13:00
parent 25471787aa
commit 239737b083
2 changed files with 82 additions and 7 deletions

View File

@ -1,20 +1,74 @@
package me.libraryaddict.disguise.disguisetypes.watchers;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.reflect.StructureModifier;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.ReflectionManager;
public class PlayerWatcher extends LivingWatcher {
private boolean isInBed;
public PlayerWatcher(Disguise disguise) {
super(disguise);
}
public PlayerWatcher clone(Disguise disguise) {
PlayerWatcher watcher = (PlayerWatcher) super.clone(disguise);
watcher.isInBed = isInBed;
return watcher;
}
public int getArrowsSticking() {
return (Byte) getValue(9, (byte) 0);
}
public boolean isSleeping() {
return isInBed;
}
public void setArrowsSticking(int arrowsNo) {
setValue(9, (byte) arrowsNo);
sendData(9);
}
/**
* The facing direction for the bed is the block metadata. 0 - 90 degrees. 1 - 0 degrees. 2 - 270 degrees. 3 - 180 degrees.
*/
public void setSleeping(boolean sleep) {
if (sleep != isSleeping()) {
isInBed = sleep;
if (DisguiseUtilities.isDisguiseInUse(getDisguise())) {
PacketContainer packet;
if (isSleeping()) {
packet = new PacketContainer(PacketType.Play.Server.BED);
StructureModifier<Integer> mods = packet.getIntegers();
mods.write(0, getDisguise().getEntity().getEntityId());
Location loc = getDisguise().getEntity().getLocation();
mods.write(1, loc.getBlockX());
mods.write(2, loc.getBlockY());
mods.write(3, loc.getBlockZ());
} else {
packet = new PacketContainer(PacketType.Play.Server.ANIMATION);
StructureModifier<Integer> mods = packet.getIntegers();
mods.write(0, getDisguise().getEntity().getEntityId());
mods.write(1, ReflectionManager.isAfter17() ? 3 : 2);
}
try {
for (Player player : DisguiseUtilities.getPerverts(getDisguise())) {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}

View File

@ -14,6 +14,7 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import me.libraryaddict.disguise.disguisetypes.MobDisguise;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
import org.bukkit.Art;
@ -164,7 +165,7 @@ public class PacketsManager {
for (int i = 0; i < packets.size(); i++) {
spawnPackets[i + 2] = packets.get(i);
}
Location loc = disguisedEntity.getLocation().clone().add(0, getYModifier(disguisedEntity, disguise.getType()), 0);
Location loc = disguisedEntity.getLocation().clone().add(0, getYModifier(disguise), 0);
byte yaw = getYaw(disguise.getType(), disguisedEntity.getType(), (byte) (int) (loc.getYaw() * 256.0F / 360.0F));
if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) {
@ -227,6 +228,15 @@ public class PacketsManager {
spawnPackets[0].getDataWatcherModifier().write(0,
createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()));
if (((PlayerWatcher) disguise.getWatcher()).isSleeping()) {
spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED);
StructureModifier<Integer> mods = spawnPackets[1].getIntegers();
mods.write(0, disguisedEntity.getEntityId());
mods.write(1, loc.getBlockX());
mods.write(2, loc.getBlockY());
mods.write(3, loc.getBlockZ());
}
} else if (disguise.getType().isMob()) {
DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType());
@ -417,18 +427,18 @@ public class PacketsManager {
/**
* Get the Y level to add to the disguise for realism.
*/
private static double getYModifier(Entity entity, DisguiseType disguiseType) {
switch (disguiseType) {
private static double getYModifier(Disguise disguise) {
switch (disguise.getType()) {
case BAT:
if (entity instanceof LivingEntity)
return ((LivingEntity) entity).getEyeHeight();
if (disguise.getEntity() instanceof LivingEntity)
return ((LivingEntity) disguise.getEntity()).getEyeHeight();
case MINECART:
case MINECART_CHEST:
case MINECART_FURNACE:
case MINECART_HOPPER:
case MINECART_MOB_SPAWNER:
case MINECART_TNT:
switch (entity.getType()) {
switch (disguise.getEntity().getType()) {
case MINECART:
case MINECART_CHEST:
case MINECART_FURNACE:
@ -452,6 +462,11 @@ public class PacketsManager {
case THROWN_EXP_BOTTLE:
case WITHER_SKULL:
return 0.7;
case PLAYER:
if (((PlayerWatcher) disguise.getWatcher()).isSleeping()) {
return 0.5;
}
break;
default:
break;
}
@ -1141,6 +1156,12 @@ public class PacketsManager {
else if (sentPacket.getType() == PacketType.Play.Server.COLLECT) {
if (disguise.getType().isMisc()) {
packets = new PacketContainer[0];
} else if (disguise.getType().isPlayer() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) {
PacketContainer newPacket = new PacketContainer(PacketType.Play.Server.ANIMATION);
StructureModifier<Integer> mods = newPacket.getIntegers();
mods.write(0, disguise.getEntity().getEntityId());
mods.write(1, ReflectionManager.isAfter17() ? 3 : 2);
packets = new PacketContainer[] { newPacket, sentPacket };
}
}
@ -1159,7 +1180,7 @@ public class PacketsManager {
byte pitchValue = (Byte) mods.read(5);
mods.write(5, getPitch(disguise.getType(), DisguiseType.getType(entity.getType()), pitchValue));
if (sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) {
double y = getYModifier(entity, disguise.getType());
double y = getYModifier(disguise);
if (y != 0) {
y *= 32;
mods.write(2, (Integer) mods.read(2) + (int) Math.floor(y));