Simplify PacketListener

This commit is contained in:
filoghost 2021-03-06 20:55:42 +01:00
parent c332547f38
commit 65a54165eb
5 changed files with 44 additions and 110 deletions

View File

@ -13,9 +13,8 @@ import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import me.filoghost.holographicdisplays.bridge.protocollib.packet.EntityRelatedPacketWrapper;
import me.filoghost.holographicdisplays.bridge.protocollib.packet.AbstractPacket;
import me.filoghost.holographicdisplays.bridge.protocollib.packet.WrapperPlayServerEntityMetadata;
import me.filoghost.holographicdisplays.bridge.protocollib.packet.WrapperPlayServerSpawnEntity;
import me.filoghost.holographicdisplays.bridge.protocollib.packet.WrapperPlayServerSpawnEntityLiving;
import me.filoghost.holographicdisplays.core.hologram.StandardHologramLine;
import me.filoghost.holographicdisplays.core.hologram.StandardTextLine;
@ -25,7 +24,6 @@ import me.filoghost.holographicdisplays.core.nms.entity.NMSArmorStand;
import me.filoghost.holographicdisplays.core.nms.entity.NMSEntity;
import me.filoghost.holographicdisplays.core.placeholder.RelativePlaceholder;
import me.filoghost.holographicdisplays.util.NMSVersion;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -61,81 +59,47 @@ class PacketListener extends PacketAdapter {
@Override
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
PacketType packetType = packet.getType();
Player player = event.getPlayer();
if (player instanceof Factory) {
return; // Ignore temporary players (reference: https://github.com/dmulloy2/ProtocolLib/issues/349)
}
// Spawn entity packet
if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
WrapperPlayServerSpawnEntityLiving spawnEntityPacket = new WrapperPlayServerSpawnEntityLiving(packet);
StandardHologramLine hologramLine = getHologramLine(event, spawnEntityPacket);
int entityID = packet.getIntegers().read(0);
if (entityID < 0) {
return;
}
if (hologramLine == null) {
return;
NMSEntity nmsEntity = nmsManager.getNMSEntityBaseFromID(event.getPlayer().getWorld(), entityID);
if (nmsEntity == null) {
return; // Entity not existing or not related to holograms.
}
if (packetType == PacketType.Play.Server.REL_ENTITY_MOVE || packetType == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK) {
if (nmsEntity instanceof NMSArmorStand && packetSettings.sendAccurateLocationPackets()) {
event.setCancelled(true); // Don't send relative movement packets for armor stands, only keep precise teleport packets.
}
return;
}
if (!hologramLine.getHologram().isVisibleTo(player)) {
event.setCancelled(true);
return;
}
if (NMSVersion.isGreaterEqualThan(NMSVersion.v1_15_R1)) {
// There's no metadata field in 1.15+ on the spawn entity packet
return;
}
StandardHologramLine hologramLine = nmsEntity.getHologramLine();
if (!hologramLine.getHologram().isVisibleTo(player)) {
event.setCancelled(true);
return;
}
if (packetType == PacketType.Play.Server.SPAWN_ENTITY_LIVING && NMSVersion.isGreaterEqualThan(NMSVersion.v1_15_R1)) {
// There's no metadata field in 1.15+ on the spawn entity packet, ignore it
return;
}
if (packetType == PacketType.Play.Server.SPAWN_ENTITY_LIVING || packetType == PacketType.Play.Server.ENTITY_METADATA) {
if (!(hologramLine instanceof StandardTextLine)) {
return;
}
StandardTextLine textLine = (StandardTextLine) hologramLine;
Collection<RelativePlaceholder> relativePlaceholders = textLine.getRelativePlaceholders();
if (relativePlaceholders == null || relativePlaceholders.isEmpty()) {
return;
}
spawnEntityPacket = new WrapperPlayServerSpawnEntityLiving(packet.deepClone());
WrappedWatchableObject customNameWatchableObject = metadataHelper.getCustomNameWacthableObject(spawnEntityPacket.getMetadata());
if (customNameWatchableObject == null) {
return;
}
replaceRelativePlaceholders(customNameWatchableObject, player, relativePlaceholders);
event.setPacket(spawnEntityPacket.getHandle());
} else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) {
WrapperPlayServerSpawnEntity spawnEntityPacket = new WrapperPlayServerSpawnEntity(packet);
StandardHologramLine hologramLine = getHologramLine(event, spawnEntityPacket);
if (hologramLine == null) {
return;
}
if (!hologramLine.getHologram().isVisibleTo(player)) {
event.setCancelled(true);
return;
}
} else if (packet.getType() == PacketType.Play.Server.ENTITY_METADATA) {
WrapperPlayServerEntityMetadata entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet);
StandardHologramLine hologramLine = getHologramLine(event, entityMetadataPacket);
if (hologramLine == null) {
return;
}
if (!hologramLine.getHologram().isVisibleTo(player)) {
event.setCancelled(true);
return;
}
if (!(hologramLine instanceof StandardTextLine)) {
return;
}
StandardTextLine textLine = (StandardTextLine) hologramLine;
Collection<RelativePlaceholder> relativePlaceholders = textLine.getRelativePlaceholders();
@ -143,8 +107,18 @@ class PacketListener extends PacketAdapter {
return;
}
entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet.deepClone());
WrappedWatchableObject customNameWatchableObject = metadataHelper.getCustomNameWatchableObject(entityMetadataPacket.getEntityMetadata());
WrappedWatchableObject customNameWatchableObject;
AbstractPacket packetWrapper;
if (packetType == PacketType.Play.Server.ENTITY_METADATA) {
WrapperPlayServerEntityMetadata entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet.deepClone());
packetWrapper = entityMetadataPacket;
customNameWatchableObject = metadataHelper.getCustomNameWatchableObject(entityMetadataPacket.getEntityMetadata());
} else {
WrapperPlayServerSpawnEntityLiving spawnEntityPacket = new WrapperPlayServerSpawnEntityLiving(packet.deepClone());
packetWrapper = spawnEntityPacket;
customNameWatchableObject = metadataHelper.getCustomNameWacthableObject(spawnEntityPacket.getMetadata());
}
if (customNameWatchableObject == null) {
return;
@ -152,15 +126,7 @@ class PacketListener extends PacketAdapter {
boolean modified = replaceRelativePlaceholders(customNameWatchableObject, player, relativePlaceholders);
if (modified) {
event.setPacket(entityMetadataPacket.getHandle());
}
} else if (packet.getType() == PacketType.Play.Server.REL_ENTITY_MOVE || packet.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK) {
int entityID = packet.getIntegers().read(0);
NMSEntity nmsEntity = nmsManager.getNMSEntityBaseFromID(event.getPlayer().getWorld(), entityID);
if (nmsEntity instanceof NMSArmorStand && packetSettings.sendAccurateLocationPackets()) {
event.setCancelled(true); // Don't send relative movement packets for armor stands, only keep precise teleport packets.
event.setPacket(packetWrapper.getHandle());
}
}
}
@ -190,23 +156,6 @@ class PacketListener extends PacketAdapter {
metadataHelper.setCustomNameNMSObject(customNameWatchableObject, replacedCustomNameNMSObject);
return true;
}
private StandardHologramLine getHologramLine(PacketEvent packetEvent, EntityRelatedPacketWrapper packetWrapper) {
return getHologramLine(packetEvent.getPlayer().getWorld(), packetWrapper.getEntityID());
}
private StandardHologramLine getHologramLine(World world, int entityID) {
if (entityID < 0) {
return null;
}
NMSEntity nmsEntity = nmsManager.getNMSEntityBaseFromID(world, entityID);
if (nmsEntity == null) {
return null; // Entity not existing or not related to holograms.
}
return nmsEntity.getHologramLine();
}
}

View File

@ -1,12 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.bridge.protocollib.packet;
public interface EntityRelatedPacketWrapper {
int getEntityID();
}

View File

@ -26,7 +26,7 @@ import org.bukkit.entity.Entity;
import java.util.List;
public class WrapperPlayServerEntityMetadata extends AbstractPacket implements EntityRelatedPacketWrapper {
public class WrapperPlayServerEntityMetadata extends AbstractPacket {
public static final PacketType TYPE = PacketType.Play.Server.ENTITY_METADATA;
public WrapperPlayServerEntityMetadata() {
@ -42,7 +42,6 @@ public class WrapperPlayServerEntityMetadata extends AbstractPacket implements E
* Retrieve unique entity ID to update.
* @return The current Entity ID
*/
@Override
public int getEntityID() {
return handle.getIntegers().read(0);
}

View File

@ -26,7 +26,7 @@ import me.filoghost.holographicdisplays.util.NMSVersion;
import org.bukkit.World;
import org.bukkit.entity.Entity;
public class WrapperPlayServerSpawnEntity extends AbstractPacket implements EntityRelatedPacketWrapper {
public class WrapperPlayServerSpawnEntity extends AbstractPacket {
public static final PacketType TYPE = PacketType.Play.Server.SPAWN_ENTITY;
private static PacketConstructor entityConstructor;
@ -109,7 +109,6 @@ public class WrapperPlayServerSpawnEntity extends AbstractPacket implements Enti
* Retrieve entity ID of the Object.
* @return The current EID
*/
@Override
public int getEntityID() {
return handle.getIntegers().read(0);
}

View File

@ -26,7 +26,7 @@ import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
public class WrapperPlayServerSpawnEntityLiving extends AbstractPacket implements EntityRelatedPacketWrapper {
public class WrapperPlayServerSpawnEntityLiving extends AbstractPacket {
public static final PacketType TYPE = PacketType.Play.Server.SPAWN_ENTITY_LIVING;
private static PacketConstructor entityConstructor;
@ -55,7 +55,6 @@ public class WrapperPlayServerSpawnEntityLiving extends AbstractPacket implement
* Retrieve entity ID.
* @return The current EID
*/
@Override
public int getEntityID() {
return handle.getIntegers().read(0);
}