Maybe make the entire runnable this much less laggier.
This commit is contained in:
parent
7da523c783
commit
62c2050587
@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
|
||||
import me.libraryaddict.disguise.DisguiseAPI;
|
||||
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
|
||||
import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
|
||||
@ -104,9 +105,7 @@ public abstract class Disguise {
|
||||
// Ok.. So it aint a horse
|
||||
}
|
||||
}
|
||||
double fallSpeed = 0.0005;
|
||||
boolean movement = false;
|
||||
boolean alwaysSend = false;
|
||||
final boolean alwaysSendVelocity;
|
||||
switch (getType()) {
|
||||
case EGG:
|
||||
case ENDER_PEARL:
|
||||
@ -118,14 +117,16 @@ public abstract class Disguise {
|
||||
case SPLASH_POTION:
|
||||
case THROWN_EXP_BOTTLE:
|
||||
case WITHER_SKULL:
|
||||
alwaysSend = true;
|
||||
alwaysSendVelocity = true;
|
||||
break;
|
||||
default:
|
||||
alwaysSendVelocity = false;
|
||||
break;
|
||||
}
|
||||
double velocitySpeed = 0.0005;
|
||||
switch (getType()) {
|
||||
case FIREWORK:
|
||||
fallSpeed = -0.040;
|
||||
velocitySpeed = -0.040;
|
||||
break;
|
||||
case EGG:
|
||||
case ENDER_PEARL:
|
||||
@ -135,17 +136,17 @@ public abstract class Disguise {
|
||||
case SNOWBALL:
|
||||
case SPLASH_POTION:
|
||||
case THROWN_EXP_BOTTLE:
|
||||
fallSpeed = 0.0005;
|
||||
velocitySpeed = 0.0005;
|
||||
break;
|
||||
case WITHER_SKULL:
|
||||
fallSpeed = 0.000001D;
|
||||
velocitySpeed = 0.000001D;
|
||||
break;
|
||||
case ARROW:
|
||||
case BOAT:
|
||||
case ENDER_CRYSTAL:
|
||||
case ENDER_DRAGON:
|
||||
case GHAST:
|
||||
// case ITEM_FRAME:
|
||||
case ITEM_FRAME:
|
||||
case MINECART:
|
||||
case MINECART_CHEST:
|
||||
case MINECART_FURNACE:
|
||||
@ -155,44 +156,39 @@ public abstract class Disguise {
|
||||
case PAINTING:
|
||||
case PLAYER:
|
||||
case SQUID:
|
||||
fallSpeed = 0;
|
||||
velocitySpeed = 0;
|
||||
break;
|
||||
case DROPPED_ITEM:
|
||||
case PRIMED_TNT:
|
||||
case WITHER:
|
||||
case FALLING_BLOCK:
|
||||
fallSpeed = 0.04;
|
||||
velocitySpeed = 0.04;
|
||||
break;
|
||||
case EXPERIENCE_ORB:
|
||||
fallSpeed = 0.0221;
|
||||
movement = true;
|
||||
velocitySpeed = 0.0221;
|
||||
break;
|
||||
case SPIDER:
|
||||
case CAVE_SPIDER:
|
||||
fallSpeed = 0.0040;
|
||||
velocitySpeed = 0.0040;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
final boolean sendMovementPacket = movement;
|
||||
final double vectorY = fallSpeed;
|
||||
final boolean alwaysSendVelocity = alwaysSend;
|
||||
final double vectorY = velocitySpeed;
|
||||
final TargetedDisguise disguise = (TargetedDisguise) this;
|
||||
// A scheduler to clean up any unused disguises.
|
||||
velocityRunnable = new BukkitRunnable() {
|
||||
private int i = 0;
|
||||
private int refreshDisguise = 0;
|
||||
|
||||
public void run() {
|
||||
// If entity is no longer valid. Remove it.
|
||||
if (!getEntity().isValid()) {
|
||||
DisguiseAPI.undisguiseToAll(getEntity());
|
||||
removeDisguise();
|
||||
} else {
|
||||
// If the disguise type is tnt, we need to resend the entity packet else it will turn invisible
|
||||
if (getType() == DisguiseType.PRIMED_TNT || getType() == DisguiseType.FIREWORK) {
|
||||
i++;
|
||||
if (i % 40 == 0) {
|
||||
i = 0;
|
||||
if (refreshDisguise++ % 40 == 0) {
|
||||
refreshDisguise = 0;
|
||||
DisguiseUtilities.refreshTrackers(disguise);
|
||||
if (getEntity() instanceof Player && isSelfDisguiseVisible()) {
|
||||
DisguiseUtilities.sendSelfDisguise((Player) getEntity());
|
||||
@ -206,10 +202,12 @@ public abstract class Disguise {
|
||||
// If this disguise has velocity sending enabled and the entity is flying.
|
||||
if (vectorY != 0 && isVelocitySent() && (alwaysSendVelocity || !getEntity().isOnGround())) {
|
||||
Vector vector = getEntity().getVelocity();
|
||||
// If the entity doesn't have velocity changes already
|
||||
// If the entity doesn't have velocity changes already - You know. I really can't wrap my head about the if statement.
|
||||
// But it doesn't seem to do anything wrong..
|
||||
if (vector.getY() != 0 && !(vector.getY() < 0 && alwaysSendVelocity && getEntity().isOnGround())) {
|
||||
return;
|
||||
}
|
||||
// If disguise isn't a experience orb, or the entity isn't standing on the ground
|
||||
if (getType() != DisguiseType.EXPERIENCE_ORB || !getEntity().isOnGround()) {
|
||||
PacketContainer lookPacket = null;
|
||||
if (getType() == DisguiseType.WITHER_SKULL) {
|
||||
@ -221,7 +219,8 @@ public abstract class Disguise {
|
||||
4,
|
||||
PacketsManager.getYaw(getType(), getEntity().getType(),
|
||||
(byte) Math.floor(loc.getYaw() * 256.0F / 360.0F)));
|
||||
mods.write(5, (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F));
|
||||
mods.write(5, PacketsManager.getPitch(getType(), DisguiseType.getType(getEntity().getType()),
|
||||
(byte) Math.floor(loc.getPitch() * 256.0F / 360.0F)));
|
||||
if (isSelfDisguiseVisible() && getEntity() instanceof Player) {
|
||||
PacketContainer selfLookPacket = lookPacket.shallowClone();
|
||||
selfLookPacket.getModifier().write(0, DisguiseAPI.getFakeDisguise(getEntity().getEntityId()));
|
||||
@ -234,10 +233,11 @@ public abstract class Disguise {
|
||||
}
|
||||
}
|
||||
try {
|
||||
Field ping = ReflectionManager.getNmsClass("EntityPlayer").getField("ping");
|
||||
PacketContainer velocityPacket = new PacketContainer(PacketType.Play.Server.ENTITY_VELOCITY);
|
||||
StructureModifier<Integer> mods = velocityPacket.getIntegers();
|
||||
mods.write(1, (int) (vector.getX() * 8000));
|
||||
mods.write(3, (int) (vector.getZ() * 8000));
|
||||
for (Player player : DisguiseUtilities.getPerverts(disguise)) {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_VELOCITY);
|
||||
StructureModifier<Object> mods = packet.getModifier();
|
||||
if (getEntity() == player) {
|
||||
if (!isSelfDisguiseVisible()) {
|
||||
continue;
|
||||
@ -246,30 +246,29 @@ public abstract class Disguise {
|
||||
} else {
|
||||
mods.write(0, getEntity().getEntityId());
|
||||
}
|
||||
mods.write(1, (int) (vector.getX() * 8000));
|
||||
mods.write(
|
||||
2,
|
||||
(int) (8000 * (vectorY * (double) ping.getInt(ReflectionManager.getNmsEntity(player)) * 0.069)));
|
||||
mods.write(3, (int) (vector.getZ() * 8000));
|
||||
mods.write(2, (int) (8000D * (vectorY * ReflectionManager.getPing(player)) * 0.069D));
|
||||
if (lookPacket != null) {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, lookPacket);
|
||||
}
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
|
||||
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, velocityPacket);
|
||||
velocityPacket = velocityPacket.shallowClone();
|
||||
mods = velocityPacket.getIntegers();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
// If we need to send more packets because else it still 'sinks'
|
||||
if (sendMovementPacket) {
|
||||
// If we need to send a packet to update the exp orbs position as it likes to gravitate client sided to
|
||||
// players.
|
||||
if (getType() == DisguiseType.EXPERIENCE_ORB) {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE);
|
||||
StructureModifier<Object> mods = packet.getModifier();
|
||||
mods.write(0, getEntity().getEntityId());
|
||||
packet.getIntegers().write(0, getEntity().getEntityId());
|
||||
try {
|
||||
for (Player player : DisguiseUtilities.getPerverts(disguise)) {
|
||||
if (DisguiseAPI.isViewDisguises() || getEntity() != player) {
|
||||
try {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
|
||||
}
|
||||
}
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -277,8 +276,6 @@ public abstract class Disguise {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,16 @@ public class ReflectionManager {
|
||||
private static String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3];
|
||||
private static Method damageAndIdleSoundMethod;
|
||||
private static Class itemClass;
|
||||
private static Field pingField;
|
||||
|
||||
public static double getPing(Player player) {
|
||||
try {
|
||||
return (double) pingField.getInt(ReflectionManager.getNmsEntity(player));
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return 0D;
|
||||
}
|
||||
|
||||
static {
|
||||
for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) {
|
||||
@ -73,6 +83,7 @@ public class ReflectionManager {
|
||||
}
|
||||
try {
|
||||
itemClass = getCraftClass("inventory.CraftItemStack");
|
||||
pingField = getNmsClass("EntityPlayer").getField("ping");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user