From 62a13fa9b32ff3aff22b18da0627cfd86fe0cd82 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Wed, 20 Jul 2022 17:18:32 +0100 Subject: [PATCH 1/5] Allow Blocks and Entities to return multiple Entities Lecterns are no longer poseable Lecterns now return both the lectern and its book. --- .../src/java/se/llbit/chunky/block/Block.java | 3 +- .../block/minecraft/CakeWithCandle.java | 6 +- .../minecraft/CalibratedSculkSensor.java | 7 +- .../llbit/chunky/block/minecraft/Candle.java | 8 +- .../chunky/block/minecraft/CoralFan.java | 7 +- .../block/minecraft/EnchantingTable.java | 7 +- .../se/llbit/chunky/block/minecraft/Head.java | 6 +- .../llbit/chunky/block/minecraft/Lectern.java | 6 +- .../llbit/chunky/block/minecraft/LilyPad.java | 7 +- .../chunky/block/minecraft/SporeBlossom.java | 7 +- .../chunky/block/minecraft/WallCoralFan.java | 7 +- .../chunky/block/minecraft/WallHead.java | 7 +- .../se/llbit/chunky/entity/ArmorStand.java | 5 +- .../se/llbit/chunky/entity/BeaconBeam.java | 5 +- .../src/java/se/llbit/chunky/entity/Book.java | 5 +- .../entity/CalibratedSculkSensorAmethyst.java | 5 +- .../java/se/llbit/chunky/entity/Campfire.java | 5 +- .../se/llbit/chunky/entity/ChickenEntity.java | 5 +- .../llbit/chunky/entity/CoralFanEntity.java | 5 +- .../se/llbit/chunky/entity/CowEntity.java | 5 +- .../java/se/llbit/chunky/entity/Entity.java | 2 +- .../llbit/chunky/entity/FlameParticles.java | 5 +- .../chunky/entity/HangingSignEntity.java | 5 +- .../se/llbit/chunky/entity/HeadEntity.java | 4 +- .../java/se/llbit/chunky/entity/Lectern.java | 80 ++++++------------- .../se/llbit/chunky/entity/LilyPadEntity.java | 5 +- .../llbit/chunky/entity/MooshroomEntity.java | 5 +- .../llbit/chunky/entity/PaintingEntity.java | 5 +- .../se/llbit/chunky/entity/PigEntity.java | 5 +- .../se/llbit/chunky/entity/PlayerEntity.java | 4 +- .../se/llbit/chunky/entity/SheepEntity.java | 5 +- .../se/llbit/chunky/entity/SignEntity.java | 9 +-- .../se/llbit/chunky/entity/SkullEntity.java | 5 +- .../se/llbit/chunky/entity/SporeBlossom.java | 6 +- .../se/llbit/chunky/entity/SquidEntity.java | 5 +- .../llbit/chunky/entity/StandingBanner.java | 5 +- .../se/llbit/chunky/entity/WallBanner.java | 5 +- .../chunky/entity/WallCoralFanEntity.java | 5 +- .../chunky/entity/WallHangingSignEntity.java | 5 +- .../llbit/chunky/entity/WallSignEntity.java | 5 +- .../model/minecraft/DecoratedPotModel.java | 7 +- .../se/llbit/chunky/renderer/scene/Scene.java | 27 ++++--- .../chunky/renderer/scene/SceneEntities.java | 10 +-- .../chunky/ui/render/tabs/EntitiesTab.java | 13 +-- 44 files changed, 182 insertions(+), 168 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/block/Block.java b/chunky/src/java/se/llbit/chunky/block/Block.java index eb1b869508..f1df64f4da 100644 --- a/chunky/src/java/se/llbit/chunky/block/Block.java +++ b/chunky/src/java/se/llbit/chunky/block/Block.java @@ -13,6 +13,7 @@ import se.llbit.nbt.CompoundTag; import se.llbit.nbt.Tag; +import java.util.Collection; import java.util.Random; public abstract class Block extends Material { @@ -121,7 +122,7 @@ public boolean isBlockWithEntity() { return false; } - public Entity toEntity(Vector3 position) { + public Collection toEntity(Vector3 position) { throw new Error("This block type can not be converted to an entity: " + getClass().getSimpleName()); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java index c6cdb2f976..ef68798fb2 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java @@ -25,6 +25,8 @@ import se.llbit.chunky.resources.Texture; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; import java.util.Random; public class CakeWithCandle extends AbstractModelBlock { @@ -61,8 +63,8 @@ public boolean isBlockWithEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new FlameParticles(position, entity); + public Collection toEntity(Vector3 position) { + return Collections.singletonList(new FlameParticles(position, entity)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java index bb4e503651..48f44e5966 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java @@ -25,6 +25,9 @@ import se.llbit.chunky.resources.Texture; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class CalibratedSculkSensor extends AbstractModelBlock { private final String phase; private final String facing; @@ -56,7 +59,7 @@ public boolean isBlockWithEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new CalibratedSculkSensorAmethyst(position, this.facing, isActive(), this); + public Collection toEntity(Vector3 position) { + return Collections.singleton(new CalibratedSculkSensorAmethyst(position, this.facing, isActive(), this)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java index 6c41351fcb..5404a686b2 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java @@ -27,6 +27,8 @@ import se.llbit.chunky.world.material.TextureMaterial; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; import java.util.Random; public class Candle extends AbstractModelBlock { @@ -89,11 +91,11 @@ public boolean isBlockWithEntity() { } @Override - public Entity toEntity(Vector3 position) { + public Collection toEntity(Vector3 position) { if (entity != null) { - return new FlameParticles(position, entity); + return Collections.singletonList(new FlameParticles(position, entity)); } else { - return new FlameParticles(position, this, new Vector3[0]); + return Collections.singletonList(new FlameParticles(position, this, new Vector3[0])); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java index d68a3111c7..cfbbae83ae 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java @@ -26,6 +26,9 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class CoralFan extends MinecraftBlockTranslucent { private final String coralType; @@ -72,7 +75,7 @@ public static Texture coralTexture(String coralType) { return true; } - @Override public Entity toEntity(Vector3 position) { - return new CoralFanEntity(position, coralType); + @Override public Collection toEntity(Vector3 position) { + return Collections.singletonList(new CoralFanEntity(position, coralType)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java index 7b4a2bf513..d73a3c0e06 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java @@ -25,6 +25,9 @@ import se.llbit.chunky.resources.Texture; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class EnchantingTable extends AbstractModelBlock { public EnchantingTable() { @@ -45,7 +48,7 @@ public boolean isBlockWithEntity() { } @Override - public Entity toEntity(Vector3 position) { + public Collection toEntity(Vector3 position) { Vector3 newPosition = new Vector3(position); newPosition.add(0, 0.35, 0); Book book = new Book( @@ -55,6 +58,6 @@ public Entity toEntity(Vector3 position) { Math.toRadians(180 - 30)); book.setPitch(Math.toRadians(80)); book.setYaw(Math.toRadians(45)); - return book; + return Collections.singletonList(book); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java index c9cbb04131..49f85be904 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java @@ -34,6 +34,8 @@ import se.llbit.util.mojangapi.MojangApi; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.Optional; public class Head extends MinecraftBlockTranslucent { @@ -67,8 +69,8 @@ public boolean isEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new SkullEntity(position, type, rotation, 1); + public Collection toEntity(Vector3 position) { + return Collections.singleton(new SkullEntity(position, type, rotation, 1)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java index ee8071214c..202756ae11 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java @@ -25,6 +25,8 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; + public class Lectern extends MinecraftBlockTranslucent { private final String facing; private final boolean hasBook; @@ -49,7 +51,7 @@ public boolean isEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new se.llbit.chunky.entity.Lectern(position, this.facing, this.hasBook); + public Collection toEntity(Vector3 position) { + return se.llbit.chunky.entity.Lectern.create(position, this.facing, this.hasBook); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java b/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java index 96d89236cd..d156695731 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java @@ -26,6 +26,9 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class LilyPad extends MinecraftBlockTranslucent { public LilyPad() { super("lily_pad", Texture.lilyPad); @@ -42,7 +45,7 @@ public LilyPad() { return true; } - @Override public Entity toEntity(Vector3 position) { - return new LilyPadEntity(position); + @Override public Collection toEntity(Vector3 position) { + return Collections.singleton(new LilyPadEntity(position)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java index c9a8ea0e0d..2bf2f30c50 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java @@ -25,6 +25,9 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class SporeBlossom extends Block { public SporeBlossom() { @@ -45,7 +48,7 @@ public boolean isEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new se.llbit.chunky.entity.SporeBlossom(position); + public Collection toEntity(Vector3 position) { + return Collections.singleton(new se.llbit.chunky.entity.SporeBlossom(position)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java index c1c1f1f600..bacbb0ae06 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java @@ -25,6 +25,9 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class WallCoralFan extends MinecraftBlockTranslucent { private final String coralType; @@ -47,7 +50,7 @@ public WallCoralFan(String name, String coralType, String facing) { return true; } - @Override public Entity toEntity(Vector3 position) { - return new WallCoralFanEntity(position, coralType, facing); + @Override public Collection toEntity(Vector3 position) { + return Collections.singletonList(new WallCoralFanEntity(position, coralType, facing)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java index 8cd02a59c5..e78586492f 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java @@ -31,9 +31,10 @@ import se.llbit.nbt.CompoundTag; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; public class WallHead extends MinecraftBlockTranslucent { - private final String description; private final int facing; private final SkullEntity.Kind type; @@ -77,8 +78,8 @@ public boolean isEntity() { } @Override - public Entity toEntity(Vector3 position) { - return new SkullEntity(position, type, 0, facing); + public Collection toEntity(Vector3 position) { + return Collections.singletonList(new SkullEntity(position, type, 0, facing)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java index 4016b6070c..74fea2fa80 100644 --- a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java +++ b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java @@ -34,6 +34,7 @@ import se.llbit.util.JsonUtil; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; public class ArmorStand extends Entity implements Poseable, Geared { @@ -597,8 +598,8 @@ public JsonValue toJson() { * * @return deserialized entity, or {@code null} if it was not a valid entity */ - public static Entity fromJson(JsonObject json) { - return new ArmorStand(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new ArmorStand(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java index 2fac831683..fecfc0896e 100644 --- a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java +++ b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -226,8 +227,8 @@ public JsonValue toJson() { return json; } - public static BeaconBeam fromJson(JsonObject json) { - return new BeaconBeam(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new BeaconBeam(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Book.java b/chunky/src/java/se/llbit/chunky/entity/Book.java index 5179d9f797..ced2b76de7 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Book.java +++ b/chunky/src/java/se/llbit/chunky/entity/Book.java @@ -1,6 +1,7 @@ package se.llbit.chunky.entity; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; import se.llbit.chunky.PersistentSettings; @@ -295,8 +296,8 @@ public JsonValue toJson() { return json; } - public static Book fromJson(JsonObject json) { - return new Book(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new Book(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java b/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java index b6fe4591e8..4972c1c49f 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java +++ b/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java @@ -13,6 +13,7 @@ import se.llbit.util.JsonUtil; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; public class CalibratedSculkSensorAmethyst extends Entity { @@ -112,8 +113,8 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { - return new CalibratedSculkSensorAmethyst(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new CalibratedSculkSensorAmethyst(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Campfire.java b/chunky/src/java/se/llbit/chunky/entity/Campfire.java index 36c8436860..b8190c5a0f 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Campfire.java +++ b/chunky/src/java/se/llbit/chunky/entity/Campfire.java @@ -1,6 +1,7 @@ package se.llbit.chunky.entity; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; import java.util.Random; @@ -328,8 +329,8 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { - return new Campfire(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new Campfire(json)); } private static int getOrientationIndex(String facing) { diff --git a/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java b/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java index 5ef7599896..d089e06115 100644 --- a/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class ChickenEntity extends Entity implements Poseable, Variant { @@ -238,8 +239,8 @@ public JsonValue toJson() { return json; } - public static ChickenEntity fromJson(JsonObject json) { - return new ChickenEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new ChickenEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java index 5b39a00c16..0647f09902 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java @@ -30,6 +30,7 @@ import se.llbit.math.primitive.Primitive; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -106,10 +107,10 @@ public CoralFanEntity(Vector3 position, String coralType) { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); - return new CoralFanEntity(position, json.get("coral_type").stringValue("tube")); + return Collections.singletonList(new CoralFanEntity(position, json.get("coral_type").stringValue("tube"))); } diff --git a/chunky/src/java/se/llbit/chunky/entity/CowEntity.java b/chunky/src/java/se/llbit/chunky/entity/CowEntity.java index 9348594b02..3ed324b492 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CowEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/CowEntity.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class CowEntity extends Entity implements Poseable, Variant { @@ -273,8 +274,8 @@ public JsonValue toJson() { return json; } - public static CowEntity fromJson(JsonObject json) { - return new CowEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new CowEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Entity.java b/chunky/src/java/se/llbit/chunky/entity/Entity.java index b1e46a679b..15cf29e383 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Entity.java +++ b/chunky/src/java/se/llbit/chunky/entity/Entity.java @@ -71,7 +71,7 @@ public void loadDataFromOctree(Octree octree, BlockPalette palette, Vector3i ori * @param json json data. * @return unmarshalled entity, or {@code null} if it was not a valid entity. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { String kind = json.get("kind").stringValue(""); switch (kind) { case "painting": diff --git a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java index 1f0945d200..db13339a46 100644 --- a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java +++ b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java @@ -1,6 +1,7 @@ package se.llbit.chunky.entity; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; import java.util.Random; import java.util.stream.StreamSupport; @@ -119,8 +120,8 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { - return new FlameParticles(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new FlameParticles(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java index 7037aba937..4e218930cb 100644 --- a/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java @@ -15,6 +15,7 @@ import se.llbit.nbt.CompoundTag; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; public class HangingSignEntity extends Entity { @@ -288,7 +289,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -306,7 +307,7 @@ public static Entity fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); SignEntity.Color backDye = SignEntity.Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return new HangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, attached, material); + return Collections.singleton(new HangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, attached, material)); } public static Texture textureFromMaterial(String material) { diff --git a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java index deec5532b3..465f4fa635 100644 --- a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java @@ -193,14 +193,14 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); //int type = json.get("type").intValue(0); int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); String skin = json.get("skin").stringValue(""); - return new HeadEntity(position, skin, rotation, placement); + return Collections.singletonList(new HeadEntity(position, skin, rotation, placement)); } diff --git a/chunky/src/java/se/llbit/chunky/entity/Lectern.java b/chunky/src/java/se/llbit/chunky/entity/Lectern.java index c2ab652e58..4bbfa35fc8 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Lectern.java +++ b/chunky/src/java/se/llbit/chunky/entity/Lectern.java @@ -1,7 +1,10 @@ package se.llbit.chunky.entity; +import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; +import java.util.List; + import se.llbit.chunky.model.Model; import se.llbit.chunky.resources.Texture; import se.llbit.chunky.world.material.TextureMaterial; @@ -14,7 +17,7 @@ import se.llbit.math.primitive.Primitive; import se.llbit.util.JsonUtil; -public class Lectern extends Entity implements Poseable { +public class Lectern extends Entity { private static final Quad[] quadsNorth = new Quad[]{ new Quad( @@ -145,28 +148,25 @@ public class Lectern extends Entity implements Poseable { }; private final String facing; - private final Book book; - public Lectern(Vector3 position, String facing, boolean hasBook) { + public Lectern(Vector3 position, String facing) { super(position); this.facing = facing; - if (hasBook) { - this.book = createBookEntity(position, facing); - } else { - this.book = null; - } } public Lectern(JsonObject json) { super(JsonUtil.vec3FromJsonObject(json.get("position"))); this.facing = json.get("facing").stringValue("north"); - if (json.get("book").isObject()) { - this.book = Book.fromJson(json.get("book").object()); - } else if (json.get("hasBook").asBoolean(false)) { - this.book = createBookEntity(getPosition(), facing); - } else { - this.book = null; + } + + public static Collection create(Vector3 position, String facing, boolean hasBook) { + List entities = new ArrayList<>(); + + entities.add(new se.llbit.chunky.entity.Lectern(position, facing)); + if (hasBook) { + entities.add(createBookEntity(position, facing)); } + return entities; } @Override @@ -184,10 +184,6 @@ public Collection primitives(Vector3 offset) { transform); } - if (book != null) { - faces.addAll(book.primitives(offset)); - } - return faces; } @@ -197,22 +193,21 @@ public JsonValue toJson() { json.add("kind", "lectern"); json.add("position", position.toJson()); json.add("facing", facing); - if (book != null) { - json.add("book", book.toJson()); - } return json; } - public Book getBook() { - return book; - } + public static Collection fromJson(JsonObject json) { + Lectern lectern = new Lectern(json); - public boolean hasBook() { - return book != null; - } + Collection entities = new ArrayList<>(); + entities.add(lectern); + if (json.get("book").isObject()) { // we still get the book from the lectern json to be compatible with the old format + entities.addAll(Book.fromJson(json.get("book").object())); + } else if (json.get("hasBook").asBoolean(false)) { + entities.add(createBookEntity(lectern.getPosition(), lectern.facing)); + } - public static Entity fromJson(JsonObject json) { - return new Lectern(json); + return entities; } private static int getOrientationIndex(String facing) { @@ -274,31 +269,4 @@ private static Book createBookEntity(Vector3 position, String facing) { return book; } - - @Override - public String[] partNames() { - return book != null ? book.partNames() : new String[0]; - } - - @Override - public double getScale() { - return book != null ? book.getScale() : 1; - } - - @Override - public void setScale(double value) { - if (book != null) { - book.setScale(value); - } - } - - @Override - public JsonObject getPose() { - return book != null ? book.getPose() : null; - } - - @Override - public boolean hasHead() { - return false; - } } diff --git a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java index 1c934094b9..b2bb107cea 100644 --- a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java @@ -27,6 +27,7 @@ import se.llbit.util.MinecraftPRNG; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; public class LilyPadEntity extends Entity { @@ -89,11 +90,11 @@ public LilyPadEntity(Vector3 position, int rotation) { /** * Unmarshall a lily pad entity from JSON data. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return new LilyPadEntity(position, rotation); + return Collections.singletonList(new LilyPadEntity(position, rotation)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java b/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java index 5b9e1db1e7..513e61aa9b 100644 --- a/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class MooshroomEntity extends Entity implements Poseable, Variant { @@ -249,8 +250,8 @@ public JsonValue toJson() { return json; } - public static MooshroomEntity fromJson(JsonObject json) { - return new MooshroomEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new MooshroomEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java index fb86e1571e..a30580093d 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java @@ -27,6 +27,7 @@ import se.llbit.math.primitive.Primitive; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; @@ -146,12 +147,12 @@ public JsonValue toJson() { * * @return deserialized entity, or {@code null} if it was not a valid entity */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); String art = json.get("art").stringValue(""); double angle = json.get("angle").doubleValue(0.0); - return new PaintingEntity(position, art, angle); + return Collections.singletonList(new PaintingEntity(position, art, angle)); } public static void resetPaintings() { diff --git a/chunky/src/java/se/llbit/chunky/entity/PigEntity.java b/chunky/src/java/se/llbit/chunky/entity/PigEntity.java index f2e7c9b302..42655201b1 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PigEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PigEntity.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class PigEntity extends Entity implements Poseable, Variant, Saddleable { @@ -217,8 +218,8 @@ public JsonValue toJson() { return json; } - public static PigEntity fromJson(JsonObject json) { - return new PigEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new PigEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java index 1f36ecbdb9..a6037cef80 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java @@ -957,8 +957,8 @@ private static TextureLoader leatherTexture(String id, int color, Texture textur new ColoredTexture(textureName, color, texture)); } - public static PlayerEntity fromJson(JsonObject json) { - return new PlayerEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new PlayerEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java b/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java index 864648c6dc..f335c42e98 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class SheepEntity extends Entity implements Poseable, Dyeable { @@ -361,8 +362,8 @@ public JsonValue toJson() { return json; } - public static SheepEntity fromJson(JsonObject json) { - return new SheepEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new SheepEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java index 03d5540df6..1ef54050a5 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java @@ -33,10 +33,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; +import java.util.*; public class SignEntity extends Entity { @@ -589,7 +586,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -606,7 +603,7 @@ public static Entity fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); Color backDye = Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material); + return Collections.singletonList(new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); } /** diff --git a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java index 3a110072a6..93aac66232 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java @@ -33,6 +33,7 @@ import se.llbit.math.primitive.Primitive; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -296,12 +297,12 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); Kind type = Kind.values()[json.get("type").intValue(0)]; int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); - return new SkullEntity(position, type, rotation, placement); + return Collections.singletonList(new SkullEntity(position, type, rotation, placement)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java index 470e0736dd..842981c1c4 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java +++ b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java @@ -5,6 +5,8 @@ import se.llbit.chunky.resources.Texture; import se.llbit.chunky.world.Material; import se.llbit.chunky.world.material.TextureMaterial; +import java.util.Collections; + import se.llbit.json.JsonObject; import se.llbit.json.JsonValue; import se.llbit.math.Transform; @@ -37,7 +39,7 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { - return new SporeBlossom(json); + public static Collection fromJson(JsonObject json) { + return Collections.singletonList(new SporeBlossom(json)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java b/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java index e5585beac3..58bd6ef427 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; public class SquidEntity extends Entity implements Poseable { @@ -187,8 +188,8 @@ public JsonValue toJson() { return json; } - public static SquidEntity fromJson(JsonObject json) { - return new SquidEntity(json); + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new SquidEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java b/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java index e8badb5e45..30af4e5880 100644 --- a/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java +++ b/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java @@ -35,6 +35,7 @@ import se.llbit.util.NbtUtil; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -211,11 +212,11 @@ public JsonValue toJson() { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return new StandingBanner(position, rotation, json.get("design").object()); + return Collections.singleton(new StandingBanner(position, rotation, json.get("design").object())); } public static Material getBannerTexture(JsonObject design) { diff --git a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java index d432ccd19f..0a12c1edc6 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java @@ -29,6 +29,7 @@ import se.llbit.nbt.CompoundTag; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -143,10 +144,10 @@ public WallBanner(Vector3 position, int rotation, CompoundTag entityTag) { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return new WallBanner(position, rotation, json.get("design").object()); + return Collections.singletonList(new WallBanner(position, rotation, json.get("design").object())); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java index c779bf8022..fd470a054f 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java @@ -31,6 +31,7 @@ import se.llbit.math.primitive.Primitive; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -104,11 +105,11 @@ public WallCoralFanEntity(Vector3 position, String coralType, String facing) { return json; } - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); String coralType = json.get("coral_type").stringValue("tube"); String facing = json.get("facing").stringValue("north"); - return new WallCoralFanEntity(position, coralType, facing); + return Collections.singletonList(new WallCoralFanEntity(position, coralType, facing)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java index dee93a532c..5ca6fc6ce4 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java @@ -16,6 +16,7 @@ import se.llbit.nbt.CompoundTag; import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; public class WallHangingSignEntity extends Entity { @@ -272,7 +273,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -289,6 +290,6 @@ public static Entity fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); SignEntity.Color backDye = SignEntity.Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return new WallHangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material); + return Collections.singleton(new WallHangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java index c09691ece8..aaaac00e58 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java @@ -33,6 +33,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.Collections; public class WallSignEntity extends Entity { @@ -166,7 +167,7 @@ public JsonValue toJson() { /** * Unmarshalls a wall sign entity from JSON data. */ - public static Entity fromJson(JsonObject json) { + public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] text = null; @@ -177,6 +178,6 @@ public static Entity fromJson(JsonObject json) { String material = json.get("material").stringValue("oak"); SignEntity.Color dye = SignEntity.Color.getFromDyedSign(json.get("dye").stringValue(null)); boolean glowing = json.get("glowing").boolValue(false); - return new WallSignEntity(position, text, dye, glowing, direction, material); + return Collections.singletonList(new WallSignEntity(position, text, dye, glowing, direction, material)); } } diff --git a/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java b/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java index 63bcfadc69..66af45f92a 100644 --- a/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java +++ b/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java @@ -34,6 +34,7 @@ import se.llbit.util.JsonUtil; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; public class DecoratedPotModel extends TopBottomOrientedTexturedBlockModel { @@ -156,11 +157,11 @@ public Collection primitives(Vector3 offset) { return primitives; } - public static Entity fromJson(JsonObject json) { - return new DecoratedPotSpoutEntity( + public static Collection fromJson(JsonObject json) { + return Collections.singleton(new DecoratedPotSpoutEntity( JsonUtil.vec3FromJsonObject(json.get("position")), json.get("facing").stringValue("north") - ); + )); } @Override diff --git a/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java b/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java index bc4bc6bf61..0a327eb12b 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java @@ -1004,22 +1004,25 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map entitiesFromBlock = block.toEntity(position); - if (entities.shouldLoad(entity)) { - if (entity instanceof Poseable && !(entity instanceof Lectern && !((Lectern) entity).hasBook())) { - entities.addActor(entity); - } else { - entities.addEntity(entity); - if (emitterGrid != null) { - for (Grid.EmitterPosition emitterPos : entity.getEmitterPosition()) { - emitterPos.x -= origin.x; - emitterPos.y -= origin.y; - emitterPos.z -= origin.z; - emitterGrid.addEmitter(emitterPos); + for (Entity entity : entitiesFromBlock) { + if (entities.shouldLoad(entity)) { + if (entity instanceof Poseable) { + entities.addActor(entity); + } else { + entities.addEntity(entity); + if (emitterGrid != null) { + for (Grid.EmitterPosition emitterPos : entity.getEmitterPosition()) { + emitterPos.x -= origin.x; + emitterPos.y -= origin.y; + emitterPos.z -= origin.z; + emitterGrid.addEmitter(emitterPos); + } } } } + } if (!block.isBlockWithEntity()) { if (block.isWaterlogged()) { diff --git a/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java b/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java index 5c1e7d97a8..b25f3c8b75 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java @@ -321,18 +321,18 @@ public void importJsonData(JsonObject json) { // rather than the actors array. In future versions only the actors // array should contain poseable entities. for (JsonValue element : json.get("entities").array()) { - Entity entity = Entity.fromJson(element.object()); + Collection entity = Entity.fromJson(element.object()); if (entity != null) { if (entity instanceof PlayerEntity) { - actors.add(entity); + actors.addAll(entity); } else { - entities.add(entity); + entities.addAll(entity); } } } for (JsonValue element : json.get("actors").array()) { - Entity entity = Entity.fromJson(element.object()); - actors.add(entity); + Collection entity = Entity.fromJson(element.object()); + actors.addAll(entity); } } diff --git a/chunky/src/java/se/llbit/chunky/ui/render/tabs/EntitiesTab.java b/chunky/src/java/se/llbit/chunky/ui/render/tabs/EntitiesTab.java index 10e269dd22..03b999e32e 100644 --- a/chunky/src/java/se/llbit/chunky/ui/render/tabs/EntitiesTab.java +++ b/chunky/src/java/se/llbit/chunky/ui/render/tabs/EntitiesTab.java @@ -72,7 +72,7 @@ public class EntitiesTab extends ScrollPane implements RenderControlsTab, Initia return player; }); entityTypes.put("Armor stand", (position, scene) -> new ArmorStand(position, new CompoundTag())); - entityTypes.put("Lectern", (position, scene) -> new Lectern(position, "north", true)); + entityTypes.put("Lectern", (position, scene) -> new Lectern(position, "north")); entityTypes.put("Book", (position, scene) -> new Book(position, Math.PI - Math.PI / 16, Math.toRadians(30), Math.toRadians(180 - 30))); entityTypes.put("Beacon beam", (position, scene) -> new BeaconBeam(position)); entityTypes.put("Sheep", (position, scene) -> new SheepEntity(position, new CompoundTag())); @@ -281,15 +281,9 @@ private void updateEntity(Entity entity) { controls.getChildren().addAll(modelBox, skinBox, layerBox); } - else if (entity instanceof Book || entity instanceof Lectern) { - Book book; - if (entity instanceof Lectern) { - book = ((Lectern) entity).getBook(); - } else { - book = (Book) entity; - } + else if (entity instanceof Book) { + Book book = (Book) entity; - if (book != null) { DoubleAdjuster openingAngle = new DoubleAdjuster(); openingAngle.setName("Opening angle"); openingAngle.setTooltip("Modifies the book's opening angle."); @@ -322,7 +316,6 @@ else if (entity instanceof Book || entity instanceof Lectern) { scene.rebuildActorBvh(); }); controls.getChildren().add(page2Angle); - } } else if (entity instanceof BeaconBeam) { BeaconBeam beam = (BeaconBeam) entity; From 007ff326b041bb4cb0a1fb84729a28912620e6f1 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 30 Aug 2025 18:27:12 +0200 Subject: [PATCH 2/5] Use Collections.singleton instead of Collections.singletonList. --- .../java/se/llbit/chunky/block/minecraft/CakeWithCandle.java | 2 +- chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java | 4 ++-- chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java | 2 +- .../java/se/llbit/chunky/block/minecraft/EnchantingTable.java | 2 +- .../java/se/llbit/chunky/block/minecraft/WallCoralFan.java | 2 +- chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java | 2 +- chunky/src/java/se/llbit/chunky/entity/ArmorStand.java | 2 +- chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java | 2 +- chunky/src/java/se/llbit/chunky/entity/Book.java | 2 +- chunky/src/java/se/llbit/chunky/entity/Campfire.java | 2 +- chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/FlameParticles.java | 2 +- chunky/src/java/se/llbit/chunky/entity/HeadEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/SignEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/SkullEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java | 2 +- chunky/src/java/se/llbit/chunky/entity/WallBanner.java | 2 +- .../src/java/se/llbit/chunky/entity/WallCoralFanEntity.java | 2 +- chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java | 2 +- 22 files changed, 23 insertions(+), 23 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java index ef68798fb2..cab5eb54c7 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java @@ -64,7 +64,7 @@ public boolean isBlockWithEntity() { @Override public Collection toEntity(Vector3 position) { - return Collections.singletonList(new FlameParticles(position, entity)); + return Collections.singleton(new FlameParticles(position, entity)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java index 5404a686b2..d1d2db83ab 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java @@ -93,9 +93,9 @@ public boolean isBlockWithEntity() { @Override public Collection toEntity(Vector3 position) { if (entity != null) { - return Collections.singletonList(new FlameParticles(position, entity)); + return Collections.singleton(new FlameParticles(position, entity)); } else { - return Collections.singletonList(new FlameParticles(position, this, new Vector3[0])); + return Collections.singleton(new FlameParticles(position, this, new Vector3[0])); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java index cfbbae83ae..0a0289a660 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java @@ -76,6 +76,6 @@ public static Texture coralTexture(String coralType) { } @Override public Collection toEntity(Vector3 position) { - return Collections.singletonList(new CoralFanEntity(position, coralType)); + return Collections.singleton(new CoralFanEntity(position, coralType)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java index d73a3c0e06..4a7d5a8f6d 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java @@ -58,6 +58,6 @@ public Collection toEntity(Vector3 position) { Math.toRadians(180 - 30)); book.setPitch(Math.toRadians(80)); book.setYaw(Math.toRadians(45)); - return Collections.singletonList(book); + return Collections.singleton(book); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java index bacbb0ae06..49443e84a2 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java @@ -51,6 +51,6 @@ public WallCoralFan(String name, String coralType, String facing) { } @Override public Collection toEntity(Vector3 position) { - return Collections.singletonList(new WallCoralFanEntity(position, coralType, facing)); + return Collections.singleton(new WallCoralFanEntity(position, coralType, facing)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java index e78586492f..f16c998be8 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java @@ -79,7 +79,7 @@ public boolean isEntity() { @Override public Collection toEntity(Vector3 position) { - return Collections.singletonList(new SkullEntity(position, type, 0, facing)); + return Collections.singleton(new SkullEntity(position, type, 0, facing)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java index 74fea2fa80..2103471a8d 100644 --- a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java +++ b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java @@ -599,7 +599,7 @@ public JsonValue toJson() { * @return deserialized entity, or {@code null} if it was not a valid entity */ public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new ArmorStand(json)); + return Collections.singleton(new ArmorStand(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java index fecfc0896e..fcc18c8adf 100644 --- a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java +++ b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java @@ -228,7 +228,7 @@ public JsonValue toJson() { } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new BeaconBeam(json)); + return Collections.singleton(new BeaconBeam(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Book.java b/chunky/src/java/se/llbit/chunky/entity/Book.java index ced2b76de7..936368c637 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Book.java +++ b/chunky/src/java/se/llbit/chunky/entity/Book.java @@ -297,7 +297,7 @@ public JsonValue toJson() { } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new Book(json)); + return Collections.singleton(new Book(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Campfire.java b/chunky/src/java/se/llbit/chunky/entity/Campfire.java index b8190c5a0f..321d54a710 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Campfire.java +++ b/chunky/src/java/se/llbit/chunky/entity/Campfire.java @@ -330,7 +330,7 @@ public JsonValue toJson() { } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new Campfire(json)); + return Collections.singleton(new Campfire(json)); } private static int getOrientationIndex(String facing) { diff --git a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java index 0647f09902..c25af23d10 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java @@ -110,7 +110,7 @@ public CoralFanEntity(Vector3 position, String coralType) { public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); - return Collections.singletonList(new CoralFanEntity(position, json.get("coral_type").stringValue("tube"))); + return Collections.singleton(new CoralFanEntity(position, json.get("coral_type").stringValue("tube"))); } diff --git a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java index db13339a46..7fa19f8eb3 100644 --- a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java +++ b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java @@ -121,7 +121,7 @@ public JsonValue toJson() { } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new FlameParticles(json)); + return Collections.singleton(new FlameParticles(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java index 465f4fa635..ef98f626a8 100644 --- a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java @@ -200,7 +200,7 @@ public static Collection fromJson(JsonObject json) { int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); String skin = json.get("skin").stringValue(""); - return Collections.singletonList(new HeadEntity(position, skin, rotation, placement)); + return Collections.singleton(new HeadEntity(position, skin, rotation, placement)); } diff --git a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java index b2bb107cea..d28e84da84 100644 --- a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java @@ -94,7 +94,7 @@ public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return Collections.singletonList(new LilyPadEntity(position, rotation)); + return Collections.singleton(new LilyPadEntity(position, rotation)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java index a30580093d..55fc6f09d1 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java @@ -152,7 +152,7 @@ public static Collection fromJson(JsonObject json) { position.fromJson(json.get("position").object()); String art = json.get("art").stringValue(""); double angle = json.get("angle").doubleValue(0.0); - return Collections.singletonList(new PaintingEntity(position, art, angle)); + return Collections.singleton(new PaintingEntity(position, art, angle)); } public static void resetPaintings() { diff --git a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java index a6037cef80..fc5e95e1b7 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java @@ -958,7 +958,7 @@ private static TextureLoader leatherTexture(String id, int color, Texture textur } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new PlayerEntity(json)); + return Collections.singleton(new PlayerEntity(json)); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java index 1ef54050a5..55e1aff256 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java @@ -603,7 +603,7 @@ public static Collection fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); Color backDye = Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return Collections.singletonList(new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); + return Collections.singleton(new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); } /** diff --git a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java index 93aac66232..da74d1dbed 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java @@ -303,6 +303,6 @@ public static Collection fromJson(JsonObject json) { Kind type = Kind.values()[json.get("type").intValue(0)]; int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); - return Collections.singletonList(new SkullEntity(position, type, rotation, placement)); + return Collections.singleton(new SkullEntity(position, type, rotation, placement)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java index 842981c1c4..dc39bf0713 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java +++ b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java @@ -40,6 +40,6 @@ public JsonValue toJson() { } public static Collection fromJson(JsonObject json) { - return Collections.singletonList(new SporeBlossom(json)); + return Collections.singleton(new SporeBlossom(json)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java index 0a12c1edc6..bec443b899 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java @@ -148,6 +148,6 @@ public static Collection fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return Collections.singletonList(new WallBanner(position, rotation, json.get("design").object())); + return Collections.singleton(new WallBanner(position, rotation, json.get("design").object())); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java index fd470a054f..0140566498 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java @@ -110,6 +110,6 @@ public static Collection fromJson(JsonObject json) { position.fromJson(json.get("position").object()); String coralType = json.get("coral_type").stringValue("tube"); String facing = json.get("facing").stringValue("north"); - return Collections.singletonList(new WallCoralFanEntity(position, coralType, facing)); + return Collections.singleton(new WallCoralFanEntity(position, coralType, facing)); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java index aaaac00e58..eb4031b8fe 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java @@ -178,6 +178,6 @@ public static Collection fromJson(JsonObject json) { String material = json.get("material").stringValue("oak"); SignEntity.Color dye = SignEntity.Color.getFromDyedSign(json.get("dye").stringValue(null)); boolean glowing = json.get("glowing").boolValue(false); - return Collections.singletonList(new WallSignEntity(position, text, dye, glowing, direction, material)); + return Collections.singleton(new WallSignEntity(position, text, dye, glowing, direction, material)); } } From 938da36db173574e39cf4600ac76648a0170dd84 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 30 Aug 2025 18:35:27 +0200 Subject: [PATCH 3/5] Throw UnsupportedOperationException instead of Error when trying to create entities or block entities from blocks that don't support this. --- chunky/src/java/se/llbit/chunky/block/Block.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/block/Block.java b/chunky/src/java/se/llbit/chunky/block/Block.java index f1df64f4da..de0ffac975 100644 --- a/chunky/src/java/se/llbit/chunky/block/Block.java +++ b/chunky/src/java/se/llbit/chunky/block/Block.java @@ -105,7 +105,7 @@ public boolean isBlockEntity() { } public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { - throw new Error("This block type can not be converted to a block entity: " + throw new UnsupportedOperationException("This block type can not be converted to a block entity: " + getClass().getSimpleName()); } @@ -123,7 +123,7 @@ public boolean isBlockWithEntity() { } public Collection toEntity(Vector3 position) { - throw new Error("This block type can not be converted to an entity: " + throw new UnsupportedOperationException("This block type can not be converted to an entity: " + getClass().getSimpleName()); } From acace167514a114ba9aec9308a8829e1f8f826a8 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sun, 31 Aug 2025 15:53:03 +0200 Subject: [PATCH 4/5] Rename some entity-related block methods and add more documentation to clarify how entities and block entities work. --- .../src/java/se/llbit/chunky/block/Block.java | 55 +++++++++++++++---- .../block/legacy/blocks/LegacyBanner.java | 2 +- .../block/legacy/blocks/LegacySkull.java | 2 +- .../block/legacy/blocks/LegacyWallBanner.java | 2 +- .../llbit/chunky/block/minecraft/Banner.java | 2 +- .../llbit/chunky/block/minecraft/Beacon.java | 6 +- .../block/minecraft/CakeWithCandle.java | 8 +-- .../minecraft/CalibratedSculkSensor.java | 8 +-- .../chunky/block/minecraft/Campfire.java | 2 +- .../llbit/chunky/block/minecraft/Candle.java | 8 +-- .../block/minecraft/CopperGolemStatue.java | 9 ++- .../chunky/block/minecraft/CoralFan.java | 4 +- .../chunky/block/minecraft/DecoratedPot.java | 2 +- .../block/minecraft/EnchantingTable.java | 8 +-- .../chunky/block/minecraft/HangingSign.java | 2 +- .../se/llbit/chunky/block/minecraft/Head.java | 6 +- .../llbit/chunky/block/minecraft/Lectern.java | 4 +- .../llbit/chunky/block/minecraft/LilyPad.java | 4 +- .../se/llbit/chunky/block/minecraft/Sign.java | 2 +- .../chunky/block/minecraft/SporeBlossom.java | 4 +- .../chunky/block/minecraft/WallBanner.java | 2 +- .../chunky/block/minecraft/WallCoralFan.java | 4 +- .../block/minecraft/WallHangingSign.java | 2 +- .../chunky/block/minecraft/WallHead.java | 6 +- .../chunky/block/minecraft/WallSign.java | 2 +- .../se/llbit/chunky/renderer/scene/Scene.java | 21 ++++--- 26 files changed, 107 insertions(+), 70 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/block/Block.java b/chunky/src/java/se/llbit/chunky/block/Block.java index de0ffac975..6e12fd9601 100644 --- a/chunky/src/java/se/llbit/chunky/block/Block.java +++ b/chunky/src/java/se/llbit/chunky/block/Block.java @@ -100,31 +100,66 @@ public String toString() { return name; } + /** + * Check if this block is a block entity, i.e. {@link #createBlockEntity(Vector3, CompoundTag)} should be invoked to + * create an entity from this block and its entity data tag. This is used for blocks that need to create a new entity + * that needs the block entity data, e.g. signs. + *

+ * This is mutually exclusive with {@link #hasEntities()}, use that one if you don't need block entity data. + * + * @return True if this block is a block entity, false otherwise + */ public boolean isBlockEntity() { return false; } - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + /** + * Create a block entity from this block and the given block entity tag at the specified position. + * + * @param position Position + * @param entityTag Block entity tag + * @return The block entity created from this block's data and the entity tag + * @throws UnsupportedOperationException If this block is not a block entity (i.e. {@link #isBlockEntity()} returns false + */ + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { throw new UnsupportedOperationException("This block type can not be converted to a block entity: " + getClass().getSimpleName()); } - public boolean isEntity() { + /** + * Check if this block has entities, i.e. {@link #createEntities(Vector3)} should be invoked to create entities from this + * block. A block can create multiple entities (e.g. the lectern may create a lectern and a book entity). + *

+ * This is mutually exclusive with {@link #isBlockEntity()}, use that one if you need block entity data. + * + * @return True if this block has entities, false otherwise + */ + public boolean hasEntities() { return false; } /** - * If this returns true, the block won't be removed from the octree even if this is an entity - * (i.e. {@link #isEntity()} returns true). This can be used for blocks that also contain - * entities, e.g. candle (where the candle flame is an entity). + * Create entities from this block at the specified position. + *

+ * This may return multiple entities, e.g. the lectern has a lectern entity and an optional book entity. + * + * @param position Position + * @return The entities created from this block's data + * @throws UnsupportedOperationException If this block is not a block entity (i.e. {@link #hasEntities()} returns false */ - public boolean isBlockWithEntity() { - return false; + public Collection createEntities(Vector3 position) { + throw new UnsupportedOperationException("This block type can not be converted to entities: " + + getClass().getSimpleName()); } - public Collection toEntity(Vector3 position) { - throw new UnsupportedOperationException("This block type can not be converted to an entity: " - + getClass().getSimpleName()); + /** + * Whether to remove this block from the octree if it contains entities (i.e. {@link #hasEntities()} returns true). + *

+ * Most blocks are replaced by their entities (eg. signs create a sign entity that does the rendering and the block itself + * does nothing, but some blocks use block model and entities, e.g. candle (where the candle flame is an entity but the candle is a block). + */ + public boolean isReplacedByEntities() { + return true; } /** diff --git a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyBanner.java b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyBanner.java index 864734b46d..7c87ac76a6 100644 --- a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyBanner.java +++ b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyBanner.java @@ -56,7 +56,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new StandingBanner(position, rotation, parseDesign(entityTag)); } diff --git a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacySkull.java b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacySkull.java index 540cc01da6..2861304c45 100644 --- a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacySkull.java +++ b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacySkull.java @@ -39,7 +39,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { Kind kind = getSkullKind(entityTag.get("SkullType").byteValue(0)); int rotation = entityTag.get("Rot").byteValue(0); if (kind == Kind.PLAYER) { diff --git a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyWallBanner.java b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyWallBanner.java index ff46332ae8..b445c24f26 100644 --- a/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyWallBanner.java +++ b/chunky/src/java/se/llbit/chunky/block/legacy/blocks/LegacyWallBanner.java @@ -32,7 +32,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new WallBanner(position, facing, LegacyBanner.parseDesign(entityTag)); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Banner.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Banner.java index e9a204e6b2..3b4d879873 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Banner.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Banner.java @@ -54,7 +54,7 @@ public Banner(String name, Texture texture, int rotation, BannerDesign.Color col return true; } - @Override public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + @Override public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { JsonObject design = StandingBanner.parseDesign(entityTag); design.set("base", Json.of(color.id)); // Base color is not included in the entity tag in Minecraft 1.13+. return new StandingBanner(position, rotation, design); diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Beacon.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Beacon.java index 3f6949024b..73009fdcee 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Beacon.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Beacon.java @@ -36,8 +36,8 @@ public Beacon() { } @Override - public boolean isBlockWithEntity() { - return true; + public boolean isReplacedByEntities() { + return false; } @Override @@ -46,7 +46,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { if (entityTag.get("Levels").intValue(0) > 0) { return new BeaconBeam(position); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java index cab5eb54c7..b692c55d17 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CakeWithCandle.java @@ -53,17 +53,17 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return isLit(); } @Override - public boolean isBlockWithEntity() { - return true; + public boolean isReplacedByEntities() { + return false; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return Collections.singleton(new FlameParticles(position, entity)); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java index 48f44e5966..d0425c294a 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CalibratedSculkSensor.java @@ -49,17 +49,17 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public boolean isBlockWithEntity() { - return true; + public boolean isReplacedByEntities() { + return false; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return Collections.singleton(new CalibratedSculkSensorAmethyst(position, this.facing, isActive(), this)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Campfire.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Campfire.java index 42c4d59499..fa7d5601b1 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Campfire.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Campfire.java @@ -54,7 +54,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new se.llbit.chunky.entity.Campfire(this.kind, position, this.facing, this.isLit, this); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java index d1d2db83ab..d236fa737d 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Candle.java @@ -81,17 +81,17 @@ public boolean isLit() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return isLit(); } @Override - public boolean isBlockWithEntity() { - return true; + public boolean isReplacedByEntities() { + return false; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { if (entity != null) { return Collections.singleton(new FlameParticles(position, entity)); } else { diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CopperGolemStatue.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CopperGolemStatue.java index 490bfa536f..2bf3c16151 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CopperGolemStatue.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CopperGolemStatue.java @@ -9,6 +9,9 @@ import se.llbit.math.Ray; import se.llbit.math.Vector3; +import java.util.Collection; +import java.util.Collections; + public class CopperGolemStatue extends MinecraftBlockTranslucent { private final String facing; private final String pose; @@ -36,14 +39,14 @@ public boolean intersect(Ray ray, Scene scene) { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public Entity toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { position = new Vector3(position); position.add(0.5, 0, 0.5); - return new CopperGolemStatueEntity(position, pose, facing, oxidation); + return Collections.singleton(new CopperGolemStatueEntity(position, pose, facing, oxidation)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java index 0a0289a660..6bff868e98 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/CoralFan.java @@ -71,11 +71,11 @@ public static Texture coralTexture(String coralType) { return false; } - @Override public boolean isEntity() { + @Override public boolean hasEntities() { return true; } - @Override public Collection toEntity(Vector3 position) { + @Override public Collection createEntities(Vector3 position) { return Collections.singleton(new CoralFanEntity(position, coralType)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/DecoratedPot.java b/chunky/src/java/se/llbit/chunky/block/minecraft/DecoratedPot.java index 87308fa0ee..c398a97bcf 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/DecoratedPot.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/DecoratedPot.java @@ -62,7 +62,7 @@ public boolean isModifiedByBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new DecoratedPotModel.DecoratedPotSpoutEntity(position, facing); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java index 4a7d5a8f6d..fd4412e0e1 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/EnchantingTable.java @@ -38,17 +38,17 @@ public EnchantingTable() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public boolean isBlockWithEntity() { - return true; + public boolean isReplacedByEntities() { + return false; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { Vector3 newPosition = new Vector3(position); newPosition.add(0, 0.35, 0); Book book = new Book( diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/HangingSign.java b/chunky/src/java/se/llbit/chunky/block/minecraft/HangingSign.java index f669c87a78..f63195afc7 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/HangingSign.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/HangingSign.java @@ -52,7 +52,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new HangingSignEntity(position, entityTag, rotation, attached, material); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java index 49f85be904..da39c30deb 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Head.java @@ -64,12 +64,12 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return type != Kind.PLAYER; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return Collections.singleton(new SkullEntity(position, type, rotation, 1)); } @@ -79,7 +79,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { if (type == Kind.PLAYER) { try { String textureUrl = getTextureUrl(entityTag); diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java index 202756ae11..a769f5bc8d 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Lectern.java @@ -46,12 +46,12 @@ public boolean intersect(Ray ray, Scene scene) { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return se.llbit.chunky.entity.Lectern.create(position, this.facing, this.hasBook); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java b/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java index d156695731..0ee6a5cb45 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/LilyPad.java @@ -41,11 +41,11 @@ public LilyPad() { return false; } - @Override public boolean isEntity() { + @Override public boolean hasEntities() { return true; } - @Override public Collection toEntity(Vector3 position) { + @Override public Collection createEntities(Vector3 position) { return Collections.singleton(new LilyPadEntity(position)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/Sign.java b/chunky/src/java/se/llbit/chunky/block/minecraft/Sign.java index fd5ab16226..ab9b68cab6 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/Sign.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/Sign.java @@ -47,7 +47,7 @@ public Sign(String name, String material, int rotation) { return true; } - @Override public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + @Override public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new SignEntity(position, entityTag, rotation, material); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java index 2bf2f30c50..95974f0082 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/SporeBlossom.java @@ -43,12 +43,12 @@ public boolean intersect(Ray ray, Scene scene) { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return Collections.singleton(new se.llbit.chunky.entity.SporeBlossom(position)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallBanner.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallBanner.java index 816a926185..bb64672559 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallBanner.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallBanner.java @@ -65,7 +65,7 @@ public WallBanner(String name, Texture texture, String facing, BannerDesign.Colo return true; } - @Override public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + @Override public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { JsonObject design = StandingBanner.parseDesign(entityTag); design.set("base", Json.of(color.id)); // Base color is not included in the entity tag in Minecraft 1.13+. return new se.llbit.chunky.entity.WallBanner(position, facing, design); diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java index 49443e84a2..463f19609d 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallCoralFan.java @@ -46,11 +46,11 @@ public WallCoralFan(String name, String coralType, String facing) { return false; } - @Override public boolean isEntity() { + @Override public boolean hasEntities() { return true; } - @Override public Collection toEntity(Vector3 position) { + @Override public Collection createEntities(Vector3 position) { return Collections.singleton(new WallCoralFanEntity(position, coralType, facing)); } } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHangingSign.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHangingSign.java index 1afccff9fc..8334e4ab0b 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHangingSign.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHangingSign.java @@ -51,7 +51,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new WallHangingSignEntity(position, entityTag, facing, material); } diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java index f16c998be8..c860729cf3 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallHead.java @@ -73,12 +73,12 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return type != Kind.PLAYER; } @Override - public Collection toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { return Collections.singleton(new SkullEntity(position, type, 0, facing)); } @@ -88,7 +88,7 @@ public boolean isBlockEntity() { } @Override - public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { if (type == Kind.PLAYER) { try { String textureUrl = Head.getTextureUrl(entityTag); diff --git a/chunky/src/java/se/llbit/chunky/block/minecraft/WallSign.java b/chunky/src/java/se/llbit/chunky/block/minecraft/WallSign.java index dd833d102e..7ddfdb4de9 100644 --- a/chunky/src/java/se/llbit/chunky/block/minecraft/WallSign.java +++ b/chunky/src/java/se/llbit/chunky/block/minecraft/WallSign.java @@ -62,7 +62,7 @@ public WallSign(String name, String material, String facing) { return true; } - @Override public Entity toBlockEntity(Vector3 position, CompoundTag entityTag) { + @Override public Entity createBlockEntity(Vector3 position, CompoundTag entityTag) { return new WallSignEntity(position, entityTag, facing, material); } } diff --git a/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java b/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java index 0a327eb12b..70d9b0fbb1 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java @@ -1002,9 +1002,9 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map entitiesFromBlock = block.toEntity(position); + Collection entitiesFromBlock = block.createEntities(position); for (Entity entity : entitiesFromBlock) { if (entities.shouldLoad(entity)) { @@ -1024,14 +1024,13 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map Date: Sat, 1 Aug 2026 19:01:57 +0100 Subject: [PATCH 5/5] Make Entities#fromJson return a single entity, legacy entities now handled by caller --- .../se/llbit/chunky/entity/ArmorStand.java | 4 +- .../se/llbit/chunky/entity/BeaconBeam.java | 4 +- .../src/java/se/llbit/chunky/entity/Book.java | 4 +- .../entity/CalibratedSculkSensorAmethyst.java | 4 +- .../java/se/llbit/chunky/entity/Campfire.java | 4 +- .../se/llbit/chunky/entity/ChickenEntity.java | 4 +- .../llbit/chunky/entity/CoralFanEntity.java | 4 +- .../se/llbit/chunky/entity/CowEntity.java | 4 +- .../java/se/llbit/chunky/entity/Entity.java | 104 ++++++++---------- .../llbit/chunky/entity/FlameParticles.java | 4 +- .../chunky/entity/HangingSignEntity.java | 4 +- .../se/llbit/chunky/entity/HeadEntity.java | 4 +- .../java/se/llbit/chunky/entity/Lectern.java | 14 +-- .../se/llbit/chunky/entity/LilyPadEntity.java | 4 +- .../llbit/chunky/entity/MooshroomEntity.java | 4 +- .../llbit/chunky/entity/PaintingEntity.java | 4 +- .../se/llbit/chunky/entity/PigEntity.java | 4 +- .../se/llbit/chunky/entity/PlayerEntity.java | 4 +- .../se/llbit/chunky/entity/SheepEntity.java | 4 +- .../se/llbit/chunky/entity/SignEntity.java | 4 +- .../se/llbit/chunky/entity/SkullEntity.java | 4 +- .../se/llbit/chunky/entity/SporeBlossom.java | 4 +- .../se/llbit/chunky/entity/SquidEntity.java | 4 +- .../llbit/chunky/entity/StandingBanner.java | 4 +- .../se/llbit/chunky/entity/WallBanner.java | 4 +- .../chunky/entity/WallCoralFanEntity.java | 4 +- .../chunky/entity/WallHangingSignEntity.java | 4 +- .../llbit/chunky/entity/WallSignEntity.java | 4 +- .../model/minecraft/DecoratedPotModel.java | 6 +- .../chunky/renderer/scene/SceneEntities.java | 4 +- 30 files changed, 102 insertions(+), 130 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java index 2103471a8d..0c712c8039 100644 --- a/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java +++ b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java @@ -598,8 +598,8 @@ public JsonValue toJson() { * * @return deserialized entity, or {@code null} if it was not a valid entity */ - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new ArmorStand(json)); + public static Entity fromJson(JsonObject json) { + return new ArmorStand(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java index fcc18c8adf..39883ca3dd 100644 --- a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java +++ b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java @@ -227,8 +227,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new BeaconBeam(json)); + public static Entity fromJson(JsonObject json) { + return new BeaconBeam(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Book.java b/chunky/src/java/se/llbit/chunky/entity/Book.java index 936368c637..0038e334f4 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Book.java +++ b/chunky/src/java/se/llbit/chunky/entity/Book.java @@ -296,8 +296,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new Book(json)); + public static Entity fromJson(JsonObject json) { + return new Book(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java b/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java index 4972c1c49f..65ba6ac8c1 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java +++ b/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java @@ -113,8 +113,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new CalibratedSculkSensorAmethyst(json)); + public static Entity fromJson(JsonObject json) { + return new CalibratedSculkSensorAmethyst(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Campfire.java b/chunky/src/java/se/llbit/chunky/entity/Campfire.java index 321d54a710..8d22988e68 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Campfire.java +++ b/chunky/src/java/se/llbit/chunky/entity/Campfire.java @@ -329,8 +329,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new Campfire(json)); + public static Entity fromJson(JsonObject json) { + return new Campfire(json); } private static int getOrientationIndex(String facing) { diff --git a/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java b/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java index d089e06115..27c20a0276 100644 --- a/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java @@ -239,8 +239,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new ChickenEntity(json)); + public static Entity fromJson(JsonObject json) { + return new ChickenEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java index c25af23d10..d2c6a7d46d 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java @@ -107,10 +107,10 @@ public CoralFanEntity(Vector3 position, String coralType) { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); - return Collections.singleton(new CoralFanEntity(position, json.get("coral_type").stringValue("tube"))); + return new CoralFanEntity(position, json.get("coral_type").stringValue("tube")); } diff --git a/chunky/src/java/se/llbit/chunky/entity/CowEntity.java b/chunky/src/java/se/llbit/chunky/entity/CowEntity.java index 3ed324b492..f446351acf 100644 --- a/chunky/src/java/se/llbit/chunky/entity/CowEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/CowEntity.java @@ -274,8 +274,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new CowEntity(json)); + public static Entity fromJson(JsonObject json) { + return new CowEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/Entity.java b/chunky/src/java/se/llbit/chunky/entity/Entity.java index 15cf29e383..09744ce5b8 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Entity.java +++ b/chunky/src/java/se/llbit/chunky/entity/Entity.java @@ -21,6 +21,7 @@ import se.llbit.chunky.model.minecraft.DecoratedPotModel; import se.llbit.json.JsonObject; import se.llbit.json.JsonValue; +import se.llbit.log.Log; import se.llbit.math.Grid; import se.llbit.math.Octree; import se.llbit.math.Vector3; @@ -28,6 +29,7 @@ import se.llbit.math.primitive.Primitive; import java.util.Collection; +import java.util.LinkedList; /** * Represents Minecraft entities that are not stored in the octree. @@ -68,72 +70,52 @@ public void loadDataFromOctree(Octree octree, BlockPalette palette, Vector3i ori /** * Unmarshalls an entity object from JSON data. * + *

This method only returns a {@link Collection} to support legacy scenes.

+ * * @param json json data. - * @return unmarshalled entity, or {@code null} if it was not a valid entity. + * @return The entities, or an empty collection if no entity was found. */ - public static Collection fromJson(JsonObject json) { + public static Collection entitiesFromJson(JsonObject json) { String kind = json.get("kind").stringValue(""); + Collection entities = new LinkedList<>(); switch (kind) { - case "painting": - return PaintingEntity.fromJson(json); - case "sign": - return SignEntity.fromJson(json); - case "wallsign": - return WallSignEntity.fromJson(json); - case "skull": - return SkullEntity.fromJson(json); - case "head": - return HeadEntity.fromJson(json); - case "player": - return PlayerEntity.fromJson(json); - case "standing_banner": - return StandingBanner.fromJson(json); - case "wall_banner": - return WallBanner.fromJson(json); - case "armor_stand": - return ArmorStand.fromJson(json); - case "lily_pad": - return LilyPadEntity.fromJson(json); - case "coral_fan": - return CoralFanEntity.fromJson(json); - case "wall_coral_fan": - return WallCoralFanEntity.fromJson(json); - case "lectern": - return Lectern.fromJson(json); - case "campfire": - return Campfire.fromJson(json); - case "book": - return Book.fromJson(json); - case "flameParticles": - return FlameParticles.fromJson(json); - case "beaconBeam": - return BeaconBeam.fromJson(json); - case "sporeBlossom": - return SporeBlossom.fromJson(json); - case "decoratedPotSpout": - return DecoratedPotModel.DecoratedPotSpoutEntity.fromJson(json); - case "calibratedSculkSensorAmethyst": - return CalibratedSculkSensorAmethyst.fromJson(json); - case "hangingSign": - return HangingSignEntity.fromJson(json); - case "wallHangingSign": - return WallHangingSignEntity.fromJson(json); - case "sheep": - return SheepEntity.fromJson(json); - case "cow": - return CowEntity.fromJson(json); - case "chicken": - return ChickenEntity.fromJson(json); - case "pig": - return PigEntity.fromJson(json); - case "mooshroom": - return MooshroomEntity.fromJson(json); - case "squid": - return SquidEntity.fromJson(json); - case "copperGolemStatue": - return CopperGolemStatueEntity.fromJson(json); + case "painting" -> entities.add(PaintingEntity.fromJson(json)); + case "sign" -> entities.add(SignEntity.fromJson(json)); + case "wallsign" -> entities.add(WallSignEntity.fromJson(json)); + case "skull" -> entities.add(SkullEntity.fromJson(json)); + case "head" -> entities.add(HeadEntity.fromJson(json)); + case "player" -> entities.add(PlayerEntity.fromJson(json)); + case "standing_banner" -> entities.add(StandingBanner.fromJson(json)); + case "wall_banner" -> entities.add(WallBanner.fromJson(json)); + case "armor_stand" -> entities.add(ArmorStand.fromJson(json)); + case "lily_pad" -> entities.add(LilyPadEntity.fromJson(json)); + case "coral_fan" -> entities.add(CoralFanEntity.fromJson(json)); + case "wall_coral_fan" -> entities.add(WallCoralFanEntity.fromJson(json)); + case "lectern" -> { + if (json.get("book").isObject()) { // we still get the book from the lectern json to be compatible with the old format + entities.add(Book.fromJson(json.get("book").object())); + } + entities.add(Lectern.fromJson(json)); + } + case "campfire" -> entities.add(Campfire.fromJson(json)); + case "book" -> entities.add(Book.fromJson(json)); + case "flameParticles" -> entities.add(FlameParticles.fromJson(json)); + case "beaconBeam" -> entities.add(BeaconBeam.fromJson(json)); + case "sporeBlossom" -> entities.add(SporeBlossom.fromJson(json)); + case "decoratedPotSpout" -> entities.add(DecoratedPotModel.DecoratedPotSpoutEntity.fromJson(json)); + case "calibratedSculkSensorAmethyst" -> entities.add(CalibratedSculkSensorAmethyst.fromJson(json)); + case "hangingSign" -> entities.add(HangingSignEntity.fromJson(json)); + case "wallHangingSign" -> entities.add(WallHangingSignEntity.fromJson(json)); + case "sheep" -> entities.add(SheepEntity.fromJson(json)); + case "cow" -> entities.add(CowEntity.fromJson(json)); + case "chicken" -> entities.add(ChickenEntity.fromJson(json)); + case "pig" -> entities.add(PigEntity.fromJson(json)); + case "mooshroom" -> entities.add(MooshroomEntity.fromJson(json)); + case "squid" -> entities.add(SquidEntity.fromJson(json)); + case "copperGolemStatue" -> entities.add(CopperGolemStatueEntity.fromJson(json)); + default -> Log.errorf("Found unknown entity %s when loading from scene.", kind); } - return null; + return entities; } public Vector3 getPosition() { diff --git a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java index 7fa19f8eb3..9f2ee1f2f7 100644 --- a/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java +++ b/chunky/src/java/se/llbit/chunky/entity/FlameParticles.java @@ -120,8 +120,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new FlameParticles(json)); + public static Entity fromJson(JsonObject json) { + return new FlameParticles(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java index 4e218930cb..ca156584d9 100644 --- a/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java @@ -289,7 +289,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -307,7 +307,7 @@ public static Collection fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); SignEntity.Color backDye = SignEntity.Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return Collections.singleton(new HangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, attached, material)); + return new HangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, attached, material); } public static Texture textureFromMaterial(String material) { diff --git a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java index ef98f626a8..deec5532b3 100644 --- a/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/HeadEntity.java @@ -193,14 +193,14 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); //int type = json.get("type").intValue(0); int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); String skin = json.get("skin").stringValue(""); - return Collections.singleton(new HeadEntity(position, skin, rotation, placement)); + return new HeadEntity(position, skin, rotation, placement); } diff --git a/chunky/src/java/se/llbit/chunky/entity/Lectern.java b/chunky/src/java/se/llbit/chunky/entity/Lectern.java index 4bbfa35fc8..8f1ceb2241 100644 --- a/chunky/src/java/se/llbit/chunky/entity/Lectern.java +++ b/chunky/src/java/se/llbit/chunky/entity/Lectern.java @@ -196,18 +196,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - Lectern lectern = new Lectern(json); - - Collection entities = new ArrayList<>(); - entities.add(lectern); - if (json.get("book").isObject()) { // we still get the book from the lectern json to be compatible with the old format - entities.addAll(Book.fromJson(json.get("book").object())); - } else if (json.get("hasBook").asBoolean(false)) { - entities.add(createBookEntity(lectern.getPosition(), lectern.facing)); - } - - return entities; + public static Entity fromJson(JsonObject json) { + return new Lectern(json); } private static int getOrientationIndex(String facing) { diff --git a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java index d28e84da84..c23965aea4 100644 --- a/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/LilyPadEntity.java @@ -90,11 +90,11 @@ public LilyPadEntity(Vector3 position, int rotation) { /** * Unmarshall a lily pad entity from JSON data. */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return Collections.singleton(new LilyPadEntity(position, rotation)); + return new LilyPadEntity(position, rotation); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java b/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java index 513e61aa9b..cb8f7fa589 100644 --- a/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java @@ -250,8 +250,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new MooshroomEntity(json)); + public static Entity fromJson(JsonObject json) { + return new MooshroomEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java index 55fc6f09d1..4c2bc84474 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java @@ -147,12 +147,12 @@ public JsonValue toJson() { * * @return deserialized entity, or {@code null} if it was not a valid entity */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); String art = json.get("art").stringValue(""); double angle = json.get("angle").doubleValue(0.0); - return Collections.singleton(new PaintingEntity(position, art, angle)); + return new PaintingEntity(position, art, angle); } public static void resetPaintings() { diff --git a/chunky/src/java/se/llbit/chunky/entity/PigEntity.java b/chunky/src/java/se/llbit/chunky/entity/PigEntity.java index 42655201b1..4182556cea 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PigEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PigEntity.java @@ -218,8 +218,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new PigEntity(json)); + public static Entity fromJson(JsonObject json) { + return new PigEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java index fc5e95e1b7..1712ce366d 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java @@ -957,8 +957,8 @@ private static TextureLoader leatherTexture(String id, int color, Texture textur new ColoredTexture(textureName, color, texture)); } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new PlayerEntity(json)); + public static Entity fromJson(JsonObject json) { + return new PlayerEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java b/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java index f335c42e98..c5b9c5d7b7 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java @@ -362,8 +362,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new SheepEntity(json)); + public static Entity fromJson(JsonObject json) { + return new SheepEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java index 55e1aff256..6764ea7c68 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java @@ -586,7 +586,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -603,7 +603,7 @@ public static Collection fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); Color backDye = Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return Collections.singleton(new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); + return new SignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material); } /** diff --git a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java index da74d1dbed..b3a7583b12 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java @@ -297,12 +297,12 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); Kind type = Kind.values()[json.get("type").intValue(0)]; int rotation = json.get("rotation").intValue(0); int placement = json.get("placement").intValue(0); - return Collections.singleton(new SkullEntity(position, type, rotation, placement)); + return new SkullEntity(position, type, rotation, placement); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java index dc39bf0713..1a6eb8675b 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java +++ b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java @@ -39,7 +39,7 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new SporeBlossom(json)); + public static Entity fromJson(JsonObject json) { + return new SporeBlossom(json); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java b/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java index 58bd6ef427..d028e43328 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java @@ -188,8 +188,8 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new SquidEntity(json)); + public static Entity fromJson(JsonObject json) { + return new SquidEntity(json); } @Override diff --git a/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java b/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java index 30af4e5880..1eb8b5995f 100644 --- a/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java +++ b/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java @@ -212,11 +212,11 @@ public JsonValue toJson() { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return Collections.singleton(new StandingBanner(position, rotation, json.get("design").object())); + return new StandingBanner(position, rotation, json.get("design").object()); } public static Material getBannerTexture(JsonObject design) { diff --git a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java index bec443b899..0ccddf604a 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java @@ -144,10 +144,10 @@ public WallBanner(Vector3 position, int rotation, CompoundTag entityTag) { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); int rotation = json.get("rotation").intValue(0); - return Collections.singleton(new WallBanner(position, rotation, json.get("design").object())); + return new WallBanner(position, rotation, json.get("design").object()); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java index 0140566498..faa403061d 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java @@ -105,11 +105,11 @@ public WallCoralFanEntity(Vector3 position, String coralType, String facing) { return json; } - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); String coralType = json.get("coral_type").stringValue("tube"); String facing = json.get("facing").stringValue("north"); - return Collections.singleton(new WallCoralFanEntity(position, coralType, facing)); + return new WallCoralFanEntity(position, coralType, facing); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java index 5ca6fc6ce4..2ae17891d7 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java @@ -273,7 +273,7 @@ public JsonValue toJson() { /** * Unmarshalls a sign entity from JSON data. */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] frontText = null; @@ -290,6 +290,6 @@ public static Collection fromJson(JsonObject json) { boolean glowing = json.get("glowing").boolValue(false); SignEntity.Color backDye = SignEntity.Color.getFromDyedSign(json.get("backDye").stringValue(null)); boolean backGlowing = json.get("backGlowing").boolValue(false); - return Collections.singleton(new WallHangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material)); + return new WallHangingSignEntity(position, frontText, dye, glowing, backText, backDye, backGlowing, direction, material); } } diff --git a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java index eb4031b8fe..b4e791623f 100644 --- a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java @@ -167,7 +167,7 @@ public JsonValue toJson() { /** * Unmarshalls a wall sign entity from JSON data. */ - public static Collection fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { Vector3 position = new Vector3(); position.fromJson(json.get("position").object()); JsonArray[] text = null; @@ -178,6 +178,6 @@ public static Collection fromJson(JsonObject json) { String material = json.get("material").stringValue("oak"); SignEntity.Color dye = SignEntity.Color.getFromDyedSign(json.get("dye").stringValue(null)); boolean glowing = json.get("glowing").boolValue(false); - return Collections.singleton(new WallSignEntity(position, text, dye, glowing, direction, material)); + return new WallSignEntity(position, text, dye, glowing, direction, material); } } diff --git a/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java b/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java index 66af45f92a..dfb3d836c1 100644 --- a/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java +++ b/chunky/src/java/se/llbit/chunky/model/minecraft/DecoratedPotModel.java @@ -157,11 +157,11 @@ public Collection primitives(Vector3 offset) { return primitives; } - public static Collection fromJson(JsonObject json) { - return Collections.singleton(new DecoratedPotSpoutEntity( + public static Entity fromJson(JsonObject json) { + return new DecoratedPotSpoutEntity( JsonUtil.vec3FromJsonObject(json.get("position")), json.get("facing").stringValue("north") - )); + ); } @Override diff --git a/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java b/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java index b25f3c8b75..0a77309bca 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/SceneEntities.java @@ -321,7 +321,7 @@ public void importJsonData(JsonObject json) { // rather than the actors array. In future versions only the actors // array should contain poseable entities. for (JsonValue element : json.get("entities").array()) { - Collection entity = Entity.fromJson(element.object()); + Collection entity = Entity.entitiesFromJson(element.object()); if (entity != null) { if (entity instanceof PlayerEntity) { actors.addAll(entity); @@ -331,7 +331,7 @@ public void importJsonData(JsonObject json) { } } for (JsonValue element : json.get("actors").array()) { - Collection entity = Entity.fromJson(element.object()); + Collection entity = Entity.entitiesFromJson(element.object()); actors.addAll(entity); } }