Skip to content

Commit 9ea8e9c

Browse files
committed
feat: Add user locale handling and metadata translation support
1 parent d6a3cb7 commit 9ea8e9c

6 files changed

Lines changed: 88 additions & 6 deletions

File tree

api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,6 @@ public interface EntityLibAPI<T> {
5353
@NotNull
5454
EntityContainer getDefaultContainer();
5555

56+
@NotNull
57+
UserLocaleProvider getUserLocaleProvider();
5658
}

api/src/main/java/me/tofaa/entitylib/Platform.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ public interface Platform<P> {
2626
*/
2727
@NotNull EntityUuidProvider getEntityUuidProvider();
2828

29+
/**
30+
* Gets the provider responsible for retrieving the locale of a user.
31+
*
32+
* @return a non-null {@link UserLocaleProvider} instance.
33+
*/
34+
@NotNull UserLocaleProvider getUserLocaleProvider();
35+
2936
/**
3037
* Sets the entityId integer provider. This can be provided by a platform if needed.
3138
* @param provider the entityId integer provider.
@@ -38,6 +45,12 @@ public interface Platform<P> {
3845
*/
3946
void setEntityUuidProvider(@NotNull EntityUuidProvider provider);
4047

48+
/**
49+
* Sets the provider responsible for retrieving the locale of a user.
50+
*
51+
* @param provider the {@link UserLocaleProvider} instance to be set. Must not be null.
52+
*/
53+
void setUserLocaleProvider(@NotNull UserLocaleProvider provider);
4154

4255
/**
4356
* @return the logger EntityLib uses internally.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package me.tofaa.entitylib;
2+
3+
import java.util.Locale;
4+
import java.util.UUID;
5+
6+
public interface UserLocaleProvider {
7+
Locale locale(UUID user);
8+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package me.tofaa.entitylib.utils;
2+
3+
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
4+
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
5+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
6+
import me.tofaa.entitylib.EntityLib;
7+
import java.util.Locale;
8+
import java.util.Optional;
9+
import java.util.UUID;
10+
import net.kyori.adventure.text.Component;
11+
import net.kyori.adventure.translation.GlobalTranslator;
12+
13+
public class PacketUtil {
14+
private PacketUtil() {
15+
}
16+
17+
public static void renderPacket(UUID user, WrapperPlayServerEntityMetadata metadata) {
18+
Locale locale = EntityLib.getApi().getUserLocaleProvider().locale(user);
19+
for (final EntityData<?> entityData : metadata.getEntityMetadata()) {
20+
if (entityData.getType() == EntityDataTypes.ADV_COMPONENT) {
21+
Component component = (Component) entityData.getValue();
22+
final Component rendered = GlobalTranslator.render(component, locale);
23+
((EntityData<Component>) entityData).setValue(rendered);
24+
} else if (entityData.getType() == EntityDataTypes.OPTIONAL_ADV_COMPONENT) {
25+
final Optional<Component> optional = (Optional<Component>) entityData.getValue();
26+
if (optional.isPresent()) {
27+
final Component component = optional.get();
28+
final Component rendered = GlobalTranslator.render(component, locale);
29+
((EntityData<Optional<Component>>) entityData).setValue(Optional.of(rendered));
30+
}
31+
}
32+
}
33+
}
34+
}

api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,39 @@
55
import com.github.retrooper.packetevents.protocol.world.Location;
66
import com.github.retrooper.packetevents.util.Vector3d;
77
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
8-
import com.github.retrooper.packetevents.wrapper.play.server.*;
8+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerBundle;
9+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities;
10+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityHeadLook;
11+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
12+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityRotation;
13+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityTeleport;
14+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityVelocity;
15+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetPassengers;
16+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
17+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSystemChatMessage;
918
import me.tofaa.entitylib.EntityLib;
1019
import me.tofaa.entitylib.container.EntityContainer;
1120
import me.tofaa.entitylib.meta.EntityMeta;
1221
import me.tofaa.entitylib.meta.types.ObjectData;
1322
import me.tofaa.entitylib.tick.Tickable;
23+
import me.tofaa.entitylib.utils.PacketUtil;
1424
import me.tofaa.entitylib.ve.ViewerRule;
1525
import me.tofaa.entitylib.wrapper.spawning.SpawnPacketProvider;
26+
import java.util.Collection;
27+
import java.util.Collections;
28+
import java.util.List;
29+
import java.util.Optional;
30+
import java.util.Set;
31+
import java.util.UUID;
32+
import java.util.concurrent.ConcurrentHashMap;
33+
import java.util.concurrent.CopyOnWriteArrayList;
34+
import java.util.function.Consumer;
1635
import net.kyori.adventure.text.Component;
1736
import org.jetbrains.annotations.ApiStatus;
1837
import org.jetbrains.annotations.NotNull;
1938
import org.jetbrains.annotations.Nullable;
2039
import org.jetbrains.annotations.UnmodifiableView;
2140

22-
import java.util.*;
23-
import java.util.concurrent.ConcurrentHashMap;
24-
import java.util.concurrent.CopyOnWriteArrayList;
25-
import java.util.function.Consumer;
26-
2741
public class WrapperEntity implements Tickable {
2842
private final UUID uuid;
2943
private final int entityId;
@@ -510,6 +524,11 @@ private static void sendPacket(UUID user, PacketWrapper<?> wrapper) {
510524
return;
511525
}
512526

527+
// Special handling for entity metadata packets to support `GlobalTranslator` functionality and component rendering
528+
if (wrapper instanceof WrapperPlayServerEntityMetadata) {
529+
PacketUtil.renderPacket(user, (WrapperPlayServerEntityMetadata) wrapper);
530+
}
531+
513532
EntityLib.getApi().getPacketEvents().getProtocolManager().sendPacket(channel, wrapper);
514533
}
515534

common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import me.tofaa.entitylib.APIConfig;
55
import me.tofaa.entitylib.EntityLibAPI;
66
import me.tofaa.entitylib.Platform;
7+
import me.tofaa.entitylib.UserLocaleProvider;
78
import me.tofaa.entitylib.container.EntityContainer;
89
import me.tofaa.entitylib.tick.TickContainer;
910
import me.tofaa.entitylib.wrapper.WrapperEntity;
@@ -63,4 +64,9 @@ public PacketEventsAPI<?> getPacketEvents() {
6364
public @NotNull Collection<TickContainer<?, T>> getTickContainers() {
6465
return tickContainers;
6566
}
67+
68+
@Override
69+
public @NotNull UserLocaleProvider getUserLocaleProvider() {
70+
return platform.getUserLocaleProvider();
71+
}
6672
}

0 commit comments

Comments
 (0)