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;