From b6ffece228014f97efa084c83df8209c14b73ac0 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 17 Jun 2020 13:28:31 +0800 Subject: [PATCH] Fix several missing method. --- .../world/server/ChunkManagerBridge.java | 3 ++ .../server/ServerChunkProviderBridge.java | 2 ++ .../core/world/server/ChunkManagerMixin.java | 11 +++++- .../server/ServerChunkProviderMixin.java | 10 ++++++ .../mod/util/ArclightSpecialRecipe.java | 34 ++++++++++++++++++- 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java index 8a33cdef..4e3a1f73 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java @@ -1,6 +1,7 @@ package io.izzel.arclight.common.bridge.world.server; import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; +import net.minecraft.world.server.ChunkHolder; import java.util.function.BooleanSupplier; @@ -9,4 +10,6 @@ public interface ChunkManagerBridge { void bridge$tick(BooleanSupplier hasMoreTime); ArclightCallbackExecutor bridge$getCallbackExecutor(); + + ChunkHolder bridge$chunkHolderAt(long chunkPos); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ServerChunkProviderBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ServerChunkProviderBridge.java index 8c40aab5..24cfc507 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ServerChunkProviderBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ServerChunkProviderBridge.java @@ -12,5 +12,7 @@ public interface ServerChunkProviderBridge { boolean bridge$tickDistanceManager(); + boolean bridge$isChunkLoaded(int x, int z); + ServerWorldLightManager bridge$getLightManager(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java index 2207bba5..87ba9ad6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java @@ -1,17 +1,21 @@ package io.izzel.arclight.common.mixin.core.world.server; import io.izzel.arclight.common.bridge.world.server.ChunkManagerBridge; +import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; +import net.minecraft.world.server.ChunkHolder; import net.minecraft.world.server.ChunkManager; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Invoker; -import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; +import javax.annotation.Nullable; import java.util.function.BooleanSupplier; @Mixin(ChunkManager.class) public abstract class ChunkManagerMixin implements ChunkManagerBridge { // @formatter:off + @Shadow @Nullable protected abstract ChunkHolder func_219220_a(long chunkPosIn); @Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime); // @formatter:on @@ -21,4 +25,9 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge { public ArclightCallbackExecutor bridge$getCallbackExecutor() { return this.callbackExecutor; } + + @Override + public ChunkHolder bridge$chunkHolderAt(long chunkPos) { + return func_219220_a(chunkPos); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java index 192642c0..04a970d5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java @@ -46,6 +46,16 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri @Accessor("lightManager") public abstract ServerWorldLightManager bridge$getLightManager(); // @formatter:on + public boolean isChunkLoaded(final int chunkX, final int chunkZ) { + final ChunkHolder chunk = ((ChunkManagerBridge) this.chunkManager).bridge$chunkHolderAt(ChunkPos.asLong(chunkX, chunkZ)); + return chunk != null && ((ChunkHolderBridge) chunk).bridge$getFullChunk() != null; + } + + @Override + public boolean bridge$isChunkLoaded(int x, int z) { + return isChunkLoaded(x, z); + } + /** * @author IzzelAliz * @reason diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightSpecialRecipe.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightSpecialRecipe.java index 44bce909..133443a8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightSpecialRecipe.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightSpecialRecipe.java @@ -5,13 +5,17 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.SpecialRecipe; import org.bukkit.Bukkit; +import org.bukkit.Keyed; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v.CraftServer; +import org.bukkit.craftbukkit.v.inventory.CraftItemStack; import org.bukkit.craftbukkit.v.inventory.CraftRecipe; import org.bukkit.craftbukkit.v.inventory.CraftShapedRecipe; import org.bukkit.craftbukkit.v.inventory.CraftShapelessRecipe; import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.RecipeChoice; +import org.jetbrains.annotations.NotNull; public class ArclightSpecialRecipe { @@ -49,7 +53,35 @@ public class ArclightSpecialRecipe { } } - public static CraftShapelessRecipe shapeless(ItemStack result, IRecipe recipe, Ingredient... ingredients) { + public static class Dynamic implements CraftRecipe, Keyed { + + private final IRecipe recipe; + + public Dynamic(IRecipe recipe) { + this.recipe = recipe; + } + + @Override + public void addToCraftingManager() { + ((RecipeManagerBridge) ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager()).bridge$addRecipe(this.recipe); + } + + @Override + public @NotNull ItemStack getResult() { + return CraftItemStack.asCraftMirror(this.recipe.getRecipeOutput()); + } + + @Override + @NotNull + public NamespacedKey getKey() { + return CraftNamespacedKey.fromMinecraft(this.recipe.getId()); + } + } + + public static CraftRecipe shapeless(ItemStack result, IRecipe recipe, Ingredient... ingredients) { + if (recipe.getRecipeOutput().isEmpty()) { + return new Dynamic(recipe); + } Shapeless shapeless = new Shapeless(result, recipe); for (Ingredient ingredient : ingredients) { shapeless.addIngredient(CraftRecipe.toBukkit(ingredient));