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;
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);
}

View File

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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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));