improve performance related to custom blocks (#1155)

This commit is contained in:
Julian Krings 2025-01-27 15:22:10 +01:00 committed by GitHub
parent e5d21fdf7e
commit 847bf972ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 113 additions and 57 deletions

View File

@ -28,6 +28,7 @@ import com.volmit.iris.core.tools.IrisConverter;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.object.*;
import com.volmit.iris.util.data.Cuboid; import com.volmit.iris.util.data.Cuboid;
import com.volmit.iris.util.data.IrisCustomData;
import com.volmit.iris.util.data.registry.Materials; import com.volmit.iris.util.data.registry.Materials;
import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeExecutor;
import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.DecreeOrigin;
@ -77,7 +78,10 @@ public class CommandObject implements DecreeExecutor {
futureBlockChanges.put(block, block.getBlockData()); futureBlockChanges.put(block, block.getBlockData());
block.setBlockData(d); if (d instanceof IrisCustomData data) {
block.setBlockData(data.getBase());
Iris.warn("Tried to place custom block at " + x + ", " + y + ", " + z + " which is not supported!");
} else block.setBlockData(d);
} }
@Override @Override

View File

@ -2,7 +2,7 @@ package com.volmit.iris.core.link;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
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 lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -49,7 +49,7 @@ public abstract class ExternalDataProvider {
* @param blockId The id of the block to get * @param blockId The id of the block to get
* @param state The state of the block to get * @param state The state of the block to get
* @return Corresponding {@link BlockData} to the blockId * @return Corresponding {@link BlockData} to the blockId
* may return {@link IrisBlockData} for blocks that need a world for placement * may return {@link IrisCustomData} for blocks that need a world for placement
* @throws MissingResourceException when the blockId is invalid * @throws MissingResourceException when the blockId is invalid
*/ */
@NotNull @NotNull
@ -77,7 +77,7 @@ public abstract class ExternalDataProvider {
/** /**
* This method is used for placing blocks that need to use the plugins api * This method is used for placing blocks that need to use the plugins api
* it will only be called when the {@link ExternalDataProvider#getBlockData(Identifier, KMap)} returned a {@link IrisBlockData} * it will only be called when the {@link ExternalDataProvider#getBlockData(Identifier, KMap)} returned a {@link IrisCustomData}
* *
* @param engine The engine of the world the block is being placed in * @param engine The engine of the world the block is being placed in
* @param block The block where the block should be placed * @param block The block where the block should be placed

View File

@ -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;
@ -64,7 +64,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));
} }
@NotNull @NotNull

View File

@ -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 io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.bukkit.BukkitAdapter;
import io.lumine.mythic.bukkit.utils.serialize.Chroma; import io.lumine.mythic.bukkit.utils.serialize.Chroma;
@ -71,7 +71,7 @@ public class MythicCrucibleDataProvider extends ExternalDataProvider {
CustomBlockItemContext blockItemContext = crucibleItem.getBlockData(); CustomBlockItemContext blockItemContext = crucibleItem.getBlockData();
FurnitureItemContext furnitureItemContext = crucibleItem.getFurnitureData(); FurnitureItemContext furnitureItemContext = crucibleItem.getFurnitureData();
if (furnitureItemContext != null) { if (furnitureItemContext != null) {
return new IrisBlockData(B.getAir(), ExternalDataSVC.buildState(blockId, state)); return new IrisCustomData(B.getAir(), ExternalDataSVC.buildState(blockId, state));
} else if (blockItemContext != null) { } else if (blockItemContext != null) {
return blockItemContext.getBlockData(); return blockItemContext.getBlockData();
} }

View File

@ -11,7 +11,7 @@ import com.volmit.iris.engine.data.cache.Cache;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
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 org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -49,9 +49,9 @@ public class NexoDataProvider extends ExternalDataProvider {
BlockData data = NexoBlocks.blockData(blockId.key()); BlockData data = NexoBlocks.blockData(blockId.key());
if (data == null) if (data == null)
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
return new IrisBlockData(data, blockState); return new IrisCustomData(data, blockState);
} else if (NexoFurniture.isFurniture(blockId.key())) { } else if (NexoFurniture.isFurniture(blockId.key())) {
return new IrisBlockData(B.getAir(), blockState); return new IrisCustomData(B.getAir(), blockState);
} }
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());

View File

@ -27,6 +27,7 @@ import com.volmit.iris.engine.platform.PlatformChunkGenerator;
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.Cuboid; import com.volmit.iris.util.data.Cuboid;
import com.volmit.iris.util.data.IrisCustomData;
import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.BlockPosition;
import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.plugin.IrisService;
@ -34,7 +35,6 @@ import com.volmit.iris.util.scheduling.J;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.TileState;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Sapling; import org.bukkit.block.data.type.Sapling;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -142,7 +142,9 @@ public class TreeSVC implements IrisService {
public void set(int x, int y, int z, BlockData d) { public void set(int x, int y, int z, BlockData d) {
Block b = event.getWorld().getBlockAt(x, y, z); Block b = event.getWorld().getBlockAt(x, y, z);
BlockState state = b.getState(); BlockState state = b.getState();
state.setBlockData(d); if (d instanceof IrisCustomData data)
state.setBlockData(data.getBase());
else state.setBlockData(d);
blockStateList.add(b.getState()); blockStateList.add(b.getState());
dataCache.put(new Location(event.getWorld(), x, y, z), d); dataCache.put(new Location(event.getWorld(), x, y, z), d);
} }
@ -213,12 +215,17 @@ public class TreeSVC implements IrisService {
block = false; block = false;
if (!iGrow.isCancelled()) { if (!iGrow.isCancelled()) {
for (BlockState block : iGrow.getBlocks()) { for (BlockState state : iGrow.getBlocks()) {
Location l = block.getLocation(); Location l = state.getLocation();
if (dataCache.containsKey(l)) { BlockData d = dataCache.get(l);
l.getBlock().setBlockData(dataCache.get(l), false); if (d == null) continue;
} Block block = l.getBlock();
if (d instanceof IrisCustomData data) {
block.setBlockData(data.getBase(), false);
Iris.service(ExternalDataSVC.class).processUpdate(engine, block, data.getCustom());
} else block.setBlockData(d);
} }
} }
}); });

View File

@ -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);
} }

View File

@ -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);

View File

@ -42,7 +42,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;
@ -259,10 +259,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, true);
} else {
getMantle().getMantle().remove(x, y, z, Identifier.class);
} }
} }

View File

@ -13,6 +13,7 @@ import com.volmit.iris.engine.object.IrisLootTable;
import com.volmit.iris.engine.object.TileData; import com.volmit.iris.engine.object.TileData;
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.data.B;
import com.volmit.iris.util.data.IrisCustomData;
import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.math.RNG;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@ -78,7 +79,11 @@ public class WorldObjectPlacer implements IObjectPlacer {
} }
} }
block.setBlockData(d);
if (d instanceof IrisCustomData data) {
block.setBlockData(data.getBase());
Iris.warn("Tried to place custom block at " + x + ", " + y + ", " + z + " which is not supported!");
} else block.setBlockData(d);
} }
@Override @Override

View File

@ -25,7 +25,6 @@ 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.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;
@ -155,9 +154,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;
} }

View File

@ -34,6 +34,7 @@ import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.context.ChunkContext; 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.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.hunk.Hunk; import com.volmit.iris.util.hunk.Hunk;
@ -104,7 +105,10 @@ public interface EngineMantle extends IObjectPlacer {
@Override @Override
default void set(int x, int y, int z, BlockData d) { default void set(int x, int y, int z, BlockData d) {
getMantle().set(x, y, z, d == null ? AIR : d); if (d instanceof IrisCustomData data) {
getMantle().set(x, y, z, data.getBase());
getMantle().set(x, y, z, data.getCustom());
} else getMantle().set(x, y, z, d == null ? AIR : d);
} }
@Override @Override

View File

@ -29,6 +29,7 @@ import com.volmit.iris.engine.object.IrisPosition;
import com.volmit.iris.engine.object.TileData; import com.volmit.iris.engine.object.TileData;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.data.IrisCustomData;
import com.volmit.iris.util.function.Function3; import com.volmit.iris.util.function.Function3;
import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.mantle.MantleChunk; import com.volmit.iris.util.mantle.MantleChunk;
@ -166,7 +167,10 @@ public class MantleWriter implements IObjectPlacer, AutoCloseable {
@Override @Override
public void set(int x, int y, int z, BlockData d) { public void set(int x, int y, int z, BlockData d) {
setData(x, y, z, d); if (d instanceof IrisCustomData data) {
setData(x, y, z, data.getBase());
setData(x, y, z, data.getCustom());
} else setData(x, y, z, d);
} }
@Override @Override

View File

@ -29,7 +29,6 @@ import com.volmit.iris.util.collection.KMap;
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.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.Form; import com.volmit.iris.util.format.Form;
@ -116,9 +115,6 @@ 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) {
writer.setData(b.getX(), b.getY(), b.getZ(), d.getCustom());
}
}, null, getData()); }, null, getData());
} }
} }

View File

@ -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,6 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode {
sDecorant sDecorant
)); ));
registerStage(sPerfection); registerStage(sPerfection);
registerStage(sCustom);
} }
} }

View File

@ -57,7 +57,7 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) { public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
Mantle mantle = getEngine().getMantle().getMantle(); Mantle mantle = getEngine().getMantle().getMantle();
MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z); MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z).use();
KMap<Long, KList<Integer>> positions = new KMap<>(); KMap<Long, KList<Integer>> positions = new KMap<>();
KMap<IrisPosition, MatterCavern> walls = new KMap<>(); KMap<IrisPosition, MatterCavern> walls = new KMap<>();
Consumer4<Integer, Integer, Integer, MatterCavern> iterator = (xx, yy, zz, c) -> { Consumer4<Integer, Integer, Integer, MatterCavern> iterator = (xx, yy, zz, c) -> {
@ -166,6 +166,7 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
}); });
getEngine().getMetrics().getDeposit().put(p.getMilliseconds()); getEngine().getMetrics().getDeposit().put(p.getMilliseconds());
mc.release();
} }
private void processZone(Hunk<BlockData> output, MantleChunk mc, Mantle mantle, CaveZone zone, int rx, int rz, int xx, int zz) { private void processZone(Hunk<BlockData> output, MantleChunk mc, Mantle mantle, CaveZone zone, int rx, int rz, int xx, int zz) {

View File

@ -0,0 +1,43 @@
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;
mc.use();
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();
mc.release();
}
}

View File

@ -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;
@ -53,8 +53,6 @@ import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.TileState;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.MultipleFacing;
import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.Waterlogged;
@ -943,7 +941,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;

View File

@ -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

View File

@ -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) {

View File

@ -35,7 +35,8 @@ public enum MantleFlag {
ETCHED, ETCHED,
TILE, TILE,
CUSTOM, CUSTOM,
DISCOVERED; DISCOVERED,
CUSTOM_ACTIVE;
static StateList getStateList() { static StateList getStateList() {
return new StateList(MantleFlag.values()); return new StateList(MantleFlag.values());

View File

@ -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);
})); }));