9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-28 11:39:07 +00:00

Remove block data caching

This commit is contained in:
cyberpwn
2021-08-24 04:00:17 -04:00
parent 56e13641df
commit 617066340b
10 changed files with 121 additions and 78 deletions

View File

@@ -59,7 +59,6 @@ import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender;
import org.bukkit.generator.BlockPopulator;
import java.io.File;
import java.io.IOException;
@@ -68,9 +67,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
@EqualsAndHashCode(callSuper = true)
@Data
public class IrisEngine extends BlockPopulator implements Engine {
public class IrisEngine implements Engine {
// TODO: Remove block population, stop using bukkit
private final AtomicInteger generated;
private final AtomicInteger generatedLast;
@@ -460,22 +458,6 @@ public class IrisEngine extends BlockPopulator implements Engine {
return getData().getBiomeLoader().load(getDimension().getFocus());
}
// TODO: Remove block population
@ChunkCoordinates
@Override
public void populate(World world, Random random, Chunk c) {
try
{
updateChunk(c);
placeTiles(c);
}
catch(Throwable e)
{
Iris.reportError(e);
}
}
@Override
public void fail(String error, Throwable e) {
failing = true;

View File

@@ -39,11 +39,13 @@ import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.Looper;
import io.papermc.lib.PaperLib;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Chunk;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
@@ -64,6 +66,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
private final ChronoLatch cl;
private final ChronoLatch ecl;
private final ChronoLatch cln;
private final ChronoLatch chunkUpdater;
private long charge = 0;
private int actuallySpawned = 0;
private int cooldown = 0;
@@ -76,11 +79,13 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
cln = null;
chunkCooldowns = null;
looper = null;
chunkUpdater = null;
id = -1;
}
public IrisWorldManager(Engine engine) {
super(engine);
chunkUpdater = new ChronoLatch(1000);
cln = new ChronoLatch(60000);
cl = new ChronoLatch(3000);
ecl = new ChronoLatch(250);
@@ -94,42 +99,50 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
interrupt();
}
if (getDimension().isInfiniteEnergy()) {
energy += 1000;
fixEnergy();
}
if(getEngine().getWorld().hasRealWorld())
{
if(chunkUpdater.flip())
{
updateChunks();
}
if (M.ms() < charge) {
energy += 70;
fixEnergy();
}
if (getDimension().isInfiniteEnergy()) {
energy += 1000;
fixEnergy();
}
if (cln.flip()) {
engine.getEngineData().cleanup(getEngine());
}
if (M.ms() < charge) {
energy += 70;
fixEnergy();
}
if (precount != null) {
entityCount = 0;
for (Entity i : precount) {
if (i instanceof LivingEntity) {
if (!i.isDead()) {
entityCount++;
if (cln.flip()) {
engine.getEngineData().cleanup(getEngine());
}
if (precount != null) {
entityCount = 0;
for (Entity i : precount) {
if (i instanceof LivingEntity) {
if (!i.isDead()) {
entityCount++;
}
}
}
precount = null;
}
if (energy < 650) {
if (ecl.flip()) {
energy *= 1 + (0.02 * M.clip((1D - getEntitySaturation()), 0D, 1D));
fixEnergy();
}
}
precount = null;
onAsyncTick();
}
if (energy < 650) {
if (ecl.flip()) {
energy *= 1 + (0.02 * M.clip((1D - getEntitySaturation()), 0D, 1D));
fixEnergy();
}
}
onAsyncTick();
return 50;
}
};
@@ -138,6 +151,16 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
looper.start();
}
private void updateChunks() {
for(Player i : getEngine().getWorld().realWorld().getPlayers())
{
J.s(() -> {
Chunk c = i.getLocation().getChunk();
J.a(() -> getEngine().updateChunk(c));
}, RNG.r.i(0, 5));
}
}
private boolean onAsyncTick() {
if (getEngine().isClosed()) {
return false;

View File

@@ -21,6 +21,8 @@ package com.volmit.iris.engine.framework;
import com.volmit.iris.util.math.RNG;
import org.bukkit.Chunk;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.LimitedRegion;
import org.bukkit.generator.WorldInfo;
public interface BlockUpdater {

View File

@@ -45,8 +45,10 @@ import com.volmit.iris.util.data.B;
import com.volmit.iris.util.data.DataProvider;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.documentation.ChunkCoordinates;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.function.Function2;
import com.volmit.iris.util.hunk.Hunk;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.mantle.MantleFlag;
import com.volmit.iris.util.math.BlockPosition;
import com.volmit.iris.util.math.M;
@@ -57,9 +59,8 @@ import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import com.volmit.iris.util.stream.ProceduralStream;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import io.papermc.lib.PaperLib;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
@@ -69,6 +70,7 @@ import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.awt.*;
import java.awt.Color;
import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -232,19 +234,21 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
@ChunkCoordinates
@Override
default void updateChunk(Chunk c) {
PrecisionStopwatch p = PrecisionStopwatch.start();
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Boolean.class, (x, y, z, v) -> {
if (v != null && v) {
int vx = x & 15;
int vz = z & 15;
update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ())));
getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> {
PrecisionStopwatch p = PrecisionStopwatch.start();
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Boolean.class, (x, y, z, v) -> {
if (v != null && v) {
int vx = x & 15;
int vz = z & 15;
update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ())));
if (vx > 0 && vx < 15 && vz > 0 && vz < 15) {
updateLighting(x, y, z, c);
if (vx > 0 && vx < 15 && vz > 0 && vz < 15) {
updateLighting(x, y, z, c);
}
}
}
});
getMetrics().getUpdates().put(p.getMilliseconds());
});
getMetrics().getUpdates().put(p.getMilliseconds());
}));
}
@BlockCoordinates
@@ -389,11 +393,37 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
items.addAll(i.getLoot(debug, items.isEmpty(), rng, slot, x, y, z, b + b, mgf + b));
}
for (ItemStack i : items) {
inv.addItem(i);
if(PaperLib.isPaper() && getWorld().hasRealWorld())
{
PaperLib.getChunkAtAsync(getWorld().realWorld(), x >> 4, z >> 4).thenAccept((c) -> {
Runnable r = () -> {
for (ItemStack i : items) {
inv.addItem(i);
}
scramble(inv, rng);
};
if(Bukkit.isPrimaryThread())
{
r.run();
}
else
{
J.s(r);
}
});
}
scramble(inv, rng);
else
{
for (ItemStack i : items) {
inv.addItem(i);
}
scramble(inv, rng);
}
}
EngineEffects getEffects();

View File

@@ -136,7 +136,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
engine = new IrisEngine(new EngineTarget(world, dimension, data), studio);
populators.clear();
populators.add((BlockPopulator) engine);
}
@Override