From 747be7aa09a5ba67b619816a0d7c00be55a29ed2 Mon Sep 17 00:00:00 2001 From: Schroddinger Date: Fri, 13 Sep 2024 14:12:22 -0500 Subject: [PATCH] MythicCrucible support. Currently under testing. (cherry picked from commit 06d0f0748bfb3a69b663c2c3604b65f52cb4c5c2) --- build.gradle | 1 + .../iris/core/link/CrucibleDataProvider.java | 159 ++++++++++++++++++ .../iris/core/service/ExternalDataSVC.java | 4 + 3 files changed, 164 insertions(+) create mode 100644 core/src/main/java/com/volmit/iris/core/link/CrucibleDataProvider.java diff --git a/build.gradle b/build.gradle index 81d90ce2e..ac8ff6afd 100644 --- a/build.gradle +++ b/build.gradle @@ -136,6 +136,7 @@ allprojects { //implementation 'org.bytedeco:javacpp:1.5.10' //implementation 'org.bytedeco:cuda-platform:12.3-8.9-1.5.10' compileOnly 'io.lumine:Mythic-Dist:5.2.1' + compileOnly 'io.lumine:MythicCrucible-Dist:2.0.0' // Dynamically Loaded compileOnly 'io.timeandspace:smoothie-map:2.0.2' diff --git a/core/src/main/java/com/volmit/iris/core/link/CrucibleDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/CrucibleDataProvider.java new file mode 100644 index 000000000..4fc2fb19d --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/link/CrucibleDataProvider.java @@ -0,0 +1,159 @@ +/* + * 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.link; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.service.ExternalDataSVC; +import com.volmit.iris.engine.data.cache.Cache; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.math.RNG; +import io.lumine.mythic.bukkit.BukkitAdapter; +import io.lumine.mythic.bukkit.utils.serialize.Chroma; +import io.lumine.mythiccrucible.MythicCrucible; +import io.lumine.mythiccrucible.items.CrucibleItem; +import io.lumine.mythiccrucible.items.ItemManager; +import io.lumine.mythiccrucible.items.blocks.CustomBlockItemContext; +import io.lumine.mythiccrucible.items.furniture.FurnitureItemContext; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.inventory.ItemStack; + +import java.util.MissingResourceException; +import java.util.Optional; + +public class CrucibleDataProvider extends ExternalDataProvider { + + private ItemManager itemManager; + + public CrucibleDataProvider() { + super("Crucible"); + } + + @Override + public void init() { + Iris.info("Setting up MythicCrucible Link..."); + try(MythicCrucible crucible = MythicCrucible.inst()) { + this.itemManager = crucible.getItemManager(); + } + catch (Exception e) { + Iris.error("Failed to set up MythicCrucible Link: Unable to fetch MythicCrucible instance!"); + } + } + + @Override + public BlockData getBlockData(Identifier blockId, KMap state) throws MissingResourceException { + this.getItemTypes(); + this.getBlockTypes(); + Optional opt = this.itemManager.getItem(blockId.key()); + CustomBlockItemContext blockItemContext = opt.orElseThrow(() -> + new MissingResourceException("Failed to find ItemData for block!", blockId.namespace(), blockId.key())) + .getBlockData(); + if (blockItemContext == null) throw new MissingResourceException("ItemData was not a block!", blockId.namespace(), blockId.key()); + return blockItemContext.getBlockData(); + } + + @Override + public ItemStack getItemStack(Identifier itemId, KMap customNbt) throws MissingResourceException { + Optional opt = this.itemManager.getItem(itemId.key()); + return BukkitAdapter.adapt(opt.orElseThrow(() -> + new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key())) + .getMythicItem() + .generateItemStack(1)); + } + + @Override + public Identifier[] getBlockTypes() { + KList names = new KList<>(); + for (CrucibleItem item : this.itemManager.getItems()) { + if (item.getBlockData() == null) continue; + try { + Identifier key = new Identifier("crucible", item.getInternalName()); + Iris.info("getBlockTypes: Block loaded '" + item.getInternalName() + "'"); + 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 (CrucibleItem item : this.itemManager.getItems()) { + try { + Identifier key = new Identifier("crucible", item.getInternalName()); + Iris.info("getItemTypes: Item loaded '" + item.getInternalName() + "'"); + if (getItemStack(key) != null) names.add(key); + } catch (MissingResourceException ignored) {} + } + return names.toArray(new Identifier[0]); + } + + @Override + public void processUpdate(Engine engine, Block block, Identifier blockId) { + var pair = ExternalDataSVC.parseState(blockId); + var state = pair.getB(); + blockId = pair.getA(); + + Optional item = itemManager.getItem(blockId.key()); + if (item.isEmpty()) return; + FurnitureItemContext furniture = item.get().getFurnitureData(); + if (furniture == null) return; + + float yaw = 0; + BlockFace face = BlockFace.NORTH; + long seed = engine.getSeedManager().getSeed() + Cache.key(block.getX(), block.getZ()) + block.getY(); + RNG rng = new RNG(seed); + if ("true".equals(state.get("randomYaw"))) { + yaw = rng.f(0, 360); + } else if (state.containsKey("yaw")) { + yaw = Float.parseFloat(state.get("yaw")); + } + if ("true".equals(state.get("randomFace"))) { + BlockFace[] faces = BlockFace.values(); + face = faces[rng.i(0, faces.length - 1)]; + } else if (state.containsKey("face")) { + face = BlockFace.valueOf(state.get("face").toUpperCase()); + } + if (face == BlockFace.SELF) { + face = BlockFace.NORTH; + } + + BiomeColor type = null; + Chroma color = null; + try { + type = BiomeColor.valueOf(state.get("matchBiome").toUpperCase()); + } catch (NullPointerException | IllegalArgumentException ignored) {} + if (type != null) { + var biomeColor = INMS.get().getBiomeColor(block.getLocation(), type); + if (biomeColor == null) return; + color = Chroma.of(biomeColor.getRGB()); + } + furniture.place(block, face, yaw, color); + } + + @Override + public boolean isValidProvider(Identifier key, boolean isItem) { + return key.namespace().equalsIgnoreCase("crucible"); + } +} 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 4c31f2312..ee65a6722 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 @@ -50,6 +50,10 @@ public class ExternalDataSVC implements IrisService { if (Bukkit.getPluginManager().getPlugin("Oraxen") != null) { Iris.info("Oraxen found, loading OraxenDataProvider..."); } + providers.add(new CrucibleDataProvider()); + if (Bukkit.getPluginManager().getPlugin("MythicCrucible") != null) { + Iris.info("MythicCrucible found, loading CrucibleDataProvider..."); + } providers.add(new ItemAdderDataProvider()); if (Bukkit.getPluginManager().getPlugin("ItemAdder") != null) { Iris.info("ItemAdder found, loading ItemAdderDataProvider...");