Fix VisibilityManager in 1.14

This commit is contained in:
filoghost 2019-09-11 10:59:23 +02:00
parent ffb8680930
commit 70e070ac11

View File

@ -48,11 +48,12 @@ import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerEntityMetadata; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerEntityMetadata;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerMount; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerMount;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntity; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntity;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntityLiving;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntity.ObjectTypes; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntity.ObjectTypes;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.packet.WrapperPlayServerSpawnEntityLiving;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager; import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.object.CraftHologram; import com.gmail.filoghost.holographicdisplays.object.CraftHologram;
import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine;
import com.gmail.filoghost.holographicdisplays.object.line.CraftItemLine; import com.gmail.filoghost.holographicdisplays.object.line.CraftItemLine;
@ -79,6 +80,11 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
private int itemstackMetadataWatcherIndex; private int itemstackMetadataWatcherIndex;
private int customNameWatcherIndex; private int customNameWatcherIndex;
private int customNameVisibleWatcherIndex;
private int noGravityWatcherIndex;
private int armorStandStatusWatcherIndex;
private int entityStatusWatcherIndex;
private int airLevelWatcherIndex;
private boolean useGetEntityWorkaround; private boolean useGetEntityWorkaround;
@ -86,17 +92,22 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
public boolean hook(Plugin plugin, NMSManager nmsManager) { public boolean hook(Plugin plugin, NMSManager nmsManager) {
this.nmsManager = nmsManager; this.nmsManager = nmsManager;
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) { if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_14_R1)) {
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_10_R1)) { itemstackMetadataWatcherIndex = 7;
} else if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_10_R1)) {
itemstackMetadataWatcherIndex = 6; itemstackMetadataWatcherIndex = 6;
} else { } else if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) {
itemstackMetadataWatcherIndex = 5; itemstackMetadataWatcherIndex = 5;
}
} else { } else {
itemstackMetadataWatcherIndex = 10; itemstackMetadataWatcherIndex = 10;
} }
entityStatusWatcherIndex = 0;
airLevelWatcherIndex = 1;
customNameWatcherIndex = 2; customNameWatcherIndex = 2;
customNameVisibleWatcherIndex = 3;
noGravityWatcherIndex = 5;
armorStandStatusWatcherIndex = 11;
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) { if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) {
itemSerializer = Registry.get(MinecraftReflection.getItemStackClass()); itemSerializer = Registry.get(MinecraftReflection.getItemStackClass());
@ -334,29 +345,12 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
CraftItemLine itemLine = (CraftItemLine) line; CraftItemLine itemLine = (CraftItemLine) line;
if (itemLine.isSpawned()) { if (itemLine.isSpawned()) {
AbstractPacket itemPacket = new WrapperPlayServerSpawnEntity(itemLine.getNmsItem().getBukkitEntityNMS(), ObjectTypes.ITEM_STACK, 1); sendSpawnItemPacket(player, itemLine.getNmsItem());
itemPacket.sendPacket(player);
sendSpawnArmorStandPacket(player, (NMSArmorStand) itemLine.getNmsVehicle()); sendSpawnArmorStandPacket(player, (NMSArmorStand) itemLine.getNmsVehicle());
sendVehicleAttachPacket(player, itemLine.getNmsVehicle().getIdNMS(), itemLine.getNmsItem().getIdNMS()); sendVehicleAttachPacket(player, itemLine.getNmsVehicle().getIdNMS(), itemLine.getNmsItem().getIdNMS());
sendItemMetadataPacket(player, itemLine.getNmsItem());
WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata();
WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) {
Object itemStackObject = NMSVersion.isGreaterEqualThan(NMSVersion.v1_11_R1) ? itemLine.getNmsItem().getRawItemStack() : com.google.common.base.Optional.of(itemLine.getNmsItem().getRawItemStack());
dataWatcher.setObject(new WrappedDataWatcherObject(itemstackMetadataWatcherIndex, itemSerializer), itemStackObject);
dataWatcher.setObject(new WrappedDataWatcherObject(1, intSerializer), 300);
dataWatcher.setObject(new WrappedDataWatcherObject(0, byteSerializer), (byte) 0);
} else {
dataWatcher.setObject(itemstackMetadataWatcherIndex, itemLine.getNmsItem().getRawItemStack());
dataWatcher.setObject(1, 300);
dataWatcher.setObject(0, (byte) 0);
}
itemDataPacket.setEntityMetadata(dataWatcher.getWatchableObjects());
itemDataPacket.setEntityID(itemLine.getNmsItem().getIdNMS());
itemDataPacket.sendPacket(player);
} }
} }
@ -380,13 +374,18 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
private void sendSpawnArmorStandPacket(Player receiver, NMSArmorStand armorStand) { private void sendSpawnArmorStandPacket(Player receiver, NMSArmorStand armorStand) {
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_11_R1)) { if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_11_R1)) {
WrapperPlayServerSpawnEntity spawnPacket = new WrapperPlayServerSpawnEntity(armorStand.getBukkitEntityNMS(), WrapperPlayServerSpawnEntity.ObjectTypes.ARMOR_STAND, 1); AbstractPacket spawnPacket;
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_14_R1)) {
spawnPacket = new WrapperPlayServerSpawnEntityLiving(armorStand.getBukkitEntityNMS());
} else {
spawnPacket = new WrapperPlayServerSpawnEntity(armorStand.getBukkitEntityNMS(), WrapperPlayServerSpawnEntity.ObjectTypes.ARMOR_STAND, 1);
}
spawnPacket.sendPacket(receiver); spawnPacket.sendPacket(receiver);
WrapperPlayServerEntityMetadata dataPacket = new WrapperPlayServerEntityMetadata(); WrapperPlayServerEntityMetadata dataPacket = new WrapperPlayServerEntityMetadata();
WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
dataWatcher.setObject(new WrappedDataWatcherObject(0, byteSerializer), (byte) 0x20); // Entity status: invisible dataWatcher.setObject(new WrappedDataWatcherObject(entityStatusWatcherIndex, byteSerializer), (byte) 0x20); // Entity status: invisible
String customName = armorStand.getCustomNameNMS(); String customName = armorStand.getCustomNameNMS();
if (customName != null && !customName.isEmpty()) { if (customName != null && !customName.isEmpty()) {
@ -395,11 +394,11 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
} else { } else {
dataWatcher.setObject(new WrappedDataWatcherObject(customNameWatcherIndex, stringSerializer), customName); dataWatcher.setObject(new WrappedDataWatcherObject(customNameWatcherIndex, stringSerializer), customName);
} }
dataWatcher.setObject(new WrappedDataWatcherObject(3, booleanSerializer), true); // Custom name visible dataWatcher.setObject(new WrappedDataWatcherObject(customNameVisibleWatcherIndex, booleanSerializer), true); // Custom name visible
} }
dataWatcher.setObject(new WrappedDataWatcherObject(5, booleanSerializer), true); // No gravity dataWatcher.setObject(new WrappedDataWatcherObject(noGravityWatcherIndex, booleanSerializer), true); // No gravity
dataWatcher.setObject(new WrappedDataWatcherObject(11, byteSerializer), (byte) (0x01 | 0x08 | 0x10)); // Armor stand data: small, no base plate, marker dataWatcher.setObject(new WrappedDataWatcherObject(armorStandStatusWatcherIndex, byteSerializer), (byte) (0x01 | 0x08 | 0x10)); // Armor stand data: small, no base plate, marker
dataPacket.setEntityMetadata(dataWatcher.getWatchableObjects()); dataPacket.setEntityMetadata(dataWatcher.getWatchableObjects());
dataPacket.setEntityID(armorStand.getIdNMS()); dataPacket.setEntityID(armorStand.getIdNMS());
@ -412,6 +411,33 @@ public class ProtocolLibHookImpl implements ProtocolLibHook {
} }
private void sendSpawnItemPacket(Player receiver, NMSItem item) {
AbstractPacket itemPacket = new WrapperPlayServerSpawnEntity(item.getBukkitEntityNMS(), ObjectTypes.ITEM_STACK, 1);
itemPacket.sendPacket(receiver);
}
private void sendItemMetadataPacket(Player receiver, NMSItem item) {
WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata();
WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) {
Object itemStackObject = NMSVersion.isGreaterEqualThan(NMSVersion.v1_11_R1) ? item.getRawItemStack() : com.google.common.base.Optional.of(item.getRawItemStack());
dataWatcher.setObject(new WrappedDataWatcherObject(itemstackMetadataWatcherIndex, itemSerializer), itemStackObject);
dataWatcher.setObject(new WrappedDataWatcherObject(airLevelWatcherIndex, intSerializer), 300);
dataWatcher.setObject(new WrappedDataWatcherObject(entityStatusWatcherIndex, byteSerializer), (byte) 0);
} else {
dataWatcher.setObject(itemstackMetadataWatcherIndex, item.getRawItemStack());
dataWatcher.setObject(airLevelWatcherIndex, 300);
dataWatcher.setObject(entityStatusWatcherIndex, (byte) 0);
}
itemDataPacket.setEntityMetadata(dataWatcher.getWatchableObjects());
itemDataPacket.setEntityID(item.getIdNMS());
itemDataPacket.sendPacket(receiver);
}
private void sendVehicleAttachPacket(Player receiver, int vehicleId, int passengerId) { private void sendVehicleAttachPacket(Player receiver, int vehicleId, int passengerId) {
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) { if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_9_R1)) {
WrapperPlayServerMount attachPacket = new WrapperPlayServerMount(); WrapperPlayServerMount attachPacket = new WrapperPlayServerMount();