Resolution Currency

This commit is contained in:
Brian Neumann-Fopiano
2026-06-11 19:21:07 -04:00
parent 65d4abe5c0
commit 4c462ba78a
38 changed files with 702 additions and 424 deletions
@@ -18,6 +18,8 @@
package art.arcane.iris.core.commands;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.Iris;
import art.arcane.iris.core.edit.BlockSignal;
@@ -26,7 +28,6 @@ import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.IrisBiome;
import art.arcane.iris.engine.object.IrisRegion;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.director.DirectorExecutor;
import art.arcane.volmlib.util.director.DirectorOrigin;
import art.arcane.volmlib.util.director.annotations.Director;
@@ -119,31 +120,31 @@ public class CommandWhat implements DirectorExecutor {
sender().sendMessage("Material: " + C.GREEN + bd.getMaterial().name());
sender().sendMessage("Full: " + C.WHITE + bd.getAsString(true));
if (B.isStorage(bd)) {
if (BukkitBlockResolution.isStorage(bd)) {
sender().sendMessage(C.YELLOW + "* Storage Block (Loot Capable)");
}
if (B.isLit(bd)) {
if (BukkitBlockResolution.isLit(bd)) {
sender().sendMessage(C.YELLOW + "* Lit Block (Light Capable)");
}
if (B.isFoliage(bd)) {
if (BukkitBlockResolution.isFoliage(bd)) {
sender().sendMessage(C.YELLOW + "* Foliage Block");
}
if (B.isDecorant(bd)) {
if (BukkitBlockResolution.isDecorant(bd)) {
sender().sendMessage(C.YELLOW + "* Decorant Block");
}
if (B.isFluid(bd)) {
if (BukkitBlockResolution.isFluid(bd)) {
sender().sendMessage(C.YELLOW + "* Fluid Block");
}
if (B.isFoliagePlantable(bd)) {
if (BukkitBlockResolution.isFoliagePlantable(bd)) {
sender().sendMessage(C.YELLOW + "* Plantable Foliage Block");
}
if (B.isSolid(bd)) {
if (BukkitBlockResolution.isSolid(bd)) {
sender().sendMessage(C.YELLOW + "* Solid Block");
}
}
+27 -27
View File
@@ -1,3 +1,6 @@
art/arcane/iris/core/IrisRuntimeSchedulerMode.java
art/arcane/iris/core/IrisWorlds.java
art/arcane/iris/core/ServerConfigurator.java
art/arcane/iris/core/datapack/DatapackIngestService.java
art/arcane/iris/core/edit/BlockSignal.java
art/arcane/iris/core/edit/DustRevealer.java
@@ -5,8 +8,6 @@ art/arcane/iris/core/events/IrisEngineEvent.java
art/arcane/iris/core/events/IrisEngineHotloadEvent.java
art/arcane/iris/core/events/IrisLootEvent.java
art/arcane/iris/core/gui/PregeneratorJob.java
art/arcane/iris/core/IrisRuntimeSchedulerMode.java
art/arcane/iris/core/IrisWorlds.java
art/arcane/iris/core/lifecycle/BukkitPublicBackend.java
art/arcane/iris/core/lifecycle/CapabilitySnapshot.java
art/arcane/iris/core/lifecycle/PaperLibBootstrap.java
@@ -18,6 +19,10 @@ art/arcane/iris/core/lifecycle/WorldLifecycleStaging.java
art/arcane/iris/core/lifecycle/WorldLifecycleSupport.java
art/arcane/iris/core/lifecycle/WorldsProviderBackend.java
art/arcane/iris/core/link/CustomItemsDataProvider.java
art/arcane/iris/core/link/ExternalDataProvider.java
art/arcane/iris/core/link/Identifier.java
art/arcane/iris/core/link/MultiverseCoreLink.java
art/arcane/iris/core/link/WorldEditLink.java
art/arcane/iris/core/link/data/CraftEngineDataProvider.java
art/arcane/iris/core/link/data/EcoItemsDataProvider.java
art/arcane/iris/core/link/data/ExecutableItemsDataProvider.java
@@ -28,14 +33,10 @@ art/arcane/iris/core/link/data/MMOItemsDataProvider.java
art/arcane/iris/core/link/data/MythicCrucibleDataProvider.java
art/arcane/iris/core/link/data/MythicMobsDataProvider.java
art/arcane/iris/core/link/data/NexoDataProvider.java
art/arcane/iris/core/link/ExternalDataProvider.java
art/arcane/iris/core/link/Identifier.java
art/arcane/iris/core/link/MultiverseCoreLink.java
art/arcane/iris/core/link/WorldEditLink.java
art/arcane/iris/core/nms/datapack/v1206/DataFixerV1206.java
art/arcane/iris/core/nms/INMS.java
art/arcane/iris/core/nms/INMSBinding.java
art/arcane/iris/core/nms/MinecraftVersion.java
art/arcane/iris/core/nms/datapack/v1206/DataFixerV1206.java
art/arcane/iris/core/nms/v1X/NMSBinding1X.java
art/arcane/iris/core/pack/IrisPack.java
art/arcane/iris/core/pregenerator/DeepSearchPregenerator.java
@@ -57,12 +58,11 @@ art/arcane/iris/core/runtime/WorldRuntimeControlBackend.java
art/arcane/iris/core/runtime/WorldRuntimeControlService.java
art/arcane/iris/core/safeguard/Mode.java
art/arcane/iris/core/safeguard/task/Tasks.java
art/arcane/iris/core/ServerConfigurator.java
art/arcane/iris/core/service/BoardSVC.java
art/arcane/iris/core/service/ExternalDataSVC.java
art/arcane/iris/core/service/GlobalCacheSVC.java
art/arcane/iris/core/service/ObjectStudioSaveService.java
art/arcane/iris/core/service/ObjectSVC.java
art/arcane/iris/core/service/ObjectStudioSaveService.java
art/arcane/iris/core/service/StudioSVC.java
art/arcane/iris/core/service/TreeSVC.java
art/arcane/iris/core/structure/BulkStructureImporter.java
@@ -77,6 +77,8 @@ art/arcane/iris/core/tools/IrisReflectiveAPI.java
art/arcane/iris/core/tools/IrisToolbelt.java
art/arcane/iris/core/tools/IrisWorldCreator.java
art/arcane/iris/core/tools/TreePlausibilizer.java
art/arcane/iris/engine/IrisEngineEffects.java
art/arcane/iris/engine/IrisWorldManager.java
art/arcane/iris/engine/actuator/IrisBiomeActuator.java
art/arcane/iris/engine/data/chunk/LinkedTerrainChunk.java
art/arcane/iris/engine/data/chunk/TerrainChunk.java
@@ -88,24 +90,15 @@ art/arcane/iris/engine/framework/EnginePlayer.java
art/arcane/iris/engine/framework/EngineWorldManager.java
art/arcane/iris/engine/framework/LootProvider.java
art/arcane/iris/engine/framework/placer/WorldObjectPlacer.java
art/arcane/iris/engine/IrisEngineEffects.java
art/arcane/iris/engine/IrisWorldManager.java
art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponent.java
art/arcane/iris/engine/mantle/components/MantleObjectComponent.java
art/arcane/iris/engine/mantle/EngineMantle.java
art/arcane/iris/engine/mantle/MantleWriter.java
art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponent.java
art/arcane/iris/engine/mantle/components/MantleObjectComponent.java
art/arcane/iris/engine/modifier/IrisDepositModifier.java
art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java
art/arcane/iris/engine/modifier/IrisPerfectionModifier.java
art/arcane/iris/engine/modifier/IrisPostModifier.java
art/arcane/iris/engine/object/annotations/functions/LootTableKeyFunction.java
art/arcane/iris/engine/object/BlockDataMergeSupport.java
art/arcane/iris/engine/object/coral/CoralGenerator.java
art/arcane/iris/engine/object/crystal/CrystalGenerator.java
art/arcane/iris/engine/object/formation/FormationBlockResolver.java
art/arcane/iris/engine/object/formation/FormationGenerator.java
art/arcane/iris/engine/object/fungi/FungusGenerator.java
art/arcane/iris/engine/object/fungi/FungusStemBuilder.java
art/arcane/iris/engine/object/IPostBlockAccess.java
art/arcane/iris/engine/object/IrisAttributeModifier.java
art/arcane/iris/engine/object/IrisBiome.java
@@ -141,10 +134,17 @@ art/arcane/iris/engine/object/IrisVillagerTrade.java
art/arcane/iris/engine/object/IrisWorld.java
art/arcane/iris/engine/object/LegacyTileData.java
art/arcane/iris/engine/object/PotionEffectTypes.java
art/arcane/iris/engine/object/TileData.java
art/arcane/iris/engine/object/annotations/functions/LootTableKeyFunction.java
art/arcane/iris/engine/object/coral/CoralGenerator.java
art/arcane/iris/engine/object/crystal/CrystalGenerator.java
art/arcane/iris/engine/object/formation/FormationBlockResolver.java
art/arcane/iris/engine/object/formation/FormationGenerator.java
art/arcane/iris/engine/object/fungi/FungusGenerator.java
art/arcane/iris/engine/object/fungi/FungusStemBuilder.java
art/arcane/iris/engine/object/ruin/RuinBlockCanvas.java
art/arcane/iris/engine/object/ruin/RuinDecoratorApplier.java
art/arcane/iris/engine/object/ruin/RuinGenerator.java
art/arcane/iris/engine/object/TileData.java
art/arcane/iris/engine/object/tree/ProceduralTreeGenerator.java
art/arcane/iris/engine/object/tree/TreeBlockResolver.java
art/arcane/iris/engine/object/tree/TreePlausibility.java
@@ -153,6 +153,7 @@ art/arcane/iris/engine/platform/DummyBiomeProvider.java
art/arcane/iris/engine/platform/DummyChunkGenerator.java
art/arcane/iris/engine/platform/studio/generators/ObjectStudioGenerator.java
art/arcane/iris/platform/bukkit/BukkitBiome.java
art/arcane/iris/platform/bukkit/BukkitBlockResolution.java
art/arcane/iris/platform/bukkit/BukkitBlockState.java
art/arcane/iris/platform/bukkit/BukkitEntityType.java
art/arcane/iris/platform/bukkit/BukkitItem.java
@@ -160,18 +161,17 @@ art/arcane/iris/platform/bukkit/BukkitPlatform.java
art/arcane/iris/platform/bukkit/BukkitRegistries.java
art/arcane/iris/platform/bukkit/BukkitScheduler.java
art/arcane/iris/platform/bukkit/BukkitWorld.java
art/arcane/iris/util/common/data/B.java
art/arcane/iris/util/common/data/IrisCustomData.java
art/arcane/iris/util/common/data/VectorMap.java
art/arcane/iris/util/common/data/registry/Attributes.java
art/arcane/iris/util/common/data/registry/KeyedRegistry.java
art/arcane/iris/util/common/data/registry/Materials.java
art/arcane/iris/util/common/data/registry/Particles.java
art/arcane/iris/util/common/data/registry/RegistryTypeAdapter.java
art/arcane/iris/util/common/data/registry/RegistryUtil.java
art/arcane/iris/util/common/data/VectorMap.java
art/arcane/iris/util/common/director/DirectorExecutor.java
art/arcane/iris/util/common/director/context/VectorContextHandler.java
art/arcane/iris/util/common/director/context/WorldContextHandler.java
art/arcane/iris/util/common/director/DirectorExecutor.java
art/arcane/iris/util/common/director/handlers/BlockVectorHandler.java
art/arcane/iris/util/common/director/handlers/PlayerHandler.java
art/arcane/iris/util/common/director/handlers/VectorHandler.java
@@ -188,8 +188,6 @@ art/arcane/iris/util/common/math/VectorMath.java
art/arcane/iris/util/common/misc/Bindings.java
art/arcane/iris/util/common/nbt/mca/Chunk.java
art/arcane/iris/util/common/nbt/mca/NBTWorld.java
art/arcane/iris/util/common/plugin/chunk/ChunkTickets.java
art/arcane/iris/util/common/plugin/chunk/TicketHolder.java
art/arcane/iris/util/common/plugin/Chunks.java
art/arcane/iris/util/common/plugin/CommandDummy.java
art/arcane/iris/util/common/plugin/IController.java
@@ -200,6 +198,8 @@ art/arcane/iris/util/common/plugin/RouterCommand.java
art/arcane/iris/util/common/plugin/VirtualCommand.java
art/arcane/iris/util/common/plugin/VolmitPlugin.java
art/arcane/iris/util/common/plugin/VolmitSender.java
art/arcane/iris/util/common/plugin/chunk/ChunkTickets.java
art/arcane/iris/util/common/plugin/chunk/TicketHolder.java
art/arcane/iris/util/common/reflect/KeyedType.java
art/arcane/iris/util/common/reflect/OldEnum.java
art/arcane/iris/util/common/scheduling/J.java
@@ -209,8 +209,8 @@ art/arcane/iris/util/project/hunk/view/ChunkDataHunkHolder.java
art/arcane/iris/util/project/hunk/view/ChunkDataHunkView.java
art/arcane/iris/util/project/hunk/view/ChunkHunkView.java
art/arcane/iris/util/project/matter/IrisMatterSupport.java
art/arcane/iris/util/project/matter/WorldMatter.java
art/arcane/iris/util/project/matter/slices/EntityMatter.java
art/arcane/iris/util/project/matter/slices/TileMatter.java
art/arcane/iris/util/project/matter/WorldMatter.java
art/arcane/iris/util/project/sentry/Attachments.java
art/arcane/iris/util/project/sentry/ServerID.java
@@ -1,12 +1,13 @@
package art.arcane.iris.core.link.data;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.link.ExternalDataProvider;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.nms.container.BlockProperty;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.data.cache.Cache;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.math.RNG;
@@ -89,7 +90,7 @@ public class CraftEngineDataProvider extends ExternalDataProvider {
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
}
return IrisCustomData.of(B.getAir(), ExternalDataSVC.buildState(blockId, state));
return IrisCustomData.of(BukkitBlockResolution.getAir(), ExternalDataSVC.buildState(blockId, state));
}
@Override
@@ -1,11 +1,12 @@
package art.arcane.iris.core.link.data;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.link.ExternalDataProvider;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import me.kryniowesegryderiusz.kgenerators.Main;
import me.kryniowesegryderiusz.kgenerators.api.KGeneratorsAPI;
@@ -48,7 +49,7 @@ public class KGeneratorsDataProvider extends ExternalDataProvider {
if (block.getType() != Material.STRUCTURE_VOID) return;
var existing = KGeneratorsAPI.getLoadedGeneratorLocation(block.getLocation());
if (existing != null) return;
block.setBlockData(B.getAir(), false);
block.setBlockData(BukkitBlockResolution.getAir(), false);
var gen = Main.getGenerators().get(blockId.key());
if (gen == null) return;
var loc = new GeneratorLocation(-1, gen, block.getLocation(), Main.getPlacedGenerators().getChunkInfo(block.getChunk()), null, null);
@@ -18,6 +18,8 @@
package art.arcane.iris.core.link.data;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.core.link.ExternalDataProvider;
import art.arcane.iris.core.link.Identifier;
@@ -27,7 +29,6 @@ import art.arcane.iris.core.nms.container.BlockProperty;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import io.lumine.mythic.bukkit.BukkitAdapter;
import io.lumine.mythic.bukkit.utils.serialize.Chroma;
@@ -72,7 +73,7 @@ public class MythicCrucibleDataProvider extends ExternalDataProvider {
CustomBlockItemContext blockItemContext = crucibleItem.getBlockData();
FurnitureItemContext furnitureItemContext = crucibleItem.getFurnitureData();
if (furnitureItemContext != null) {
return IrisCustomData.of(B.getAir(), ExternalDataSVC.buildState(blockId, state));
return IrisCustomData.of(BukkitBlockResolution.getAir(), ExternalDataSVC.buildState(blockId, state));
} else if (blockItemContext != null) {
return blockItemContext.getBlockData();
}
@@ -1,5 +1,7 @@
package art.arcane.iris.core.link.data;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import com.nexomc.nexo.api.NexoBlocks;
import com.nexomc.nexo.api.NexoFurniture;
import com.nexomc.nexo.api.NexoItems;
@@ -12,7 +14,6 @@ import art.arcane.iris.core.nms.container.BlockProperty;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import org.bukkit.Color;
import org.bukkit.block.Block;
@@ -51,7 +52,7 @@ public class NexoDataProvider extends ExternalDataProvider {
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
return IrisCustomData.of(data, blockState);
} else if (NexoFurniture.isFurniture(blockId.key())) {
return IrisCustomData.of(B.getAir(), blockState);
return IrisCustomData.of(BukkitBlockResolution.getAir(), blockState);
}
throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
@@ -18,6 +18,8 @@
package art.arcane.iris.core.project;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.link.Identifier;
@@ -31,7 +33,6 @@ import art.arcane.iris.engine.object.annotations.*;
import art.arcane.iris.core.nms.INMS;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.volmlib.util.json.JSONArray;
import art.arcane.volmlib.util.json.JSONObject;
import art.arcane.iris.util.common.reflect.KeyedType;
@@ -275,7 +276,7 @@ public class SchemaBuilder {
ja.put(i);
}
for (String i : B.getBlockTypes()) {
for (String i : BukkitBlockResolution.getBlockTypes()) {
ja.put(i);
}
@@ -330,7 +331,7 @@ public class SchemaBuilder {
if (!definitions.containsKey(key)) {
JSONObject j = new JSONObject();
j.put("enum", B.getItemTypes());
j.put("enum", BukkitBlockResolution.getItemTypes());
definitions.put(key, j);
}
@@ -438,7 +439,7 @@ public class SchemaBuilder {
JSONArray any = new JSONArray();
prop.put("anyOf", any);
B.getBlockStates().forEach((blocks, properties) -> {
BukkitBlockResolution.getBlockStates().forEach((blocks, properties) -> {
if (blocks.isEmpty()) return;
String raw = blocks.getFirst().replace(':', '_');
@@ -570,7 +571,7 @@ public class SchemaBuilder {
ja.put(i);
}
for (String i : B.getBlockTypes()) {
for (String i : BukkitBlockResolution.getBlockTypes()) {
ja.put(i);
}
@@ -588,7 +589,7 @@ public class SchemaBuilder {
if (!definitions.containsKey(key)) {
JSONObject j = new JSONObject();
j.put("enum", B.getItemTypes());
j.put("enum", BukkitBlockResolution.getItemTypes());
definitions.put(key, j);
}
@@ -1,6 +1,7 @@
package art.arcane.iris.core.tools;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
@@ -19,7 +20,7 @@ public class IrisReflectiveAPI {
}
public static void registerCustomBlockData(String namespace, String key, BlockData blockData) {
B.registerCustomBlockData(namespace, key, blockData);
BukkitBlockResolution.registerCustomBlockData(namespace, key, blockData);
}
public static void retainMantleData(String classname) {
@@ -18,8 +18,9 @@
package art.arcane.iris.core.tools;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.engine.object.IrisObject;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.VectorMap;
import org.bukkit.Axis;
import org.bukkit.Tag;
@@ -47,8 +48,8 @@ public final class TreePlausibilizer {
{0, 1, 0}, {0, -1, 0},
{0, 0, 1}, {0, 0, -1}
};
private static final BlockData FALLBACK_LOG = B.get("minecraft:oak_log[axis=y]");
private static final BlockData FALLBACK_LEAF = B.get("minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]");
private static final BlockData FALLBACK_LOG = BukkitBlockResolution.get("minecraft:oak_log[axis=y]");
private static final BlockData FALLBACK_LEAF = BukkitBlockResolution.get("minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]");
private TreePlausibilizer() {
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.decorator;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.mantle.EngineMantle;
import art.arcane.iris.engine.object.IrisBiome;
@@ -26,7 +28,6 @@ import art.arcane.iris.engine.object.IrisDecorator;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.project.hunk.Hunk;
import art.arcane.volmlib.util.math.RNG;
import org.bukkit.Material;
@@ -103,7 +104,7 @@ final class DecoratorCore {
BlockData top = rawBd.clone();
((Bisected) top).setHalf(Bisected.Half.TOP);
try {
if (!caveSkipFluid || !B.isFluid(unwrap(data.get(x, height + 2, z)))) {
if (!caveSkipFluid || !BukkitBlockResolution.isFluid(unwrap(data.get(x, height + 2, z)))) {
data.set(x, height + 2, z, BukkitBlockState.of(top));
}
} catch (Throwable e) {
@@ -114,7 +115,7 @@ final class DecoratorCore {
bd = BukkitBlockState.of(bottom);
}
if (B.isAir(unwrap(data.get(x, height + 1, z)))) {
if (BukkitBlockResolution.isAir(unwrap(data.get(x, height + 1, z)))) {
data.set(x, height + 1, z, fixFacesForHunk(bd, data, x, z, realX, height + 1, realZ, mantle));
}
}
@@ -132,7 +133,7 @@ final class DecoratorCore {
}
if (decorator.getForceBlock() != null) {
if (caveSkipFluid && B.isFluid(unwrap(bdx))) {
if (caveSkipFluid && BukkitBlockResolution.isFluid(unwrap(bdx))) {
return;
}
data.set(x, height, z, fixFacesForHunk(
@@ -156,7 +157,7 @@ final class DecoratorCore {
BlockData top = rawBd.clone();
((Bisected) top).setHalf(Bisected.Half.TOP);
try {
if (!caveSkipFluid || !B.isFluid(unwrap(data.get(x, height + 2, z)))) {
if (!caveSkipFluid || !BukkitBlockResolution.isFluid(unwrap(data.get(x, height + 2, z)))) {
data.set(x, height + 2, z, BukkitBlockState.of(top));
}
} catch (Throwable e) {
@@ -167,7 +168,7 @@ final class DecoratorCore {
bd = BukkitBlockState.of(bottom);
}
if (B.isAir(unwrap(data.get(x, height + 1, z)))) {
if (BukkitBlockResolution.isAir(unwrap(data.get(x, height + 1, z)))) {
data.set(x, height + 1, z, fixFacesForHunk(bd, data, x, z, realX, height + 1, realZ, mantle));
}
}
@@ -196,7 +197,7 @@ final class DecoratorCore {
int stack = computeStack(decorator, rng, realX, realZ, irisData, effectiveMax);
if (stack == 1) {
if (opts.caveSkipFluid && B.isFluid(unwrap(data.get(x, height, z)))) {
if (opts.caveSkipFluid && BukkitBlockResolution.isFluid(unwrap(data.get(x, height, z)))) {
return;
}
data.set(x, height, z, decorator.pickBlockDataTop(rng, irisData, realX, realZ));
@@ -224,7 +225,7 @@ final class DecoratorCore {
break;
}
if (opts.caveSkipFluid && B.isFluid(unwrap(data.get(x, height + 1 + i, z)))) {
if (opts.caveSkipFluid && BukkitBlockResolution.isFluid(unwrap(data.get(x, height + 1 + i, z)))) {
break;
}
@@ -242,7 +243,7 @@ final class DecoratorCore {
int stack = computeStack(decorator, rng, realX, realZ, irisData, max);
if (stack == 1) {
if (opts.caveSkipFluid && B.isFluid(unwrap(data.get(x, height, z)))) {
if (opts.caveSkipFluid && BukkitBlockResolution.isFluid(unwrap(data.get(x, height, z)))) {
return;
}
data.set(x, height, z, fixFacesForHunk(
@@ -266,7 +267,7 @@ final class DecoratorCore {
bd = BukkitBlockState.of(dripstoneBlock(stack, i, BlockFace.DOWN));
}
if (opts.caveSkipFluid && B.isFluid(unwrap(data.get(x, h, z)))) {
if (opts.caveSkipFluid && BukkitBlockResolution.isFluid(unwrap(data.get(x, h, z)))) {
break;
}
data.set(x, h, z, fixFacesForHunk(bd, data, x, z, realX, h, realZ, mantle));
@@ -336,7 +337,7 @@ final class DecoratorCore {
static PlatformBlockState fixFacesForHunk(PlatformBlockState b, Hunk<PlatformBlockState> hunk, int rX, int rZ,
int x, int y, int z, EngineMantle mantle) {
BlockData rawB = unwrap(b);
if (!B.isVineBlock(rawB)) {
if (!BukkitBlockResolution.isVineBlock(rawB)) {
return b;
}
MultipleFacing data = (MultipleFacing) rawB.clone();
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.framework;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.events.IrisLootEvent;
@@ -46,7 +48,6 @@ import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.project.context.ChunkContext;
import art.arcane.iris.util.project.context.IrisContext;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.DataProvider;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.volmlib.util.documentation.BlockCoordinates;
@@ -328,7 +329,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
}
BlockData blockData = (BlockData) data.nativeHandle();
if (B.isUpdatable(blockData)) {
if (BukkitBlockResolution.isUpdatable(blockData)) {
getMantle().updateBlock(x, y, z);
}
if (blockData instanceof IrisCustomData) {
@@ -405,14 +406,14 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
x &= 15;
z &= 15;
Block block = c.getBlock(x, y, z);
if (!B.isFluid(block.getBlockData())) {
if (!BukkitBlockResolution.isFluid(block.getBlockData())) {
return;
}
boolean u = B.isAir(block.getRelative(BlockFace.DOWN).getBlockData())
|| B.isAir(block.getRelative(BlockFace.WEST).getBlockData())
|| B.isAir(block.getRelative(BlockFace.EAST).getBlockData())
|| B.isAir(block.getRelative(BlockFace.SOUTH).getBlockData())
|| B.isAir(block.getRelative(BlockFace.NORTH).getBlockData());
boolean u = BukkitBlockResolution.isAir(block.getRelative(BlockFace.DOWN).getBlockData())
|| BukkitBlockResolution.isAir(block.getRelative(BlockFace.WEST).getBlockData())
|| BukkitBlockResolution.isAir(block.getRelative(BlockFace.EAST).getBlockData())
|| BukkitBlockResolution.isAir(block.getRelative(BlockFace.SOUTH).getBlockData())
|| BukkitBlockResolution.isAir(block.getRelative(BlockFace.NORTH).getBlockData());
if (u) grid[x][z] = Math.max(grid[x][z], y);
});
@@ -511,11 +512,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Block block = c.getBlock(x, y, z);
BlockData data = block.getBlockData();
blockUpdatedMetric();
if (B.isStorage(data)) {
if (BukkitBlockResolution.isStorage(data)) {
RNG rx = rf.nextParallelRNG(BlockPosition.toLong(x, y, z));
InventorySlotType slot = null;
if (B.isStorageChest(data)) {
if (BukkitBlockResolution.isStorageChest(data)) {
slot = InventorySlotType.STORAGE;
}
@@ -608,7 +609,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
PlacedObject po = getObjectPlacement(rx, ry, rz, mc);
if (po != null && po.getPlacement() != null) {
if (B.isStorageChest(b.getBlockData())) {
if (BukkitBlockResolution.isStorageChest(b.getBlockData())) {
IrisLootTable table = po.getPlacement().getTable(BukkitBlockState.of(b.getBlockData()), getData());
if (table != null) {
tables.add(table);
@@ -1,5 +1,7 @@
package art.arcane.iris.engine.framework.placer;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.data.cache.Cache;
@@ -14,7 +16,6 @@ import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.volmlib.util.math.RNG;
import art.arcane.volmlib.util.matter.MatterCavern;
@@ -59,7 +60,7 @@ public class WorldObjectPlacer implements IObjectPlacer {
if (y <= world.getMinHeight() || block.getType() == Material.BEDROCK) return;
InventorySlotType slot = null;
if (B.isStorageChest(d)) {
if (BukkitBlockResolution.isStorageChest(d)) {
slot = InventorySlotType.STORAGE;
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.mantle;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.util.project.matter.TileWrapper;
import com.google.common.collect.ImmutableList;
@@ -32,7 +34,6 @@ import art.arcane.iris.engine.object.IrisPosition;
import art.arcane.iris.engine.object.TileData;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.collection.KSet;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.volmlib.util.documentation.ChunkCoordinates;
import art.arcane.volmlib.util.function.Function3;
@@ -299,7 +300,7 @@ public class MantleWriter implements IObjectPlacer, AutoCloseable {
@Override
public boolean isSolid(int x, int y, int z) {
return B.isSolid((BlockData) get(x, y, z).nativeHandle());
return BukkitBlockResolution.isSolid((BlockData) get(x, y, z).nativeHandle());
}
@Override
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.mantle.components;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.IrisComplex;
import art.arcane.iris.engine.data.cache.Cache;
@@ -37,7 +39,6 @@ import art.arcane.iris.engine.object.IrisObjectRotation;
import art.arcane.iris.engine.object.IrisObjectTranslate;
import art.arcane.iris.engine.object.ObjectPlaceMode;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.iris.util.project.context.ChunkContext;
import art.arcane.volmlib.util.collection.KList;
@@ -453,7 +454,7 @@ public class MantleFloatingObjectComponent extends IrisMantleComponent {
BlockData data = (BlockData) state.nativeHandle();
PlatformBlockState existingState = placer.get(x, y, z);
BlockData existing = existingState == null ? null : (BlockData) existingState.nativeHandle();
boolean wouldReplace = existing != null && B.isSolid(existing) && B.isVineBlock(data);
boolean wouldReplace = existing != null && BukkitBlockResolution.isSolid(existing) && BukkitBlockResolution.isVineBlock(data);
boolean placesBlock = !data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR) && !wouldReplace;
return data instanceof IrisCustomData || placesBlock;
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.mantle.components;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.engine.data.cache.Cache;
import art.arcane.iris.engine.IrisComplex;
@@ -35,7 +37,6 @@ import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.collection.KSet;
import art.arcane.iris.util.project.context.ChunkedDoubleDataCache;
import art.arcane.iris.util.project.context.ChunkContext;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.project.stream.ProceduralStream;
import art.arcane.volmlib.util.documentation.BlockCoordinates;
import art.arcane.volmlib.util.documentation.ChunkCoordinates;
@@ -583,7 +584,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
if (marker != null) {
writer.setData(b.getX(), b.getY(), b.getZ(), marker);
}
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && B.isStorageChest(unwrap(data))) {
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && BukkitBlockResolution.isStorageChest(unwrap(data))) {
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
}
}, null, getData());
@@ -598,7 +599,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
if (marker != null) {
writer.setData(b.getX(), b.getY(), b.getZ(), marker);
}
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && B.isStorageChest(unwrap(data))) {
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && BukkitBlockResolution.isStorageChest(unwrap(data))) {
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
}
}, null, getData());
@@ -610,7 +611,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
if (marker != null) {
writer.setData(b.getX(), b.getY(), b.getZ(), marker);
}
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && B.isStorageChest(unwrap(data))) {
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && BukkitBlockResolution.isStorageChest(unwrap(data))) {
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
}
}, null, getData());
@@ -807,7 +808,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
if (marker != null) {
writer.setData(b.getX(), b.getY(), b.getZ(), marker);
}
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && B.isStorageChest(unwrap(data))) {
if (effectivePlacement.isDolphinTarget() && effectivePlacement.isUnderwater() && BukkitBlockResolution.isStorageChest(unwrap(data))) {
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
}
}, null, getData());
@@ -987,7 +988,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
if (marker != null) {
writer.setData(b.getX(), b.getY(), b.getZ(), marker);
}
if (placement.isDolphinTarget() && placement.isUnderwater() && B.isStorageChest(unwrap(data))) {
if (placement.isDolphinTarget() && placement.isUnderwater() && BukkitBlockResolution.isStorageChest(unwrap(data))) {
writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE);
}
}, null, getData());
@@ -18,11 +18,12 @@
package art.arcane.iris.engine.modifier;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.framework.EngineAssignedModifier;
import art.arcane.iris.engine.object.*;
import art.arcane.iris.util.project.context.ChunkContext;
import art.arcane.iris.util.common.data.B;
import art.arcane.volmlib.util.data.HeightMap;
import art.arcane.iris.util.project.hunk.Hunk;
import art.arcane.volmlib.util.mantle.runtime.MantleChunk;
@@ -141,7 +142,7 @@ public class IrisDepositModifier extends EngineAssignedModifier<PlatformBlockSta
PlatformBlockState remapped = resolveDepositVariant(cx, cz, nx, ny, nz, ore, dimension, context);
PlatformBlockState finalBlock = remapped != null
? remapped
: BukkitBlockState.of(B.toDeepSlateOre(unwrap(data.get(nx, ny, nz)), unwrap(ore)));
: BukkitBlockState.of(BukkitBlockResolution.toDeepSlateOre(unwrap(data.get(nx, ny, nz)), unwrap(ore)));
data.set(nx, ny, nz, finalBlock);
}
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.modifier;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.IrisComplex;
import art.arcane.iris.engine.decorator.FloatingDecorator;
@@ -260,9 +262,9 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
IrisFloatingChildBiomes entry = sample.entry;
Integer localFluidHeight = entry.getLocalFluidHeight();
if (localFluidHeight != null && localFluidHeight > 0) {
BlockData rawFluid = B.get(entry.getFluidBlock());
BlockData rawFluid = BukkitBlockResolution.get(entry.getFluidBlock());
if (rawFluid == null) {
rawFluid = B.get("minecraft:water");
rawFluid = BukkitBlockResolution.get("minecraft:water");
}
PlatformBlockState fluid = BukkitBlockState.of(rawFluid);
int fluidCap = Math.min(sample.thickness - 1, localFluidHeight);
@@ -323,7 +325,7 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
int max = Math.max(1, chunkHeight - topY);
if (topY + 1 < chunkHeight) {
PlatformBlockState above = output.get(xf, topY + 1, zf);
if (above == null || B.isAir((BlockData) above.nativeHandle())) {
if (above == null || BukkitBlockResolution.isAir((BlockData) above.nativeHandle())) {
try {
RNG colRng = rng.nextParallelRNG((int) FloatingIslandSample.columnSeed(baseSeed, wx, wz));
FloatingDecorator.decorateColumn(getEngine(), target, IrisDecorationPart.NONE, xf, zf, wx, wz, topY, max, output, colRng, NOOP_DECORATION_MISS);
@@ -356,7 +358,7 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
fluidTopY = y;
}
}
if (fluidTopY > 0 && fluidTopY + 1 < chunkHeight && B.isAir(unwrap(output.get(xf, fluidTopY + 1, zf)))) {
if (fluidTopY > 0 && fluidTopY + 1 < chunkHeight && BukkitBlockResolution.isAir(unwrap(output.get(xf, fluidTopY + 1, zf)))) {
try {
seaSurfaceDecorator.decorate(xf, zf, wx, wx + 1, wx - 1, wz, wz + 1, wz - 1, output, target, fluidTopY, chunkHeight);
} catch (Throwable e) {
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.modifier;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.framework.EngineAssignedModifier;
import art.arcane.iris.util.project.context.ChunkContext;
@@ -103,7 +105,7 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<PlatformBlock
for (int k = top; k >= 0; k--) {
PlatformBlockState b = output.get(finalI, k, j);
BlockData rawB = unwrap(b);
boolean now = b != null && !(B.isAir(rawB) || B.isFluid(rawB));
boolean now = b != null && !(BukkitBlockResolution.isAir(rawB) || BukkitBlockResolution.isFluid(rawB));
if (now != inside) {
inside = now;
@@ -127,16 +129,16 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<PlatformBlock
boolean remove2 = false;
BlockData rawTip = (BlockData) tip.nativeHandle();
if (B.isDecorant(rawTip)) {
if (BukkitBlockResolution.isDecorant(rawTip)) {
BlockData bel = unwrap(output.get(finalI, k - 1, j));
if (bel == null) {
remove = true;
} else if (!B.canPlaceOnto(rawTip.getMaterial(), bel.getMaterial())) {
} else if (!BukkitBlockResolution.canPlaceOnto(rawTip.getMaterial(), bel.getMaterial())) {
remove = true;
} else if (bel instanceof Bisected) {
BlockData bb = unwrap(output.get(finalI, k - 2, j));
if (bb == null || !B.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) {
if (bb == null || !BukkitBlockResolution.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) {
remove = true;
remove2 = true;
}
@@ -191,7 +193,7 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<PlatformBlock
if (b != null) {
BlockData rawB = (BlockData) b.nativeHandle();
if (!B.isAir(rawB) && !B.isFluid(rawB)) {
if (!BukkitBlockResolution.isAir(rawB) && !BukkitBlockResolution.isFluid(rawB)) {
return i;
}
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.modifier;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.framework.EngineAssignedModifier;
import art.arcane.iris.engine.object.IrisBiome;
@@ -128,10 +130,10 @@ public class IrisPostModifier extends EngineAssignedModifier<PlatformBlockState>
BlockData bc = (BlockData) getPostBlock(x, hc, z, currentPostX, currentPostZ, currentData).nativeHandle();
BlockData bd = (BlockData) getPostBlock(x, hd, z, currentPostX, currentPostZ, currentData).nativeHandle();
g = 0;
g = B.isSolid(ba) ? g + 1 : g;
g = B.isSolid(bb) ? g + 1 : g;
g = B.isSolid(bc) ? g + 1 : g;
g = B.isSolid(bd) ? g + 1 : g;
g = BukkitBlockResolution.isSolid(ba) ? g + 1 : g;
g = BukkitBlockResolution.isSolid(bb) ? g + 1 : g;
g = BukkitBlockResolution.isSolid(bc) ? g + 1 : g;
g = BukkitBlockResolution.isSolid(bd) ? g + 1 : g;
if (g >= 3) {
setPostBlock(x, h + 1, z, getPostBlock(x, h, z, currentPostX, currentPostZ, currentData), currentPostX, currentPostZ, currentData);
@@ -183,7 +185,7 @@ public class IrisPostModifier extends EngineAssignedModifier<PlatformBlockState>
if (d != null) {
BlockData rawD = (BlockData) d.nativeHandle();
boolean cancel = B.isAir(rawD);
boolean cancel = BukkitBlockResolution.isAir(rawD);
if (rawD.getMaterial().equals(Material.SNOW) && h + 1 <= getDimension().getFluidHeight()) {
cancel = true;
@@ -229,23 +231,23 @@ public class IrisPostModifier extends EngineAssignedModifier<PlatformBlockState>
// Foliage
b = (BlockData) getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData).nativeHandle();
if (B.isVineBlock(b) && b instanceof MultipleFacing) {
if (BukkitBlockResolution.isVineBlock(b) && b instanceof MultipleFacing) {
MultipleFacing f = (MultipleFacing) b.clone();
int finalH = h + 1;
f.getAllowedFaces().forEach(face -> {
BlockData d = (BlockData) getPostBlock(x + face.getModX(), finalH + face.getModY(), z + face.getModZ(), currentPostX, currentPostZ, currentData).nativeHandle();
f.setFace(face, !B.isAir(d) && !B.isVineBlock(d));
f.setFace(face, !BukkitBlockResolution.isAir(d) && !BukkitBlockResolution.isVineBlock(d));
});
if (!f.equals(b)) {
setPostBlock(x, h + 1, z, BukkitBlockState.of(f), currentPostX, currentPostZ, currentData);
}
}
if (B.isFoliage(b) || b.getMaterial().equals(Material.DEAD_BUSH)) {
if (BukkitBlockResolution.isFoliage(b) || b.getMaterial().equals(Material.DEAD_BUSH)) {
Material onto = ((BlockData) getPostBlock(x, h, z, currentPostX, currentPostZ, currentData).nativeHandle()).getMaterial();
if (!B.canPlaceOnto(b.getMaterial(), onto) && !B.isDecorant(b)) {
if (!BukkitBlockResolution.canPlaceOnto(b.getMaterial(), onto) && !BukkitBlockResolution.isDecorant(b)) {
setPostBlock(x, h + 1, z, AIR, currentPostX, currentPostZ, currentData);
}
}
@@ -263,7 +265,7 @@ public class IrisPostModifier extends EngineAssignedModifier<PlatformBlockState>
public boolean isSolid(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<PlatformBlockState> currentData) {
BlockData d = (BlockData) getPostBlock(x, y, z, currentPostX, currentPostZ, currentData).nativeHandle();
return d.getMaterial().isSolid() && !B.isVineBlock(d);
return d.getMaterial().isSolid() && !BukkitBlockResolution.isVineBlock(d);
}
public boolean isSolidNonSlab(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<PlatformBlockState> currentData) {
@@ -2,7 +2,7 @@ package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import org.bukkit.block.data.BlockData;
import java.util.function.Function;
@@ -12,7 +12,7 @@ final class BlockDataMergeSupport {
}
static PlatformBlockState merge(PlatformBlockState base, PlatformBlockState update) {
BlockData merged = merge((BlockData) base.nativeHandle(), (BlockData) update.nativeHandle(), B::get);
BlockData merged = merge((BlockData) base.nativeHandle(), (BlockData) update.nativeHandle(), BukkitBlockResolution::get);
return merged == null ? null : BukkitBlockState.of(merged);
}
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.core.loader.IrisRegistrant;
@@ -173,7 +175,7 @@ public class IrisBlockData extends IrisRegistrant {
IrisLogging.debug("Block Data used " + sx + " (CUSTOM)");
}
BlockData bx = B.get(sx);
BlockData bx = BukkitBlockResolution.get(sx);
if (bx != null) {
return BukkitBlockState.of(bx);
@@ -186,7 +188,7 @@ public class IrisBlockData extends IrisRegistrant {
}
String ss = keyify(getBlock()) + computeProperties();
b = B.get(ss);
b = BukkitBlockResolution.get(ss);
if (debug) {
IrisLogging.debug("Block Data used " + ss);
@@ -18,10 +18,11 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import com.google.gson.Gson;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.iris.util.common.data.B;
import art.arcane.volmlib.util.io.IO;
import art.arcane.volmlib.util.json.JSONObject;
import art.arcane.iris.util.common.scheduling.J;
@@ -266,7 +267,7 @@ public class IrisCompat {
String buf = n;
int err = 16;
BlockData tx = B.getOrNull(buf, false);
BlockData tx = BukkitBlockResolution.getOrNull(buf, false);
if (tx != null) {
return tx;
@@ -276,7 +277,7 @@ public class IrisCompat {
while (true) {
if (err-- <= 0) {
IrisLogging.error("Can't find block data for " + n);
return B.getNoCompat("STONE");
return BukkitBlockResolution.getNoCompat("STONE");
}
String m = buf;
if (m.contains("[")) {
@@ -300,14 +301,14 @@ public class IrisCompat {
}
IrisLogging.error("Can't find block data for " + n);
return B.getNoCompat("STONE");
return BukkitBlockResolution.getNoCompat("STONE");
}
}
public Material getItem(String n) {
String buf = n;
int err = 16;
Material txf = B.getMaterialOrNull(buf);
Material txf = BukkitBlockResolution.getMaterialOrNull(buf);
if (txf != null) {
return txf;
@@ -318,7 +319,7 @@ public class IrisCompat {
searching:
while (true) {
if (nomore < 0) {
return B.getMaterial("STONE");
return BukkitBlockResolution.getMaterial("STONE");
}
nomore--;
@@ -343,7 +344,7 @@ public class IrisCompat {
}
buf = n;
BlockData tx = B.getOrNull(buf, false);
BlockData tx = BukkitBlockResolution.getOrNull(buf, false);
if (tx != null) {
return tx.getMaterial();
@@ -353,13 +354,13 @@ public class IrisCompat {
searching:
while (true) {
if (nomore < 0) {
return B.getMaterial("STONE");
return BukkitBlockResolution.getMaterial("STONE");
}
nomore--;
if (err-- <= 0) {
return B.getMaterial("STONE");
return BukkitBlockResolution.getMaterial("STONE");
}
for (IrisCompatabilityBlockFilter i : blockFilters) {
@@ -375,7 +376,7 @@ public class IrisCompat {
}
}
return B.getMaterial("STONE");
return BukkitBlockResolution.getMaterial("STONE");
}
}
}
@@ -18,11 +18,12 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.object.annotations.Desc;
import art.arcane.iris.engine.object.annotations.Required;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.util.common.data.B;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -51,13 +52,13 @@ public class IrisCompatabilityBlockFilter {
}
public BlockData getFind() {
return findData.aquire(() -> B.get(when));
return findData.aquire(() -> BukkitBlockResolution.get(when));
}
public BlockData getReplace() {
return replaceData.aquire(() ->
{
BlockData b = B.getOrNull(supplement, false);
BlockData b = BukkitBlockResolution.getOrNull(supplement, false);
if (b == null) {
return null;
@@ -18,11 +18,12 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.object.annotations.Desc;
import art.arcane.iris.engine.object.annotations.Required;
import art.arcane.iris.util.common.data.B;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@@ -48,13 +49,13 @@ public class IrisCompatabilityItemFilter {
}
public Material getFind() {
return findData.aquire(() -> B.getMaterial(when));
return findData.aquire(() -> BukkitBlockResolution.getMaterial(when));
}
public Material getReplace() {
return replaceData.aquire(() ->
{
Material b = B.getMaterialOrNull(supplement);
Material b = BukkitBlockResolution.getMaterialOrNull(supplement);
if (b == null) {
return null;
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.object.annotations.Desc;
@@ -25,7 +27,6 @@ import art.arcane.iris.engine.object.annotations.MaxNumber;
import art.arcane.iris.engine.object.annotations.MinNumber;
import art.arcane.iris.engine.object.annotations.Required;
import art.arcane.iris.engine.object.annotations.Snippet;
import art.arcane.iris.util.common.data.B;
import art.arcane.volmlib.util.collection.KMap;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -75,8 +76,8 @@ public class IrisDepositVariant {
KMap<Material, BlockData> out = new KMap<>();
for (java.util.Map.Entry<String, String> entry : remap.entrySet()) {
BlockData source = B.getOrNull(entry.getKey(), false);
BlockData target = B.getOrNull(entry.getValue(), true);
BlockData source = BukkitBlockResolution.getOrNull(entry.getKey(), false);
BlockData target = BukkitBlockResolution.getOrNull(entry.getValue(), true);
if (source == null || target == null) {
continue;
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.service.ExternalDataSVC;
@@ -27,7 +29,6 @@ import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.format.C;
import art.arcane.volmlib.util.format.Form;
import art.arcane.volmlib.util.math.RNG;
@@ -108,7 +109,7 @@ public class IrisLoot {
private KMap<String, Object> customNbt;
public Material getType() {
return B.getMaterial(type);
return BukkitBlockResolution.getMaterial(type);
}
public ItemStack get(boolean debug, RNG rng) {
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.core.loader.IrisRegistrant;
@@ -328,7 +330,7 @@ public class IrisObject extends IrisRegistrant {
for (int i = 0; i < s; i++) {
Vector3i pos = new Vector3i(din.readShort(), din.readShort(), din.readShort());
BlockData data = B.get(din.readUTF());
BlockData data = BukkitBlockResolution.get(din.readUTF());
if (isStructureMarker(data)) {
continue;
}
@@ -370,7 +372,7 @@ public class IrisObject extends IrisRegistrant {
for (i = 0; i < s; i++) {
Vector3i pos = new Vector3i(din.readShort(), din.readShort(), din.readShort());
BlockData data = B.get(palette.get(din.readShort()));
BlockData data = BukkitBlockResolution.get(palette.get(din.readShort()));
if (isStructureMarker(data)) {
continue;
}
@@ -1098,7 +1100,7 @@ public class IrisObject extends IrisRegistrant {
zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x, getLoader());
}
if (yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT)) && !B.isVineBlock((BlockData) data.nativeHandle())) {
if (yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT)) && !BukkitBlockResolution.isVineBlock((BlockData) data.nativeHandle())) {
yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, getLoader(), config.isUnderwater());
}
@@ -1124,13 +1126,13 @@ public class IrisObject extends IrisRegistrant {
data = BukkitBlockState.of(waterlogged);
}
if (B.isVineBlock((BlockData) data.nativeHandle())) {
if (BukkitBlockResolution.isVineBlock((BlockData) data.nativeHandle())) {
MultipleFacing f = (MultipleFacing) ((BlockData) data.nativeHandle()).clone();
boolean facesChanged = false;
for (BlockFace face : f.getAllowedFaces()) {
PlatformBlockState facingState = placer.get(xx + face.getModX(), yy + face.getModY(), zz + face.getModZ());
BlockData facingBlock = facingState == null ? null : (BlockData) facingState.nativeHandle();
if (B.isSolid(facingBlock) && !B.isVineBlock(facingBlock)) {
if (BukkitBlockResolution.isSolid(facingBlock) && !BukkitBlockResolution.isVineBlock(facingBlock)) {
f.setFace(face, true);
facesChanged = true;
}
@@ -1151,7 +1153,7 @@ public class IrisObject extends IrisRegistrant {
PlatformBlockState existingState = placer.get(xx, yy, zz);
BlockData existingRaw = existingState == null ? null : (BlockData) existingState.nativeHandle();
BlockData rawData = (BlockData) data.nativeHandle();
boolean wouldReplace = B.isSolid(existingRaw) && B.isVineBlock(rawData);
boolean wouldReplace = BukkitBlockResolution.isSolid(existingRaw) && BukkitBlockResolution.isVineBlock(rawData);
boolean place = !rawData.getMaterial().equals(Material.AIR) && !rawData.getMaterial().equals(Material.CAVE_AIR) && !wouldReplace;
if (rawData instanceof IrisCustomData || place) {
@@ -1368,7 +1370,7 @@ public class IrisObject extends IrisRegistrant {
for (int j = lowest + y; j > lowerBound; j--) {
PlatformBlockState fluidState = placer.get(xx, j, zz);
if (B.isFluid(fluidState == null ? null : (BlockData) fluidState.nativeHandle())) {
if (BukkitBlockResolution.isFluid(fluidState == null ? null : (BlockData) fluidState.nativeHandle())) {
break;
}
if (eroding) {
@@ -1384,13 +1386,13 @@ public class IrisObject extends IrisRegistrant {
}
}
if (B.isVineBlock((BlockData) d.nativeHandle())) {
if (BukkitBlockResolution.isVineBlock((BlockData) d.nativeHandle())) {
MultipleFacing f = (MultipleFacing) ((BlockData) d.nativeHandle()).clone();
boolean facesChanged = false;
for (BlockFace face : f.getAllowedFaces()) {
PlatformBlockState facingState = placer.get(xx + face.getModX(), j + face.getModY(), zz + face.getModZ());
BlockData facingBlock = facingState == null ? null : (BlockData) facingState.nativeHandle();
if (B.isSolid(facingBlock) && !B.isVineBlock(facingBlock)) {
if (BukkitBlockResolution.isSolid(facingBlock) && !BukkitBlockResolution.isVineBlock(facingBlock)) {
f.setFace(face, true);
facesChanged = true;
}
@@ -1497,7 +1499,7 @@ public class IrisObject extends IrisRegistrant {
targetY = Math.max(worldMin + 1, Math.min(worldMax, targetY));
if (targetY > origY) {
PlatformBlockState fill = complex != null ? complex.getRockStream().get(cx, cz) : null;
if (fill == null || B.isAir((BlockData) fill.nativeHandle())) {
if (fill == null || BukkitBlockResolution.isAir((BlockData) fill.nativeHandle())) {
fill = STONE;
}
for (int yy = origY + 1; yy <= targetY; yy++) {
@@ -1568,7 +1570,7 @@ public class IrisObject extends IrisRegistrant {
}
BlockData raw = (BlockData) existing.nativeHandle();
return B.isWater(raw) || B.isWaterLogged(raw);
return BukkitBlockResolution.isWater(raw) || BukkitBlockResolution.isWaterLogged(raw);
}
public IrisObject rotateCopy(IrisObjectRotation rt) {
@@ -18,6 +18,8 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.framework.Engine;
@@ -26,7 +28,6 @@ import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.DataProvider;
import art.arcane.volmlib.util.data.WeightedRandom;
import art.arcane.volmlib.util.math.RNG;
@@ -321,7 +322,7 @@ public class IrisObjectPlacement {
public IrisLootTable getTable(PlatformBlockState state, IrisData dataManager) {
TableCache cache = getCache(dataManager);
BlockData data = (BlockData) state.nativeHandle();
if (B.isStorageChest(data)) {
if (BukkitBlockResolution.isStorageChest(data)) {
IrisLootTable picked = null;
if (cache.exact.containsKey(data.getMaterial()) && cache.exact.get(data.getMaterial()).containsKey(data)) {
picked = cache.exact.get(data.getMaterial()).get(data).pullRandom();
@@ -18,10 +18,11 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.math.Vector3i;
import art.arcane.volmlib.util.math.RNG;
import org.bukkit.block.data.BlockData;
@@ -48,7 +49,7 @@ public final class IrisProceduralBlocks {
return state == null ? null : ((BlockData) state.nativeHandle()).clone();
}
if (block != null && !block.isEmpty()) {
BlockData bd = B.getOrNull(block, false);
BlockData bd = BukkitBlockResolution.getOrNull(block, false);
return bd == null ? null : bd.clone();
}
return null;
@@ -18,12 +18,13 @@
package art.arcane.iris.engine.object.tree;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.object.IrisMaterialPalette;
import art.arcane.iris.engine.object.IrisProceduralTree;
import art.arcane.iris.engine.object.IrisTreeDecorator;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.volmlib.util.math.RNG;
import org.bukkit.Axis;
import org.bukkit.Material;
@@ -106,10 +107,10 @@ public final class TreeBlockResolver {
}
if (tree.getWeightedSecondaryLeaves() != null && !tree.getWeightedSecondaryLeaves().isEmpty()) {
String picked = pickWeighted(tree, posRng);
return picked == null ? null : cloneOrNull(B.getOrNull(picked, false));
return picked == null ? null : cloneOrNull(BukkitBlockResolution.getOrNull(picked, false));
}
if (tree.getSecondaryLeaves() != null && !tree.getSecondaryLeaves().isEmpty()) {
return cloneOrNull(B.getOrNull(tree.getSecondaryLeaves(), false));
return cloneOrNull(BukkitBlockResolution.getOrNull(tree.getSecondaryLeaves(), false));
}
return null;
}
@@ -139,7 +140,7 @@ public final class TreeBlockResolver {
return state == null ? null : ((BlockData) state.nativeHandle()).clone();
}
if (block != null && !block.isEmpty()) {
return cloneOrNull(B.getOrNull(block, false));
return cloneOrNull(BukkitBlockResolution.getOrNull(block, false));
}
return null;
}
@@ -0,0 +1,284 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2026 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.platform.bukkit;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.link.data.DataType;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.core.nms.container.BlockProperty;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.object.IrisCompat;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.util.common.data.registry.Materials;
import art.arcane.iris.util.common.reflect.KeyedType;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.data.BSupport;
import it.unimi.dsi.fastutil.ints.IntSet;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.data.BlockData;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
public final class BukkitBlockResolution {
private static final BSupportImpl BASE = new BSupportImpl();
private BukkitBlockResolution() {
}
private static final class BSupportImpl extends BSupport<BlockProperty> {
@Override
protected void warn(String message) {
IrisLogging.warn(message);
}
@Override
protected void debug(String message) {
IrisLogging.debug(message);
}
@Override
protected void reportError(Throwable throwable) {
IrisLogging.reportError(throwable);
}
@Override
protected void error(String message) {
IrisLogging.error(message);
}
@Override
protected Material shortGrassMaterial() {
return Materials.GRASS;
}
@Override
protected void appendExtraFoliageMaterials(IntSet foliage) {
}
@Override
protected boolean includeLitInUpdatable() {
return false;
}
@Override
protected BlockData resolveCompatBlock(String bdxf) {
if (bdxf.contains(":")) {
if (bdxf.startsWith("minecraft:")) {
return IrisServices.get(IrisCompat.class).getBlock(bdxf);
}
return null;
}
return IrisServices.get(IrisCompat.class).getBlock(bdxf);
}
@Override
protected BlockData resolveExternalBlockData(String ix) {
if (ix.startsWith("minecraft:") || !ix.contains(":")) {
return null;
}
Identifier key = Identifier.fromString(ix);
Optional<BlockData> bd = IrisServices.get(ExternalDataSVC.class).getBlockData(key);
debug("Loading block data " + key);
return bd.orElse(null);
}
@Override
protected boolean shouldPreventLeafDecay() {
return IrisSettings.get().getGenerator().isPreventLeafDecay();
}
@Override
protected void appendExternalBlockTypes(KList<String> blockTypes) {
for (Identifier id : IrisServices.get(ExternalDataSVC.class).getAllIdentifiers(DataType.BLOCK)) {
blockTypes.add(id.toString());
}
}
@Override
protected void appendExternalItemTypes(KList<String> itemTypes) {
for (Identifier id : IrisServices.get(ExternalDataSVC.class).getAllIdentifiers(DataType.ITEM)) {
itemTypes.add(id.toString());
}
}
@Override
protected KMap<List<String>, List<BlockProperty>> loadExternalBlockStates() {
KMap<List<BlockProperty>, List<String>> flipped = new KMap<>();
INMS.get().getBlockProperties().forEach((k, v) -> {
NamespacedKey key = KeyedType.getKey(k);
String serialized = key == null ? k.name().toLowerCase(Locale.ROOT) : key.toString();
flipped.computeIfAbsent(v, $ -> new KList<>()).add(serialized);
});
var emptyStates = flipped.computeIfAbsent(new KList<>(0), $ -> new KList<>());
for (var pair : IrisServices.get(ExternalDataSVC.class).getAllBlockProperties()) {
if (pair.getB().isEmpty()) {
emptyStates.add(pair.getA().toString());
} else {
flipped.computeIfAbsent(pair.getB(), $ -> new KList<>()).add(pair.getA().toString());
}
}
KMap<List<String>, List<BlockProperty>> states = new KMap<>();
flipped.forEach((k, v) -> {
var old = states.put(v, k);
if (old != null) {
error("Duplicate block state: " + v + " (" + old + " and " + k + ")");
}
});
return states;
}
}
public static BlockData toDeepSlateOre(BlockData block, BlockData ore) {
return BASE.toDeepSlateOre(block, ore);
}
public static boolean isDeepSlate(BlockData blockData) {
return BASE.isDeepSlate(blockData);
}
public static boolean isOre(BlockData blockData) {
return BASE.isOre(blockData);
}
public static boolean canPlaceOnto(Material mat, Material onto) {
return BASE.canPlaceOnto(mat, onto);
}
public static boolean isFoliagePlantable(BlockData d) {
return BASE.isFoliagePlantable(d);
}
public static boolean isFoliagePlantable(Material d) {
return BASE.isFoliagePlantable(d);
}
public static boolean isWater(BlockData b) {
return BASE.isWater(b);
}
public static BlockData getAir() {
return BASE.getAir();
}
public static Material getMaterialOrNull(String bdx) {
return BASE.getMaterialOrNull(bdx);
}
public static Material getMaterial(String bdx) {
return BASE.getMaterial(bdx);
}
public static boolean isSolid(BlockData mat) {
return BASE.isSolid(mat);
}
public static BlockData getOrNull(String bdxf) {
return BASE.getOrNull(bdxf);
}
public static BlockData getOrNull(String bdxf, boolean warn) {
return BASE.getOrNull(bdxf, warn);
}
public static BlockData getNoCompat(String bdxf) {
return BASE.getNoCompat(bdxf);
}
public static BlockData get(String bdxf) {
return BASE.get(bdxf);
}
public static boolean isStorage(BlockData mat) {
return BASE.isStorage(mat);
}
public static boolean isStorageChest(BlockData mat) {
return BASE.isStorageChest(mat);
}
public static boolean isLit(BlockData mat) {
return BASE.isLit(mat);
}
public static boolean isUpdatable(BlockData mat) {
return BASE.isUpdatable(mat);
}
public static boolean isFoliage(Material d) {
return BASE.isFoliage(d);
}
public static boolean isFoliage(BlockData d) {
return BASE.isFoliage(d);
}
public static boolean isDecorant(BlockData m) {
return BASE.isDecorant(m);
}
public static KList<BlockData> get(KList<String> find) {
return BASE.get(find);
}
public static boolean isFluid(BlockData d) {
return BASE.isFluid(d);
}
public static boolean isAirOrFluid(BlockData d) {
return BASE.isAirOrFluid(d);
}
public static boolean isAir(BlockData d) {
return BASE.isAir(d);
}
public static synchronized String[] getBlockTypes() {
return BASE.getBlockTypes();
}
public static synchronized KMap<List<String>, List<BlockProperty>> getBlockStates() {
return BASE.getBlockStates();
}
public static String[] getItemTypes() {
return BASE.getItemTypes();
}
public static boolean isWaterLogged(BlockData b) {
return BASE.isWaterLogged(b);
}
public static void registerCustomBlockData(String namespace, String key, BlockData blockData) {
BASE.registerCustomBlockData(namespace, key, blockData);
}
public static boolean isVineBlock(BlockData data) {
return BASE.isVineBlock(data);
}
}
@@ -20,7 +20,6 @@ package art.arcane.iris.platform.bukkit;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import org.bukkit.Bukkit;
import org.bukkit.block.data.BlockData;
@@ -40,6 +39,10 @@ public final class BukkitBlockState implements PlatformBlockState {
private final String namespace;
private volatile Boolean air;
private volatile Boolean solid;
private volatile Boolean fluid;
private volatile Boolean water;
private volatile Boolean foliage;
private volatile Boolean decorant;
private BukkitBlockState(BlockData data, String key) {
this.data = data;
@@ -123,7 +126,7 @@ public final class BukkitBlockState implements PlatformBlockState {
public boolean isAir() {
Boolean cached = air;
if (cached == null) {
cached = B.isAir(data);
cached = BukkitBlockResolution.isAir(data);
air = cached;
}
return cached;
@@ -133,12 +136,107 @@ public final class BukkitBlockState implements PlatformBlockState {
public boolean isSolid() {
Boolean cached = solid;
if (cached == null) {
cached = B.isSolid(data);
cached = BukkitBlockResolution.isSolid(data);
solid = cached;
}
return cached;
}
@Override
public boolean isFluid() {
Boolean cached = fluid;
if (cached == null) {
cached = BukkitBlockResolution.isFluid(data);
fluid = cached;
}
return cached;
}
@Override
public boolean isWater() {
Boolean cached = water;
if (cached == null) {
cached = BukkitBlockResolution.isWater(data);
water = cached;
}
return cached;
}
@Override
public boolean isWaterLogged() {
return BukkitBlockResolution.isWaterLogged(data);
}
@Override
public boolean isLit() {
return BukkitBlockResolution.isLit(data);
}
@Override
public boolean isUpdatable() {
return BukkitBlockResolution.isUpdatable(data);
}
@Override
public boolean isFoliage() {
Boolean cached = foliage;
if (cached == null) {
cached = BukkitBlockResolution.isFoliage(data);
foliage = cached;
}
return cached;
}
@Override
public boolean isFoliagePlantable() {
return BukkitBlockResolution.isFoliagePlantable(data);
}
@Override
public boolean isDecorant() {
Boolean cached = decorant;
if (cached == null) {
cached = BukkitBlockResolution.isDecorant(data);
decorant = cached;
}
return cached;
}
@Override
public boolean isStorage() {
return BukkitBlockResolution.isStorage(data);
}
@Override
public boolean isStorageChest() {
return BukkitBlockResolution.isStorageChest(data);
}
@Override
public boolean isOre() {
return BukkitBlockResolution.isOre(data);
}
@Override
public boolean isDeepSlate() {
return BukkitBlockResolution.isDeepSlate(data);
}
@Override
public boolean isVineBlock() {
return BukkitBlockResolution.isVineBlock(data);
}
@Override
public boolean canPlaceOnto(PlatformBlockState onto) {
return BukkitBlockResolution.canPlaceOnto(data.getMaterial(), ((BlockData) onto.nativeHandle()).getMaterial());
}
@Override
public boolean matches(PlatformBlockState state) {
return data.matches((BlockData) state.nativeHandle());
}
@Override
public boolean hasTileEntity() {
return INMS.get().hasTile(data.getMaterial());
@@ -24,7 +24,6 @@ import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.spi.PlatformEntityType;
import art.arcane.iris.spi.PlatformItem;
import art.arcane.iris.spi.PlatformRegistries;
import art.arcane.iris.util.common.data.B;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
@@ -41,10 +40,32 @@ import java.util.List;
public final class BukkitRegistries implements PlatformRegistries {
@Override
public PlatformBlockState block(String key) {
BlockData data = B.get(key);
BlockData data = BukkitBlockResolution.get(key);
return data == null ? null : BukkitBlockState.of(data);
}
@Override
public PlatformBlockState blockOrNull(String key) {
BlockData data = BukkitBlockResolution.getOrNull(key);
return data == null ? null : BukkitBlockState.of(data);
}
@Override
public PlatformBlockState blockOrNull(String key, boolean warn) {
BlockData data = BukkitBlockResolution.getOrNull(key, warn);
return data == null ? null : BukkitBlockState.of(data);
}
@Override
public PlatformBlockState air() {
return BukkitBlockState.of(BukkitBlockResolution.getAir());
}
@Override
public PlatformBlockState deepSlateOre(PlatformBlockState block, PlatformBlockState ore) {
return BukkitBlockState.of(BukkitBlockResolution.toDeepSlateOre((BlockData) block.nativeHandle(), (BlockData) ore.nativeHandle()));
}
@Override
public PlatformBiome biome(String key) {
NamespacedKey namespacedKey = NamespacedKey.fromString(key);
@@ -1,309 +1,107 @@
package art.arcane.iris.util.common.data;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.data.BSupport;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.engine.object.IrisCompat;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.link.data.DataType;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.core.nms.container.BlockProperty;
import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.util.common.data.registry.Materials;
import art.arcane.iris.util.common.reflect.KeyedType;
import it.unimi.dsi.fastutil.ints.IntSet;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.data.BlockData;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
public class B {
private static final BSupportImpl BASE = new BSupportImpl();
public static PlatformBlockState getState(String bdxf) {
return IrisPlatforms.get().registries().block(bdxf);
}
private static final class BSupportImpl extends BSupport<BlockProperty> {
@Override
protected void warn(String message) {
IrisLogging.warn(message);
}
@Override
protected void debug(String message) {
IrisLogging.debug(message);
}
@Override
protected void reportError(Throwable throwable) {
IrisLogging.reportError(throwable);
}
@Override
protected void error(String message) {
IrisLogging.error(message);
}
@Override
protected Material shortGrassMaterial() {
return Materials.GRASS;
}
@Override
protected void appendExtraFoliageMaterials(IntSet foliage) {
// Iris has no extra foliage materials beyond Bukkit Material.
}
@Override
protected boolean includeLitInUpdatable() {
return false;
}
@Override
protected BlockData resolveCompatBlock(String bdxf) {
if (bdxf.contains(":")) {
if (bdxf.startsWith("minecraft:")) {
return IrisServices.get(IrisCompat.class).getBlock(bdxf);
}
return null;
}
return IrisServices.get(IrisCompat.class).getBlock(bdxf);
}
@Override
protected BlockData resolveExternalBlockData(String ix) {
if (ix.startsWith("minecraft:") || !ix.contains(":")) {
return null;
}
Identifier key = Identifier.fromString(ix);
Optional<BlockData> bd = IrisServices.get(ExternalDataSVC.class).getBlockData(key);
debug("Loading block data " + key);
return bd.orElse(null);
}
@Override
protected boolean shouldPreventLeafDecay() {
return IrisSettings.get().getGenerator().isPreventLeafDecay();
}
@Override
protected void appendExternalBlockTypes(KList<String> blockTypes) {
for (Identifier id : IrisServices.get(ExternalDataSVC.class).getAllIdentifiers(DataType.BLOCK)) {
blockTypes.add(id.toString());
}
}
@Override
protected void appendExternalItemTypes(KList<String> itemTypes) {
for (Identifier id : IrisServices.get(ExternalDataSVC.class).getAllIdentifiers(DataType.ITEM)) {
itemTypes.add(id.toString());
}
}
@Override
protected KMap<List<String>, List<BlockProperty>> loadExternalBlockStates() {
KMap<List<BlockProperty>, List<String>> flipped = new KMap<>();
INMS.get().getBlockProperties().forEach((k, v) -> {
NamespacedKey key = KeyedType.getKey(k);
String serialized = key == null ? k.name().toLowerCase(Locale.ROOT) : key.toString();
flipped.computeIfAbsent(v, $ -> new KList<>()).add(serialized);
});
var emptyStates = flipped.computeIfAbsent(new KList<>(0), $ -> new KList<>());
for (var pair : IrisServices.get(ExternalDataSVC.class).getAllBlockProperties()) {
if (pair.getB().isEmpty()) {
emptyStates.add(pair.getA().toString());
} else {
flipped.computeIfAbsent(pair.getB(), $ -> new KList<>()).add(pair.getA().toString());
}
}
KMap<List<String>, List<BlockProperty>> states = new KMap<>();
flipped.forEach((k, v) -> {
var old = states.put(v, k);
if (old != null) {
error("Duplicate block state: " + v + " (" + old + " and " + k + ")");
}
});
return states;
public static PlatformBlockState getStateOrNull(String bdxf) {
return IrisPlatforms.get().registries().blockOrNull(bdxf);
}
public static PlatformBlockState getStateOrNull(String bdxf, boolean warn) {
return IrisPlatforms.get().registries().blockOrNull(bdxf, warn);
}
public static KList<PlatformBlockState> getStates(KList<String> find) {
KList<PlatformBlockState> states = new KList<>(find.size());
for (String key : find) {
states.add(getState(key));
}
return states;
}
public static BlockData toDeepSlateOre(BlockData block, BlockData ore) {
return BASE.toDeepSlateOre(block, ore);
public static PlatformBlockState getAirState() {
return IrisPlatforms.get().registries().air();
}
public static art.arcane.iris.spi.PlatformBlockState toDeepSlateOre(art.arcane.iris.spi.PlatformBlockState block, art.arcane.iris.spi.PlatformBlockState ore) {
return art.arcane.iris.platform.bukkit.BukkitBlockState.of(BASE.toDeepSlateOre((BlockData) block.nativeHandle(), (BlockData) ore.nativeHandle()));
public static PlatformBlockState toDeepSlateOre(PlatformBlockState block, PlatformBlockState ore) {
return IrisPlatforms.get().registries().deepSlateOre(block, ore);
}
public static boolean isOre(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isOre(state == null ? null : (BlockData) state.nativeHandle());
public static boolean isAir(PlatformBlockState state) {
return state == null || state.isAir();
}
public static boolean isDeepSlate(BlockData blockData) {
return BASE.isDeepSlate(blockData);
public static boolean isSolid(PlatformBlockState state) {
return state != null && state.isSolid();
}
public static boolean isOre(BlockData blockData) {
return BASE.isOre(blockData);
public static boolean isFluid(PlatformBlockState state) {
return state != null && state.isFluid();
}
public static boolean canPlaceOnto(Material mat, Material onto) {
return BASE.canPlaceOnto(mat, onto);
public static boolean isAirOrFluid(PlatformBlockState state) {
return state == null || state.isAirOrFluid();
}
public static boolean canPlaceOnto(art.arcane.iris.spi.PlatformBlockState mat, art.arcane.iris.spi.PlatformBlockState onto) {
return BASE.canPlaceOnto(((BlockData) mat.nativeHandle()).getMaterial(), ((BlockData) onto.nativeHandle()).getMaterial());
public static boolean isWater(PlatformBlockState state) {
return state != null && state.isWater();
}
public static boolean isFoliagePlantable(BlockData d) {
return BASE.isFoliagePlantable(d);
public static boolean isWaterLogged(PlatformBlockState state) {
return state != null && state.isWaterLogged();
}
public static boolean isFoliagePlantable(Material d) {
return BASE.isFoliagePlantable(d);
public static boolean isLit(PlatformBlockState state) {
return state != null && state.isLit();
}
public static boolean isWater(BlockData b) {
return BASE.isWater(b);
public static boolean isUpdatable(PlatformBlockState state) {
return state != null && state.isUpdatable();
}
public static boolean isWater(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isWater(state == null ? null : (BlockData) state.nativeHandle());
public static boolean isFoliage(PlatformBlockState state) {
return state != null && state.isFoliage();
}
public static BlockData getAir() {
return BASE.getAir();
public static boolean isFoliagePlantable(PlatformBlockState state) {
return state != null && state.isFoliagePlantable();
}
public static Material getMaterialOrNull(String bdx) {
return BASE.getMaterialOrNull(bdx);
public static boolean isDecorant(PlatformBlockState state) {
return state != null && state.isDecorant();
}
public static Material getMaterial(String bdx) {
return BASE.getMaterial(bdx);
public static boolean isStorage(PlatformBlockState state) {
return state != null && state.isStorage();
}
public static boolean isSolid(BlockData mat) {
return BASE.isSolid(mat);
public static boolean isStorageChest(PlatformBlockState state) {
return state != null && state.isStorageChest();
}
public static boolean isSolid(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isSolid(state == null ? null : (BlockData) state.nativeHandle());
public static boolean isOre(PlatformBlockState state) {
return state != null && state.isOre();
}
public static BlockData getOrNull(String bdxf) {
return BASE.getOrNull(bdxf);
public static boolean isDeepSlate(PlatformBlockState state) {
return state != null && state.isDeepSlate();
}
public static BlockData getOrNull(String bdxf, boolean warn) {
return BASE.getOrNull(bdxf, warn);
public static boolean isVineBlock(PlatformBlockState state) {
return state != null && state.isVineBlock();
}
public static BlockData getNoCompat(String bdxf) {
return BASE.getNoCompat(bdxf);
public static boolean canPlaceOnto(PlatformBlockState mat, PlatformBlockState onto) {
return mat != null && onto != null && mat.canPlaceOnto(onto);
}
public static BlockData get(String bdxf) {
return BASE.get(bdxf);
}
public static art.arcane.iris.spi.PlatformBlockState getState(String bdxf) {
return art.arcane.iris.platform.bukkit.BukkitBlockState.of(BASE.get(bdxf));
}
public static art.arcane.iris.spi.PlatformBlockState getStateOrNull(String bdxf) {
BlockData data = BASE.getOrNull(bdxf);
return data == null ? null : art.arcane.iris.platform.bukkit.BukkitBlockState.of(data);
}
public static boolean isStorage(BlockData mat) {
return BASE.isStorage(mat);
}
public static boolean isStorageChest(BlockData mat) {
return BASE.isStorageChest(mat);
}
public static boolean isLit(BlockData mat) {
return BASE.isLit(mat);
}
public static boolean isUpdatable(BlockData mat) {
return BASE.isUpdatable(mat);
}
public static boolean isFoliage(Material d) {
return BASE.isFoliage(d);
}
public static boolean isFoliage(BlockData d) {
return BASE.isFoliage(d);
}
public static boolean isDecorant(BlockData m) {
return BASE.isDecorant(m);
}
public static boolean isDecorant(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isDecorant(state == null ? null : (BlockData) state.nativeHandle());
}
public static KList<BlockData> get(KList<String> find) {
return BASE.get(find);
}
public static boolean isFluid(BlockData d) {
return BASE.isFluid(d);
}
public static boolean isFluid(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isFluid(state == null ? null : (BlockData) state.nativeHandle());
}
public static boolean matches(art.arcane.iris.spi.PlatformBlockState filter, art.arcane.iris.spi.PlatformBlockState state) {
return ((BlockData) filter.nativeHandle()).matches((BlockData) state.nativeHandle());
}
public static boolean isAirOrFluid(BlockData d) {
return BASE.isAirOrFluid(d);
}
public static boolean isAirOrFluid(art.arcane.iris.spi.PlatformBlockState state) {
return BASE.isAirOrFluid((BlockData) state.nativeHandle());
}
public static boolean isAir(BlockData d) {
return BASE.isAir(d);
}
public synchronized static String[] getBlockTypes() {
return BASE.getBlockTypes();
}
public synchronized static KMap<List<String>, List<BlockProperty>> getBlockStates() {
return BASE.getBlockStates();
}
public static String[] getItemTypes() {
return BASE.getItemTypes();
}
public static boolean isWaterLogged(BlockData b) {
return BASE.isWaterLogged(b);
}
public static void registerCustomBlockData(String namespace, String key, BlockData blockData) {
BASE.registerCustomBlockData(namespace, key, blockData);
}
public static boolean isVineBlock(BlockData data) {
return BASE.isVineBlock(data);
public static boolean matches(PlatformBlockState filter, PlatformBlockState state) {
return filter != null && state != null && filter.matches(state);
}
}
@@ -18,6 +18,8 @@
package art.arcane.iris.util.nbt.common.mca;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.engine.data.cache.Cache;
@@ -25,7 +27,6 @@ import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.nbt.mca.MCAWorldStoreSupport;
import art.arcane.volmlib.util.nbt.mca.MCAWorldRuntimeSupport;
import art.arcane.volmlib.util.nbt.mca.NBTWorldSupport;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.reflect.KeyedType;
import art.arcane.volmlib.util.math.M;
import art.arcane.volmlib.util.nbt.tag.CompoundTag;
@@ -40,10 +41,10 @@ import java.util.Map;
import java.util.Locale;
public class NBTWorld {
private static final BlockData AIR = B.get("AIR");
private static final BlockData AIR = BukkitBlockResolution.get("AIR");
private static final NBTWorldSupport.BlockStateCodec<BlockData> BLOCK_STATE_CODEC = NBTWorldSupport.blockStateCodec(
blockStateString -> B.getOrNull(blockStateString, true),
B::getAir,
blockStateString -> BukkitBlockResolution.getOrNull(blockStateString, true),
BukkitBlockResolution::getAir,
blockData -> blockData.getAsString(true),
blockData -> {
NamespacedKey key = KeyedType.getKey(blockData.getMaterial());
@@ -18,9 +18,10 @@
package art.arcane.iris.util.project.hunk.view;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.IrisCustomData;
import art.arcane.iris.util.project.hunk.Hunk;
import org.bukkit.block.data.BlockData;
@@ -28,7 +29,7 @@ import org.bukkit.generator.ChunkGenerator.ChunkData;
@SuppressWarnings("ClassCanBeRecord")
public class ChunkDataHunkView implements Hunk<PlatformBlockState> {
private static final BlockData AIR = B.getAir();
private static final BlockData AIR = BukkitBlockResolution.getAir();
private final art.arcane.volmlib.util.hunk.view.ChunkDataHunkView view;
@@ -30,6 +30,40 @@ public interface PlatformBlockState {
boolean isSolid();
boolean isFluid();
boolean isWater();
boolean isWaterLogged();
boolean isLit();
boolean isUpdatable();
boolean isFoliage();
boolean isFoliagePlantable();
boolean isDecorant();
boolean isStorage();
boolean isStorageChest();
boolean isOre();
boolean isDeepSlate();
boolean isVineBlock();
boolean canPlaceOnto(PlatformBlockState onto);
boolean matches(PlatformBlockState state);
default boolean isAirOrFluid() {
return isAir() || isFluid();
}
boolean hasTileEntity();
PlatformBlockState withProperty(String name, String value);
@@ -26,6 +26,14 @@ import java.util.List;
public interface PlatformRegistries {
PlatformBlockState block(String key);
PlatformBlockState blockOrNull(String key);
PlatformBlockState blockOrNull(String key, boolean warn);
PlatformBlockState air();
PlatformBlockState deepSlateOre(PlatformBlockState block, PlatformBlockState ore);
PlatformBiome biome(String key);
PlatformItem item(String key);