mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 18:55:18 +00:00
Performance!
This commit is contained in:
parent
bf9c4c602b
commit
0dbff85bd8
@ -79,6 +79,14 @@ public class EditManager implements Listener
|
||||
}
|
||||
}
|
||||
|
||||
public void flushNow()
|
||||
{
|
||||
for(World i : editors.k())
|
||||
{
|
||||
editors.remove(i).close();
|
||||
}
|
||||
}
|
||||
|
||||
public BlockEditor open(World world)
|
||||
{
|
||||
if(editors.containsKey(world))
|
||||
|
@ -46,10 +46,10 @@ public class CommandIrisRegen extends MortarCommand
|
||||
return true;
|
||||
}
|
||||
|
||||
//TODO: IrisWorlds.access(world).clearRegeneratedLists();
|
||||
if(args.length == 0)
|
||||
{
|
||||
sender.sendMessage("Regenerating your chunk");
|
||||
IrisWorlds.access(world).clearRegeneratedLists(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ());
|
||||
IrisWorlds.access(world).regenerate(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ());
|
||||
return true;
|
||||
}
|
||||
@ -58,6 +58,7 @@ public class CommandIrisRegen extends MortarCommand
|
||||
{
|
||||
int m = Integer.valueOf(args[0]);
|
||||
sender.sendMessage("Regenerating " + (m * m) + " Chunks Surrounding you");
|
||||
new Spiraler(m, m, (a, b) -> IrisWorlds.access(world).clearRegeneratedLists(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain();
|
||||
new Spiraler(m, m, (a, b) -> IrisWorlds.access(world).regenerate(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain();
|
||||
}
|
||||
catch(Throwable e)
|
||||
|
@ -1,8 +1,12 @@
|
||||
package com.volmit.iris.scaffold;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.scaffold.engine.IrisAccess;
|
||||
import com.volmit.iris.util.KMap;
|
||||
import com.volmit.iris.util.MortarSender;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class IrisWorlds
|
||||
{
|
||||
@ -37,4 +41,22 @@ public class IrisWorlds
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean evacuate(World world) {
|
||||
for(World i : Bukkit.getWorlds())
|
||||
{
|
||||
if(!i.getName().equals(world.getName()))
|
||||
{
|
||||
for(Player j : world.getPlayers())
|
||||
{
|
||||
new MortarSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world due to a close request.");
|
||||
j.teleport(i.getSpawnLocation());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,16 @@
|
||||
package com.volmit.iris.scaffold.engine;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.manager.IrisDataManager;
|
||||
import com.volmit.iris.object.*;
|
||||
import com.volmit.iris.scaffold.cache.Cache;
|
||||
import com.volmit.iris.scaffold.data.DataProvider;
|
||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||
import com.volmit.iris.scaffold.parallax.ParallaxAccess;
|
||||
import com.volmit.iris.util.*;
|
||||
import com.volmit.iris.util.B;
|
||||
import com.volmit.iris.util.KList;
|
||||
import com.volmit.iris.util.RNG;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.Block;
|
||||
@ -138,14 +140,34 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
|
||||
Hunk<Boolean> b = getParallax().getUpdatesR(c.getX(), c.getZ());
|
||||
|
||||
b.iterateSync((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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public default void updateLighting(int x, int y, int z, Chunk c)
|
||||
{
|
||||
Block block = c.getBlock(x,y,z);
|
||||
BlockData data = block.getBlockData();
|
||||
|
||||
if(B.isLit(data))
|
||||
{
|
||||
block.setType(Material.AIR, false);
|
||||
block.setBlockData(data, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public default void update(int x, int y, int z, Chunk c, RNG rf)
|
||||
{
|
||||
@ -179,11 +201,6 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if(B.isLit(data))
|
||||
{
|
||||
Iris.linkBK.updateBlock(block);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -6,17 +6,18 @@ import com.volmit.iris.generator.legacy.scaffold.TerrainChunk;
|
||||
import com.volmit.iris.manager.IrisDataManager;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.object.IrisDimension;
|
||||
import com.volmit.iris.scaffold.IrisWorlds;
|
||||
import com.volmit.iris.scaffold.cache.Cache;
|
||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||
import com.volmit.iris.util.KList;
|
||||
import com.volmit.iris.util.M;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import com.volmit.iris.util.RNG;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.BlockPopulator;
|
||||
import org.bukkit.generator.ChunkGenerator;
|
||||
import org.bukkit.material.MaterialData;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@ -260,13 +261,132 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
|
||||
}
|
||||
|
||||
@Override
|
||||
public void regenerate(int x, int z) {
|
||||
// TODO: DO IT
|
||||
public void clearRegeneratedLists(int x, int z) {
|
||||
if (true)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for(int i = 0; i < getComposite().getSize(); i++)
|
||||
{
|
||||
getComposite().getEngine(i).getParallax().delete(x, z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void regenerate(int x, int z) {
|
||||
if (true)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Chunk chunk = getComposite().getWorld().getChunkAt(x, z);
|
||||
generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() {
|
||||
@Override
|
||||
public void setRaw(ChunkData data) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int z) {
|
||||
return Biome.THE_VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int y, int z) {
|
||||
return Biome.THE_VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int z, Biome bio) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int y, int z, Biome bio) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxHeight() {
|
||||
return 256;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, BlockData blockData) {
|
||||
Iris.edit.set(compound.getWorld(), x, y, z, blockData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData getBlockData(int x, int y, int z) {
|
||||
return Iris.edit.get(compound.getWorld(), x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkData getRaw() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void inject(BiomeGrid biome) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int i, int i1, int i2, @NotNull Material material) {
|
||||
setBlock(i, i1, i2, material.createBlockData());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int i, int i1, int i2, @NotNull MaterialData materialData) {
|
||||
setBlock(i, i1, i2, materialData.getItemType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull Material material) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull MaterialData materialData) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull BlockData blockData) {
|
||||
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Material getType(int i, int i1, int i2) {
|
||||
return getBlockData(i, i1, i2).getMaterial();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public MaterialData getTypeAndData(int i, int i1, int i2) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte getData(int i, int i1, int i2) {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
|
||||
Iris.edit.flushNow();
|
||||
|
||||
for (BlockPopulator i : populators) {
|
||||
i.populate(compound.getWorld(), new RNG(Cache.key(x, z)), chunk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
getComposite().close();
|
||||
IrisWorlds.evacuate(getComposite().getWorld());
|
||||
Bukkit.unloadWorld(getComposite().getWorld(), !isStudio());
|
||||
}
|
||||
|
||||
|
@ -206,4 +206,6 @@ public interface IrisAccess extends Hotloadable, DataProvider {
|
||||
triesc.accept(tries.get());
|
||||
return location.get();
|
||||
}
|
||||
|
||||
public void clearRegeneratedLists(int x, int z);
|
||||
}
|
||||
|
@ -1,5 +1,17 @@
|
||||
package com.volmit.iris.scaffold.hunk;
|
||||
|
||||
import com.volmit.iris.scaffold.hunk.io.HunkIOAdapter;
|
||||
import com.volmit.iris.scaffold.hunk.storage.*;
|
||||
import com.volmit.iris.scaffold.hunk.view.*;
|
||||
import com.volmit.iris.scaffold.parallel.BurstExecutor;
|
||||
import com.volmit.iris.scaffold.parallel.MultiBurst;
|
||||
import com.volmit.iris.util.*;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
@ -7,33 +19,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.volmit.iris.scaffold.hunk.view.*;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
|
||||
import com.volmit.iris.util.ByteArrayTag;
|
||||
import com.volmit.iris.util.Consumer2;
|
||||
import com.volmit.iris.util.Consumer3;
|
||||
import com.volmit.iris.util.Consumer4;
|
||||
import com.volmit.iris.util.Consumer5;
|
||||
import com.volmit.iris.util.Consumer6;
|
||||
import com.volmit.iris.util.Consumer8;
|
||||
import com.volmit.iris.util.Function3;
|
||||
import com.volmit.iris.util.KList;
|
||||
import com.volmit.iris.scaffold.hunk.io.HunkIOAdapter;
|
||||
import com.volmit.iris.scaffold.hunk.storage.ArrayHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.AtomicDoubleHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.AtomicHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.AtomicIntegerHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.AtomicLongHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.MappedHunk;
|
||||
import com.volmit.iris.scaffold.hunk.storage.SynchronizedArrayHunk;
|
||||
import com.volmit.iris.scaffold.parallel.BurstExecutor;
|
||||
import com.volmit.iris.scaffold.parallel.MultiBurst;
|
||||
|
||||
public interface Hunk<T>
|
||||
{
|
||||
/**
|
||||
@ -119,6 +104,11 @@ public interface Hunk<T>
|
||||
return new MappedHunk<>(w, h, d);
|
||||
}
|
||||
|
||||
public static <T> Hunk<T> newMappedHunkSynced(int w, int h, int d)
|
||||
{
|
||||
return new MappedHunk<T>(w, h, d).synchronize();
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <T> Hunk<T> newCombinedMappedHunk(Hunk<T>... hunks)
|
||||
{
|
||||
|
@ -1,10 +1,8 @@
|
||||
package com.volmit.iris.scaffold.hunk.storage;
|
||||
|
||||
import com.volmit.iris.util.Consumer4;
|
||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||
import com.volmit.iris.util.BlockPosition;
|
||||
import com.volmit.iris.util.Consumer4;
|
||||
import com.volmit.iris.util.KMap;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@ -14,7 +12,7 @@ import java.util.Map;
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||
{
|
||||
private final KMap<BlockPosition, T> data;
|
||||
private final KMap<Integer, T> data;
|
||||
|
||||
public MappedHunk(int w, int h, int d)
|
||||
{
|
||||
@ -25,15 +23,31 @@ public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||
@Override
|
||||
public void setRaw(int x, int y, int z, T t)
|
||||
{
|
||||
data.put(new BlockPosition(x, y, z), t);
|
||||
if(t == null)
|
||||
{
|
||||
data.remove(index(x,y,z));
|
||||
return;
|
||||
}
|
||||
|
||||
data.put(index(x, y, z), t);
|
||||
}
|
||||
|
||||
private Integer index(int x, int y, int z)
|
||||
{
|
||||
return (z * getWidth() * getHeight()) + (y * getWidth()) + x;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Hunk<T> iterateSync(Consumer4<Integer, Integer, Integer, T> c)
|
||||
public synchronized Hunk<T> iterateSync(Consumer4<Integer, Integer, Integer, T> c)
|
||||
{
|
||||
for(Map.Entry<BlockPosition, T> g : data.entrySet())
|
||||
int idx, z;
|
||||
|
||||
for(Map.Entry<Integer, T> g : data.entrySet())
|
||||
{
|
||||
c.accept( g.getKey().getX(), g.getKey().getY(), g.getKey().getZ(), g.getValue());
|
||||
idx = g.getKey();
|
||||
z = idx / (getWidth() * getHeight());
|
||||
idx -= (z * getWidth() * getHeight());
|
||||
c.accept(idx % getWidth(), idx / getWidth(), z, g.getValue());
|
||||
}
|
||||
|
||||
return this;
|
||||
@ -42,6 +56,6 @@ public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
|
||||
@Override
|
||||
public T getRaw(int x, int y, int z)
|
||||
{
|
||||
return data.get(new BlockPosition(x, y, z));
|
||||
return data.get(index(x, y, z));
|
||||
}
|
||||
}
|
||||
|
@ -3,45 +3,36 @@ package com.volmit.iris.scaffold.parallax;
|
||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public interface ParallaxAccess
|
||||
{
|
||||
default BlockData getBlock(int x, int y, int z)
|
||||
{
|
||||
public interface ParallaxAccess {
|
||||
default BlockData getBlock(int x, int y, int z) {
|
||||
return getBlocksR(x >> 4, z >> 4).get(x & 15, y, z & 15);
|
||||
}
|
||||
|
||||
default void setBlock(int x, int y, int z, BlockData d)
|
||||
{
|
||||
default void setBlock(int x, int y, int z, BlockData d) {
|
||||
getBlocksRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
|
||||
}
|
||||
|
||||
default String getObject(int x, int y, int z)
|
||||
{
|
||||
default String getObject(int x, int y, int z) {
|
||||
return getObjectsR(x >> 4, z >> 4).get(x & 15, y, z & 15);
|
||||
}
|
||||
|
||||
default void setObject(int x, int y, int z, String d)
|
||||
{
|
||||
default void setObject(int x, int y, int z, String d) {
|
||||
getObjectsRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
|
||||
}
|
||||
|
||||
default Boolean isUpdate(int x, int y, int z)
|
||||
{
|
||||
default Boolean isUpdate(int x, int y, int z) {
|
||||
return getUpdatesR(x >> 4, z >> 4).get(x & 15, y, z & 15);
|
||||
}
|
||||
|
||||
default void updateBlock(int x, int y, int z)
|
||||
{
|
||||
default void updateBlock(int x, int y, int z) {
|
||||
setUpdate(x, y, z, true);
|
||||
}
|
||||
|
||||
default void setUpdate(int x, int y, int z, boolean d)
|
||||
{
|
||||
default void setUpdate(int x, int y, int z, boolean d) {
|
||||
getUpdatesRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
|
||||
}
|
||||
|
||||
default boolean isParallaxGenerated(int x, int z)
|
||||
{
|
||||
default boolean isParallaxGenerated(int x, int z) {
|
||||
return getMetaR(x, z).isParallaxGenerated();
|
||||
}
|
||||
|
||||
@ -92,4 +83,11 @@ public interface ParallaxAccess
|
||||
public int getRegionCount();
|
||||
|
||||
public int getChunkCount();
|
||||
|
||||
public default void delete(int x, int z)
|
||||
{
|
||||
getUpdatesRW(x, z).fill(false);
|
||||
getBlocksRW(x, z).fill(null);
|
||||
getObjectsRW(x, z).fill(null);
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,14 @@ public class MultiBurst
|
||||
burst(r.length).queue(r).complete();
|
||||
}
|
||||
|
||||
public void sync(Runnable... r)
|
||||
{
|
||||
for(Runnable i : r)
|
||||
{
|
||||
i.run();
|
||||
}
|
||||
}
|
||||
|
||||
public BurstExecutor burst(int estimate)
|
||||
{
|
||||
return new BurstExecutor(service, estimate);
|
||||
|
Loading…
x
Reference in New Issue
Block a user