9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-30 12:29:20 +00:00
This commit is contained in:
Daniel Mills
2020-08-21 03:48:53 -04:00
parent 7b94d753b8
commit 39b7563d3a
24 changed files with 773 additions and 29 deletions

View File

@@ -1,14 +1,17 @@
package com.volmit.iris.gen;
import java.io.IOException;
import java.util.List;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator;
import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.gen.atomics.AtomicWorldData;
import com.volmit.iris.gen.atomics.MasterLock;
import com.volmit.iris.gen.layer.GenLayerUpdate;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomeMutation;
import com.volmit.iris.object.IrisObjectPlacement;
@@ -40,6 +43,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
private MasterLock masterLock;
private IrisLock lock = new IrisLock("ParallaxLock");
private IrisLock lockq = new IrisLock("ParallaxQueueLock");
private GenLayerUpdate glUpdate;
private int sliverBuffer;
public ParallaxChunkGenerator(String dimensionName, int threads)
@@ -82,6 +86,12 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
return getHighest(x, z, false);
}
@Override
public void onHotload()
{
super.onHotload();
}
@Override
public int getHighest(int x, int z, boolean ignoreFluid)
{
@@ -163,6 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
return new AtomicSliverMap();
}
@Override
public List<BlockPopulator> getDefaultPopulators(World world)
{
List<BlockPopulator> g = super.getDefaultPopulators(world);
if(glUpdate == null)
{
glUpdate = new GenLayerUpdate(this, world);
}
g.add(glUpdate);
return g;
}
@Override
protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
@@ -178,11 +202,13 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
{
onGenerateParallax(random, x, z);
getParallaxChunk(x, z).inject(data);
setSliverBuffer(getSliverCache().size());
getParallaxChunk(x, z).setWorldGenerated(true);
getMasterLock().clear();
}
getParallaxChunk(x, z).injectUpdates(map);
setSliverBuffer(getSliverCache().size());
getParallaxChunk(x, z).setWorldGenerated(true);
getMasterLock().clear();
p.end();
getMetrics().getParallax().put(p.getMilliseconds());
super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);

View File

@@ -101,7 +101,7 @@ public class AtomicSliver
modified = true;
block.put(h, d);
if(B.isLit(d))
if(B.isUpdatable(d))
{
update(h);
}
@@ -293,4 +293,9 @@ public class AtomicSliver
{
return M.ms() - last > m;
}
public void inject(KSet<Integer> updatables)
{
update.addAll(updatables);
}
}

View File

@@ -114,4 +114,15 @@ public class AtomicSliverMap
return false;
}
public void injectUpdates(AtomicSliverMap map)
{
for(int i = 0; i < 16; i++)
{
for(int j = 0; j < 16; j++)
{
getSliver(i, j).inject(map.getSliver(i, j).getUpdatables());
}
}
}
}

View File

@@ -0,0 +1,164 @@
package com.volmit.iris.gen.layer;
import java.util.Random;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.ParallaxChunkGenerator;
import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.object.InventorySlotType;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisLootReference;
import com.volmit.iris.object.IrisLootTable;
import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.LootMode;
import com.volmit.iris.util.B;
import com.volmit.iris.util.IrisStructureResult;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KSet;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
public class GenLayerUpdate extends BlockPopulator
{
private ParallaxChunkGenerator gen;
private RNG rng;
public GenLayerUpdate(ParallaxChunkGenerator gen, World w)
{
this.gen = gen;
this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289);
}
@Override
public void populate(World w, Random r, Chunk c)
{
PrecisionStopwatch p = PrecisionStopwatch.start();
AtomicSliverMap map = gen.getParallaxChunk(c.getX(), c.getZ());
RNG rx = rng.nextParallelRNG(c.getX()).nextParallelRNG(c.getZ());
for(int i = 0; i < 16; i++)
{
for(int j = 0; j < 16; j++)
{
for(int k : map.getSliver(i, j).getUpdatables())
{
if(k > 255 || k < 0)
{
continue;
}
update(c, i, k, j, i + (c.getX() << 4), i + (c.getZ() << 4), rx);
}
}
}
p.end();
gen.getMetrics().getUpdate().put(p.getMilliseconds());
}
public void update(Chunk c, int x, int y, int z, int rx, int rz, RNG rng)
{
Block b = c.getBlock(x, y, z);
BlockData d = b.getBlockData();
if(B.isLit(d.getMaterial()))
{
updateLight(b, d);
}
else if(B.isStorage(d.getMaterial()))
{
updateStorage(b, d, rx, rz, rng);
}
}
public void injectTables(KSet<IrisLootTable> list, IrisLootReference r)
{
if(r.getMode().equals(LootMode.CLEAR) || r.getMode().equals(LootMode.REPLACE))
{
list.clear();
}
list.addAll(r.getLootTables(gen));
}
public KSet<IrisLootTable> getLootTables(Block b)
{
int rx = b.getX();
int rz = b.getZ();
IrisRegion region = gen.sampleRegion(rx, rz);
IrisBiome biomeSurface = gen.sampleTrueBiome(rx, rz).getBiome();
IrisBiome biomeUnder = gen.sampleTrueBiome(rx, b.getY(), rz).getBiome();
KSet<IrisLootTable> tables = new KSet<>();
IrisStructureResult structure = gen.getStructure(rx, b.getY(), rz);
injectTables(tables, gen.getDimension().getLoot());
injectTables(tables, region.getLoot());
injectTables(tables, biomeSurface.getLoot());
injectTables(tables, biomeUnder.getLoot());
if(structure != null && structure.getTile() != null)
{
injectTables(tables, structure.getStructure().getLoot());
injectTables(tables, structure.getTile().getLoot());
}
return tables;
}
public void addItems(boolean debug, Inventory inv, RNG rng, KSet<IrisLootTable> tables, InventorySlotType slot, int x, int y, int z)
{
KList<ItemStack> items = new KList<>();
for(IrisLootTable i : tables)
{
items.addAll(i.getLoot(debug, rng, slot, x, y, z));
}
for(ItemStack i : items)
{
inv.addItem(i);
}
}
public void updateStorage(Block b, BlockData data, int rx, int rz, RNG rng)
{
InventorySlotType slot = null;
if(B.isStorageChest(data.getMaterial()))
{
slot = InventorySlotType.STORAGE;
}
if(slot != null)
{
KSet<IrisLootTable> tables = getLootTables(b);
try
{
InventoryHolder m = (InventoryHolder) b.getState();
addItems(false, m.getInventory(), rng, tables, slot, rx, b.getY(), rz);
}
catch(Throwable e)
{
Iris.error("NOT INVENTORY: " + data.getMaterial().name());
}
}
}
public void updateLight(Block b, BlockData data)
{
b.setType(Material.AIR, false);
b.setBlockData(data, false);
}
}