Fix several missing method.

This commit is contained in:
IzzelAliz 2020-06-17 13:28:31 +08:00
parent 1ed82a216c
commit b6ffece228
5 changed files with 58 additions and 2 deletions

View File

@ -1,6 +1,7 @@
package io.izzel.arclight.common.bridge.world.server; package io.izzel.arclight.common.bridge.world.server;
import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor;
import net.minecraft.world.server.ChunkHolder;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
@ -9,4 +10,6 @@ public interface ChunkManagerBridge {
void bridge$tick(BooleanSupplier hasMoreTime); void bridge$tick(BooleanSupplier hasMoreTime);
ArclightCallbackExecutor bridge$getCallbackExecutor(); ArclightCallbackExecutor bridge$getCallbackExecutor();
ChunkHolder bridge$chunkHolderAt(long chunkPos);
} }

View File

@ -12,5 +12,7 @@ public interface ServerChunkProviderBridge {
boolean bridge$tickDistanceManager(); boolean bridge$tickDistanceManager();
boolean bridge$isChunkLoaded(int x, int z);
ServerWorldLightManager bridge$getLightManager(); ServerWorldLightManager bridge$getLightManager();
} }

View File

@ -1,17 +1,21 @@
package io.izzel.arclight.common.mixin.core.world.server; package io.izzel.arclight.common.mixin.core.world.server;
import io.izzel.arclight.common.bridge.world.server.ChunkManagerBridge; 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 net.minecraft.world.server.ChunkManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor;
import javax.annotation.Nullable;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
@Mixin(ChunkManager.class) @Mixin(ChunkManager.class)
public abstract class ChunkManagerMixin implements ChunkManagerBridge { public abstract class ChunkManagerMixin implements ChunkManagerBridge {
// @formatter:off // @formatter:off
@Shadow @Nullable protected abstract ChunkHolder func_219220_a(long chunkPosIn);
@Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime); @Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime);
// @formatter:on // @formatter:on
@ -21,4 +25,9 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge {
public ArclightCallbackExecutor bridge$getCallbackExecutor() { public ArclightCallbackExecutor bridge$getCallbackExecutor() {
return this.callbackExecutor; return this.callbackExecutor;
} }
@Override
public ChunkHolder bridge$chunkHolderAt(long chunkPos) {
return func_219220_a(chunkPos);
}
} }

View File

@ -46,6 +46,16 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri
@Accessor("lightManager") public abstract ServerWorldLightManager bridge$getLightManager(); @Accessor("lightManager") public abstract ServerWorldLightManager bridge$getLightManager();
// @formatter:on // @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 * @author IzzelAliz
* @reason * @reason

View File

@ -5,13 +5,17 @@ import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.SpecialRecipe; import net.minecraft.item.crafting.SpecialRecipe;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Keyed;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.v.CraftServer; 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.CraftRecipe;
import org.bukkit.craftbukkit.v.inventory.CraftShapedRecipe; import org.bukkit.craftbukkit.v.inventory.CraftShapedRecipe;
import org.bukkit.craftbukkit.v.inventory.CraftShapelessRecipe; import org.bukkit.craftbukkit.v.inventory.CraftShapelessRecipe;
import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.bukkit.craftbukkit.v.util.CraftNamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.RecipeChoice;
import org.jetbrains.annotations.NotNull;
public class ArclightSpecialRecipe { 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); Shapeless shapeless = new Shapeless(result, recipe);
for (Ingredient ingredient : ingredients) { for (Ingredient ingredient : ingredients) {
shapeless.addIngredient(CraftRecipe.toBukkit(ingredient)); shapeless.addIngredient(CraftRecipe.toBukkit(ingredient));