From 8a08a3e1489b001a079b681141702fa4e96190fe Mon Sep 17 00:00:00 2001 From: Julian Krings <47589149+CrazyDev05@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:30:40 +0100 Subject: [PATCH 1/7] Remove Cherry Grove from 1.19.4 biomes list --- .../main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java index 78d8cb1a5..fb46544a5 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -278,7 +278,7 @@ public class NMSBinding implements INMSBinding { @Override public KList getBiomes() { - return new KList<>(Biome.values()).qadd(Biome.CHERRY_GROVE).qdel(Biome.CUSTOM); + return new KList<>(Biome.values()).qdel(Biome.CHERRY_GROVE).qdel(Biome.CUSTOM); } @Override From 65e3fdd26cf4067781d0a93d10fc2002f7aacf3b Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 17:23:00 +0100 Subject: [PATCH 2/7] make implementing blocks that need world context possible --- .../iris/core/link/ExternalDataProvider.java | 3 + .../iris/core/service/ExternalDataSVC.java | 249 +++++++++--------- .../engine/data/chunk/LinkedTerrainChunk.java | 3 + .../engine/data/chunk/MCATerrainChunk.java | 3 + .../volmit/iris/engine/framework/Engine.java | 11 + .../volmit/iris/util/data/IrisBlockData.java | 127 +++++++++ .../util/hunk/view/ChunkDataHunkView.java | 4 +- .../volmit/iris/util/mantle/MantleFlag.java | 3 +- .../iris/util/matter/slices/BlockMatter.java | 7 +- .../util/matter/slices/IdentifierMatter.java | 36 +++ 10 files changed, 324 insertions(+), 122 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java create mode 100644 core/src/main/java/com/volmit/iris/util/matter/slices/IdentifierMatter.java diff --git a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java index ee4d46bfc..b3104d2e5 100644 --- a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java @@ -1,8 +1,10 @@ package com.volmit.iris.core.link; +import com.volmit.iris.engine.framework.Engine; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -28,6 +30,7 @@ public abstract class ExternalDataProvider { public abstract BlockData getBlockData(Identifier blockId) throws MissingResourceException; public abstract ItemStack getItemStack(Identifier itemId) throws MissingResourceException; + public void processUpdate(Engine engine, Location location, Identifier blockId) {}; public abstract Identifier[] getBlockTypes(); diff --git a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java index de6d2ac81..a7136fe51 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java @@ -1,119 +1,130 @@ -/* - * Iris is a World Generator for Minecraft Bukkit Servers - * Copyright (c) 2022 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 . - */ - -package com.volmit.iris.core.service; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.link.*; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.plugin.IrisService; -import lombok.Data; -import org.bukkit.Bukkit; -import org.bukkit.block.data.BlockData; -import org.bukkit.event.EventHandler; -import org.bukkit.event.server.PluginEnableEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.MissingResourceException; -import java.util.Optional; - -@Data -public class ExternalDataSVC implements IrisService { - - private KList providers = new KList<>(), activeProviders = new KList<>(); - - @Override - public void onEnable() { - Iris.info("Loading ExternalDataProvider..."); - Bukkit.getPluginManager().registerEvents(this, Iris.instance); - - providers.add(new OraxenDataProvider()); - if (Bukkit.getPluginManager().getPlugin("Oraxen") != null) { - Iris.info("Oraxen found, loading OraxenDataProvider..."); - } - providers.add(new ItemAdderDataProvider()); - if (Bukkit.getPluginManager().getPlugin("ItemAdder") != null) { - Iris.info("ItemAdder found, loading ItemAdderDataProvider..."); - } - providers.add(new ExecutableItemsDataProvider()); - if (Bukkit.getPluginManager().getPlugin("ExecutableItems") != null) { - Iris.info("ExecutableItems found, loading ExecutableItemsDataProvider..."); - } - - for (ExternalDataProvider p : providers) { - if (p.isReady()) { - activeProviders.add(p); - p.init(); - Iris.info("Enabled ExternalDataProvider for %s.", p.getPluginId()); - } - } - } - - @Override - public void onDisable() { - } - - @EventHandler - public void onPluginEnable(PluginEnableEvent e) { - if (activeProviders.stream().noneMatch(p -> p.getPlugin().equals(e.getPlugin()))) { - providers.stream().filter(p -> p.isReady() && p.getPlugin().equals(e.getPlugin())).findFirst().ifPresent(edp -> { - activeProviders.add(edp); - edp.init(); - Iris.info("Enabled ExternalDataProvider for %s.", edp.getPluginId()); - }); - } - } - - public Optional getBlockData(Identifier key) { - Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, false)).findFirst(); - if (provider.isEmpty()) - return Optional.empty(); - try { - return Optional.of(provider.get().getBlockData(key)); - } catch (MissingResourceException e) { - Iris.error(e.getMessage() + " - [" + e.getClassName() + ":" + e.getKey() + "]"); - return Optional.empty(); - } - } - - public Optional getItemStack(Identifier key) { - Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, true)).findFirst(); - if (provider.isEmpty()) { - Iris.warn("No matching Provider found for modded material \"%s\"!", key); - return Optional.empty(); - } - try { - return Optional.of(provider.get().getItemStack(key)); - } catch (MissingResourceException e) { - Iris.error(e.getMessage() + " - [" + e.getClassName() + ":" + e.getKey() + "]"); - return Optional.empty(); - } - } - - public Identifier[] getAllBlockIdentifiers() { - KList names = new KList<>(); - activeProviders.forEach(p -> names.add(p.getBlockTypes())); - return names.toArray(new Identifier[0]); - } - - public Identifier[] getAllItemIdentifiers() { - KList names = new KList<>(); - activeProviders.forEach(p -> names.add(p.getItemTypes())); - return names.toArray(new Identifier[0]); - } -} +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 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 . + */ + +package com.volmit.iris.core.service; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.link.*; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.plugin.IrisService; +import lombok.Data; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.EventHandler; +import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.MissingResourceException; +import java.util.Optional; + +@Data +public class ExternalDataSVC implements IrisService { + + private KList providers = new KList<>(), activeProviders = new KList<>(); + + @Override + public void onEnable() { + Iris.info("Loading ExternalDataProvider..."); + Bukkit.getPluginManager().registerEvents(this, Iris.instance); + + providers.add(new OraxenDataProvider()); + if (Bukkit.getPluginManager().getPlugin("Oraxen") != null) { + Iris.info("Oraxen found, loading OraxenDataProvider..."); + } + providers.add(new ItemAdderDataProvider()); + if (Bukkit.getPluginManager().getPlugin("ItemAdder") != null) { + Iris.info("ItemAdder found, loading ItemAdderDataProvider..."); + } + providers.add(new ExecutableItemsDataProvider()); + if (Bukkit.getPluginManager().getPlugin("ExecutableItems") != null) { + Iris.info("ExecutableItems found, loading ExecutableItemsDataProvider..."); + } + + for (ExternalDataProvider p : providers) { + if (p.isReady()) { + activeProviders.add(p); + p.init(); + Iris.info("Enabled ExternalDataProvider for %s.", p.getPluginId()); + } + } + } + + @Override + public void onDisable() { + } + + @EventHandler + public void onPluginEnable(PluginEnableEvent e) { + if (activeProviders.stream().noneMatch(p -> p.getPlugin().equals(e.getPlugin()))) { + providers.stream().filter(p -> p.isReady() && p.getPlugin().equals(e.getPlugin())).findFirst().ifPresent(edp -> { + activeProviders.add(edp); + edp.init(); + Iris.info("Enabled ExternalDataProvider for %s.", edp.getPluginId()); + }); + } + } + + public Optional getBlockData(Identifier key) { + Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, false)).findFirst(); + if (provider.isEmpty()) + return Optional.empty(); + try { + return Optional.of(provider.get().getBlockData(key)); + } catch (MissingResourceException e) { + Iris.error(e.getMessage() + " - [" + e.getClassName() + ":" + e.getKey() + "]"); + return Optional.empty(); + } + } + + public Optional getItemStack(Identifier key) { + Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, true)).findFirst(); + if (provider.isEmpty()) { + Iris.warn("No matching Provider found for modded material \"%s\"!", key); + return Optional.empty(); + } + try { + return Optional.of(provider.get().getItemStack(key)); + } catch (MissingResourceException e) { + Iris.error(e.getMessage() + " - [" + e.getClassName() + ":" + e.getKey() + "]"); + return Optional.empty(); + } + } + + public void processUpdate(Engine engine, Location location, Identifier blockId) { + Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(blockId, true)).findFirst(); + if (provider.isEmpty()) { + Iris.warn("No matching Provider found for modded material \"%s\"!", blockId); + return; + } + provider.get().processUpdate(engine, location, blockId); + } + + public Identifier[] getAllBlockIdentifiers() { + KList names = new KList<>(); + activeProviders.forEach(p -> names.add(p.getBlockTypes())); + return names.toArray(new Identifier[0]); + } + + public Identifier[] getAllItemIdentifiers() { + KList names = new KList<>(); + activeProviders.forEach(p -> names.add(p.getItemTypes())); + return names.toArray(new Identifier[0]); + } +} diff --git a/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index cbf18c1e6..015efd0e9 100644 --- a/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine.data.chunk; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.util.data.IrisBiomeStorage; +import com.volmit.iris.util.data.IrisBlockData; import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -120,6 +121,8 @@ public class LinkedTerrainChunk implements TerrainChunk { @Override public synchronized void setBlock(int x, int y, int z, BlockData blockData) { + if (blockData instanceof IrisBlockData d) + blockData = d.getBase(); rawChunkData.setBlock(x, y, z, blockData); } diff --git a/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java index 31b24a665..2da3db43a 100644 --- a/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java +++ b/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.data.chunk; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.nbt.mca.Chunk; import com.volmit.iris.util.nbt.mca.NBTWorld; import lombok.AllArgsConstructor; @@ -88,6 +89,8 @@ public class MCATerrainChunk implements TerrainChunk { if (blockData == null) { Iris.error("NULL BD"); } + if (blockData instanceof IrisBlockData data) + blockData = data.getBase(); mcaChunk.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false); } diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 4d57cdf83..d80b23d1b 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -22,10 +22,12 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.core.gui.components.Renderer; +import com.volmit.iris.core.link.Identifier; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.core.nms.container.BlockPos; import com.volmit.iris.core.nms.container.Pair; +import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.data.chunk.TerrainChunk; @@ -38,6 +40,7 @@ import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.DataProvider; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.C; @@ -254,6 +257,9 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat if (B.isUpdatable(data)) { getMantle().updateBlock(x, y, z); } + if (data instanceof IrisBlockData d) { + getMantle().getMantle().set(x, y, z, d.getCustom()); + } } void blockUpdatedMetric(); @@ -277,6 +283,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat Iris.warn("Failed to set tile entity data at [%d %d %d | %s] for tile %s!", x, betterY, z, c.getBlock(x, betterY, z).getBlockData().getMaterial().getKey(), tile.getData().getTileId()); }); })); + getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.CUSTOM, () -> J.s(() -> { + getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> { + Iris.service(ExternalDataSVC.class).processUpdate(this, new Location(c.getWorld(), x, y + getWorld().minHeight(), z), v); + }); + })); getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> { PrecisionStopwatch p = PrecisionStopwatch.start(); diff --git a/core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java b/core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java new file mode 100644 index 000000000..dce36cd17 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java @@ -0,0 +1,127 @@ +package com.volmit.iris.util.data; + +import com.volmit.iris.core.link.Identifier; +import lombok.Data; +import lombok.NonNull; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.SoundGroup; +import org.bukkit.block.*; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.structure.Mirror; +import org.bukkit.block.structure.StructureRotation; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@Data +public class IrisBlockData implements BlockData{ + private final @NonNull BlockData base; + private final @NotNull Identifier custom; + + @NotNull + @Override + public Material getMaterial() { + return base.getMaterial(); + } + + @NotNull + @Override + public String getAsString() { + return base.getAsString(); + } + + @NotNull + @Override + public String getAsString(boolean b) { + return base.getAsString(b); + } + + @NotNull + @Override + public BlockData merge(@NotNull BlockData blockData) { + return new IrisBlockData(base.merge(blockData), custom); + } + + @Override + public boolean matches(@Nullable BlockData blockData) { + if (blockData instanceof IrisBlockData b) + return custom.equals(b.custom) && base.matches(b.base); + return base.matches(blockData); + } + + @NotNull + @Override + public BlockData clone() { + return new IrisBlockData(base.clone(), custom); + } + + @NotNull + @Override + public SoundGroup getSoundGroup() { + return base.getSoundGroup(); + } + + @Override + public int getLightEmission() { + return base.getLightEmission(); + } + + @Override + public boolean isOccluding() { + return base.isOccluding(); + } + + @Override + public boolean requiresCorrectToolForDrops() { + return base.requiresCorrectToolForDrops(); + } + + @Override + public boolean isPreferredTool(@NotNull ItemStack itemStack) { + return base.isPreferredTool(itemStack); + } + + @NotNull + @Override + public PistonMoveReaction getPistonMoveReaction() { + return base.getPistonMoveReaction(); + } + + @Override + public boolean isSupported(@NotNull Block block) { + return base.isSupported(block); + } + + @Override + public boolean isSupported(@NotNull Location location) { + return base.isSupported(location); + } + + @Override + public boolean isFaceSturdy(@NotNull BlockFace blockFace, @NotNull BlockSupport blockSupport) { + return base.isFaceSturdy(blockFace, blockSupport); + } + + @NotNull + @Override + public Material getPlacementMaterial() { + return base.getPlacementMaterial(); + } + + @Override + public void rotate(@NotNull StructureRotation structureRotation) { + base.rotate(structureRotation); + } + + @Override + public void mirror(@NotNull Mirror mirror) { + base.mirror(mirror); + } + + @NotNull + @Override + public BlockState createBlockState() { + return base.createBlockState(); + } +} diff --git a/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java index a9267f3fc..62cb7fc61 100644 --- a/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java +++ b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java @@ -19,6 +19,7 @@ package com.volmit.iris.util.hunk.view; import com.volmit.iris.util.data.B; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.hunk.Hunk; import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.ChunkData; @@ -72,7 +73,8 @@ public class ChunkDataHunkView implements Hunk { } try { - + if (t instanceof IrisBlockData d) + t = d.getBase(); chunk.setBlock(x, y + chunk.getMinHeight(), z, t); } catch (Throwable ignored) { diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java index 03d98dee6..6bb5f1e6f 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java @@ -33,7 +33,8 @@ public enum MantleFlag { CLEANED, PLANNED, ETCHED, - TILE; + TILE, + CUSTOM; static StateList getStateList() { return new StateList(MantleFlag.values()); diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java index 9a0de90ba..cf6eef776 100644 --- a/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java +++ b/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.matter.slices; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.data.palette.Palette; import com.volmit.iris.util.matter.Sliced; import org.bukkit.Bukkit; @@ -39,7 +40,11 @@ public class BlockMatter extends RawMatter { public BlockMatter(int width, int height, int depth) { super(width, height, depth, BlockData.class); - registerWriter(World.class, ((w, d, x, y, z) -> w.getBlockAt(x, y, z).setBlockData(d))); + registerWriter(World.class, ((w, d, x, y, z) -> { + if (d instanceof IrisBlockData c) + w.getBlockAt(x, y, z).setBlockData(c.getBase()); + else w.getBlockAt(x, y, z).setBlockData(d); + })); registerReader(World.class, (w, x, y, z) -> { BlockData d = w.getBlockAt(x, y, z).getBlockData(); return d.getMaterial().isAir() ? null : d; diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/IdentifierMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/IdentifierMatter.java new file mode 100644 index 000000000..5777c6320 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/matter/slices/IdentifierMatter.java @@ -0,0 +1,36 @@ +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.core.link.Identifier; +import com.volmit.iris.util.data.palette.Palette; +import com.volmit.iris.util.matter.Sliced; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +@Sliced +public class IdentifierMatter extends RawMatter { + + public IdentifierMatter() { + this(1, 1, 1); + } + + public IdentifierMatter(int width, int height, int depth) { + super(width, height, depth, Identifier.class); + } + + @Override + public Palette getGlobalPalette() { + return null; + } + + @Override + public void writeNode(Identifier b, DataOutputStream dos) throws IOException { + dos.writeUTF(b.toString()); + } + + @Override + public Identifier readNode(DataInputStream din) throws IOException { + return Identifier.fromString(din.readUTF()); + } +} From eb45339c818b642e6a39ffa18e4f37a6f97479a7 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 17:23:32 +0100 Subject: [PATCH 3/7] add oraxen furniture support --- .../iris/core/link/OraxenDataProvider.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java index 068c8c18e..feaacb769 100644 --- a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java @@ -19,17 +19,25 @@ package com.volmit.iris.core.link; import com.volmit.iris.Iris; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.B; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.reflect.WrappedField; import io.th0rgal.oraxen.api.OraxenItems; import io.th0rgal.oraxen.items.ItemBuilder; +import io.th0rgal.oraxen.mechanics.Mechanic; import io.th0rgal.oraxen.mechanics.MechanicFactory; import io.th0rgal.oraxen.mechanics.MechanicsManager; import io.th0rgal.oraxen.mechanics.provided.gameplay.block.BlockMechanic; import io.th0rgal.oraxen.mechanics.provided.gameplay.block.BlockMechanicFactory; +import io.th0rgal.oraxen.mechanics.provided.gameplay.furniture.FurnitureFactory; +import io.th0rgal.oraxen.mechanics.provided.gameplay.furniture.FurnitureMechanic; import io.th0rgal.oraxen.mechanics.provided.gameplay.noteblock.NoteBlockMechanicFactory; import io.th0rgal.oraxen.mechanics.provided.gameplay.stringblock.StringBlockMechanicFactory; import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.MultipleFacing; @@ -69,6 +77,8 @@ public class OraxenDataProvider extends ExternalDataProvider { return newBlockData; } else if (factory instanceof StringBlockMechanicFactory f) { return f.createTripwireData(blockId.key()); + } else if (factory instanceof FurnitureFactory) { + return new IrisBlockData(B.getAir(), blockId); } else throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); } @@ -79,6 +89,14 @@ public class OraxenDataProvider extends ExternalDataProvider { return opt.orElseThrow(() -> new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key())).build(); } + @Override + public void processUpdate(Engine engine, Location location, Identifier blockId) { + Mechanic mechanic = getFactory(blockId).getMechanic(blockId.key()); + if (mechanic instanceof FurnitureMechanic f) { + f.place(location); + } + } + @Override public Identifier[] getBlockTypes() { KList names = new KList<>(); From 6d3dbf84ef18ed773359ea6d6e3f7946d9caf586 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 17:24:09 +0100 Subject: [PATCH 4/7] add HMCLeaves compatibility --- .../iris/core/link/HMCLeavesDataProvider.java | 121 ++++++++++++++++++ .../iris/core/service/ExternalDataSVC.java | 4 + 2 files changed, 125 insertions(+) create mode 100644 core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java new file mode 100644 index 000000000..e060569f1 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -0,0 +1,121 @@ +package com.volmit.iris.core.link; + +import com.volmit.iris.Iris; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.reflect.WrappedField; +import com.volmit.iris.util.reflect.WrappedReturningMethod; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; +import java.util.MissingResourceException; +import java.util.function.Supplier; + +public class HMCLeavesDataProvider extends ExternalDataProvider { + private Object apiInstance; + private WrappedReturningMethod worldBlockType; + private WrappedReturningMethod setCustomBlock; + private Map blockDataMap = Map.of(); + private Map> itemDataField = Map.of(); + + public HMCLeavesDataProvider() { + super("HMCLeaves"); + } + + @Override + public String getPluginId() { + return "HMCLeaves"; + } + + @Override + public void init() { + try { + worldBlockType = new WrappedReturningMethod<>((Class) Class.forName("io.github.fisher2911.hmcleaves.data.BlockData"), "worldBlockType"); + apiInstance = getApiInstance(Class.forName("io.github.fisher2911.hmcleaves.api.HMCLeavesAPI")); + setCustomBlock = new WrappedReturningMethod<>((Class) apiInstance.getClass(), "setCustomBlock"); + Object config = getLeavesConfig(apiInstance.getClass()); + blockDataMap = getMap(config, "blockDataMap"); + itemDataField = getMap(config, "itemSupplierMap"); + } catch (Throwable e) { + Iris.error("Failed to initialize HMCLeavesDataProvider: " + e.getMessage()); + } + } + + @Override + public BlockData getBlockData(Identifier blockId) throws MissingResourceException { + Object o = blockDataMap.get(blockId.key()); + if (o == null) + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + Material material = worldBlockType.invoke(o, new Object[0]); + if (material == null) + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + return Bukkit.createBlockData(material); + } + + @Override + public ItemStack getItemStack(Identifier itemId) throws MissingResourceException { + if (!itemDataField.containsKey(itemId.key())) + throw new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key()); + return itemDataField.get(itemId.key()).get(); + } + + @Override + public void processUpdate(Engine engine, Location location, Identifier blockId) { + setCustomBlock.invoke(apiInstance, new Object[]{location, blockId.key(), true}); + } + + @Override + public Identifier[] getBlockTypes() { + KList names = new KList<>(); + for (String name : blockDataMap.keySet()) { + try { + Identifier key = new Identifier("hmcleaves", name); + if (getBlockData(key) != null) + names.add(key); + } catch (MissingResourceException ignored) { + } + } + + return names.toArray(new Identifier[0]); + } + + @Override + public Identifier[] getItemTypes() { + KList names = new KList<>(); + for (String name : itemDataField.keySet()) { + try { + Identifier key = new Identifier("hmcleaves", name); + if (getItemStack(key) != null) + names.add(key); + } catch (MissingResourceException ignored) { + } + } + + return names.toArray(new Identifier[0]); + } + + @Override + public boolean isValidProvider(Identifier id, boolean isItem) { + return (isItem ? itemDataField.keySet() : blockDataMap.keySet()).contains(id.key()); + } + + private Map getMap(C config, String name) { + WrappedField> field = new WrappedField<>((Class) config.getClass(), name); + return field.get(config); + } + + private A getApiInstance(Class apiClass) { + WrappedReturningMethod instance = new WrappedReturningMethod<>(apiClass, "getInstance"); + return instance.invoke(); + } + + private C getLeavesConfig(Class apiClass) { + WrappedReturningMethod instance = new WrappedReturningMethod<>(apiClass, "getInstance"); + WrappedField config = new WrappedField<>(apiClass, "config"); + return config.get(instance.invoke()); + } +} diff --git a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java index a7136fe51..d466269ad 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java @@ -56,6 +56,10 @@ public class ExternalDataSVC implements IrisService { if (Bukkit.getPluginManager().getPlugin("ExecutableItems") != null) { Iris.info("ExecutableItems found, loading ExecutableItemsDataProvider..."); } + providers.add(new HMCLeavesDataProvider()); + if (Bukkit.getPluginManager().getPlugin("HMCLeaves") != null) { + Iris.info("BlockAdder found, loading HMCLeavesDataProvider..."); + } for (ExternalDataProvider p : providers) { if (p.isReady()) { From e9ca30257c6287b834e5cbb830083b7528a0784a Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 18:48:09 +0100 Subject: [PATCH 5/7] woops --- .../java/com/volmit/iris/core/link/HMCLeavesDataProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java index e060569f1..1dd0e5327 100644 --- a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -3,6 +3,7 @@ package com.volmit.iris.core.link; import com.volmit.iris.Iris; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.IrisBlockData; import com.volmit.iris.util.reflect.WrappedField; import com.volmit.iris.util.reflect.WrappedReturningMethod; import org.bukkit.Bukkit; @@ -53,7 +54,7 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { Material material = worldBlockType.invoke(o, new Object[0]); if (material == null) throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); - return Bukkit.createBlockData(material); + return new IrisBlockData(Bukkit.createBlockData(material), blockId); } @Override From 289eca35ec82f56327a0b7d5a3a72fdbd362b3a7 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 19:41:28 +0100 Subject: [PATCH 6/7] fix missing method parameter types --- .../java/com/volmit/iris/core/link/HMCLeavesDataProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java index 1dd0e5327..2f7d87222 100644 --- a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -37,7 +37,7 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { try { worldBlockType = new WrappedReturningMethod<>((Class) Class.forName("io.github.fisher2911.hmcleaves.data.BlockData"), "worldBlockType"); apiInstance = getApiInstance(Class.forName("io.github.fisher2911.hmcleaves.api.HMCLeavesAPI")); - setCustomBlock = new WrappedReturningMethod<>((Class) apiInstance.getClass(), "setCustomBlock"); + setCustomBlock = new WrappedReturningMethod<>((Class) apiInstance.getClass(), "setCustomBlock", Location.class, String.class, boolean.class); Object config = getLeavesConfig(apiInstance.getClass()); blockDataMap = getMap(config, "blockDataMap"); itemDataField = getMap(config, "itemSupplierMap"); From a691d49abc8774ea96be4db591427b316046794d Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 8 Mar 2024 19:35:07 +0100 Subject: [PATCH 7/7] fix only the 0 0 chunk being updated --- .../volmit/iris/core/link/ExternalDataProvider.java | 4 ++-- .../iris/core/link/HMCLeavesDataProvider.java | 13 ++++++++++--- .../volmit/iris/core/link/OraxenDataProvider.java | 7 +++---- .../volmit/iris/core/service/ExternalDataSVC.java | 6 +++--- .../com/volmit/iris/engine/framework/Engine.java | 4 +++- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java index b3104d2e5..7e3b4d00e 100644 --- a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java @@ -4,7 +4,7 @@ import com.volmit.iris.engine.framework.Engine; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; -import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -30,7 +30,7 @@ public abstract class ExternalDataProvider { public abstract BlockData getBlockData(Identifier blockId) throws MissingResourceException; public abstract ItemStack getItemStack(Identifier itemId) throws MissingResourceException; - public void processUpdate(Engine engine, Location location, Identifier blockId) {}; + public void processUpdate(Engine engine, Block block, Identifier blockId) {}; public abstract Identifier[] getBlockTypes(); diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java index 2f7d87222..3e0a384c9 100644 --- a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -9,7 +9,9 @@ import com.volmit.iris.util.reflect.WrappedReturningMethod; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Leaves; import org.bukkit.inventory.ItemStack; import java.util.Map; @@ -54,7 +56,10 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { Material material = worldBlockType.invoke(o, new Object[0]); if (material == null) throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); - return new IrisBlockData(Bukkit.createBlockData(material), blockId); + BlockData blockData = Bukkit.createBlockData(material); + if (blockData instanceof Leaves leaves) + leaves.setPersistent(true); + return new IrisBlockData(blockData, blockId); } @Override @@ -65,8 +70,10 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { } @Override - public void processUpdate(Engine engine, Location location, Identifier blockId) { - setCustomBlock.invoke(apiInstance, new Object[]{location, blockId.key(), true}); + public void processUpdate(Engine engine, Block block, Identifier blockId) { + Boolean result = setCustomBlock.invoke(apiInstance, new Object[]{block.getLocation(), blockId.key(), true}); + if (result == null || !result) + Iris.warn("Failed to set custom block! " + blockId.key() + " " + block.getX() + " " + block.getY() + " " + block.getZ()); } @Override diff --git a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java index feaacb769..58e21883d 100644 --- a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java @@ -36,9 +36,8 @@ import io.th0rgal.oraxen.mechanics.provided.gameplay.furniture.FurnitureMechanic import io.th0rgal.oraxen.mechanics.provided.gameplay.noteblock.NoteBlockMechanicFactory; import io.th0rgal.oraxen.mechanics.provided.gameplay.stringblock.StringBlockMechanicFactory; import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.MultipleFacing; import org.bukkit.inventory.ItemStack; @@ -90,10 +89,10 @@ public class OraxenDataProvider extends ExternalDataProvider { } @Override - public void processUpdate(Engine engine, Location location, Identifier blockId) { + public void processUpdate(Engine engine, Block block, Identifier blockId) { Mechanic mechanic = getFactory(blockId).getMechanic(blockId.key()); if (mechanic instanceof FurnitureMechanic f) { - f.place(location); + f.place(block.getLocation()); } } diff --git a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java index d466269ad..53f566586 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java @@ -25,7 +25,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.IrisService; import lombok.Data; import org.bukkit.Bukkit; -import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.server.PluginEnableEvent; @@ -111,13 +111,13 @@ public class ExternalDataSVC implements IrisService { } } - public void processUpdate(Engine engine, Location location, Identifier blockId) { + public void processUpdate(Engine engine, Block block, Identifier blockId) { Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(blockId, true)).findFirst(); if (provider.isEmpty()) { Iris.warn("No matching Provider found for modded material \"%s\"!", blockId); return; } - provider.get().processUpdate(engine, location, blockId); + provider.get().processUpdate(engine, block, blockId); } public Identifier[] getAllBlockIdentifiers() { diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index d80b23d1b..e1f6560dc 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -259,6 +259,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat } if (data instanceof IrisBlockData d) { getMantle().getMantle().set(x, y, z, d.getCustom()); + } else { + getMantle().getMantle().remove(x, y, z, Identifier.class); } } @@ -285,7 +287,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat })); getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.CUSTOM, () -> J.s(() -> { getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> { - Iris.service(ExternalDataSVC.class).processUpdate(this, new Location(c.getWorld(), x, y + getWorld().minHeight(), z), v); + Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v); }); }));