diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/BundlePacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/BundlePacket.java new file mode 100644 index 0000000..a9eae80 --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/BundlePacket.java @@ -0,0 +1,20 @@ +package me.zimzaza4.geyserutils.common.packet; + +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class BundlePacket extends CustomPayloadPacket { + + private List packets = new ArrayList<>(); + + public void addPacket(CustomPayloadPacket packet) { + this.packets.add(packet); + } + +} diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomEntityDataPacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomEntityDataPacket.java index 0454b66..9774f8a 100644 --- a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomEntityDataPacket.java +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomEntityDataPacket.java @@ -5,6 +5,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.awt.*; + @AllArgsConstructor @NoArgsConstructor @Getter @@ -17,4 +19,6 @@ public class CustomEntityDataPacket extends CustomPayloadPacket { private Float scale; + private Integer color; + } 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 9302f0a..99048b2 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java @@ -21,7 +21,9 @@ import me.zimzaza4.geyserutils.geyser.replace.JavaAddEntityTranslatorReplace; import me.zimzaza4.geyserutils.geyser.scoreboard.EntityScoreboard; import me.zimzaza4.geyserutils.geyser.translator.NPCFormResponseTranslator; import me.zimzaza4.geyserutils.geyser.util.Converter; +import me.zimzaza4.geyserutils.geyser.util.DeltaUtils; import me.zimzaza4.geyserutils.geyser.util.ReflectionUtils; +import net.kyori.adventure.text.format.TextColor; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtType; @@ -44,6 +46,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; @@ -63,6 +66,7 @@ import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.Clien import org.jetbrains.annotations.NotNull; import javax.imageio.ImageIO; +import java.awt.*; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileReader; @@ -70,6 +74,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.*; +import java.util.List; import java.util.concurrent.*; public class GeyserUtils implements Extension { @@ -93,13 +98,19 @@ public class GeyserUtils implements Extension { public static ItemParticlesMappings particlesMappings = new ItemParticlesMappings(); static Cape EMPTY_CAPE = new Cape("", "no-cape", new byte[0], 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(); @@ -114,6 +125,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, @@ -139,7 +204,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); } @@ -258,117 +325,7 @@ public class GeyserUtils implements Extension { if (packet instanceof ClientboundCustomPayloadPacket payloadPacket) { if (ReflectionUtils.getChannel(payloadPacket).toString().equals(GeyserUtilsChannels.MAIN)) { CustomPayloadPacket customPacket = packetManager.decodePacket(payloadPacket.getData()); - if (customPacket instanceof CameraShakeCustomPayloadPacket cameraShakePacket) { - session.camera().shakeCamera(cameraShakePacket.getIntensity(), cameraShakePacket.getDuration(), CameraShake.values()[cameraShakePacket.getType()]); - } else if (customPacket instanceof NpcDialogueFormDataCustomPayloadPacket formData) { - - if (formData.action().equals("CLOSE")) { - NpcDialogueForm openForm = NpcDialogueForms.getOpenNpcDialogueForms(session); - if (openForm != null) { - openForm.close(session); - } - return; - } - - NpcDialogueForm form = new NpcDialogueForm(); - form.title(formData.title()) - .dialogue(formData.dialogue()) - .bindEntity(session.getEntityCache().getEntityByJavaId(formData.bindEntity())) - .hasNextForm(formData.hasNextForm()); - - if (formData.skinData() != null) { - form.skinData(formData.skinData()); - } - - - List