diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index 7069b55b2..4f3910636 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -272,8 +272,9 @@ public final class EntityDefinitions { .type(EntityType.LLAMA_SPIT) .heightAndWidth(0.25f) .build(); - PAINTING = EntityDefinition.inherited(PaintingEntity::new, entityBase) + PAINTING = EntityDefinition.inherited(null, entityBase) .type(EntityType.PAINTING) + .addTranslator(MetadataType.PAINTING_VARIANT, PaintingEntity::setPaintingType) .build(); SHULKER_BULLET = EntityDefinition.inherited(ThrowableEntity::new, entityBase) .type(EntityType.SHULKER_BULLET) @@ -871,7 +872,7 @@ public final class EntityDefinitions { CAT = EntityDefinition.inherited(CatEntity::new, tameableEntityBase) .type(EntityType.CAT) .height(0.35f).width(0.3f) - .addTranslator(MetadataType.INT, CatEntity::setCatVariant) + .addTranslator(MetadataType.CAT_VARIANT, CatEntity::setCatVariant) .addTranslator(MetadataType.BOOLEAN, CatEntity::setResting) .addTranslator(null) // "resting state one" //TODO .addTranslator(MetadataType.INT, CatEntity::setCollarColor) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java index 3fa4e90b2..cdd9449e5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/PaintingEntity.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.entity.type; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.AddPaintingPacket; import org.geysermc.geyser.entity.EntityDefinition; @@ -35,11 +37,11 @@ import java.util.UUID; public class PaintingEntity extends Entity { private static final double OFFSET = -0.46875; - private PaintingType paintingName; - private int direction; + private final Direction direction; - public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, Direction direction) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + this.direction = direction; } @Override @@ -47,13 +49,21 @@ public class PaintingEntity extends Entity { // Wait until we get the metadata needed } - public void paintingtodo() { + public void setPaintingType(ObjectEntityMetadata entityMetadata) { + PaintingType type = PaintingType.getByPaintingType(entityMetadata.getValue()); AddPaintingPacket addPaintingPacket = new AddPaintingPacket(); addPaintingPacket.setUniqueEntityId(geyserId); addPaintingPacket.setRuntimeEntityId(geyserId); - addPaintingPacket.setMotive(paintingName.getBedrockName()); - addPaintingPacket.setPosition(fixOffset()); - addPaintingPacket.setDirection(direction); + addPaintingPacket.setMotive(type.getBedrockName()); + addPaintingPacket.setPosition(fixOffset(type)); + addPaintingPacket.setDirection(switch (direction) { + //TODO this doesn't seem right. Why did it work fine before? + case SOUTH -> 0; + case WEST -> 1; + case NORTH -> 2; + case EAST -> 3; + default -> 0; + }); session.sendUpstreamPacket(addPaintingPacket); valid = true; @@ -66,17 +76,17 @@ public class PaintingEntity extends Entity { // Do nothing, as head look messes up paintings } - private Vector3f fixOffset() { + private Vector3f fixOffset(PaintingType paintingName) { Vector3f position = super.position; position = position.add(0.5, 0.5, 0.5); double widthOffset = paintingName.getWidth() > 1 ? 0.5 : 0; double heightOffset = paintingName.getHeight() > 1 && paintingName.getHeight() != 3 ? 0.5 : 0; return switch (direction) { - case 0 -> position.add(widthOffset, heightOffset, OFFSET); - case 1 -> position.add(-OFFSET, heightOffset, widthOffset); - case 2 -> position.add(-widthOffset, heightOffset, -OFFSET); - case 3 -> position.add(OFFSET, heightOffset, -widthOffset); + case SOUTH -> position.add(widthOffset, heightOffset, OFFSET); + case WEST -> position.add(-OFFSET, heightOffset, widthOffset); + case NORTH -> position.add(-widthOffset, heightOffset, -OFFSET); + case EAST -> position.add(OFFSET, heightOffset, -widthOffset); default -> position; }; } diff --git a/core/src/main/java/org/geysermc/geyser/level/PaintingType.java b/core/src/main/java/org/geysermc/geyser/level/PaintingType.java index 1d8b56030..43c51efd4 100644 --- a/core/src/main/java/org/geysermc/geyser/level/PaintingType.java +++ b/core/src/main/java/org/geysermc/geyser/level/PaintingType.java @@ -60,13 +60,9 @@ public enum PaintingType { BURNING_SKULL("BurningSkull", 4, 4); private static final PaintingType[] VALUES = values(); - private String bedrockName; - private int width; - private int height; - - public com.github.steveice10.mc.protocol.data.game.entity.type.PaintingType toJavaType() { - return com.github.steveice10.mc.protocol.data.game.entity.type.PaintingType.valueOf(name()); - } + private final String bedrockName; + private final int width; + private final int height; public static PaintingType getByName(String javaName) { for (PaintingType paintingName : VALUES) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 993d93e0b..d46a39616 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -69,7 +69,6 @@ public class TagCache { } public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) { - System.out.println(packet); Map blockTags = packet.getTags().get("minecraft:block"); this.leaves = IntList.of(blockTags.get("minecraft:leaves")); this.wool = IntList.of(blockTags.get("minecraft:wool")); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java index b7f169627..5a8eaaaa6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginTranslator.java @@ -106,10 +106,12 @@ public class JavaLoginTranslator extends PacketTranslator