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 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) {