This commit is contained in:
Daniel Mills
2020-08-29 14:30:12 -04:00
parent ed9ddc0825
commit 20b715f7cb
41 changed files with 17273 additions and 14829 deletions

View File

@@ -5,12 +5,17 @@ import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
@@ -34,9 +39,11 @@ import com.volmit.iris.object.IrisObject;
import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.IrisStructure;
import com.volmit.iris.util.B;
import com.volmit.iris.util.BlockPosition;
import com.volmit.iris.util.C;
import com.volmit.iris.util.ChronoLatch;
import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.M;
import com.volmit.iris.util.RNG;
@@ -47,6 +54,8 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener
{
private KList<BlockPosition> noLoot;
private BlockPosition allowLoot;
private AtomicMulticache cache;
private IrisDataManager data;
protected boolean failing;
@@ -79,10 +88,12 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
ticks = 0;
task = -1;
initialized = false;
allowLoot = new BlockPosition(0, 0, 0);
failing = false;
pregenDone = false;
dimCache = new AtomicCache<>();
dev = false;
noLoot = new KList<>(1285);
}
protected abstract void onGenerate(RNG masterRandom, int x, int z, ChunkData data, BiomeGrid grid);
@@ -174,6 +185,14 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
checkHotload();
if(noLoot.size() > 1024)
{
for(int i = 0; i < 64; i++)
{
noLoot.remove(0);
}
}
}
}
@@ -186,7 +205,59 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
onTick(ticks++);
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockBreakEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
{
return;
}
BlockPosition bp = new BlockPosition(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ());
if(!noLoot.contains(bp))
{
noLoot.add(bp);
if(e.isDropItems() && e.getPlayer().getGameMode().equals(GameMode.SURVIVAL))
{
allowLoot = new BlockPosition(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ());
}
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockPlaceEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
{
return;
}
noLoot.addIfMissing(new BlockPosition(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ()));
}
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockDropItemEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
{
return;
}
BlockPosition bp = new BlockPosition(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ());
if(noLoot.contains(bp) && !allowLoot.equals(bp))
{
return;
}
handleDrops(e);
}
protected abstract void handleDrops(BlockDropItemEvent e);
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerTeleportEvent e)
{
if(e.getFrom().getWorld().equals(world) && !e.getTo().getWorld().equals(world))
@@ -202,7 +273,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerQuitEvent e)
{
if(e.getPlayer().getWorld().equals(world))
@@ -212,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerJoinEvent e)
{
if(e.getPlayer().getWorld().equals(world))
@@ -222,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkLoadEvent e)
{
if(e.getWorld().equals(world))
@@ -232,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkUnloadEvent e)
{
if(e.getWorld().equals(world))
@@ -242,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void on(WorldUnloadEvent e)
{
if(world != null && e.getWorld().equals(world))
@@ -253,6 +324,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
public void close()
{
noLoot.clear();
noLoot.trimToSize();
HandlerList.unregisterAll(this);
Bukkit.getScheduler().cancelTask(getTask());
onClose();

View File

@@ -9,19 +9,25 @@ import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.inventory.ItemStack;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisContext;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.atomics.AtomicRegionData;
import com.volmit.iris.gui.Renderer;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBlockDrops;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisEffect;
import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.util.BiomeResult;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.Function2;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
@@ -254,7 +260,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
return getDimension().isVanillaStructures();
}
public Function2<Double, Double, Color> createRenderer()
public Renderer createRenderer()
{
return (x, z) -> render(x, z);
}
@@ -267,22 +273,20 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
IrisRegion region = sampleRegion(ix, iz);
IrisBiome biome = sampleTrueBiome(ix, iz, height).getBiome();
if(biome.getCachedColor() != null)
{
return biome.getCachedColor();
}
float shift = (biome.hashCode() % 32) / 32f / 14f;
float shift2 = (region.hashCode() % 9) / 9f / 14f;
shift -= shift2;
float sat = 0;
float h = (biome.isLand() ? 0.233f : 0.644f) - shift;
float s = 0.25f + shift + sat;
float b = (float) (Math.max(0, Math.min(height + getFluidHeight(), 255)) / 255);
if(hr.getLoadKey().equals(region.getLoadKey()))
{
sat += 0.2;
}
if(hb.getLoadKey().equals(biome.getLoadKey()))
{
sat += 0.3;
}
Color c = Color.getHSBColor((biome.isLand() ? 0.233f : 0.644f) - shift, 0.25f + shift + sat, (float) (Math.max(0, Math.min(height + getFluidHeight(), 255)) / 255));
Color c = Color.getHSBColor(h, s, b);
return c;
@@ -290,7 +294,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
public String textFor(double x, double z)
{
int ix = (int) x;
int iz = (int) z;
double height = getTerrainHeight(ix, iz);
@@ -312,4 +315,119 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
e.printStackTrace();
}
}
@Override
protected void handleDrops(BlockDropItemEvent e)
{
int x = e.getBlock().getX();
int y = e.getBlock().getY();
int z = e.getBlock().getZ();
IrisDimension dim = getDimension();
IrisRegion reg = sampleRegion(x, z);
IrisBiome bio = sampleTrueBiome(x, z).getBiome();
IrisBiome cbio = y < getFluidHeight() ? sampleTrueBiome(x, y, z).getBiome() : null;
if(cbio != null && bio.equals(cbio))
{
cbio = null;
}
if(dim.getBlockDrops().isEmpty() && reg.getBlockDrops().isEmpty() && bio.getBlockDrops().isEmpty())
{
return;
}
BlockData data = e.getBlockState().getBlockData();
KList<ItemStack> drops = new KList<>();
boolean skipParents = false;
if(!skipParents && cbio != null)
{
for(IrisBlockDrops i : cbio.getBlockDrops())
{
if(i.shouldDropFor(data))
{
if(!skipParents && i.isSkipParents())
{
skipParents = true;
}
if(i.isReplaceVanillaDrops())
{
e.getItems().clear();
}
i.fillDrops(isDev(), drops);
}
}
}
if(!skipParents)
{
for(IrisBlockDrops i : bio.getBlockDrops())
{
if(i.shouldDropFor(data))
{
if(!skipParents && i.isSkipParents())
{
skipParents = true;
}
if(i.isReplaceVanillaDrops())
{
e.getItems().clear();
}
i.fillDrops(isDev(), drops);
}
}
}
if(!skipParents)
{
for(IrisBlockDrops i : reg.getBlockDrops())
{
if(i.shouldDropFor(data))
{
if(!skipParents && i.isSkipParents())
{
skipParents = true;
}
if(i.isReplaceVanillaDrops())
{
e.getItems().clear();
}
i.fillDrops(isDev(), drops);
}
}
}
if(!skipParents)
{
for(IrisBlockDrops i : dim.getBlockDrops())
{
if(i.shouldDropFor(data))
{
if(i.isReplaceVanillaDrops())
{
e.getItems().clear();
}
i.fillDrops(isDev(), drops);
}
}
}
if(drops.isNotEmpty())
{
Location l = e.getBlock().getLocation();
for(ItemStack i : drops)
{
e.getBlock().getWorld().dropItemNaturally(l, i);
}
}
}
}

View File

@@ -38,6 +38,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator implements IObjectPlacer
{
private short cacheID = 0;
protected KMap<ChunkPosition, AtomicSliver> sliverCache;
protected AtomicWorldData parallaxMap;
private MasterLock masterLock;
@@ -93,6 +94,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
public void onHotload()
{
super.onHotload();
cacheID = RNG.r.simax();
}
@Override

View File

@@ -66,7 +66,12 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
{
super.onInit(world, rng);
loadGenerators();
glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1));
buildGenLayers(masterRandom);
}
private void buildGenLayers(RNG rng)
{
glBiome = new GenLayerBiome(this, rng.nextParallelRNG(24671));
masterFracture = CNG.signature(rng.nextParallelRNG(13)).scale(0.12);
rockRandom = getMasterRandom().nextParallelRNG(2858678);
glCave = new GenLayerCave(this, rng.nextParallelRNG(238948));
@@ -638,7 +643,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
{
super.onHotload();
loadGenerators();
glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1));
buildGenLayers(masterRandom);
}
public void registerGenerator(IrisGenerator g, IrisDimension dim)
@@ -661,7 +666,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
return generators;
}
protected double getBiomeHeight(double rrx, double rrz)
protected double getRawBiomeHeight(double rrx, double rrz)
{
double rx = rrx;
double rz = rrz;
@@ -675,6 +680,13 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
return h;
}
protected double getBiomeHeight(double rrx, double rrz)
{
double h = getRawBiomeHeight(rrx, rrz);
return h;
}
protected double interpolateGenerator(double rx, double rz, IrisGenerator gen)
{
double hi = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) ->

View File

@@ -10,6 +10,7 @@ import com.volmit.iris.util.KMap;
public class AtomicMulticache
{
public static boolean broken = false;
private final AtomicInteger x;
private final AtomicInteger z;
private final KMap<Long, Double> height;
@@ -29,6 +30,11 @@ public class AtomicMulticache
public void targetChunk(int x, int z)
{
if(broken)
{
return;
}
this.x.set(x);
this.z.set(z);
@@ -40,6 +46,11 @@ public class AtomicMulticache
public double getHeight(int x, int z, Supplier<Double> g)
{
if(broken)
{
return -5784;
}
Long pos = pos(x, z);
Double r = height.get(pos);
@@ -82,6 +93,10 @@ public class AtomicMulticache
public BiomeResult getRawBiome(int x, int z, Supplier<BiomeResult> g)
{
if(broken)
{
return null;
}
Long pos = pos(x, z);
BiomeResult r = rawBiome.get(pos);
@@ -96,11 +111,19 @@ public class AtomicMulticache
private long pos(int x, int z)
{
if(broken)
{
return 1;
}
return (((long) x) << 32) | (z & 0xffffffffL);
}
public void updateHeight(int x, int z, int h)
{
if(broken)
{
return;
}
height.put(pos(x, z), (double) h);
}
@@ -111,6 +134,11 @@ public class AtomicMulticache
public void drop()
{
if(broken)
{
return;
}
height.clear();
region.clear();
biome.clear();

View File

@@ -25,6 +25,7 @@ import lombok.Data;
public class AtomicSliver
{
public static final BlockData AIR = B.getBlockData("AIR");
public static boolean forgetful = false;
private transient KMap<Integer, IrisBiome> truebiome;
private transient KMap<Integer, Biome> biome;
private transient IrisLock lock = new IrisLock("Sliver");
@@ -59,16 +60,30 @@ public class AtomicSliver
public void update(int y)
{
if(forgetful)
{
return;
}
blockUpdates.add(y);
}
public void dontUpdate(int y)
{
if(forgetful)
{
return;
}
blockUpdates.remove(y);
}
public BlockData get(int h)
{
if(forgetful)
{
return null;
}
BlockData b = block.get(h);
last = M.ms();
@@ -82,6 +97,10 @@ public class AtomicSliver
public BlockData getOrNull(int h)
{
if(forgetful)
{
return null;
}
BlockData b = block.get(h);
last = M.ms();
@@ -95,6 +114,10 @@ public class AtomicSliver
public void set(int h, BlockData d)
{
if(forgetful)
{
return;
}
setSilently(h, d);
modified = true;
lock.lock();
@@ -104,6 +127,11 @@ public class AtomicSliver
public void setSilently(int h, BlockData d)
{
if(forgetful)
{
return;
}
if(d == null)
{
return;
@@ -133,6 +161,11 @@ public class AtomicSliver
public Biome getBiome(int h)
{
if(forgetful)
{
return Biome.THE_VOID;
}
last = M.ms();
return biome.containsKey(h) ? biome.get(h) : Biome.THE_VOID;
}
@@ -162,7 +195,13 @@ public class AtomicSliver
public void write(ChunkData d)
{
if(forgetful)
{
return;
}
lock.lock();
for(int i = 0; i <= highestBlock; i++)
{
if(block.get(i) == null)
@@ -180,6 +219,10 @@ public class AtomicSliver
public void write(BiomeGrid d)
{
if(forgetful)
{
return;
}
lock.lock();
for(int i = 0; i <= highestBiome; i++)
{
@@ -193,6 +236,10 @@ public class AtomicSliver
public void write(HeightMap height)
{
if(forgetful)
{
return;
}
lock.lock();
height.setHeight(x, z, highestBlock);
lock.unlock();
@@ -200,6 +247,10 @@ public class AtomicSliver
public void read(DataInputStream din) throws IOException
{
if(forgetful)
{
return;
}
lock.lock();
this.block = new KMap<Integer, BlockData>();
@@ -234,6 +285,10 @@ public class AtomicSliver
public void write(DataOutputStream dos) throws IOException
{
if(forgetful)
{
return;
}
lock.lock();
// Block Palette
@@ -278,6 +333,10 @@ public class AtomicSliver
public void insert(AtomicSliver atomicSliver)
{
if(forgetful)
{
return;
}
lock.lock();
for(int i = 0; i < 256; i++)
{
@@ -297,6 +356,10 @@ public class AtomicSliver
public void inject(ChunkData currentData)
{
if(forgetful)
{
return;
}
lock.lock();
for(int i = 0; i < 256; i++)
{
@@ -311,11 +374,21 @@ public class AtomicSliver
public boolean isOlderThan(long m)
{
if(forgetful)
{
return false;
}
return M.ms() - last > m;
}
public void inject(KSet<Integer> updatables)
{
if(forgetful)
{
return;
}
blockUpdates.addAll(updatables);
}
}

View File

@@ -18,6 +18,7 @@ import com.volmit.iris.util.RNG;
public class GenLayerCave extends GenLayer
{
public static boolean bad = false;
public static final BlockData CAVE_AIR = B.getBlockData("CAVE_AIR");
public static final BlockData AIR = B.getBlockData("AIR");
private static final KList<CaveResult> EMPTY = new KList<>();