diff --git a/pom.xml b/pom.xml
index 3db491308..368b93c79 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.volmit
Iris
- 1.3
+ 1.3.1
Iris
false
diff --git a/src/main/java/com/volmit/iris/generator/IrisEngine.java b/src/main/java/com/volmit/iris/generator/IrisEngine.java
index 8564161cb..5cc809562 100644
--- a/src/main/java/com/volmit/iris/generator/IrisEngine.java
+++ b/src/main/java/com/volmit/iris/generator/IrisEngine.java
@@ -127,6 +127,7 @@ public class IrisEngine extends BlockPopulator implements Engine
{
getWorldManager().spawnInitialEntities(c);
updateChunk(c);
+ placeTiles(c);
}
@Override
diff --git a/src/main/java/com/volmit/iris/generator/IrisWorldManager.java b/src/main/java/com/volmit/iris/generator/IrisWorldManager.java
index f6b498fa6..2ae5aec77 100644
--- a/src/main/java/com/volmit/iris/generator/IrisWorldManager.java
+++ b/src/main/java/com/volmit/iris/generator/IrisWorldManager.java
@@ -9,6 +9,7 @@ import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RNG;
import org.bukkit.Chunk;
+import org.bukkit.Location;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
@@ -34,6 +35,18 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
@Override
public void spawnInitialEntities(Chunk c) {
RNG rng = new RNG(Cache.key(c));
+
+ getEngine().getParallaxAccess().getEntitiesR(c.getX(), c.getZ()).iterateSync((x,y,z,e) -> {
+ if(e != null)
+ {
+ IrisEntity en = getData().getEntityLoader().load(e);
+
+ if(en != null){
+ en.spawn(getEngine(), new Location(c.getWorld(), x+(c.getX()<<4),y,z+(c.getZ()<<4)));
+ }
+ }
+ });
+
int x = (c.getX() * 16) + rng.nextInt(15);
int z = (c.getZ() * 16) + rng.nextInt(15);
int y = getEngine().getHeight(x, z) + 1;
@@ -43,6 +56,8 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
trySpawn(above.getEntityInitialSpawns(), c, rng);
trySpawn(region.getEntityInitialSpawns(), c, rng);
trySpawn(dim.getEntityInitialSpawns(), c, rng);
+
+
}
@Override
diff --git a/src/main/java/com/volmit/iris/object/IrisEntity.java b/src/main/java/com/volmit/iris/object/IrisEntity.java
index f3cad9e19..507a10eec 100644
--- a/src/main/java/com/volmit/iris/object/IrisEntity.java
+++ b/src/main/java/com/volmit/iris/object/IrisEntity.java
@@ -279,11 +279,6 @@ public class IrisEntity extends IrisRegistrant
return Iris.linkMythicMobs.spawn(getMythicalType(), at);
}
- if(isCitizens())
- {
- // TODO: return Iris.linkCitizens.spawn(getType(), at); SPAWN SOME TYPE TOO
- }
-
return at.getWorld().spawnEntity(at, getType());
}
diff --git a/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java b/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java
index 22915a5ed..0a4418ef5 100644
--- a/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java
+++ b/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java
@@ -18,7 +18,6 @@ import org.bukkit.entity.Entity;
@Data
public class IrisEntityInitialSpawn
{
-
@RegistryListEntity
@Required
@DontObfuscate
diff --git a/src/main/java/com/volmit/iris/object/IrisJigsawPieceConnector.java b/src/main/java/com/volmit/iris/object/IrisJigsawPieceConnector.java
index b5ceba93a..585d236c3 100644
--- a/src/main/java/com/volmit/iris/object/IrisJigsawPieceConnector.java
+++ b/src/main/java/com/volmit/iris/object/IrisJigsawPieceConnector.java
@@ -40,6 +40,11 @@ public class IrisJigsawPieceConnector
@Required
private KList pools = new KList<>();
+ @RegistryListEntity
+ @DontObfuscate
+ @Desc("Pick an entity to spawn on this connector")
+ private String spawnEntity;
+
@DontObfuscate
@Desc("The relative position this connector is located at for connecting to other pieces")
@Required
@@ -63,6 +68,7 @@ public class IrisJigsawPieceConnector
c.setDirection(getDirection());
c.setRotateConnector(isRotateConnector());
c.setName(getName());
+ c.setSpawnEntity(getSpawnEntity());
c.setPools(getPools().copy());
return c;
}
diff --git a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java
index 70da17fb7..022eadac5 100644
--- a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java
+++ b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java
@@ -155,6 +155,9 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
}
}
+ public default void placeTiles(Chunk c) {
+
+ }
@Override
public default void updateChunk(Chunk c)
diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java b/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java
index 112ed28a4..c9db250b9 100644
--- a/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java
+++ b/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java
@@ -1425,4 +1425,13 @@ public interface Hunk
}
}
}
+
+ /**
+ * Acts like fill, however if used by a mapped hunk, will simply clear it
+ * @param b the data to use for fill
+ */
+ default void empty(T b)
+ {
+ fill(b);
+ }
}
diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java b/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java
index d258b0679..1cfd083ba 100644
--- a/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java
+++ b/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java
@@ -53,6 +53,12 @@ public class MappedHunk extends StorageHunk implements Hunk
return this;
}
+ @Override
+ public void empty(T b)
+ {
+ data.clear();
+ }
+
@Override
public T getRaw(int x, int y, int z)
{
diff --git a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java
index f7880e8f2..b6b538782 100644
--- a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java
+++ b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java
@@ -2,11 +2,15 @@ package com.volmit.iris.scaffold.jigsaw;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.*;
+import com.volmit.iris.object.tile.TileData;
import com.volmit.iris.util.AxisAlignedBB;
+import com.volmit.iris.util.IObjectPlacer;
import com.volmit.iris.util.KList;
+import com.volmit.iris.util.RNG;
import lombok.Data;
-import org.bukkit.Location;
import org.bukkit.World;
+import org.bukkit.block.TileState;
+import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector;
@Data
@@ -129,6 +133,58 @@ public class PlannedPiece {
}
public void place(World world) {
- getObject().placeCenterY(new Location(world, position.getX(), position.getY(), position.getZ()));
+
+ getPiece().getPlacementOptions().getRotation().setEnabled(false);
+ getObject().place(position.getX()+getObject().getCenter().getBlockX(), position.getY()+getObject().getCenter().getBlockY(), position.getZ()+getObject().getCenter().getBlockZ(), new IObjectPlacer() {
+ @Override
+ public int getHighest(int x, int z) {
+ return position.getY();
+ }
+
+ @Override
+ public int getHighest(int x, int z, boolean ignoreFluid) {
+ return position.getY();
+ }
+
+ @Override
+ public void set(int x, int y, int z, BlockData d) {
+ world.getBlockAt(x,y,z).setBlockData(d);
+ }
+
+ @Override
+ public BlockData get(int x, int y, int z) {
+ return world.getBlockAt(x,y,z).getBlockData();
+ }
+
+ @Override
+ public boolean isPreventingDecay() {
+ return false;
+ }
+
+ @Override
+ public boolean isSolid(int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ public boolean isUnderwater(int x, int z) {
+ return false;
+ }
+
+ @Override
+ public int getFluidHeight() {
+ return 0;
+ }
+
+ @Override
+ public boolean isDebugSmartBore() {
+ return false;
+ }
+
+ @Override
+ public void setTile(int xx, int yy, int zz, TileData extends TileState> tile) {
+
+ }
+ }, piece.getPlacementOptions(), new RNG(), getData());
}
}
diff --git a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedStructure.java b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedStructure.java
index 4302407ae..cea815abe 100644
--- a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedStructure.java
+++ b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedStructure.java
@@ -3,11 +3,17 @@ package com.volmit.iris.scaffold.jigsaw;
import com.volmit.iris.Iris;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.*;
+import com.volmit.iris.scaffold.IrisWorlds;
import com.volmit.iris.scaffold.engine.EngineParallaxManager;
+import com.volmit.iris.scaffold.engine.IrisAccess;
import com.volmit.iris.scaffold.parallax.ParallaxChunkMeta;
-import com.volmit.iris.util.*;
+import com.volmit.iris.util.IObjectPlacer;
+import com.volmit.iris.util.KList;
+import com.volmit.iris.util.KMap;
+import com.volmit.iris.util.RNG;
import lombok.Data;
import org.bukkit.Axis;
+import org.bukkit.Location;
import org.bukkit.World;
@Data
@@ -105,6 +111,27 @@ public class PlannedStructure {
meta.setMaxObject(Math.max(Math.max(meta.getMaxObject(), 0), yf));
}, null, getData());
+
+ for(IrisJigsawPieceConnector j : i.getAvailableConnectors())
+ {
+ if(j.getSpawnEntity() != null)
+ {
+ IrisPosition p = i.getWorldPosition(j).add(new IrisPosition(j.getDirection().toVector().multiply(2)));
+
+ if(options.getMode().equals(ObjectPlaceMode.PAINT) || options.isVacuum())
+ {
+ p.setY(placer.getHighest(xx, zz) + offset + (v.getH() / 2));
+ }
+
+ else
+ {
+ p.setY(height);
+ }
+
+ e.getParallaxAccess().setEntity(p.getX(), p.getY(), p.getZ(), j.getSpawnEntity());
+ }
+ }
+
if(options.isVacuum())
{
int dx = xx;
@@ -126,6 +153,23 @@ public class PlannedStructure {
{
for(PlannedPiece i : pieces)
{
+ Iris.sq(() -> {
+ for(IrisJigsawPieceConnector j : i.getAvailableConnectors())
+ {
+ if(j.getSpawnEntity() != null)
+ {
+ IrisPosition p = i.getWorldPosition(j).add(new IrisPosition(j.getDirection().toVector().multiply(2)));
+ IrisEntity e = getData().getEntityLoader().load(j.getSpawnEntity());
+ IrisAccess a = IrisWorlds.access(world);
+
+ if(a != null)
+ {
+ e.spawn(a.getCompound().getEngineForHeight(p.getY()), new Location(world, p.getX(), p.getY(), p.getZ()), rng);
+ }
+ }
+ }
+ });
+
Iris.sq(() -> i.place(world));
}
}
diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java
index cd3c08ed8..aeb3f7ea6 100644
--- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java
+++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java
@@ -30,6 +30,14 @@ public interface ParallaxAccess {
getObjectsRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
}
+ default String getEntity(int x, int y, int z) {
+ return getEntitiesR(x >> 4, z >> 4).get(x & 15, y, z & 15);
+ }
+
+ default void setEntity(int x, int y, int z, String d) {
+ getEntitiesRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
+ }
+
default Boolean isUpdate(int x, int y, int z) {
return getUpdatesR(x >> 4, z >> 4).get(x & 15, y, z & 15);
}
@@ -109,6 +117,10 @@ public interface ParallaxAccess {
public Hunk getObjectsRW(int x, int z);
+ public Hunk getEntitiesRW(int x, int z);
+
+ public Hunk getEntitiesR(int x, int z);
+
public Hunk getUpdatesR(int x, int z);
public Hunk getUpdatesRW(int x, int z);
@@ -131,9 +143,10 @@ public interface ParallaxAccess {
public default void delete(int x, int z)
{
- getUpdatesRW(x, z).fill(false);
- getBlocksRW(x, z).fill(null);
- getTilesRW(x, z).fill(null);
- getObjectsRW(x, z).fill(null);
+ getUpdatesRW(x, z).empty(false);
+ getBlocksRW(x, z).empty(null);
+ getTilesRW(x, z).empty(null);
+ getEntitiesRW(x, z).empty(null);
+ getObjectsRW(x, z).empty(null);
}
}
diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java
index 9349ab543..2e609ca4a 100644
--- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java
+++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java
@@ -24,6 +24,7 @@ public class ParallaxRegion extends HunkRegion
private HunkRegionSlice blockSlice;
private HunkRegionSlice> tileSlice;
private HunkRegionSlice objectSlice;
+ private HunkRegionSlice entitySlice;
private HunkRegionSlice updateSlice;
private final GridLock lock;
private long lastUse;
@@ -50,6 +51,7 @@ public class ParallaxRegion extends HunkRegion
blockSlice = HunkRegionSlice.BLOCKDATA.apply(height, getCompound());
tileSlice = HunkRegionSlice.TILE.apply(height, getCompound());
objectSlice = HunkRegionSlice.STRING.apply(height, getCompound(), "objects");
+ entitySlice = HunkRegionSlice.STRING.apply(height, getCompound(), "entities");
updateSlice = HunkRegionSlice.BOOLEAN.apply(height, getCompound(), "updates");
metaAdapter = ParallaxChunkMeta.adapter.apply(getCompound());
dirtyMeta = false;
@@ -152,6 +154,7 @@ public class ParallaxRegion extends HunkRegion
{
blockSlice.save();
objectSlice.save();
+ entitySlice.save();
tileSlice.save();
updateSlice.save();
saveMetaHunk();
@@ -163,6 +166,7 @@ public class ParallaxRegion extends HunkRegion
unloadMetaHunk();
return blockSlice.unloadAll()+
objectSlice.unloadAll()+
+ entitySlice.unloadAll()+
tileSlice.unloadAll()+
updateSlice.unloadAll();
}
@@ -172,6 +176,11 @@ public class ParallaxRegion extends HunkRegion
return blockSlice;
}
+ public HunkRegionSlice getEntitySlice() {
+ lastUse = M.ms();
+ return entitySlice;
+ }
+
public HunkRegionSlice> getTileSlice() {
lastUse = M.ms();
return tileSlice;
@@ -190,11 +199,12 @@ public class ParallaxRegion extends HunkRegion
public synchronized int cleanup(long c) {
return blockSlice.cleanup(c) +
objectSlice.cleanup(c) +
+ entitySlice.cleanup(c) +
tileSlice.cleanup(c) +
updateSlice.cleanup(c);
}
public int getChunkCount() {
- return blockSlice.getLoadCount() + objectSlice.getLoadCount() + tileSlice.getLoadCount() + updateSlice.getLoadCount();
+ return blockSlice.getLoadCount() + objectSlice.getLoadCount() + entitySlice.getLoadCount() + tileSlice.getLoadCount() + updateSlice.getLoadCount();
}
}
diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java
index fadd107cf..ff97e1469 100644
--- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java
+++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java
@@ -187,6 +187,16 @@ public class ParallaxWorld implements ParallaxAccess
return getRW(x >> 5, z >> 5).getObjectSlice().getRW(x & 31, z & 31);
}
+ @Override
+ public Hunk getEntitiesRW(int x, int z) {
+ return getRW(x >> 5, z >> 5).getEntitySlice().getRW(x & 31, z & 31);
+ }
+
+ @Override
+ public Hunk getEntitiesR(int x, int z) {
+ return getRW(x >> 5, z >> 5).getEntitySlice().getR(x & 31, z & 31);
+ }
+
@Override
public Hunk getUpdatesR(int x, int z)
{