diff --git a/chunky/src/java/se/llbit/chunky/block/Block.java b/chunky/src/java/se/llbit/chunky/block/Block.java index eb1b86950..6e12fd960 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 { @@ -99,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) { - throw new Error("This block type can not be converted to a block entity: " + /** + * 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 Entity toEntity(Vector3 position) { - throw new Error("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 864734b46..7c87ac76a 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 540cc01da..2861304c4 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 ff46332ae..b445c24f2 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 e9a204e6b..3b4d87987 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 3f6949024..73009fdce 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 c6cdb2f97..b692c55d1 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 { @@ -51,18 +53,18 @@ 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 Entity toEntity(Vector3 position) { - return new FlameParticles(position, entity); + public Collection createEntities(Vector3 position) { + return Collections.singleton(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 bb4e50365..d0425c294 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; @@ -46,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 Entity toEntity(Vector3 position) { - return new CalibratedSculkSensorAmethyst(position, this.facing, isActive(), this); + 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 42c4d5949..fa7d5601b 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 6c41351fc..d236fa737 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 { @@ -79,21 +81,21 @@ 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 Entity toEntity(Vector3 position) { + public Collection createEntities(Vector3 position) { if (entity != null) { - return new FlameParticles(position, entity); + return Collections.singleton(new FlameParticles(position, entity)); } else { - return 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/CopperGolemStatue.java b/chunky/src/java/se/llbit/chunky/block/minecraft/CopperGolemStatue.java index 490bfa536..2bf3c1615 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 d68a3111c..6bff868e9 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; @@ -68,11 +71,11 @@ public static Texture coralTexture(String coralType) { return false; } - @Override public boolean isEntity() { + @Override public boolean hasEntities() { return true; } - @Override public Entity toEntity(Vector3 position) { - return new CoralFanEntity(position, coralType); + @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 87308fa0e..c398a97bc 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 7b4a2bf51..fd4412e0e 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() { @@ -35,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 Entity toEntity(Vector3 position) { + public Collection createEntities(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.singleton(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 f669c87a7..f63195afc 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 c9cbb0413..da39c30de 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 { @@ -62,13 +64,13 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return type != Kind.PLAYER; } @Override - public Entity toEntity(Vector3 position) { - return new SkullEntity(position, type, rotation, 1); + public Collection createEntities(Vector3 position) { + return Collections.singleton(new SkullEntity(position, type, rotation, 1)); } @Override @@ -77,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 ee8071214..a769f5bc8 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; @@ -44,12 +46,12 @@ public boolean intersect(Ray ray, Scene scene) { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public Entity toEntity(Vector3 position) { - return new se.llbit.chunky.entity.Lectern(position, this.facing, this.hasBook); + 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 96d89236c..0ee6a5cb4 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); @@ -38,11 +41,11 @@ public LilyPad() { return false; } - @Override public boolean isEntity() { + @Override public boolean hasEntities() { return true; } - @Override public Entity toEntity(Vector3 position) { - return new LilyPadEntity(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 fd5ab1622..ab9b68cab 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 c9a8ea0e0..95974f008 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() { @@ -40,12 +43,12 @@ public boolean intersect(Ray ray, Scene scene) { } @Override - public boolean isEntity() { + public boolean hasEntities() { return true; } @Override - public Entity toEntity(Vector3 position) { - return new se.llbit.chunky.entity.SporeBlossom(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 816a92618..bb6467255 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 c1c1f1f60..463f19609 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; @@ -43,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 Entity toEntity(Vector3 position) { - return new WallCoralFanEntity(position, coralType, facing); + @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 1afccff9f..8334e4ab0 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 8cd02a59c..c860729cf 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; @@ -72,13 +73,13 @@ public String description() { } @Override - public boolean isEntity() { + public boolean hasEntities() { return type != Kind.PLAYER; } @Override - public Entity toEntity(Vector3 position) { - return new SkullEntity(position, type, 0, facing); + public Collection createEntities(Vector3 position) { + return Collections.singleton(new SkullEntity(position, type, 0, facing)); } @Override @@ -87,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 dd833d102..7ddfdb4de 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/entity/ArmorStand.java b/chunky/src/java/se/llbit/chunky/entity/ArmorStand.java index 4016b6070..0c712c803 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java b/chunky/src/java/se/llbit/chunky/entity/BeaconBeam.java index 2fac83168..39883ca3d 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,7 +227,7 @@ public JsonValue toJson() { return json; } - public static BeaconBeam fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new BeaconBeam(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/Book.java b/chunky/src/java/se/llbit/chunky/entity/Book.java index 5179d9f79..0038e334f 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,7 +296,7 @@ public JsonValue toJson() { return json; } - public static Book fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new Book(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java b/chunky/src/java/se/llbit/chunky/entity/CalibratedSculkSensorAmethyst.java index b6fe4591e..65ba6ac8c 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/Campfire.java b/chunky/src/java/se/llbit/chunky/entity/Campfire.java index 36c843686..8d22988e6 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; diff --git a/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java b/chunky/src/java/se/llbit/chunky/entity/ChickenEntity.java index 5ef759989..27c20a027 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,7 +239,7 @@ public JsonValue toJson() { return json; } - public static ChickenEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new ChickenEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/CoralFanEntity.java index 5b39a00c1..d2c6a7d46 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; /** diff --git a/chunky/src/java/se/llbit/chunky/entity/CowEntity.java b/chunky/src/java/se/llbit/chunky/entity/CowEntity.java index 9348594b0..f446351ac 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,7 +274,7 @@ public JsonValue toJson() { return json; } - public static CowEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new CowEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/Entity.java b/chunky/src/java/se/llbit/chunky/entity/Entity.java index b1e46a679..09744ce5b 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 Entity 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 1f0945d20..9f2ee1f2f 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; diff --git a/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/HangingSignEntity.java index 7037aba93..ca156584d 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/Lectern.java b/chunky/src/java/se/llbit/chunky/entity/Lectern.java index c2ab652e5..8f1ceb224 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,20 +193,9 @@ 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 boolean hasBook() { - return book != null; - } - public static Entity fromJson(JsonObject json) { return new Lectern(json); } @@ -274,31 +259,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 1c934094b..c23965aea 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java b/chunky/src/java/se/llbit/chunky/entity/MooshroomEntity.java index 5b9e1db1e..cb8f7fa58 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,7 +250,7 @@ public JsonValue toJson() { return json; } - public static MooshroomEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new MooshroomEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java b/chunky/src/java/se/llbit/chunky/entity/PaintingEntity.java index fb86e1571..4c2bc8447 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; diff --git a/chunky/src/java/se/llbit/chunky/entity/PigEntity.java b/chunky/src/java/se/llbit/chunky/entity/PigEntity.java index f2e7c9b30..4182556ce 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,7 +218,7 @@ public JsonValue toJson() { return json; } - public static PigEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new PigEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java index 1f36ecbdb..1712ce366 100644 --- a/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/PlayerEntity.java @@ -957,7 +957,7 @@ private static TextureLoader leatherTexture(String id, int color, Texture textur new ColoredTexture(textureName, color, texture)); } - public static PlayerEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new PlayerEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java b/chunky/src/java/se/llbit/chunky/entity/SheepEntity.java index 864648c6d..c5b9c5d7b 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,7 +362,7 @@ public JsonValue toJson() { return json; } - public static SheepEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new SheepEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/SignEntity.java b/chunky/src/java/se/llbit/chunky/entity/SignEntity.java index 03d5540df..6764ea7c6 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java index 3a110072a..b3a7583b1 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; /** diff --git a/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java b/chunky/src/java/se/llbit/chunky/entity/SporeBlossom.java index 470e0736d..1a6eb8675 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; diff --git a/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java b/chunky/src/java/se/llbit/chunky/entity/SquidEntity.java index e5585beac..d028e4332 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,7 +188,7 @@ public JsonValue toJson() { return json; } - public static SquidEntity fromJson(JsonObject json) { + public static Entity fromJson(JsonObject json) { return new SquidEntity(json); } diff --git a/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java b/chunky/src/java/se/llbit/chunky/entity/StandingBanner.java index e8badb5e4..1eb8b5995 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; /** diff --git a/chunky/src/java/se/llbit/chunky/entity/WallBanner.java b/chunky/src/java/se/llbit/chunky/entity/WallBanner.java index d432ccd19..0ccddf604 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; /** diff --git a/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallCoralFanEntity.java index c779bf802..faa403061 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; /** diff --git a/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallHangingSignEntity.java index dee93a532..2ae17891d 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 { diff --git a/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java b/chunky/src/java/se/llbit/chunky/entity/WallSignEntity.java index c09691ece..b4e791623 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 { 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 63bcfadc6..dfb3d836c 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 { 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 bc4bc6bf6..70d9b0fbb 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java @@ -1002,33 +1002,35 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map entitiesFromBlock = block.createEntities(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()) { - block = palette.water; - octNode = palette.waterId; - } else { - block = Air.INSTANCE; - octNode = palette.airId; - } + if (!block.isReplacedByEntities()) { + if (block.isWaterlogged()) { + block = palette.water; + octNode = palette.waterId; + } else { + block = Air.INSTANCE; + octNode = palette.airId; } } } @@ -1200,7 +1202,7 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map entity = Entity.entitiesFromJson(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.entitiesFromJson(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 10e269dd2..03b999e32 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;