From b95083c77e1f949a2f7ba242b3c4a12428e43e9f Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 1 Sep 2020 23:41:50 +0800 Subject: [PATCH] make gui work --- build.gradle | 3 + gradle.properties | 1 + .../computercraft/ComputerCraftAPIImpl.java | 13 +- .../shared/ComputerCraftRegistry.java | 36 +- .../shared/computer/core/ServerComputer.java | 15 +- .../inventory/ContainerComputerBase.java | 5 +- .../crafttweaker/TrackingLogger.java | 39 -- .../crafttweaker/TurtleTweaker.java | 71 ---- .../crafttweaker/actions/AddTurtleTool.java | 126 ------ .../actions/RemoveTurtleUpgradeByItem.java | 70 --- .../actions/RemoveTurtleUpgradeByName.java | 69 --- .../integration/jei/JEIComputerCraft.java | 156 ------- .../integration/jei/RecipeResolver.java | 401 ------------------ .../container/ComputerContainerData.java | 2 +- .../shared/util/FixedPointTileEntityType.java | 10 +- .../computercraft/shared/util/IDAssigner.java | 10 +- .../resources/computercraft.accesswidener | 1 + 17 files changed, 56 insertions(+), 972 deletions(-) delete mode 100644 src/main/java/dan200/computercraft/shared/integration/crafttweaker/TrackingLogger.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/crafttweaker/TurtleTweaker.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/AddTurtleTool.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByItem.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByName.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java delete mode 100644 src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java diff --git a/build.gradle b/build.gradle index 07cb03036..0cc98b309 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,9 @@ dependencies { modImplementation "me.shedaniel.cloth:config-2:${cloth_config_version}" modImplementation "io.github.prospector:modmenu:${modmenu_version}" + modApi "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}" + include "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}" + implementation "blue.endless:jankson:${jankson_version}" implementation 'com.google.code.findbugs:jsr305:3.0.2' diff --git a/gradle.properties b/gradle.properties index 2b14ebb17..cd652e770 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,3 +11,4 @@ fabric_api_version=0.19.0+build.398-1.16 fabric_loader_version=0.9.2+build.206 jankson_version=1.2.0 modmenu_version=1.14.6+ +cloth_api_version=1.4.5 diff --git a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java index 4f2f8c890..5a65601c9 100644 --- a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java +++ b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java @@ -26,6 +26,7 @@ import dan200.computercraft.shared.peripheral.modem.wired.TileWiredModemFull; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.wired.WiredNode; +import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.entity.BlockEntity; import net.minecraft.resource.ReloadableResourceManager; @@ -40,7 +41,6 @@ import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.Optional; public final class ComputerCraftAPIImpl implements IComputerCraftAPI { @@ -54,8 +54,9 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI public static InputStream getResourceFile( String domain, String subPath ) { - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { - ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServer) FabricLoader.getInstance().getGameInstance()).getDataPackManager(); + MinecraftServer server = GameInstanceUtils.getServer(); + if (server != null) { + ReloadableResourceManager manager = (ReloadableResourceManager) server.serverResourceManager.getResourceManager(); try { return manager.getResource(new Identifier(domain, subPath)).getInputStream(); } catch (IOException ignored) { @@ -97,8 +98,10 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI @Override public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath ) { - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { - ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServer) FabricLoader.getInstance().getGameInstance()).getDataPackManager(); + MinecraftServer server = GameInstanceUtils.getServer(); + if ( server != null ) + { + ReloadableResourceManager manager = (ReloadableResourceManager) server.serverResourceManager.getResourceManager(); ResourceMount mount = ResourceMount.get(domain, subPath, manager); return mount.exists("") ? mount : null; } diff --git a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java index 9acbbb7b7..3d54a09b7 100644 --- a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java +++ b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java @@ -8,8 +8,10 @@ package dan200.computercraft.shared; import static net.minecraft.util.registry.Registry.BLOCK_ENTITY_TYPE; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.common.ContainerHeldItem; @@ -70,11 +72,11 @@ public final class ComputerCraftRegistry { public static void init() { Object[] o = { + ModTiles.CABLE, ModBlocks.CABLE, ModItems.CABLE, ModEntities.TURTLE_PLAYER, ModContainers.COMPUTER, - ModTiles.CABLE }; } @@ -135,33 +137,33 @@ public final class ComputerCraftRegistry { public static class ModTiles { - private static BlockEntityType ofBlock(Block block, String id, Function, T> factory) { - return Registry.register(BLOCK_ENTITY_TYPE, new Identifier(MOD_ID, id), FixedPointTileEntityType.create(block, factory)); + private static BlockEntityType ofBlock( Supplier block, String id, Function, T> factory) { + return Registry.register(BLOCK_ENTITY_TYPE, new Identifier(MOD_ID, id), FixedPointTileEntityType.create( Objects.requireNonNull(block), factory)); } - public static final BlockEntityType MONITOR_NORMAL = ofBlock(ModBlocks.MONITOR_NORMAL, "monitor_normal",f -> new TileMonitor(f, false)); - public static final BlockEntityType MONITOR_ADVANCED = ofBlock(ModBlocks.MONITOR_ADVANCED, "monitor_advanced",f -> new TileMonitor(f, true)); + public static final BlockEntityType MONITOR_NORMAL = ofBlock(() ->ModBlocks.MONITOR_NORMAL, "monitor_normal",f -> new TileMonitor(f, false)); + public static final BlockEntityType MONITOR_ADVANCED = ofBlock(() ->ModBlocks.MONITOR_ADVANCED, "monitor_advanced",f -> new TileMonitor(f, true)); - public static final BlockEntityType COMPUTER_NORMAL = ofBlock(ModBlocks.COMPUTER_NORMAL,"computer_normal", + public static final BlockEntityType COMPUTER_NORMAL = ofBlock(() ->ModBlocks.COMPUTER_NORMAL,"computer_normal", f -> new TileComputer(ComputerFamily.NORMAL, f)); - public static final BlockEntityType COMPUTER_ADVANCED = ofBlock(ModBlocks.COMPUTER_ADVANCED,"computer_advanced", + public static final BlockEntityType COMPUTER_ADVANCED = ofBlock(() ->ModBlocks.COMPUTER_ADVANCED,"computer_advanced", f -> new TileComputer(ComputerFamily.ADVANCED, f)); - public static final BlockEntityType COMPUTER_COMMAND = ofBlock(ModBlocks.COMPUTER_COMMAND, "computer_command", + public static final BlockEntityType COMPUTER_COMMAND = ofBlock(() ->ModBlocks.COMPUTER_COMMAND, "computer_command", f -> new TileCommandComputer(ComputerFamily.COMMAND, f)); - public static final BlockEntityType TURTLE_NORMAL = ofBlock(ModBlocks.TURTLE_NORMAL, "turtle_normal",f -> new TileTurtle(f, ComputerFamily.NORMAL)); - public static final BlockEntityType TURTLE_ADVANCED = ofBlock(ModBlocks.TURTLE_ADVANCED,"turtle_advanced", + public static final BlockEntityType TURTLE_NORMAL = ofBlock(() ->ModBlocks.TURTLE_NORMAL, "turtle_normal",f -> new TileTurtle(f, ComputerFamily.NORMAL)); + public static final BlockEntityType TURTLE_ADVANCED = ofBlock(() ->ModBlocks.TURTLE_ADVANCED,"turtle_advanced", f -> new TileTurtle(f, ComputerFamily.ADVANCED)); - public static final BlockEntityType SPEAKER = ofBlock(ModBlocks.SPEAKER, "speaker",TileSpeaker::new); - public static final BlockEntityType DISK_DRIVE = ofBlock(ModBlocks.DISK_DRIVE, "disk_drive",TileDiskDrive::new); - public static final BlockEntityType PRINTER = ofBlock(ModBlocks.PRINTER, "printer",TilePrinter::new); - public static final BlockEntityType WIRED_MODEM_FULL = ofBlock(ModBlocks.WIRED_MODEM_FULL,"wired_modem_full", TileWiredModemFull::new); - public static final BlockEntityType CABLE = ofBlock(ModBlocks.CABLE, "cable",TileCable::new); + public static final BlockEntityType SPEAKER = ofBlock(() ->ModBlocks.SPEAKER, "speaker",TileSpeaker::new); + public static final BlockEntityType DISK_DRIVE = ofBlock(() ->ModBlocks.DISK_DRIVE, "disk_drive",TileDiskDrive::new); + public static final BlockEntityType PRINTER = ofBlock(() ->ModBlocks.PRINTER, "printer",TilePrinter::new); + public static final BlockEntityType WIRED_MODEM_FULL = ofBlock(() ->ModBlocks.WIRED_MODEM_FULL,"wired_modem_full", TileWiredModemFull::new); + public static final BlockEntityType CABLE = ofBlock(() -> ModBlocks.CABLE, "cable",TileCable::new); - public static final BlockEntityType WIRELESS_MODEM_NORMAL = ofBlock(ModBlocks.WIRELESS_MODEM_NORMAL,"wireless_modem_normal", + public static final BlockEntityType WIRELESS_MODEM_NORMAL = ofBlock(() ->ModBlocks.WIRELESS_MODEM_NORMAL,"wireless_modem_normal", f -> new TileWirelessModem(f, false)); - public static final BlockEntityType WIRELESS_MODEM_ADVANCED = ofBlock(ModBlocks.WIRELESS_MODEM_ADVANCED,"wireless_modem_advanced", + public static final BlockEntityType WIRELESS_MODEM_ADVANCED = ofBlock(() ->ModBlocks.WIRELESS_MODEM_ADVANCED,"wireless_modem_advanced", f -> new TileWirelessModem(f, true)); } diff --git a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java index fb2db0823..a25206b58 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java @@ -22,6 +22,7 @@ import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.client.ComputerDataClientMessage; import dan200.computercraft.shared.network.client.ComputerDeletedClientMessage; import dan200.computercraft.shared.network.client.ComputerTerminalClientMessage; +import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundTag; @@ -163,15 +164,16 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput if( hasOutputChanged() || force ) { // Send computer state to all clients - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) - NetworkHandler.sendToAllPlayers((MinecraftServer) FabricLoader.getInstance().getGameInstance(), createComputerPacket() ); + MinecraftServer server = GameInstanceUtils.getServer(); + if ( server != null ) + NetworkHandler.sendToAllPlayers(server, createComputerPacket() ); } if( hasTerminalChanged() || force ) { - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { + MinecraftServer server = GameInstanceUtils.getServer(); + if ( server != null ) { // Send terminal state to clients who are currently interacting with the computer. - MinecraftServer server = (MinecraftServer) FabricLoader.getInstance().getGameInstance(); NetworkMessage packet = null; for (PlayerEntity player : server.getPlayerManager().getPlayerList()) { @@ -199,8 +201,9 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput public void broadcastDelete() { // Send deletion to client - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) - NetworkHandler.sendToAllPlayers((MinecraftServer) FabricLoader.getInstance().getGameInstance(), new ComputerDeletedClientMessage( getInstanceID() ) ); + MinecraftServer server = GameInstanceUtils.getServer(); + if ( server != null ) + NetworkHandler.sendToAllPlayers(server, new ComputerDeletedClientMessage( getInstanceID() ) ); } public void setID( int id ) diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java index 9f439c9a9..6c613ffad 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java @@ -15,6 +15,7 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandlerType; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Objects; import java.util.function.Predicate; public class ContainerComputerBase extends ScreenHandler implements IContainerComputer @@ -28,13 +29,13 @@ public class ContainerComputerBase extends ScreenHandler implements IContainerCo { super( type, id ); this.canUse = canUse; - this.computer = computer; + this.computer = Objects.requireNonNull(computer); this.family = family; } protected ContainerComputerBase(ScreenHandlerType type, int id, PlayerInventory player, PacketByteBuf packetByteBuf) { - this( type, id, x -> true, getComputer( player, new ComputerContainerData((PacketByteBuf) packetByteBuf.copy()) ), new ComputerContainerData(packetByteBuf).getFamily() ); + this( type, id, x -> true, getComputer( player, new ComputerContainerData(new PacketByteBuf( packetByteBuf.copy() )) ), new ComputerContainerData(packetByteBuf).getFamily() ); } protected static IComputer getComputer( PlayerInventory player, ComputerContainerData data ) diff --git a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TrackingLogger.java b/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TrackingLogger.java deleted file mode 100644 index 07733df89..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TrackingLogger.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.crafttweaker; - -import com.blamejared.crafttweaker.api.logger.ILogger; - -/** - * Logger which tracks if it has any messages. - */ -public final class TrackingLogger -{ - private final ILogger logger; - private boolean ok = true; - - public TrackingLogger( ILogger logger ) - { - this.logger = logger; - } - - public boolean isOk() - { - return ok; - } - - public void warning( String message ) - { - ok = false; - logger.warning( message ); - } - - public void error( String message ) - { - ok = false; - logger.error( message ); - } -} diff --git a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TurtleTweaker.java b/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TurtleTweaker.java deleted file mode 100644 index d3b9345d4..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/TurtleTweaker.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.crafttweaker; - -import com.blamejared.crafttweaker.api.CraftTweakerAPI; -import com.blamejared.crafttweaker.api.annotations.ZenRegister; -import com.blamejared.crafttweaker.api.item.IItemStack; -import dan200.computercraft.shared.integration.crafttweaker.actions.AddTurtleTool; -import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByItem; -import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByName; -import org.openzen.zencode.java.ZenCodeType; - -@ZenRegister -@ZenCodeType.Name( "dan200.computercraft.turtle" ) -public class TurtleTweaker -{ - /** - * Remove a turtle upgrade with the given id. - * - * @param upgrade The ID of the to remove - */ - @ZenCodeType.Method - public static void removeUpgrade( String upgrade ) - { - CraftTweakerAPI.apply( new RemoveTurtleUpgradeByName( upgrade ) ); - } - - /** - * Remove a turtle upgrade crafted with the given item stack". - * - * @param stack The stack with which the upgrade is crafted. - */ - @ZenCodeType.Method - public static void removeUpgrade( IItemStack stack ) - { - CraftTweakerAPI.apply( new RemoveTurtleUpgradeByItem( stack.getInternal() ) ); - } - - /** - * Add a new turtle tool with the given id, which crafts and acts using the given stack. - * - * @param id The new upgrade's ID - * @param stack The stack used for crafting the upgrade and used by the turtle as a tool. - */ - @ZenCodeType.Method - public static void addTool( String id, IItemStack stack ) - { - addTool( id, stack, stack, "tool" ); - } - - @ZenCodeType.Method - public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack ) - { - addTool( id, craftingStack, toolStack, "tool" ); - } - - @ZenCodeType.Method - public static void addTool( String id, IItemStack stack, String kind ) - { - addTool( id, stack, stack, kind ); - } - - @ZenCodeType.Method - public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack, String kind ) - { - CraftTweakerAPI.apply( new AddTurtleTool( id, craftingStack.getInternal(), toolStack.getInternal(), kind ) ); - } -} diff --git a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/AddTurtleTool.java b/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/AddTurtleTool.java deleted file mode 100644 index e61e91b90..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/AddTurtleTool.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.crafttweaker.actions; - -import com.blamejared.crafttweaker.api.actions.IUndoableAction; -import com.blamejared.crafttweaker.api.logger.ILogger; -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.shared.TurtleUpgrades; -import dan200.computercraft.shared.integration.crafttweaker.TrackingLogger; -import dan200.computercraft.shared.turtle.upgrades.*; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraftforge.fml.LogicalSide; - -import java.util.HashMap; -import java.util.Map; - -/** - * Register a new turtle tool. - */ -public class AddTurtleTool implements IUndoableAction -{ - private interface Factory - { - TurtleTool create( Identifier location, ItemStack craftItem, ItemStack toolItem ); - } - - private static final Map kinds = new HashMap<>(); - - static - { - kinds.put( "tool", TurtleTool::new ); - kinds.put( "axe", TurtleAxe::new ); - kinds.put( "hoe", TurtleHoe::new ); - kinds.put( "shovel", TurtleShovel::new ); - kinds.put( "sword", TurtleSword::new ); - } - - private final String id; - private final ItemStack craftItem; - private final ItemStack toolItem; - private final String kind; - - private ITurtleUpgrade upgrade; - - public AddTurtleTool( String id, ItemStack craftItem, ItemStack toolItem, String kind ) - { - this.id = id; - this.craftItem = craftItem; - this.toolItem = toolItem; - this.kind = kind; - } - - @Override - public void apply() - { - ITurtleUpgrade upgrade = this.upgrade; - if( upgrade == null ) - { - Factory factory = kinds.get( kind ); - if( factory == null ) - { - ComputerCraft.log.error( "Unknown turtle upgrade kind '{}' (this should have been rejected by verify!)", kind ); - return; - } - - upgrade = this.upgrade = factory.create( new Identifier( id ), craftItem, toolItem ); - } - - try - { - TurtleUpgrades.register( upgrade ); - } - catch( RuntimeException e ) - { - ComputerCraft.log.error( "Registration of turtle tool failed", e ); - } - } - - @Override - public String describe() - { - return String.format( "Add new turtle %s '%s' (crafted with '%s', uses a '%s')", kind, id, craftItem, toolItem ); - } - - @Override - public void undo() - { - if( upgrade != null ) TurtleUpgrades.remove( upgrade ); - } - - @Override - public String describeUndo() - { - return String.format( "Removing turtle upgrade %s.", id ); - } - - public boolean validate( ILogger logger ) - { - TrackingLogger trackLog = new TrackingLogger( logger ); - - if( craftItem.isEmpty() ) trackLog.warning( "Crafting item stack is empty." ); - - if( craftItem.hasTag() && !craftItem.getTag().isEmpty() ) trackLog.warning( "Crafting item has NBT." ); - if( toolItem.isEmpty() ) trackLog.error( "Tool item stack is empty." ); - - if( !kinds.containsKey( kind ) ) trackLog.error( String.format( "Unknown kind '%s'.", kind ) ); - - if( TurtleUpgrades.get( id ) != null ) - { - trackLog.error( String.format( "An upgrade with the same name ('%s') has already been registered.", id ) ); - } - - return trackLog.isOk(); - } - - @Override - public boolean shouldApplyOn( LogicalSide side ) - { - return true; - } -} diff --git a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByItem.java b/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByItem.java deleted file mode 100644 index 5c1cc0aec..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByItem.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.crafttweaker.actions; - -import com.blamejared.crafttweaker.api.actions.IUndoableAction; -import com.blamejared.crafttweaker.api.logger.ILogger; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.shared.TurtleUpgrades; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.LogicalSide; - -/** - * Removes a turtle upgrade crafted with the given stack. - */ -public class RemoveTurtleUpgradeByItem implements IUndoableAction -{ - private final ItemStack stack; - private ITurtleUpgrade upgrade; - - public RemoveTurtleUpgradeByItem( ItemStack stack ) - { - this.stack = stack; - } - - @Override - public void apply() - { - ITurtleUpgrade upgrade = this.upgrade = TurtleUpgrades.get( stack ); - if( upgrade != null ) TurtleUpgrades.disable( upgrade ); - } - - @Override - public String describe() - { - return String.format( "Remove turtle upgrades crafted with '%s'", stack ); - } - - @Override - public void undo() - { - if( this.upgrade != null ) TurtleUpgrades.enable( upgrade ); - } - - @Override - public String describeUndo() - { - return String.format( "Adding back turtle upgrades crafted with '%s'", stack ); - } - - @Override - public boolean validate( ILogger logger ) - { - if( TurtleUpgrades.get( stack ) == null ) - { - logger.error( String.format( "Unknown turtle upgrade crafted with '%s'.", stack ) ); - return false; - } - - return true; - } - - @Override - public boolean shouldApplyOn( LogicalSide side ) - { - return true; - } -} diff --git a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByName.java b/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByName.java deleted file mode 100644 index 47158be7f..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/crafttweaker/actions/RemoveTurtleUpgradeByName.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.crafttweaker.actions; - -import com.blamejared.crafttweaker.api.actions.IUndoableAction; -import com.blamejared.crafttweaker.api.logger.ILogger; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.shared.TurtleUpgrades; -import net.minecraftforge.fml.LogicalSide; - -/** - * Removes a turtle upgrade with the given id. - */ -public class RemoveTurtleUpgradeByName implements IUndoableAction -{ - private final String id; - private ITurtleUpgrade upgrade; - - public RemoveTurtleUpgradeByName( String id ) - { - this.id = id; - } - - @Override - public void apply() - { - ITurtleUpgrade upgrade = this.upgrade = TurtleUpgrades.get( id ); - if( upgrade != null ) TurtleUpgrades.disable( upgrade ); - } - - @Override - public String describe() - { - return String.format( "Remove turtle upgrade '%s'", id ); - } - - @Override - public void undo() - { - if( this.upgrade != null ) TurtleUpgrades.enable( upgrade ); - } - - @Override - public String describeUndo() - { - return String.format( "Adding back turtle upgrade '%s'", id ); - } - - @Override - public boolean validate( ILogger logger ) - { - if( TurtleUpgrades.get( id ) == null ) - { - logger.error( String.format( "Unknown turtle upgrade '%s'.", id ) ); - return false; - } - - return true; - } - - @Override - public boolean shouldApplyOn( LogicalSide side ) - { - return true; - } -} diff --git a/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java b/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java deleted file mode 100644 index 82425a802..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.jei; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.pocket.IPocketUpgrade; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.api.turtle.TurtleSide; -import dan200.computercraft.shared.PocketUpgrades; -import dan200.computercraft.shared.ComputerCraftRegistry; -import dan200.computercraft.shared.TurtleUpgrades; -import dan200.computercraft.shared.computer.core.ComputerFamily; -import dan200.computercraft.shared.media.items.ItemDisk; -import dan200.computercraft.shared.pocket.items.ItemPocketComputer; -import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory; -import dan200.computercraft.shared.turtle.items.ITurtleItem; -import dan200.computercraft.shared.turtle.items.TurtleItemFactory; -import mezz.jei.api.IModPlugin; -import mezz.jei.api.JeiPlugin; -import mezz.jei.api.constants.VanillaRecipeCategoryUid; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.ingredients.subtypes.ISubtypeInterpreter; -import mezz.jei.api.recipe.IRecipeManager; -import mezz.jei.api.recipe.category.IRecipeCategory; -import mezz.jei.api.registration.IAdvancedRegistration; -import mezz.jei.api.registration.ISubtypeRegistration; -import mezz.jei.api.runtime.IJeiRuntime; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Recipe; -import net.minecraft.util.Identifier; -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -import static dan200.computercraft.shared.integration.jei.RecipeResolver.MAIN_FAMILIES; - -@JeiPlugin -public class JEIComputerCraft implements IModPlugin -{ - @Nonnull - @Override - public Identifier getPluginUid() - { - return new Identifier( ComputerCraft.MOD_ID, "jei" ); - } - - @Override - public void registerItemSubtypes( ISubtypeRegistration subtypeRegistry ) - { - subtypeRegistry.registerSubtypeInterpreter( ComputerCraftRegistry.ModItems.TURTLE_NORMAL.get(), turtleSubtype ); - subtypeRegistry.registerSubtypeInterpreter( ComputerCraftRegistry.ModItems.TURTLE_ADVANCED.get(), turtleSubtype ); - - subtypeRegistry.registerSubtypeInterpreter( ComputerCraftRegistry.ModItems.POCKET_COMPUTER_NORMAL.get(), pocketSubtype ); - subtypeRegistry.registerSubtypeInterpreter( ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED.get(), pocketSubtype ); - - subtypeRegistry.registerSubtypeInterpreter( ComputerCraftRegistry.ModItems.DISK.get(), diskSubtype ); - } - - @Override - public void registerAdvanced( IAdvancedRegistration registry ) - { - registry.addRecipeManagerPlugin( new RecipeResolver() ); - } - - @Override - public void onRuntimeAvailable( IJeiRuntime runtime ) - { - IRecipeManager registry = runtime.getRecipeManager(); - - // Register all turtles/pocket computers (not just vanilla upgrades) as upgrades on JEI. - List upgradeItems = new ArrayList<>(); - for( ComputerFamily family : MAIN_FAMILIES ) - { - TurtleUpgrades.getUpgrades() - .filter( x -> TurtleUpgrades.suitableForFamily( family, x ) ) - .map( x -> TurtleItemFactory.create( -1, null, -1, family, null, x, 0, null ) ) - .forEach( upgradeItems::add ); - - for( IPocketUpgrade upgrade : PocketUpgrades.getUpgrades() ) - { - upgradeItems.add( PocketComputerItemFactory.create( -1, null, -1, family, upgrade ) ); - } - } - - runtime.getIngredientManager().addIngredientsAtRuntime( VanillaTypes.ITEM, upgradeItems ); - - // Hide all upgrade recipes - IRecipeCategory category = (IRecipeCategory) registry.getRecipeCategory( VanillaRecipeCategoryUid.CRAFTING ); - if( category != null ) - { - for( Object wrapper : registry.getRecipes( category ) ) - { - if( !(wrapper instanceof Recipe) ) continue; - Identifier id = ((Recipe) wrapper).getId(); - if( id.getNamespace().equals( ComputerCraft.MOD_ID ) - && (id.getPath().startsWith( "generated/turtle_" ) || id.getPath().startsWith( "generated/pocket_" )) ) - { - registry.hideRecipe( wrapper, VanillaRecipeCategoryUid.CRAFTING ); - } - } - } - } - - /** - * Distinguishes turtles by upgrades and family. - */ - private static final ISubtypeInterpreter turtleSubtype = stack -> { - Item item = stack.getItem(); - if( !(item instanceof ITurtleItem) ) return ""; - - ITurtleItem turtle = (ITurtleItem) item; - StringBuilder name = new StringBuilder(); - - // Add left and right upgrades to the identifier - ITurtleUpgrade left = turtle.getUpgrade( stack, TurtleSide.LEFT ); - ITurtleUpgrade right = turtle.getUpgrade( stack, TurtleSide.RIGHT ); - if( left != null ) name.append( left.getUpgradeID() ); - if( left != null && right != null ) name.append( '|' ); - if( right != null ) name.append( right.getUpgradeID() ); - - return name.toString(); - }; - - /** - * Distinguishes pocket computers by upgrade and family. - */ - private static final ISubtypeInterpreter pocketSubtype = stack -> { - Item item = stack.getItem(); - if( !(item instanceof ItemPocketComputer) ) return ""; - - StringBuilder name = new StringBuilder(); - - // Add the upgrade to the identifier - IPocketUpgrade upgrade = ItemPocketComputer.getUpgrade( stack ); - if( upgrade != null ) name.append( upgrade.getUpgradeID() ); - - return name.toString(); - }; - - /** - * Distinguishes disks by colour. - */ - private static final ISubtypeInterpreter diskSubtype = stack -> { - Item item = stack.getItem(); - if( !(item instanceof ItemDisk) ) return ""; - - ItemDisk disk = (ItemDisk) item; - - int colour = disk.getColour( stack ); - return colour == -1 ? "" : String.format( "%06x", colour ); - }; -} diff --git a/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java b/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java deleted file mode 100644 index 9050bb375..000000000 --- a/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java +++ /dev/null @@ -1,401 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.integration.jei; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.pocket.IPocketUpgrade; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.api.turtle.TurtleSide; -import dan200.computercraft.shared.PocketUpgrades; -import dan200.computercraft.shared.TurtleUpgrades; -import dan200.computercraft.shared.computer.core.ComputerFamily; -import dan200.computercraft.shared.pocket.items.ItemPocketComputer; -import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory; -import dan200.computercraft.shared.turtle.items.ITurtleItem; -import dan200.computercraft.shared.turtle.items.TurtleItemFactory; -import dan200.computercraft.shared.util.InventoryUtil; -import mezz.jei.api.constants.VanillaRecipeCategoryUid; -import mezz.jei.api.recipe.IFocus; -import mezz.jei.api.recipe.advanced.IRecipeManagerPlugin; -import mezz.jei.api.recipe.category.IRecipeCategory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; -import javax.annotation.Nonnull; -import java.util.*; - -import static net.minecraft.recipe.Ingredient.ofStacks; -import static net.minecraft.util.collection.DefaultedList.copyOf; - -class RecipeResolver implements IRecipeManagerPlugin -{ - static final ComputerFamily[] MAIN_FAMILIES = new ComputerFamily[] { ComputerFamily.NORMAL, ComputerFamily.ADVANCED }; - - private final Map> upgradeItemLookup = new HashMap<>(); - private final List pocketUpgrades = new ArrayList<>(); - private final List turtleUpgrades = new ArrayList<>(); - private boolean initialised = false; - - /** - * Build a cache of items which are used for turtle and pocket computer upgrades. - */ - private void setupCache() - { - if( initialised ) return; - initialised = true; - - TurtleUpgrades.getUpgrades().forEach( upgrade -> { - ItemStack stack = upgrade.getCraftingItem(); - if( stack.isEmpty() ) return; - - UpgradeInfo info = new UpgradeInfo( stack, upgrade ); - upgradeItemLookup.computeIfAbsent( stack.getItem(), k -> new ArrayList<>( 1 ) ).add( info ); - turtleUpgrades.add( info ); - } ); - - for( IPocketUpgrade upgrade : PocketUpgrades.getUpgrades() ) - { - ItemStack stack = upgrade.getCraftingItem(); - if( stack.isEmpty() ) continue; - - UpgradeInfo info = new UpgradeInfo( stack, upgrade ); - upgradeItemLookup.computeIfAbsent( stack.getItem(), k -> new ArrayList<>( 1 ) ).add( info ); - pocketUpgrades.add( info ); - } - } - - private boolean hasUpgrade( @Nonnull ItemStack stack ) - { - if( stack.isEmpty() ) return false; - - setupCache(); - List upgrades = upgradeItemLookup.get( stack.getItem() ); - if( upgrades == null ) return false; - - for( UpgradeInfo upgrade : upgrades ) - { - ItemStack craftingStack = upgrade.stack; - if( !craftingStack.isEmpty() && InventoryUtil.areItemsSimilar( stack, craftingStack ) ) return true; - } - - return false; - } - - @Nonnull - @Override - public List getRecipeCategoryUids( @Nonnull IFocus focus ) - { - V value = focus.getValue(); - if( !(value instanceof ItemStack) ) return Collections.emptyList(); - - ItemStack stack = (ItemStack) value; - switch( focus.getMode() ) - { - case INPUT: - return stack.getItem() instanceof ITurtleItem || stack.getItem() instanceof ItemPocketComputer || - hasUpgrade( stack ) - ? Collections.singletonList( VanillaRecipeCategoryUid.CRAFTING ) - : Collections.emptyList(); - case OUTPUT: - return stack.getItem() instanceof ITurtleItem || stack.getItem() instanceof ItemPocketComputer - ? Collections.singletonList( VanillaRecipeCategoryUid.CRAFTING ) - : Collections.emptyList(); - default: - return Collections.emptyList(); - } - } - - @Nonnull - @Override - public List getRecipes( @Nonnull IRecipeCategory recipeCategory, @Nonnull IFocus focus ) - { - if( !(focus.getValue() instanceof ItemStack) || !recipeCategory.getUid().equals( VanillaRecipeCategoryUid.CRAFTING ) ) - { - return Collections.emptyList(); - } - - ItemStack stack = (ItemStack) focus.getValue(); - switch( focus.getMode() ) - { - case INPUT: - return cast( findRecipesWithInput( stack ) ); - case OUTPUT: - return cast( findRecipesWithOutput( stack ) ); - default: - return Collections.emptyList(); - } - } - - @Nonnull - @Override - public List getRecipes( @Nonnull IRecipeCategory recipeCategory ) - { - return Collections.emptyList(); - } - - @Nonnull - private List findRecipesWithInput( @Nonnull ItemStack stack ) - { - setupCache(); - - if( stack.getItem() instanceof ITurtleItem ) - { - // Suggest possible upgrades which can be applied to this turtle - ITurtleItem item = (ITurtleItem) stack.getItem(); - ITurtleUpgrade left = item.getUpgrade( stack, TurtleSide.LEFT ); - ITurtleUpgrade right = item.getUpgrade( stack, TurtleSide.RIGHT ); - if( left != null && right != null ) return Collections.emptyList(); - - List recipes = new ArrayList<>(); - Ingredient ingredient = ofStacks( stack ); - for( UpgradeInfo upgrade : turtleUpgrades ) - { - // The turtle is facing towards us, so upgrades on the left are actually crafted on the right. - if( left == null ) - { - recipes.add( horizontal( copyOf( Ingredient.EMPTY, ingredient, upgrade.ingredient ), turtleWith( stack, upgrade.turtle, right ) ) ); - } - - if( right == null ) - { - recipes.add( horizontal( copyOf( Ingredient.EMPTY, upgrade.ingredient, ingredient ), turtleWith( stack, left, upgrade.turtle ) ) ); - } - } - - return cast( recipes ); - } - else if( stack.getItem() instanceof ItemPocketComputer ) - { - // Suggest possible upgrades which can be applied to this turtle - IPocketUpgrade back = ItemPocketComputer.getUpgrade( stack ); - if( back != null ) return Collections.emptyList(); - - List recipes = new ArrayList<>(); - Ingredient ingredient = ofStacks( stack ); - for( UpgradeInfo upgrade : pocketUpgrades ) - { - recipes.add( vertical( copyOf( Ingredient.EMPTY, ingredient, upgrade.ingredient ), pocketWith( stack, upgrade.pocket ) ) ); - } - - return recipes; - } - else - { - List upgrades = upgradeItemLookup.get( stack.getItem() ); - if( upgrades == null ) return Collections.emptyList(); - - List recipes = null; - boolean multiple = false; - Ingredient ingredient = ofStacks( stack ); - for( UpgradeInfo upgrade : upgrades ) - { - ItemStack craftingStack = upgrade.stack; - if( craftingStack.isEmpty() || !InventoryUtil.areItemsSimilar( stack, craftingStack ) ) - { - continue; - } - - if( recipes == null ) - { - recipes = upgrade.getRecipes(); - } - else - { - if( !multiple ) - { - multiple = true; - recipes = new ArrayList<>( recipes ); - } - recipes.addAll( upgrade.getRecipes() ); - } - } - - return recipes == null ? Collections.emptyList() : recipes; - } - } - - @Nonnull - private static List findRecipesWithOutput( @Nonnull ItemStack stack ) - { - // Find which upgrade this item currently has, an so how we could build it. - if( stack.getItem() instanceof ITurtleItem ) - { - ITurtleItem item = (ITurtleItem) stack.getItem(); - List recipes = new ArrayList<>( 0 ); - - ITurtleUpgrade left = item.getUpgrade( stack, TurtleSide.LEFT ); - ITurtleUpgrade right = item.getUpgrade( stack, TurtleSide.RIGHT ); - - // The turtle is facing towards us, so upgrades on the left are actually crafted on the right. - if( left != null ) - { - recipes.add( horizontal( - copyOf( Ingredient.EMPTY, ofStacks( turtleWith( stack, null, right ) ), ofStacks( left.getCraftingItem() ) ), - stack - ) ); - } - - if( right != null ) - { - recipes.add( horizontal( - copyOf( Ingredient.EMPTY, ofStacks( right.getCraftingItem() ), ofStacks( turtleWith( stack, left, null ) ) ), - stack - ) ); - } - - return cast( recipes ); - } - else if( stack.getItem() instanceof ItemPocketComputer ) - { - List recipes = new ArrayList<>( 0 ); - - IPocketUpgrade back = ItemPocketComputer.getUpgrade( stack ); - if( back != null ) - { - recipes.add( vertical( - copyOf( Ingredient.EMPTY, ofStacks( back.getCraftingItem() ), ofStacks( pocketWith( stack, null ) ) ), - stack - ) ); - } - - return cast( recipes ); - } - else - { - return Collections.emptyList(); - } - } - - @SuppressWarnings( { "unchecked", "rawtypes" } ) - private static List cast( List from ) - { - return (List) from; - } - - private static ItemStack turtleWith( ItemStack stack, ITurtleUpgrade left, ITurtleUpgrade right ) - { - ITurtleItem item = (ITurtleItem) stack.getItem(); - return TurtleItemFactory.create( - item.getComputerID( stack ), item.getLabel( stack ), item.getColour( stack ), item.getFamily(), - left, right, item.getFuelLevel( stack ), item.getOverlay( stack ) - ); - } - - private static ItemStack pocketWith( ItemStack stack, IPocketUpgrade back ) - { - ItemPocketComputer item = (ItemPocketComputer) stack.getItem(); - return PocketComputerItemFactory.create( - item.getComputerID( stack ), item.getLabel( stack ), item.getColour( stack ), item.getFamily(), - back - ); - } - - private static Shaped vertical( DefaultedList input, ItemStack result ) - { - return new Shaped( 1, input.size(), input, result ); - } - - private static Shaped horizontal( DefaultedList input, ItemStack result ) - { - return new Shaped( input.size(), 1, input, result ); - } - - private static class Shaped extends ShapedRecipe - { - private static final Identifier ID = new Identifier( ComputerCraft.MOD_ID, "impostor" ); - - Shaped( int width, int height, DefaultedList input, ItemStack output ) - { - super( ID, null, width, height, input, output ); - } - - @Nonnull - @Override - public Identifier getId() - { - return null; - } - - @Nonnull - @Override - public RecipeSerializer getSerializer() - { - throw new IllegalStateException( "Should not serialise the JEI recipe" ); - } - } - - private static final class Upgrade - { - final T upgrade; - final ItemStack stack; - final Ingredient ingredient; - - private Upgrade( T upgrade, ItemStack stack ) - { - this.upgrade = upgrade; - this.stack = stack; - ingredient = ofStacks( stack ); - } - } - - private static class UpgradeInfo - { - final ItemStack stack; - final Ingredient ingredient; - final ITurtleUpgrade turtle; - final IPocketUpgrade pocket; - ArrayList recipes; - - UpgradeInfo( ItemStack stack, ITurtleUpgrade turtle ) - { - this.stack = stack; - ingredient = ofStacks( stack ); - this.turtle = turtle; - pocket = null; - } - - UpgradeInfo( ItemStack stack, IPocketUpgrade pocket ) - { - this.stack = stack; - ingredient = ofStacks( stack ); - turtle = null; - this.pocket = pocket; - } - - List getRecipes() - { - ArrayList recipes = this.recipes; - if( recipes != null ) return recipes; - - recipes = this.recipes = new ArrayList<>( 4 ); - for( ComputerFamily family : MAIN_FAMILIES ) - { - if( turtle != null && TurtleUpgrades.suitableForFamily( family, turtle ) ) - { - recipes.add( horizontal( - copyOf( Ingredient.EMPTY, ingredient, ofStacks( TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null ) ) ), - TurtleItemFactory.create( -1, null, -1, family, null, turtle, 0, null ) - ) ); - } - - if( pocket != null ) - { - recipes.add( vertical( - copyOf( Ingredient.EMPTY, ingredient, ofStacks( PocketComputerItemFactory.create( -1, null, -1, family, null ) ) ), - PocketComputerItemFactory.create( -1, null, -1, family, pocket ) - ) ); - } - } - - recipes.trimToSize(); - return recipes; - } - } -} diff --git a/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java index 8ed7772ba..f0ae10528 100644 --- a/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java +++ b/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java @@ -14,7 +14,7 @@ import net.minecraft.network.PacketByteBuf; import net.minecraft.util.Identifier; public class ComputerContainerData implements ContainerData { - private static final Identifier IDENTIFIER = new Identifier(ComputerCraft.MOD_ID, "computerContainerData"); + private static final Identifier IDENTIFIER = new Identifier(ComputerCraft.MOD_ID, "computer_container_data"); private int id; private ComputerFamily family; diff --git a/src/main/java/dan200/computercraft/shared/util/FixedPointTileEntityType.java b/src/main/java/dan200/computercraft/shared/util/FixedPointTileEntityType.java index e13062240..3b1bf0e1d 100644 --- a/src/main/java/dan200/computercraft/shared/util/FixedPointTileEntityType.java +++ b/src/main/java/dan200/computercraft/shared/util/FixedPointTileEntityType.java @@ -20,15 +20,15 @@ import java.util.function.Supplier; */ public final class FixedPointTileEntityType extends BlockEntityType { - private final Block block; + private final Supplier block; - private FixedPointTileEntityType( Block block, Supplier builder ) + private FixedPointTileEntityType( Supplier block, Supplier builder ) { super( builder, Collections.emptySet(), null ); this.block = block; } - public static FixedPointTileEntityType create( Block block, Function, T> builder ) + public static FixedPointTileEntityType create( Supplier block, Function, T> builder ) { return new FixedPointSupplier<>( block, builder ).factory; } @@ -36,7 +36,7 @@ public final class FixedPointTileEntityType extends Block @Override public boolean supports( @Nonnull Block block ) { - return block == this.block; + return block == this.block.get(); } private static final class FixedPointSupplier implements Supplier @@ -44,7 +44,7 @@ public final class FixedPointTileEntityType extends Block final FixedPointTileEntityType factory; private final Function, T> builder; - private FixedPointSupplier( Block block, Function, T> builder ) + private FixedPointSupplier( Supplier block, Function, T> builder ) { factory = new FixedPointTileEntityType<>( block, this ); this.builder = builder; diff --git a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java index 4bb140ce5..dcb0966c5 100644 --- a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java +++ b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java @@ -9,6 +9,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import dan200.computercraft.ComputerCraft; +import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; import net.minecraft.util.WorldSavePath; @@ -42,7 +43,7 @@ public final class IDAssigner public static File getDir() { - return FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer ? ((MinecraftServer) FabricLoader.getInstance().getGameInstance()).getSavePath( FOLDER ).toFile() : null; + return GameInstanceUtils.getServer().getSavePath( FOLDER ).toFile(); } private static MinecraftServer getCachedServer() @@ -52,7 +53,7 @@ public final class IDAssigner MinecraftServer currentServer = server.get(); if( currentServer == null ) return null; - if(FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer && currentServer != FabricLoader.getInstance().getGameInstance() ) return null; + if( currentServer != GameInstanceUtils.getServer() ) return null; return currentServer; } @@ -62,8 +63,9 @@ public final class IDAssigner if( currentServer == null ) { // The server has changed, refetch our ID map - if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { - server = new WeakReference<>((MinecraftServer) FabricLoader.getInstance().getGameInstance()); + if ( GameInstanceUtils.getServer() != null ) + { + server = new WeakReference<>( GameInstanceUtils.getServer() ); File dir = getDir(); dir.mkdirs(); diff --git a/src/main/resources/computercraft.accesswidener b/src/main/resources/computercraft.accesswidener index 21cb2868f..9269a0e00 100644 --- a/src/main/resources/computercraft.accesswidener +++ b/src/main/resources/computercraft.accesswidener @@ -15,3 +15,4 @@ accessible class net/minecraft/screen/ScreenHandlerType$Factory accessible method net/minecraft/client/render/model/json/ModelOverrideList ()V extendable class net/minecraft/util/math/Matrix4f accessible method net/minecraft/util/WorldSavePath (Ljava/lang/String;)V +accessible field net/minecraft/server/MinecraftServer serverResourceManager Lnet/minecraft/resource/ServerResourceManager;