From 584e43b733c93128be28e41505ebcc5dac1eadb3 Mon Sep 17 00:00:00 2001 From: OmeWillem Date: Thu, 4 Jul 2024 02:46:23 +0200 Subject: [PATCH] I did a whole lot, essentially added a whole property system. (sorry for not commiting, i forgot) --- .../common/packet/EntityPropertyPacket.java | 18 +++ .../packet/EntityPropertyRegisterPacket.java | 18 +++ .../geyserutils/geyser/GeyserUtils.java | 110 +++++++++++++++++- .../JavaAddEntityTranslatorReplace.java | 14 ++- .../geyser/util/ReflectionUtils.java | 6 +- spigot/pom.xml | 4 + .../geyserutils/spigot/api/PlayerUtils.java | 35 ++++++ 7 files changed, 194 insertions(+), 11 deletions(-) create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyPacket.java create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyRegisterPacket.java diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyPacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyPacket.java new file mode 100644 index 0000000..8a67caa --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyPacket.java @@ -0,0 +1,18 @@ +package me.zimzaza4.geyserutils.common.packet; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class EntityPropertyPacket extends CustomPayloadPacket { + private int entityId; + + private String identifier; + private T value; + +} diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyRegisterPacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyRegisterPacket.java new file mode 100644 index 0000000..1d09431 --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/EntityPropertyRegisterPacket.java @@ -0,0 +1,18 @@ +package me.zimzaza4.geyserutils.common.packet; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class EntityPropertyRegisterPacket extends CustomPayloadPacket { + private int entityId; + + private String identifier; + private Class type; + +} diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java index cfff07e..d4297f9 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java @@ -45,6 +45,7 @@ import org.geysermc.geyser.api.skin.Skin; import org.geysermc.geyser.api.skin.SkinData; import org.geysermc.geyser.api.skin.SkinGeometry; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.properties.GeyserEntityProperties; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -94,13 +95,19 @@ public class GeyserUtils implements Extension { public static ItemParticlesMappings particlesMappings = new ItemParticlesMappings(); static Cape EMPTY_CAPE = new Cape("", "no-cape", ByteArrays.EMPTY_ARRAY, true); - - public static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); + private static final Map>>> properties = new HashMap<>(); + + @Getter + private static GeyserUtils instance; + + public GeyserUtils() { + instance = this; + } + @Subscribe public void onEnable(GeyserPostInitializeEvent event) { - Registries.BEDROCK_PACKET_TRANSLATORS.register(NpcRequestPacket.class, new NPCFormResponseTranslator()); loadSkins(); ReflectionUtils.init(); @@ -115,6 +122,60 @@ public class GeyserUtils implements Extension { particlesMappings.read(dataFolder().resolve("item_particles_mappings.json")); } + // the static here is crazy ;( + private static GeyserEntityProperties getProperties(String id) { + if (!properties.containsKey(id)) return null; + + GeyserEntityProperties.Builder builder = new GeyserEntityProperties.Builder(); + List>> pairs = properties.get(id); + pairs.forEach(p -> { + // only bool, float and int support for now + if (p.getValue() == Boolean.class) builder.addBoolean(p.getKey()); + else if (p.getValue() == Float.class) builder.addBoolean(p.getKey()); + else if (p.getValue() == Integer.class) builder.addBoolean(p.getKey()); + else instance.logger().info("Found unknown property: " + p.getKey()); + }); + + return builder.build(); + } + + private static boolean containsProperty(String entityId, String identifier) { + if (!properties.containsKey(entityId)) return false; + + return properties.get(entityId).stream().anyMatch(p -> p.getKey().equalsIgnoreCase(identifier)); + } + + public static void addProperty(String entityId, String identifier, Class type) { + if (containsProperty(entityId, identifier)) return; + + List>> pairs = properties.getOrDefault(entityId, new ArrayList<>()); + pairs.add(new AbstractMap.SimpleEntry<>(identifier, type)); + + if (properties.containsKey(entityId)) properties.replace(entityId, pairs); + else properties.put(entityId, pairs); + } + + public static void registerProperties(String entityId) { + GeyserEntityProperties entityProperties = getProperties(entityId); + if (entityProperties == null) return; + + properties.values().stream() + .flatMap(List::stream) + .map(Map.Entry::getKey) + .forEach(id -> { + Registries.BEDROCK_ENTITY_PROPERTIES.get().removeIf(i -> i.containsKey(id)); + }); + + + Registries.BEDROCK_ENTITY_PROPERTIES.get().add(entityProperties.toNbtMap(entityId)); + + EntityDefinition old = LOADED_ENTITY_DEFINITIONS.get(entityId); + LOADED_ENTITY_DEFINITIONS.replace(entityId, new EntityDefinition(old.factory(), old.entityType(), old.identifier(), + old.width(), old.height(), old.offset(), entityProperties, old.translators())); + + instance.logger().info("Defined property: " + entityId + " in registry."); + } + public static void addCustomEntity(String id) { /* LOADED_ENTITY_DEFINITIONS.put(id, @@ -140,7 +201,9 @@ public class GeyserUtils implements Extension { Registries.BEDROCK_ENTITY_IDENTIFIERS.set(NbtMap.builder() .putList("idlist", NbtType.COMPOUND, idList).build() ); - EntityDefinition def = EntityDefinition.builder(null).height(0.1f).width(0.1f).identifier(id).build(); + + EntityDefinition def = EntityDefinition.builder(null) + .height(0.1f).width(0.1f).identifier(id).registeredProperties(getProperties(id)).build(); LOADED_ENTITY_DEFINITIONS.put(id, def); } @@ -356,6 +419,45 @@ public class GeyserUtils implements Extension { if (customEntityDataPacket.getScale() != null) entity.getDirtyMetadata().put(EntityDataTypes.SCALE, customEntityDataPacket.getScale()); entity.updateBedrockMetadata(); } + } else if (customPacket instanceof EntityPropertyPacket entityPropertyPacket) { + Entity entity = (session.getEntityCache().getEntityByJavaId(entityPropertyPacket.getEntityId())); + if (entity != null) { + if (entityPropertyPacket.getIdentifier() == null + || entityPropertyPacket.getValue() == null) return; + + String def = CUSTOM_ENTITIES.get(session).getIfPresent(entity.getEntityId()); + if (def == null) return; + + if (!containsProperty(def, entityPropertyPacket.getIdentifier())) { + addProperty(def, entityPropertyPacket.getIdentifier(), entityPropertyPacket.getValue().getClass()); + + registerProperties(def); + } + + if (entity.getPropertyManager() == null) return; + entity.getPropertyManager().add(entityPropertyPacket.getIdentifier(), + (Boolean) entityPropertyPacket.getValue()); + + entity.updateBedrockEntityProperties(); + } + } else if (customPacket instanceof EntityPropertyRegisterPacket entityPropertyRegisterPacket) { + if (entityPropertyRegisterPacket.getIdentifier() == null + || entityPropertyRegisterPacket.getType() == null) return; + + Entity entity = (session.getEntityCache().getEntityByJavaId(entityPropertyRegisterPacket.getEntityId())); + if (entity != null) { + String def = CUSTOM_ENTITIES.get(session).getIfPresent(entity.getEntityId()); + if (def == null) return; + + if (!containsProperty(def, entityPropertyRegisterPacket.getIdentifier())) { + addProperty(def, entityPropertyRegisterPacket.getIdentifier(), entityPropertyRegisterPacket.getType()); + + registerProperties(def); + logger().info("Defined property: " + entityPropertyRegisterPacket.getIdentifier() + " in registry."); + } + } + + } else if (customPacket instanceof CustomEntityPacket customEntityPacket) { if (!LOADED_ENTITY_DEFINITIONS.containsKey(customEntityPacket.getIdentifier())) { return; diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/replace/JavaAddEntityTranslatorReplace.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/replace/JavaAddEntityTranslatorReplace.java index 86bc4c0..1845da3 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/replace/JavaAddEntityTranslatorReplace.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/replace/JavaAddEntityTranslatorReplace.java @@ -25,6 +25,7 @@ package me.zimzaza4.geyserutils.geyser.replace; +import org.geysermc.geyser.entity.properties.GeyserEntityPropertyManager; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose; import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction; import org.geysermc.mcprotocollib.protocol.data.game.entity.object.FallingBlockData; @@ -44,6 +45,8 @@ import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import java.lang.reflect.Field; + import static me.zimzaza4.geyserutils.geyser.GeyserUtils.CUSTOM_ENTITIES; import static me.zimzaza4.geyserutils.geyser.GeyserUtils.LOADED_ENTITY_DEFINITIONS; @@ -127,8 +130,15 @@ public class JavaAddEntityTranslatorReplace extends PacketTranslatorsonatype https://oss.sonatype.org/content/groups/public/ + + opencollab-snapshot + https://repo.opencollab.dev/main/ + diff --git a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java index 83ed1b6..97f0b7e 100644 --- a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java +++ b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java @@ -7,6 +7,7 @@ import me.zimzaza4.geyserutils.common.packet.*; import me.zimzaza4.geyserutils.common.particle.CustomParticle; import me.zimzaza4.geyserutils.common.util.Pos; import me.zimzaza4.geyserutils.spigot.GeyserUtils; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -88,4 +89,38 @@ public class PlayerUtils { player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); } + + // (yes I'm aware it's "horrible" code, I'm just matching the energy of this plugin), also this aint player packets at all lmao + + public static void registerProperty(Player player, Entity entity, String identifier, Class type) { + EntityPropertyRegisterPacket packet = new EntityPropertyRegisterPacket(); + packet.setEntityId(entity.getEntityId()); + packet.setIdentifier(identifier); + packet.setType(type); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + } + + public static void sendBoolProperty(Player player, Entity entity, String identifier, Boolean value) { + EntityPropertyPacket packet = new EntityPropertyPacket<>(); + packet.setEntityId(entity.getEntityId()); + packet.setIdentifier(identifier); + packet.setValue(value); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + } + + public static void sendFloatProperty(Player player, Entity entity, String identifier, Float value) { + EntityPropertyPacket packet = new EntityPropertyPacket<>(); + packet.setEntityId(entity.getEntityId()); + packet.setIdentifier(identifier); + packet.setValue(value); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + } + + public static void sendIntProperty(Player player, Entity entity, String identifier, Integer value) { + EntityPropertyPacket packet = new EntityPropertyPacket<>(); + packet.setEntityId(entity.getEntityId()); + packet.setIdentifier(identifier); + packet.setValue(value); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + } }