From d192e2b6d1e36ba49a2cbd4b036185b52834c6ae Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Fri, 27 Dec 2024 18:14:29 +0100 Subject: [PATCH] add tabcomplete for vanilla loottables and fix some multi version compat --- .../iris/core/pregenerator/ChunkUpdater.java | 10 ++++- .../iris/engine/framework/ListFunction.java | 4 +- .../engine/object/IrisJigsawStructure.java | 3 +- .../engine/object/IrisObjectVanillaLoot.java | 2 + .../iris/engine/object/LegacyTileData.java | 42 ++++++++++++++++--- .../annotations/RegistryListFunction.java | 3 +- .../functions/LootTableKeyFunction.java | 33 +++++++++++++++ .../{ => functions}/StructureKeyFunction.java | 4 +- 8 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/engine/object/annotations/functions/LootTableKeyFunction.java rename core/src/main/java/com/volmit/iris/engine/object/annotations/{ => functions}/StructureKeyFunction.java (77%) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java b/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java index b7d90ed95..e8c00d3df 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java @@ -236,7 +236,8 @@ public class ChunkUpdater { try { c = PaperLib.getChunkAtAsync(world, xx, zz, false, true) .thenApply(chunk -> { - chunk.addPluginChunkTicket(Iris.instance); + if (chunk != null) + chunk.addPluginChunkTicket(Iris.instance); return chunk; }).get(); } catch (InterruptedException | ExecutionException e) { @@ -244,12 +245,17 @@ public class ChunkUpdater { return; } + if (c == null) { + generated.set(false); + return; + } + if (!c.isLoaded()) { var future = J.sfut(() -> c.load(false)); if (future != null) future.join(); } - if (!c.isGenerated()) + if (!PaperLib.isChunkGenerated(c.getWorld(), xx, zz)) generated.set(false); var pair = lastUse.computeIfAbsent(Cache.key(c), k -> new Pair<>(0L, new AtomicInteger(-1))); diff --git a/core/src/main/java/com/volmit/iris/engine/framework/ListFunction.java b/core/src/main/java/com/volmit/iris/engine/framework/ListFunction.java index 2d2c8bfdb..a99341603 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/ListFunction.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/ListFunction.java @@ -1,8 +1,10 @@ package com.volmit.iris.engine.framework; +import com.volmit.iris.core.loader.IrisData; + import java.util.function.Function; -public interface ListFunction extends Function { +public interface ListFunction extends Function { String key(); String fancyName(); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java index d4a577101..af47af3cf 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java @@ -22,6 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.engine.object.annotations.functions.StructureKeyFunction; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.plugin.VolmitSender; @@ -141,7 +142,7 @@ public class IrisJigsawStructure extends IrisRegistrant { avg += getLoader().getJigsawPieceLoader().load(i).getMax2dDimension(); } - return (avg / (pieces.size() > 0 ? pieces.size() : 1)) * (((getMaxDepth() + 1) * 2) + 1); + return (avg / (!pieces.isEmpty() ? pieces.size() : 1)) * (((getMaxDepth() + 1) * 2) + 1); } }); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisObjectVanillaLoot.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectVanillaLoot.java index ea14b8274..b3f9ebc4b 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisObjectVanillaLoot.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectVanillaLoot.java @@ -3,6 +3,7 @@ package com.volmit.iris.engine.object; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.engine.object.annotations.functions.LootTableKeyFunction; import com.volmit.iris.util.collection.KList; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,6 +26,7 @@ public class IrisObjectVanillaLoot { private boolean exact = false; @Desc("The vanilla loot table key") @Required + @RegistryListFunction(LootTableKeyFunction.class) private String name; @Desc("The weight of this loot table being chosen") private int weight = 1; diff --git a/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java b/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java index 233f0b8d6..7cbcc094c 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java @@ -1,6 +1,7 @@ package com.volmit.iris.engine.object; import com.volmit.iris.core.nms.container.Pair; +import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.scheduling.J; @@ -9,20 +10,22 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import org.apache.commons.io.function.IOFunction; -import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.Tag; +import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.block.banner.Pattern; import org.bukkit.block.banner.PatternType; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; @ToString @EqualsAndHashCode(callSuper = false) @@ -31,6 +34,7 @@ public class LegacyTileData extends TileData { 0, new Pair<>(SignHandler::fromBukkit, SignHandler::new), 1, new Pair<>(SpawnerHandler::fromBukkit, SpawnerHandler::new), 2, new Pair<>(BannerHandler::fromBukkit, BannerHandler::new)); + private static final AtomicCache> SIGNS = new AtomicCache<>(); private final int id; private final Handler handler; @@ -122,7 +126,7 @@ public class LegacyTileData extends TileData { @SuppressWarnings("deprecation") private static SignHandler fromBukkit(BlockState blockState, Material type) { - if (!Tag.ALL_SIGNS.isTagged(type) || !(blockState instanceof Sign sign)) + if (!signsTag().isTagged(type) || !(blockState instanceof Sign sign)) return null; return new SignHandler(sign.getLine(0), sign.getLine(1), sign.getLine(2), sign.getLine(3), sign.getColor()); } @@ -134,7 +138,7 @@ public class LegacyTileData extends TileData { @Override public boolean isApplicable(BlockData data) { - return Tag.ALL_SIGNS.isTagged(data.getMaterial()); + return signsTag().isTagged(data.getMaterial()); } @Override @@ -247,4 +251,32 @@ public class LegacyTileData extends TileData { banner.update(); } } + + private static Tag signsTag() { + return SIGNS.aquire(() -> { + var signs = Bukkit.getTag("blocks", NamespacedKey.minecraft("all_signs"), Material.class); + if (signs != null) + return signs; + return new Tag<>() { + @Override + public boolean isTagged(@NotNull Material item) { + return item.getKey().getKey().endsWith("_sign"); + } + + @NotNull + @Override + public Set getValues() { + return StreamSupport.stream(Registry.MATERIAL.spliterator(), false) + .filter(this::isTagged) + .collect(Collectors.toUnmodifiableSet()); + } + + @NotNull + @Override + public NamespacedKey getKey() { + return NamespacedKey.minecraft("all_signs"); + } + }; + }); + } } diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFunction.java index e437ebfae..04d9fd5b2 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFunction.java +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFunction.java @@ -1,6 +1,5 @@ package com.volmit.iris.engine.object.annotations; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.framework.ListFunction; import com.volmit.iris.util.collection.KList; @@ -13,5 +12,5 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @Retention(RUNTIME) @Target({PARAMETER, TYPE, FIELD}) public @interface RegistryListFunction { - Class>> value(); + Class>> value(); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/LootTableKeyFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/LootTableKeyFunction.java new file mode 100644 index 000000000..d77f49583 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/LootTableKeyFunction.java @@ -0,0 +1,33 @@ +package com.volmit.iris.engine.object.annotations.functions; + +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.engine.framework.ListFunction; +import com.volmit.iris.util.collection.KList; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.loot.LootTable; +import org.bukkit.loot.LootTables; + +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class LootTableKeyFunction implements ListFunction> { + @Override + public String key() { + return "loot-table-key"; + } + + @Override + public String fancyName() { + return "LootTable Key"; + } + + @Override + public KList apply(IrisData data) { + return StreamSupport.stream(Registry.LOOT_TABLES.spliterator(), false) + .map(LootTables::getLootTable) + .map(LootTable::getKey) + .map(NamespacedKey::toString) + .collect(Collectors.toCollection(KList::new)); + } +} diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/StructureKeyFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/StructureKeyFunction.java similarity index 77% rename from core/src/main/java/com/volmit/iris/engine/object/annotations/StructureKeyFunction.java rename to core/src/main/java/com/volmit/iris/engine/object/annotations/functions/StructureKeyFunction.java index 5ab656cc8..acfb7a6b5 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/annotations/StructureKeyFunction.java +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/StructureKeyFunction.java @@ -1,11 +1,11 @@ -package com.volmit.iris.engine.object.annotations; +package com.volmit.iris.engine.object.annotations.functions; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.engine.framework.ListFunction; import com.volmit.iris.util.collection.KList; -public class StructureKeyFunction implements ListFunction> { +public class StructureKeyFunction implements ListFunction> { @Override public String key() { return "structure-key";