mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-04 00:46:08 +00:00
commit
24e1c578c8
@ -672,10 +672,12 @@ public class Iris extends VolmitPlugin implements Listener {
|
|||||||
metrics.addCustomChart(new DrilldownPie("used_packs", () -> Bukkit.getWorlds().stream()
|
metrics.addCustomChart(new DrilldownPie("used_packs", () -> Bukkit.getWorlds().stream()
|
||||||
.map(IrisToolbelt::access)
|
.map(IrisToolbelt::access)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.map(PlatformChunkGenerator::getTarget)
|
.map(PlatformChunkGenerator::getEngine)
|
||||||
.collect(Collectors.toMap(target -> target.getDimension().getLoadKey(), target -> {
|
.collect(Collectors.toMap(engine -> engine.getDimension().getLoadKey(), engine -> {
|
||||||
int version = target.getDimension().getVersion();
|
var hash32 = engine.getHash32().getNow(null);
|
||||||
String checksum = IO.hashRecursive(target.getData().getDataFolder());
|
if (hash32 == null) return Map.of();
|
||||||
|
int version = engine.getDimension().getVersion();
|
||||||
|
String checksum = Long.toHexString(hash32);
|
||||||
|
|
||||||
return Map.of("v" + version + " (" + checksum + ")", 1);
|
return Map.of("v" + version + " (" + checksum + ")", 1);
|
||||||
}, (a, b) -> {
|
}, (a, b) -> {
|
||||||
|
@ -21,10 +21,10 @@ package com.volmit.iris.engine;
|
|||||||
import com.google.common.util.concurrent.AtomicDouble;
|
import com.google.common.util.concurrent.AtomicDouble;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
|
||||||
import com.volmit.iris.core.ServerConfigurator;
|
import com.volmit.iris.core.ServerConfigurator;
|
||||||
import com.volmit.iris.core.events.IrisEngineHotloadEvent;
|
import com.volmit.iris.core.events.IrisEngineHotloadEvent;
|
||||||
import com.volmit.iris.core.gui.PregeneratorJob;
|
import com.volmit.iris.core.gui.PregeneratorJob;
|
||||||
|
import com.volmit.iris.core.loader.ResourceLoader;
|
||||||
import com.volmit.iris.core.nms.container.BlockPos;
|
import com.volmit.iris.core.nms.container.BlockPos;
|
||||||
import com.volmit.iris.core.nms.container.Pair;
|
import com.volmit.iris.core.nms.container.Pair;
|
||||||
import com.volmit.iris.core.project.IrisProject;
|
import com.volmit.iris.core.project.IrisProject;
|
||||||
@ -53,7 +53,6 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
@ -63,11 +62,10 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(exclude = "context")
|
@EqualsAndHashCode(exclude = "context")
|
||||||
@ -92,6 +90,7 @@ public class IrisEngine implements Engine {
|
|||||||
private final AtomicBoolean cleaning;
|
private final AtomicBoolean cleaning;
|
||||||
private final ChronoLatch cleanLatch;
|
private final ChronoLatch cleanLatch;
|
||||||
private final SeedManager seedManager;
|
private final SeedManager seedManager;
|
||||||
|
private CompletableFuture<Long> hash32;
|
||||||
private EngineMode mode;
|
private EngineMode mode;
|
||||||
private EngineEffects effects;
|
private EngineEffects effects;
|
||||||
private EngineExecutionEnvironment execution;
|
private EngineExecutionEnvironment execution;
|
||||||
@ -174,8 +173,17 @@ public class IrisEngine implements Engine {
|
|||||||
complex = new IrisComplex(this);
|
complex = new IrisComplex(this);
|
||||||
execution = new IrisExecutionEnvironment(this);
|
execution = new IrisExecutionEnvironment(this);
|
||||||
effects = new IrisEngineEffects(this);
|
effects = new IrisEngineEffects(this);
|
||||||
|
hash32 = new CompletableFuture<>();
|
||||||
setupMode();
|
setupMode();
|
||||||
J.a(this::computeBiomeMaxes);
|
J.a(this::computeBiomeMaxes);
|
||||||
|
J.a(() -> {
|
||||||
|
File[] roots = getData().getLoaders()
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.map(ResourceLoader::getRoot)
|
||||||
|
.toArray(File[]::new);
|
||||||
|
hash32.complete(IO.hashRecursive(roots));
|
||||||
|
});
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("FAILED TO SETUP ENGINE!");
|
Iris.error("FAILED TO SETUP ENGINE!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -23,13 +23,11 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisDecorationPart;
|
import com.volmit.iris.engine.object.IrisDecorationPart;
|
||||||
import com.volmit.iris.engine.object.IrisDecorator;
|
import com.volmit.iris.engine.object.IrisDecorator;
|
||||||
import com.volmit.iris.util.data.B;
|
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.MultipleFacing;
|
|
||||||
import org.bukkit.block.data.type.PointedDripstone;
|
import org.bukkit.block.data.type.PointedDripstone;
|
||||||
|
|
||||||
public class IrisCeilingDecorator extends IrisEngineDecorator {
|
public class IrisCeilingDecorator extends IrisEngineDecorator {
|
||||||
@ -43,7 +41,7 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
|
|||||||
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
||||||
if (decorator != null) {
|
if (decorator != null) {
|
||||||
if (!decorator.isStacking()) {
|
if (!decorator.isStacking()) {
|
||||||
data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), realX, height, realZ));
|
data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), data, x, z, realX, height, realZ));
|
||||||
} else {
|
} else {
|
||||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||||
if (decorator.isScaleStack()) {
|
if (decorator.isScaleStack()) {
|
||||||
@ -97,24 +95,4 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BlockData fixFaces(BlockData b, int x, int y, int z) {
|
|
||||||
if (B.isVineBlock(b)) {
|
|
||||||
MultipleFacing data = (MultipleFacing) b.clone();
|
|
||||||
boolean found = false;
|
|
||||||
for (BlockFace f : BlockFace.values()) {
|
|
||||||
if (!f.isCartesian())
|
|
||||||
continue;
|
|
||||||
Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial();
|
|
||||||
if (m.isSolid()) {
|
|
||||||
found = true;
|
|
||||||
data.setFace(f, m.isSolid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
data.setFace(BlockFace.UP, true);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,14 @@ import com.volmit.iris.engine.object.IrisBiome;
|
|||||||
import com.volmit.iris.engine.object.IrisDecorationPart;
|
import com.volmit.iris.engine.object.IrisDecorationPart;
|
||||||
import com.volmit.iris.engine.object.IrisDecorator;
|
import com.volmit.iris.engine.object.IrisDecorator;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.data.B;
|
||||||
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.BlockSupport;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.MultipleFacing;
|
||||||
|
|
||||||
public abstract class IrisEngineDecorator extends EngineAssignedComponent implements EngineDecorator {
|
public abstract class IrisEngineDecorator extends EngineAssignedComponent implements EngineDecorator {
|
||||||
|
|
||||||
@ -65,4 +71,40 @@ public abstract class IrisEngineDecorator extends EngineAssignedComponent implem
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected BlockData fixFaces(BlockData b, Hunk<BlockData> hunk, int rX, int rZ, int x, int y, int z) {
|
||||||
|
if (B.isVineBlock(b)) {
|
||||||
|
MultipleFacing data = (MultipleFacing) b.clone();
|
||||||
|
data.getFaces().forEach(f -> data.setFace(f, false));
|
||||||
|
|
||||||
|
boolean found = false;
|
||||||
|
for (BlockFace f : BlockFace.values()) {
|
||||||
|
if (!f.isCartesian())
|
||||||
|
continue;
|
||||||
|
int yy = y + f.getModY();
|
||||||
|
|
||||||
|
BlockData r = getEngine().getMantle().get(x + f.getModX(), yy, z + f.getModZ());
|
||||||
|
if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) {
|
||||||
|
found = true;
|
||||||
|
data.setFace(f, true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int xx = rX + f.getModX();
|
||||||
|
int zz = rZ + f.getModZ();
|
||||||
|
if (xx < 0 || xx > 15 || zz < 0 || zz > 15 || yy < 0 || yy > hunk.getHeight())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
r = hunk.get(xx, yy, zz);
|
||||||
|
if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) {
|
||||||
|
found = true;
|
||||||
|
data.setFace(f, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
data.setFace(BlockFace.DOWN, true);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,6 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.Bisected;
|
import org.bukkit.block.data.Bisected;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.MultipleFacing;
|
|
||||||
import org.bukkit.block.data.type.PointedDripstone;
|
import org.bukkit.block.data.type.PointedDripstone;
|
||||||
|
|
||||||
public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
||||||
@ -68,7 +67,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (decorator.getForceBlock() != null) {
|
if (decorator.getForceBlock() != null) {
|
||||||
data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), x, height, z));
|
data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), data, x, z, realX, height, realZ));
|
||||||
} else if (!decorator.isForcePlace()) {
|
} else if (!decorator.isForcePlace()) {
|
||||||
if (decorator.getWhitelist() != null && decorator.getWhitelist().stream().noneMatch(d -> d.getBlockData(getData()).equals(bdx))) {
|
if (decorator.getWhitelist() != null && decorator.getWhitelist().stream().noneMatch(d -> d.getBlockData(getData()).equals(bdx))) {
|
||||||
return;
|
return;
|
||||||
@ -91,7 +90,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (B.isAir(data.get(x, height + 1, z))) {
|
if (B.isAir(data.get(x, height + 1, z))) {
|
||||||
data.set(x, height + 1, z, fixFaces(bd, x, height + 1, z));
|
data.set(x, height + 1, z, fixFaces(bd, data, x, z, realX, height + 1, realZ));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (height < getDimension().getFluidHeight()) {
|
if (height < getDimension().getFluidHeight()) {
|
||||||
@ -158,24 +157,4 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BlockData fixFaces(BlockData b, int x, int y, int z) {
|
|
||||||
if (B.isVineBlock(b)) {
|
|
||||||
MultipleFacing data = (MultipleFacing) b.clone();
|
|
||||||
boolean found = false;
|
|
||||||
for (BlockFace f : BlockFace.values()) {
|
|
||||||
if (!f.isCartesian())
|
|
||||||
continue;
|
|
||||||
Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial();
|
|
||||||
if (m.isSolid()) {
|
|
||||||
found = true;
|
|
||||||
data.setFace(f, m.isSolid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
data.setFace(BlockFace.UP, true);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,7 @@ import java.awt.Color;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
@ -611,6 +612,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
|
|
||||||
int getGenerated();
|
int getGenerated();
|
||||||
|
|
||||||
|
CompletableFuture<Long> getHash32();
|
||||||
|
|
||||||
default <T> IrisPosition lookForStreamResult(T find, ProceduralStream<T> stream, Function2<T, T, Boolean> matcher, long timeout) {
|
default <T> IrisPosition lookForStreamResult(T find, ProceduralStream<T> stream, Function2<T, T, Boolean> matcher, long timeout) {
|
||||||
AtomicInteger checked = new AtomicInteger();
|
AtomicInteger checked = new AtomicInteger();
|
||||||
AtomicLong time = new AtomicLong(M.ms());
|
AtomicLong time = new AtomicLong(M.ms());
|
||||||
|
@ -211,14 +211,6 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
|
|
||||||
biome.setInferredType(InferredType.CAVE);
|
biome.setInferredType(InferredType.CAVE);
|
||||||
|
|
||||||
for (IrisDecorator i : biome.getDecorators()) {
|
|
||||||
if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) {
|
|
||||||
decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness());
|
|
||||||
} else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) {
|
|
||||||
decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KList<BlockData> blocks = biome.generateLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex());
|
KList<BlockData> blocks = biome.generateLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex());
|
||||||
|
|
||||||
for (int i = 0; i < zone.floor - 1; i++) {
|
for (int i = 0; i < zone.floor - 1; i++) {
|
||||||
@ -260,6 +252,14 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
output.set(rx, zone.ceiling + i + 1, rz, b);
|
output.set(rx, zone.ceiling + i + 1, rz, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (IrisDecorator i : biome.getDecorators()) {
|
||||||
|
if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) {
|
||||||
|
decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness());
|
||||||
|
} else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) {
|
||||||
|
decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
@ -111,10 +111,12 @@ public class IO {
|
|||||||
return "¯\\_(ツ)_/¯";
|
return "¯\\_(ツ)_/¯";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String hashRecursive(File base) {
|
public static long hashRecursive(File... bases) {
|
||||||
LinkedList<File> files = new LinkedList<>();
|
LinkedList<File> files = new LinkedList<>();
|
||||||
Set<File> processed = new HashSet<>();
|
Set<File> processed = new HashSet<>();
|
||||||
files.add(base);
|
Arrays.parallelSort(bases, Comparator.comparing(File::getName));
|
||||||
|
files.addAll(Arrays.asList(bases));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
CRC32 crc = new CRC32();
|
CRC32 crc = new CRC32();
|
||||||
while (!files.isEmpty()) {
|
while (!files.isEmpty()) {
|
||||||
@ -141,13 +143,13 @@ public class IO {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Long.toHexString(crc.getValue());
|
return crc.getValue();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String hash(File b) {
|
public static String hash(File b) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user