mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-06-18 23:01:07 +00:00
iris go brrrr
This commit is contained in:
@@ -6,7 +6,7 @@ import com.volmit.iris.core.service.ExternalDataSVC;
|
|||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.reflect.WrappedField;
|
import com.volmit.iris.util.reflect.WrappedField;
|
||||||
import com.volmit.iris.util.reflect.WrappedReturningMethod;
|
import com.volmit.iris.util.reflect.WrappedReturningMethod;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -62,7 +62,7 @@ public class HMCLeavesDataProvider extends ExternalDataProvider {
|
|||||||
BlockData blockData = Bukkit.createBlockData(material);
|
BlockData blockData = Bukkit.createBlockData(material);
|
||||||
if (IrisSettings.get().getGenerator().preventLeafDecay && blockData instanceof Leaves leaves)
|
if (IrisSettings.get().getGenerator().preventLeafDecay && blockData instanceof Leaves leaves)
|
||||||
leaves.setPersistent(true);
|
leaves.setPersistent(true);
|
||||||
return new IrisBlockData(blockData, ExternalDataSVC.buildState(blockId, state));
|
return new IrisCustomData(blockData, ExternalDataSVC.buildState(blockId, state));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import com.volmit.iris.util.reflect.WrappedField;
|
import com.volmit.iris.util.reflect.WrappedField;
|
||||||
import io.th0rgal.oraxen.api.OraxenItems;
|
import io.th0rgal.oraxen.api.OraxenItems;
|
||||||
@@ -90,7 +90,7 @@ public class OraxenDataProvider extends ExternalDataProvider {
|
|||||||
} else if (factory instanceof StringBlockMechanicFactory f) {
|
} else if (factory instanceof StringBlockMechanicFactory f) {
|
||||||
return f.createTripwireData(blockId.key());
|
return f.createTripwireData(blockId.key());
|
||||||
} else if (factory instanceof FurnitureFactory) {
|
} else if (factory instanceof FurnitureFactory) {
|
||||||
return new IrisBlockData(B.getAir(), ExternalDataSVC.buildState(blockId, state));
|
return new IrisCustomData(B.getAir(), ExternalDataSVC.buildState(blockId, state));
|
||||||
} else
|
} else
|
||||||
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
|
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ 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;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -287,14 +288,15 @@ public class IrisComplex implements DataProvider {
|
|||||||
return biome;
|
return biome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private record DPair(double x, double z) {}
|
||||||
private double interpolateGenerators(Engine engine, IrisInterpolator interpolator, KSet<IrisGenerator> generators, double x, double z, long seed) {
|
private double interpolateGenerators(Engine engine, IrisInterpolator interpolator, KSet<IrisGenerator> generators, double x, double z, long seed) {
|
||||||
if (generators.isEmpty()) {
|
if (generators.isEmpty()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
var cache = new HashMap<DPair, IrisBiome>();
|
||||||
double hi = interpolator.interpolate(x, z, (xx, zz) -> {
|
double hi = interpolator.interpolate(x, z, (xx, zz) -> {
|
||||||
try {
|
try {
|
||||||
IrisBiome bx = baseBiomeStream.get(xx, zz);
|
IrisBiome bx = cache.computeIfAbsent(new DPair(xx, zz), k -> baseBiomeStream.get(k.x, k.z));
|
||||||
double b = 0;
|
double b = 0;
|
||||||
|
|
||||||
for (IrisGenerator gen : generators) {
|
for (IrisGenerator gen : generators) {
|
||||||
@@ -313,7 +315,7 @@ public class IrisComplex implements DataProvider {
|
|||||||
|
|
||||||
double lo = interpolator.interpolate(x, z, (xx, zz) -> {
|
double lo = interpolator.interpolate(x, z, (xx, zz) -> {
|
||||||
try {
|
try {
|
||||||
IrisBiome bx = baseBiomeStream.get(xx, zz);
|
IrisBiome bx = cache.computeIfAbsent(new DPair(xx, zz), k -> baseBiomeStream.get(k.x, k.z));
|
||||||
double b = 0;
|
double b = 0;
|
||||||
|
|
||||||
for (IrisGenerator gen : generators) {
|
for (IrisGenerator gen : generators) {
|
||||||
@@ -329,6 +331,7 @@ public class IrisComplex implements DataProvider {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
cache.clear();
|
||||||
|
|
||||||
double d = 0;
|
double d = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ package com.volmit.iris.engine.data.chunk;
|
|||||||
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
||||||
import com.volmit.iris.core.nms.INMS;
|
import com.volmit.iris.core.nms.INMS;
|
||||||
import com.volmit.iris.util.data.IrisBiomeStorage;
|
import com.volmit.iris.util.data.IrisBiomeStorage;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@@ -121,7 +121,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void setBlock(int x, int y, int z, BlockData blockData) {
|
public synchronized void setBlock(int x, int y, int z, BlockData blockData) {
|
||||||
if (blockData instanceof IrisBlockData d)
|
if (blockData instanceof IrisCustomData d)
|
||||||
blockData = d.getBase();
|
blockData = d.getBase();
|
||||||
rawChunkData.setBlock(x, y, z, blockData);
|
rawChunkData.setBlock(x, y, z, blockData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package com.volmit.iris.engine.data.chunk;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.nbt.mca.Chunk;
|
import com.volmit.iris.util.nbt.mca.Chunk;
|
||||||
import com.volmit.iris.util.nbt.mca.NBTWorld;
|
import com.volmit.iris.util.nbt.mca.NBTWorld;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@@ -89,7 +89,7 @@ public class MCATerrainChunk implements TerrainChunk {
|
|||||||
if (blockData == null) {
|
if (blockData == null) {
|
||||||
Iris.error("NULL BD");
|
Iris.error("NULL BD");
|
||||||
}
|
}
|
||||||
if (blockData instanceof IrisBlockData data)
|
if (blockData instanceof IrisCustomData data)
|
||||||
blockData = data.getBase();
|
blockData = data.getBase();
|
||||||
|
|
||||||
mcaChunk.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false);
|
mcaChunk.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import com.volmit.iris.util.context.ChunkContext;
|
|||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.DataProvider;
|
import com.volmit.iris.util.data.DataProvider;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.format.C;
|
import com.volmit.iris.util.format.C;
|
||||||
@@ -257,10 +257,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
if (B.isUpdatable(data)) {
|
if (B.isUpdatable(data)) {
|
||||||
getMantle().updateBlock(x, y, z);
|
getMantle().updateBlock(x, y, z);
|
||||||
}
|
}
|
||||||
if (data instanceof IrisBlockData d) {
|
if (data instanceof IrisCustomData) {
|
||||||
getMantle().getMantle().set(x, y, z, d.getCustom());
|
getMantle().getMantle().flag(x >> 4, z >> 4, MantleFlag.CUSTOM_ACTIVE, true);
|
||||||
} else {
|
|
||||||
getMantle().getMantle().remove(x, y, z, Identifier.class);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,18 +280,21 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.TILE, () -> J.s(() -> {
|
var mc = getMantle().getMantle().getChunk(c.getX(), c.getZ());
|
||||||
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), TileWrapper.class, (x, y, z, tile) -> {
|
mc.raiseFlag(MantleFlag.TILE, () -> J.s(() -> {
|
||||||
|
mc.iterate(TileWrapper.class, (x, y, z, tile) -> {
|
||||||
int betterY = y + getWorld().minHeight();
|
int betterY = y + getWorld().minHeight();
|
||||||
if (!TileData.setTileState(c.getBlock(x, betterY, z), tile.getData()))
|
if (!TileData.setTileState(c.getBlock(x, betterY, z), tile.getData()))
|
||||||
Iris.warn("Failed to set tile entity data at [%d %d %d | %s] for tile %s!", x, betterY, z, c.getBlock(x, betterY, z).getBlockData().getMaterial().getKey(), tile.getData().getTileId());
|
Iris.warn("Failed to set tile entity data at [%d %d %d | %s] for tile %s!", x, betterY, z, c.getBlock(x, betterY, z).getBlockData().getMaterial().getKey(), tile.getData().getTileId());
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.CUSTOM, () -> J.s(() -> {
|
if (mc.isFlagged(MantleFlag.CUSTOM_ACTIVE)) {
|
||||||
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> {
|
mc.raiseFlag(MantleFlag.CUSTOM, () -> J.s(() -> {
|
||||||
Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v);
|
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> {
|
||||||
});
|
Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v);
|
||||||
}));
|
});
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> {
|
getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.framework.placer.WorldObjectPlacer;
|
import com.volmit.iris.engine.framework.placer.WorldObjectPlacer;
|
||||||
import com.volmit.iris.engine.object.*;
|
import com.volmit.iris.engine.object.*;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.mantle.Mantle;
|
import com.volmit.iris.util.mantle.Mantle;
|
||||||
import com.volmit.iris.util.math.Position2;
|
import com.volmit.iris.util.math.Position2;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -150,9 +150,6 @@ public class PlannedStructure {
|
|||||||
return v.place(xx, height, zz, placer, options, rng, (b, data) -> {
|
return v.place(xx, height, zz, placer, options, rng, (b, data) -> {
|
||||||
e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id);
|
e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id);
|
||||||
e.set(b.getX(), b.getY(), b.getZ(), container);
|
e.set(b.getX(), b.getY(), b.getZ(), container);
|
||||||
if (data instanceof IrisBlockData d) {
|
|
||||||
e.set(b.getX(), b.getY(), b.getZ(), d.getCustom());
|
|
||||||
}
|
|
||||||
}, null, getData().getEngine() != null ? getData() : eng.getData()) != -1;
|
}, null, getData().getEngine() != null ? getData() : eng.getData()) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -27,7 +27,7 @@ import com.volmit.iris.engine.object.*;
|
|||||||
import com.volmit.iris.util.collection.KSet;
|
import com.volmit.iris.util.collection.KSet;
|
||||||
import com.volmit.iris.util.context.ChunkContext;
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
@@ -104,7 +104,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
|
|||||||
if (objectPlacement.isDolphinTarget() && objectPlacement.isUnderwater() && B.isStorageChest(data)) {
|
if (objectPlacement.isDolphinTarget() && objectPlacement.isUnderwater() && B.isStorageChest(data)) {
|
||||||
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
|
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
|
||||||
}
|
}
|
||||||
if (data instanceof IrisBlockData d) {
|
if (data instanceof IrisCustomData d) {
|
||||||
writer.setData(b.getX(), b.getY(), b.getZ(), d.getCustom());
|
writer.setData(b.getX(), b.getY(), b.getZ(), d.getCustom());
|
||||||
}
|
}
|
||||||
}, null, getData());
|
}, null, getData());
|
||||||
|
|||||||
@@ -25,10 +25,7 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.framework.EngineMode;
|
import com.volmit.iris.engine.framework.EngineMode;
|
||||||
import com.volmit.iris.engine.framework.EngineStage;
|
import com.volmit.iris.engine.framework.EngineStage;
|
||||||
import com.volmit.iris.engine.framework.IrisEngineMode;
|
import com.volmit.iris.engine.framework.IrisEngineMode;
|
||||||
import com.volmit.iris.engine.modifier.IrisCarveModifier;
|
import com.volmit.iris.engine.modifier.*;
|
||||||
import com.volmit.iris.engine.modifier.IrisDepositModifier;
|
|
||||||
import com.volmit.iris.engine.modifier.IrisPerfectionModifier;
|
|
||||||
import com.volmit.iris.engine.modifier.IrisPostModifier;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
||||||
@@ -41,6 +38,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
|||||||
var post = new IrisPostModifier(getEngine());
|
var post = new IrisPostModifier(getEngine());
|
||||||
var deposit = new IrisDepositModifier(getEngine());
|
var deposit = new IrisDepositModifier(getEngine());
|
||||||
var perfection = new IrisPerfectionModifier(getEngine());
|
var perfection = new IrisPerfectionModifier(getEngine());
|
||||||
|
var custom = new IrisCustomModifier(getEngine());
|
||||||
EngineStage sBiome = (x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c);
|
EngineStage sBiome = (x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c);
|
||||||
EngineStage sGenMatter = (x, z, k, p, m, c) -> generateMatter(x >> 4, z >> 4, m, c);
|
EngineStage sGenMatter = (x, z, k, p, m, c) -> generateMatter(x >> 4, z >> 4, m, c);
|
||||||
EngineStage sTerrain = (x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c);
|
EngineStage sTerrain = (x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c);
|
||||||
@@ -50,6 +48,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
|||||||
EngineStage sPost = (x, z, k, p, m, c) -> post.modify(x, z, k, m, c);
|
EngineStage sPost = (x, z, k, p, m, c) -> post.modify(x, z, k, m, c);
|
||||||
EngineStage sInsertMatter = (x, z, K, p, m, c) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m);
|
EngineStage sInsertMatter = (x, z, K, p, m, c) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m);
|
||||||
EngineStage sPerfection = (x, z, k, p, m, c) -> perfection.modify(x, z, k, m, c);
|
EngineStage sPerfection = (x, z, k, p, m, c) -> perfection.modify(x, z, k, m, c);
|
||||||
|
EngineStage sCustom = (x, z, k, p, m, c) -> custom.modify(x, z, k, m, c);
|
||||||
|
|
||||||
registerStage(burst(
|
registerStage(burst(
|
||||||
sGenMatter,
|
sGenMatter,
|
||||||
@@ -65,6 +64,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
|||||||
sDecorant
|
sDecorant
|
||||||
));
|
));
|
||||||
registerStage(sPerfection);
|
registerStage(sPerfection);
|
||||||
|
registerStage(sCustom);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.volmit.iris.engine.modifier;
|
||||||
|
|
||||||
|
import com.volmit.iris.core.link.Identifier;
|
||||||
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
|
import com.volmit.iris.engine.framework.EngineAssignedModifier;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
public class IrisCustomModifier extends EngineAssignedModifier<BlockData> {
|
||||||
|
public IrisCustomModifier(Engine engine) {
|
||||||
|
super(engine, "Custom");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
|
var mc = getEngine().getMantle().getMantle().getChunk(x >> 4, z >> 4);
|
||||||
|
if (!mc.isFlagged(MantleFlag.CUSTOM_ACTIVE)) return;
|
||||||
|
|
||||||
|
BurstExecutor burst = MultiBurst.burst.burst(output.getHeight());
|
||||||
|
burst.setMulticore(multicore);
|
||||||
|
for (int y = 0; y < output.getHeight(); y++) {
|
||||||
|
int finalY = y;
|
||||||
|
burst.queue(() -> {
|
||||||
|
for (int rX = 0; rX < output.getWidth(); rX++) {
|
||||||
|
for (int rZ = 0; rZ < output.getDepth(); rZ++) {
|
||||||
|
BlockData b = output.get(rX, finalY, rZ);
|
||||||
|
if (!(b instanceof IrisCustomData d)) continue;
|
||||||
|
|
||||||
|
mc.getOrCreate(finalY >> 4)
|
||||||
|
.slice(Identifier.class)
|
||||||
|
.set(rX, finalY & 15, rZ, d.getCustom());
|
||||||
|
output.set(rX, finalY, rZ, d.getBase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
burst.complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ import com.volmit.iris.util.collection.KList;
|
|||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.format.Form;
|
import com.volmit.iris.util.format.Form;
|
||||||
import com.volmit.iris.util.interpolation.IrisInterpolation;
|
import com.volmit.iris.util.interpolation.IrisInterpolation;
|
||||||
import com.volmit.iris.util.json.JSONObject;
|
import com.volmit.iris.util.json.JSONObject;
|
||||||
@@ -837,7 +837,7 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
if (j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) {
|
if (j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) {
|
||||||
BlockData newData = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z, rdata).clone();
|
BlockData newData = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z, rdata).clone();
|
||||||
|
|
||||||
if (newData.getMaterial() == data.getMaterial() && !(newData instanceof IrisBlockData || data instanceof IrisBlockData))
|
if (newData.getMaterial() == data.getMaterial() && !(newData instanceof IrisCustomData || data instanceof IrisCustomData))
|
||||||
data = data.merge(newData);
|
data = data.merge(newData);
|
||||||
else
|
else
|
||||||
data = newData;
|
data = newData;
|
||||||
|
|||||||
+4
-4
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class IrisBlockData implements BlockData {
|
public class IrisCustomData implements BlockData {
|
||||||
private final @NonNull BlockData base;
|
private final @NonNull BlockData base;
|
||||||
private final @NotNull Identifier custom;
|
private final @NotNull Identifier custom;
|
||||||
|
|
||||||
@@ -40,12 +40,12 @@ public class IrisBlockData implements BlockData {
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public BlockData merge(@NotNull BlockData blockData) {
|
public BlockData merge(@NotNull BlockData blockData) {
|
||||||
return new IrisBlockData(base.merge(blockData), custom);
|
return new IrisCustomData(base.merge(blockData), custom);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(@Nullable BlockData blockData) {
|
public boolean matches(@Nullable BlockData blockData) {
|
||||||
if (blockData instanceof IrisBlockData b)
|
if (blockData instanceof IrisCustomData b)
|
||||||
return custom.equals(b.custom) && base.matches(b.base);
|
return custom.equals(b.custom) && base.matches(b.base);
|
||||||
return base.matches(blockData);
|
return base.matches(blockData);
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ public class IrisBlockData implements BlockData {
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public BlockData clone() {
|
public BlockData clone() {
|
||||||
return new IrisBlockData(base.clone(), custom);
|
return new IrisCustomData(base.clone(), custom);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
package com.volmit.iris.util.hunk.view;
|
package com.volmit.iris.util.hunk.view;
|
||||||
|
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
@@ -73,7 +73,7 @@ public class ChunkDataHunkView implements Hunk<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (t instanceof IrisBlockData d)
|
if (t instanceof IrisCustomData d)
|
||||||
t = d.getBase();
|
t = d.getBase();
|
||||||
chunk.setBlock(x, y + chunk.getMinHeight(), z, t);
|
chunk.setBlock(x, y + chunk.getMinHeight(), z, t);
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ public enum MantleFlag {
|
|||||||
PLANNED,
|
PLANNED,
|
||||||
ETCHED,
|
ETCHED,
|
||||||
TILE,
|
TILE,
|
||||||
CUSTOM;
|
CUSTOM,
|
||||||
|
CUSTOM_ACTIVE;
|
||||||
|
|
||||||
static StateList getStateList() {
|
static StateList getStateList() {
|
||||||
return new StateList(MantleFlag.values());
|
return new StateList(MantleFlag.values());
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
package com.volmit.iris.util.matter.slices;
|
package com.volmit.iris.util.matter.slices;
|
||||||
|
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import com.volmit.iris.util.data.palette.Palette;
|
import com.volmit.iris.util.data.palette.Palette;
|
||||||
import com.volmit.iris.util.matter.Sliced;
|
import com.volmit.iris.util.matter.Sliced;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -41,7 +41,7 @@ public class BlockMatter extends RawMatter<BlockData> {
|
|||||||
public BlockMatter(int width, int height, int depth) {
|
public BlockMatter(int width, int height, int depth) {
|
||||||
super(width, height, depth, BlockData.class);
|
super(width, height, depth, BlockData.class);
|
||||||
registerWriter(World.class, ((w, d, x, y, z) -> {
|
registerWriter(World.class, ((w, d, x, y, z) -> {
|
||||||
if (d instanceof IrisBlockData c)
|
if (d instanceof IrisCustomData c)
|
||||||
w.getBlockAt(x, y, z).setBlockData(c.getBase());
|
w.getBlockAt(x, y, z).setBlockData(c.getBase());
|
||||||
else w.getBlockAt(x, y, z).setBlockData(d);
|
else w.getBlockAt(x, y, z).setBlockData(d);
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.volmit.iris.core.nms.v1_20_R3;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.ServerConfigurator;
|
import com.volmit.iris.core.ServerConfigurator;
|
||||||
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
|
||||||
import com.volmit.iris.core.nms.IHeadless;
|
import com.volmit.iris.core.nms.IHeadless;
|
||||||
import com.volmit.iris.core.nms.v1_20_R3.mca.MCATerrainChunk;
|
import com.volmit.iris.core.nms.v1_20_R3.mca.MCATerrainChunk;
|
||||||
import com.volmit.iris.core.nms.v1_20_R3.mca.RegionFileStorage;
|
import com.volmit.iris.core.nms.v1_20_R3.mca.RegionFileStorage;
|
||||||
@@ -33,7 +32,6 @@ import net.minecraft.world.level.chunk.ChunkAccess;
|
|||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.NamespacedKey;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -51,13 +49,15 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
private final Queue<ProtoChunk> chunkQueue = new ArrayDeque<>();
|
private final Queue<ProtoChunk> chunkQueue = new ArrayDeque<>();
|
||||||
private final ReentrantLock saveLock = new ReentrantLock();
|
private final ReentrantLock saveLock = new ReentrantLock();
|
||||||
private final KMap<String, Holder<Biome>> customBiomes = new KMap<>();
|
private final KMap<String, Holder<Biome>> customBiomes = new KMap<>();
|
||||||
private final KMap<NamespacedKey, Holder<Biome>> minecraftBiomes = new KMap<>();
|
private final KMap<org.bukkit.block.Biome, Holder<Biome>> minecraftBiomes = new KMap<>();
|
||||||
|
private final RNG BIOME_RNG;
|
||||||
private boolean closed = false;
|
private boolean closed = false;
|
||||||
|
|
||||||
public Headless(NMSBinding binding, Engine engine) {
|
public Headless(NMSBinding binding, Engine engine) {
|
||||||
this.binding = binding;
|
this.binding = binding;
|
||||||
this.engine = engine;
|
this.engine = engine;
|
||||||
this.storage = new RegionFileStorage(new File(engine.getWorld().worldFolder(), "region").toPath(), false);
|
this.storage = new RegionFileStorage(new File(engine.getWorld().worldFolder(), "region").toPath(), false);
|
||||||
|
this.BIOME_RNG = new RNG(engine.getSeedManager().getBiome());
|
||||||
var queueLooper = new Looper() {
|
var queueLooper = new Looper() {
|
||||||
@Override
|
@Override
|
||||||
protected long loop() {
|
protected long loop() {
|
||||||
@@ -78,8 +78,7 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
}
|
}
|
||||||
for (var biome : org.bukkit.block.Biome.values()) {
|
for (var biome : org.bukkit.block.Biome.values()) {
|
||||||
if (biome == org.bukkit.block.Biome.CUSTOM) continue;
|
if (biome == org.bukkit.block.Biome.CUSTOM) continue;
|
||||||
var key = biome.getKey();
|
minecraftBiomes.put(biome, binding.getBiomeHolder(biome.getKey()));
|
||||||
minecraftBiomes.put(key, binding.getBiomeHolder(key.getNamespace(), key.getKey()));
|
|
||||||
}
|
}
|
||||||
ServerConfigurator.dumpDataPack();
|
ServerConfigurator.dumpDataPack();
|
||||||
}
|
}
|
||||||
@@ -165,7 +164,7 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
blocks.apply();
|
blocks.apply();
|
||||||
biomes.apply();
|
biomes.apply();
|
||||||
|
|
||||||
inject(engine, tc.getBiomeBaseInjector(), chunk, ctx); //TODO improve
|
inject(engine, chunk, ctx);
|
||||||
chunk.setStatus(ChunkStatus.FULL);
|
chunk.setStatus(ChunkStatus.FULL);
|
||||||
chunkQueue.add(chunk);
|
chunkQueue.add(chunk);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
@@ -214,7 +213,7 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void inject(Engine engine, BiomeBaseInjector injector, ChunkAccess chunk, ChunkContext ctx) {
|
private void inject(Engine engine, ChunkAccess chunk, ChunkContext ctx) {
|
||||||
var pos = chunk.getPos();
|
var pos = chunk.getPos();
|
||||||
for (int y = engine.getMinHeight(); y < engine.getMaxHeight(); y++) {
|
for (int y = engine.getMinHeight(); y < engine.getMaxHeight(); y++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
@@ -222,7 +221,7 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
int wX = pos.getBlockX(x);
|
int wX = pos.getBlockX(x);
|
||||||
int wZ = pos.getBlockZ(z);
|
int wZ = pos.getBlockZ(z);
|
||||||
try {
|
try {
|
||||||
injector.setBiome(x, y, z, getNoiseBiome(engine, ctx, x, z, wX, y, wZ));
|
chunk.setBiome(x, y, z, getNoiseBiome(engine, ctx, x, z, wX, y, wZ));
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to inject biome for " + wX + ", " + y + ", " + wZ);
|
Iris.error("Failed to inject biome for " + wX + ", " + y + ", " + wZ);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -233,17 +232,14 @@ public class Headless implements IHeadless, LevelHeightAccessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Holder<Biome> getNoiseBiome(Engine engine, ChunkContext ctx, int rX, int rZ, int x, int y, int z) {
|
private Holder<Biome> getNoiseBiome(Engine engine, ChunkContext ctx, int rX, int rZ, int x, int y, int z) {
|
||||||
RNG rng = new RNG(engine.getSeedManager().getBiome());
|
|
||||||
int m = (y - engine.getMinHeight()) << 2;
|
int m = (y - engine.getMinHeight()) << 2;
|
||||||
IrisBiome ib = ctx == null ?
|
IrisBiome ib = ctx == null ?
|
||||||
engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2) :
|
engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2) :
|
||||||
ctx.getBiome().get(rX, rZ);
|
ctx.getBiome().get(rX, rZ);
|
||||||
if (ib.isCustom()) {
|
if (ib.isCustom()) {
|
||||||
return customBiomes.computeIfAbsent(ib.getCustomBiome(rng, x << 2, m, z << 2).getId(),
|
return customBiomes.get(ib.getCustomBiome(BIOME_RNG, x << 2, m, z << 2).getId());
|
||||||
id -> binding.getBiomeHolder(engine.getDimension().getLoadKey(), id));
|
|
||||||
} else {
|
} else {
|
||||||
return minecraftBiomes.computeIfAbsent(ib.getSkyBiome(rng, x << 2, m, z << 2).getKey(),
|
return minecraftBiomes.get(ib.getSkyBiome(BIOME_RNG, x << 2, m, z << 2));
|
||||||
id -> binding.getBiomeHolder(id.getNamespace(), id.getKey()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -906,6 +906,10 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Holder.Reference<net.minecraft.world.level.biome.Biome> getBiomeHolder(NamespacedKey key) {
|
||||||
|
return getBiomeHolder(key.getNamespace(), key.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
Holder.Reference<net.minecraft.world.level.biome.Biome> getBiomeHolder(String namespace, String id) {
|
Holder.Reference<net.minecraft.world.level.biome.Biome> getBiomeHolder(String namespace, String id) {
|
||||||
return getCustomBiomeRegistry().getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(namespace, id))).orElse(null);
|
return getCustomBiomeRegistry().getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(namespace, id))).orElse(null);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -3,7 +3,7 @@ package com.volmit.iris.core.nms.v1_20_R3.mca;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
import com.volmit.iris.core.nms.BiomeBaseInjector;
|
||||||
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
||||||
import com.volmit.iris.util.data.IrisBlockData;
|
import com.volmit.iris.util.data.IrisCustomData;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.world.level.LevelHeightAccessor;
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
@@ -22,7 +22,7 @@ public record MCATerrainChunk(ChunkAccess chunk) implements TerrainChunk {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BiomeBaseInjector getBiomeBaseInjector() {
|
public BiomeBaseInjector getBiomeBaseInjector() {
|
||||||
return (x, y, z, biomeBase) -> chunk.setBiome(x, y, z, (Holder<net.minecraft.world.level.biome.Biome>) biomeBase);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -71,7 +71,7 @@ public record MCATerrainChunk(ChunkAccess chunk) implements TerrainChunk {
|
|||||||
if (blockData == null) {
|
if (blockData == null) {
|
||||||
Iris.error("NULL BD");
|
Iris.error("NULL BD");
|
||||||
}
|
}
|
||||||
if (blockData instanceof IrisBlockData data)
|
if (blockData instanceof IrisCustomData data)
|
||||||
blockData = data.getBase();
|
blockData = data.getBase();
|
||||||
if (!(blockData instanceof CraftBlockData craftBlockData))
|
if (!(blockData instanceof CraftBlockData craftBlockData))
|
||||||
throw new IllegalArgumentException("Expected CraftBlockData, got " + blockData.getClass().getSimpleName() + " instead");
|
throw new IllegalArgumentException("Expected CraftBlockData, got " + blockData.getClass().getSimpleName() + " instead");
|
||||||
|
|||||||
Reference in New Issue
Block a user