Skip to content

Commit

Permalink
Merge pull request #34 from Matt-MX/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
Matt-MX authored Dec 1, 2024
2 parents 12f1ea4 + 0f7ed0d commit cd3e5cd
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 24 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ repositories {
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
maven("https://repo.codemc.io/repository/maven-releases/")
maven("https://maven.evokegames.gg/snapshots")
maven("https://repo.viaversion.com")
}

dependencies {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kotlin.code.style=official
# Project configuration
group_name = com.mattmx
id = nametags
version = 1.3
version = 1.4

plugin_name = NameTags
plugin_main_class_name = NameTags
Expand Down
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ runPaper = "2.2.4"
packetEvents = "2.6.0"
entityLib = "2.4.11-SNAPSHOT"
tab = "4.1.8"
viaversion = "5.0.0"

[libraries]

Expand All @@ -23,6 +24,7 @@ ktgui = { module = "com.mattmx:ktgui", version.ref = "ktgui" }
packet-events = { module = "com.github.retrooper:packetevents-spigot", version.ref = "packetEvents" }
entity-lib = { module = "me.tofaa.entitylib:spigot", version.ref = "entityLib" }
tab-api = { module = "com.github.NEZNAMY:TAB-API", version.ref = "tab" }
via-version = { module = "com.viaversion:viaversion-api", version.ref = "viaversion" }

[plugins]

Expand Down
24 changes: 21 additions & 3 deletions src/main/java/com/mattmx/nametags/EventsListener.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.mattmx.nametags;

import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent;
import com.mattmx.nametags.entity.NameTagEntity;
import com.mattmx.nametags.entity.trait.SneakTrait;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
Expand All @@ -25,8 +28,21 @@ public void onPlayerJoin(@NotNull PlayerJoinEvent event) {
.updateVisibility();
}

// @EventHandler
// public void onEntityRemove(@NotNull EntityRemoveFromWorldEvent event) {
// plugin.getEntityManager().removeLastSentPassengersCache(event.getEntity().getEntityId());
//
// NameTagEntity entity = plugin.getEntityManager()
// .removeEntity(event.getEntity());
//
// if (entity != null) {
// entity.destroy();
// }
// }

@EventHandler
public void onPlayerQuit(@NotNull PlayerQuitEvent event) {
plugin.getEntityManager().removeLastSentPassengersCache(event.getPlayer().getEntityId());

// Remove as a viewer from all entities
for (final NameTagEntity entity : plugin.getEntityManager().getAllEntities()) {
Expand All @@ -36,9 +52,9 @@ public void onPlayerQuit(@NotNull PlayerQuitEvent event) {
NameTagEntity entity = plugin.getEntityManager()
.removeEntity(event.getPlayer());

if (entity == null) return;

entity.destroy();
if (entity != null) {
entity.destroy();
}
}

@EventHandler
Expand All @@ -63,6 +79,8 @@ public void onPlayerSneak(@NotNull PlayerToggleSneakEvent event) {
return;
}

if (event.getPlayer().isInsideVehicle()) return;

NameTagEntity nameTagEntity = plugin.getEntityManager()
.getNameTagEntity(event.getPlayer());

Expand Down
83 changes: 66 additions & 17 deletions src/main/java/com/mattmx/nametags/OutgoingPacketListener.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
package com.mattmx.nametags;

import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.manager.server.VersionComparison;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.potion.PotionTypes;
import com.github.retrooper.packetevents.util.Vector3f;
import com.github.retrooper.packetevents.wrapper.play.server.*;
import com.mattmx.nametags.entity.NameTagEntity;
import me.tofaa.entitylib.meta.display.TextDisplayMeta;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;

public class OutgoingPacketListener extends PacketListenerAbstract {

private static final Vector3f PRE_1_20_2_TRANSLATION = new Vector3f(0f, 0.4f, 0f);
private final @NotNull NameTags plugin;

public OutgoingPacketListener(@NotNull NameTags plugin) {
Expand Down Expand Up @@ -41,6 +49,40 @@ public void onPacketSend(@NotNull PacketSendEvent event) {
event.getUser().sendPacket(nameTagEntity.getPassengersPacket());
});
}
case PacketType.Play.Server.ENTITY_METADATA -> {
if (event.getUser().getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_20_2)) {
return;
}

WrapperPlayServerEntityMetadata packet = new WrapperPlayServerEntityMetadata(event);

NameTagEntity nameTagEntity = plugin.getEntityManager().getNameTagEntityByTagEntityId(packet.getEntityId());

if (nameTagEntity == null) return;

byte index = PacketEvents.getAPI()
.getServerManager()
.getVersion()
.is(VersionComparison.OLDER_THAN, ServerVersion.V_1_20_2)
? (byte) 10
: (byte) 11;

packet.getEntityMetadata()
.stream()
.filter((meta) -> meta.getIndex() == index)
.findFirst()
.ifPresentOrElse((data) -> {
Vector3f vec = (Vector3f) data.getValue();
data.setValue(vec.add(PRE_1_20_2_TRANSLATION));
}, () -> packet.getEntityMetadata().add(new EntityData(
index,
EntityDataTypes.VECTOR3F,
PRE_1_20_2_TRANSLATION
))
);

event.markForReEncode(true);
}
case PacketType.Play.Server.DESTROY_ENTITIES -> {
WrapperPlayServerDestroyEntities packet = new WrapperPlayServerDestroyEntities(event);

Expand Down Expand Up @@ -76,22 +118,29 @@ public void onPacketSend(@NotNull PacketSendEvent event) {

nameTagEntity.updateVisibility(false);
}
// case PacketType.Play.Server.SET_PASSENGERS -> {
// final WrapperPlayServerSetPassengers packet = new WrapperPlayServerSetPassengers(event);
//
// final NameTagEntity nameTagEntity = plugin.getEntityManager().getNameTagEntityById(packet.getEntityId());
//
// if (nameTagEntity == null) return;
//
// if (Arrays.stream(packet.getPassengers()).noneMatch((i) -> nameTagEntity.getPassenger().getEntityId() == i)) {
//
// // Add our entity
// int[] passengers = Arrays.copyOf(packet.getPassengers(), packet.getPassengers().length + 1);
// passengers[passengers.length - 1] = nameTagEntity.getPassenger().getEntityId();
//
// packet.setPassengers(passengers);
// }
// }
case PacketType.Play.Server.SET_PASSENGERS -> {
final WrapperPlayServerSetPassengers packet = new WrapperPlayServerSetPassengers(event);

final NameTagEntity nameTagEntity = plugin.getEntityManager().getNameTagEntityById(packet.getEntityId());

if (nameTagEntity == null) return;

// If the packet doesn't already contain our entity
if (Arrays.stream(packet.getPassengers()).noneMatch((i) -> nameTagEntity.getPassenger().getEntityId() == i)) {

// Add our entity
int[] passengers = Arrays.copyOf(packet.getPassengers(), packet.getPassengers().length + 1);
passengers[passengers.length - 1] = nameTagEntity.getPassenger().getEntityId();

packet.setPassengers(passengers);

NameTags.getInstance()
.getEntityManager()
.setLastSentPassengers(packet.getEntityId(), passengers);

event.markForReEncode(true);
}
}
default -> {
}
}
Expand Down
27 changes: 26 additions & 1 deletion src/main/java/com/mattmx/nametags/config/TextFormatter.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import java.util.Arrays;
import java.util.Optional;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public enum TextFormatter {
MINI_MESSAGE(
Expand All @@ -16,10 +18,33 @@ public enum TextFormatter {
),
LEGACY(
"legacy",
(line) -> getLegacySerializer().deserialize(line)
(line) -> getLegacySerializer().deserialize(convertLegacyHex(line))
)
;

// Converts legacy hex format &x&9&0&0&c&3&f to modern hex format &#900c3f
// https://github.com/Matt-MX/DisplayNameTags/issues/32#issuecomment-2509403581
private static String convertLegacyHex(String input) {
//regex to match the legacy hex format
String legacyHexPattern = "&x(&[0-9a-fA-F]){6}";
Pattern pattern = Pattern.compile(legacyHexPattern);
Matcher matcher = pattern.matcher(input);

StringBuilder result = new StringBuilder();
while (matcher.find()) {
String legacyHex = matcher.group();
//extract hex digits from the legacy format
String hexColor = legacyHex.replace("&x", "")
.replace("&", "");
//replace with modern format
String modernHex = "&#" + hexColor;
matcher.appendReplacement(result, modernHex);
}
matcher.appendTail(result);

return result.toString();
}

private static final LegacyComponentSerializer legacy = LegacyComponentSerializer.builder()
.character('&')
.hexCharacter('#')
Expand Down
19 changes: 17 additions & 2 deletions src/main/java/com/mattmx/nametags/entity/NameTagEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;
import java.util.function.Consumer;

public class NameTagEntity {
Expand Down Expand Up @@ -87,8 +88,22 @@ public void sendPassengerPacket(Player target) {
}

public PacketWrapper<?> getPassengersPacket() {
// TODO(Matt): track previous passengers
return new WrapperPlayServerSetPassengers(bukkitEntity.getEntityId(), new int[]{this.passenger.getEntityId()});
int[] previousPackets = NameTags.getInstance()
.getEntityManager()
.getLastSentPassengers(getBukkitEntity().getEntityId())
.orElseGet(() -> {
int[] bukkitPassengers = this.bukkitEntity.getPassengers()
.stream()
.mapToInt(Entity::getEntityId)
.toArray();

int[] passengers = Arrays.copyOf(bukkitPassengers, bukkitPassengers.length + 1);
passengers[passengers.length - 1] = getPassenger().getEntityId();

return passengers;
});

return new WrapperPlayServerSetPassengers(bukkitEntity.getEntityId(), previousPackets);
}

public @NotNull Entity getBukkitEntity() {
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/mattmx/nametags/entity/NameTagEntityManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;

public class NameTagEntityManager {
private final @NotNull ConcurrentHashMap<UUID, NameTagEntity> entityMap = new ConcurrentHashMap<>();
private final Map<Integer, int[]> lastSentPassengers = new ConcurrentHashMap<>();
private @NotNull BiConsumer<Entity, TextDisplayMeta> defaultProvider = (entity, meta) -> {
// Default minecraft name-tag appearance
meta.setText(entity.name());
Expand Down Expand Up @@ -56,11 +59,31 @@ public class NameTagEntityManager {
.orElse(null);
}

public @Nullable NameTagEntity getNameTagEntityByTagEntityId(int entityId) {
return entityMap.values()
.stream()
.filter((e) -> e.getPassenger().getEntityId() == entityId)
.findFirst()
.orElse(null);
}

public @NotNull Collection<NameTagEntity> getAllEntities() {
return this.entityMap.values();
}

public void setDefaultProvider(@NotNull BiConsumer<Entity, TextDisplayMeta> consumer) {
this.defaultProvider = consumer;
}

public void setLastSentPassengers(int entityId, int[] passengers) {
this.lastSentPassengers.put(entityId, passengers);
}

public void removeLastSentPassengersCache(int entityId) {
this.lastSentPassengers.remove(entityId);
}

public @NotNull Optional<int[]> getLastSentPassengers(int entityId) {
return Optional.ofNullable(this.lastSentPassengers.get(entityId));
}
}

0 comments on commit cd3e5cd

Please sign in to comment.