From 0f6db63020e7811c26929ed94ff1a29acb8bd216 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 5 Jun 2021 10:09:28 +0100 Subject: [PATCH] Remove "*Proxy" classes - Move registry code into the various *Registry classes. I'm not sure this is any more sensible, but things being registered in different places kinda irked me. - Everything else (i.e. event listeners) goes in a {Client,Common}Hooks class right now. It's not ideal, but I don't think we can split it up much. --- .../computercraft/client/ClientHooks.java | 39 ++++ .../computercraft/client/ClientRegistry.java | 49 ++++ .../proxy/ComputerCraftProxyClient.java | 81 ------- .../dan200/computercraft/data/Generators.java | 4 +- .../dan200/computercraft/data/LootTables.java | 4 +- .../computercraft/shared/CommonHooks.java | 123 ++++++++++ .../dan200/computercraft/shared/Registry.java | 93 +++++++- .../proxy/ComputerCraftProxyCommon.java | 221 ------------------ 8 files changed, 300 insertions(+), 314 deletions(-) create mode 100644 src/main/java/dan200/computercraft/client/ClientHooks.java delete mode 100644 src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java create mode 100644 src/main/java/dan200/computercraft/shared/CommonHooks.java delete mode 100644 src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java diff --git a/src/main/java/dan200/computercraft/client/ClientHooks.java b/src/main/java/dan200/computercraft/client/ClientHooks.java new file mode 100644 index 000000000..17e565f5b --- /dev/null +++ b/src/main/java/dan200/computercraft/client/ClientHooks.java @@ -0,0 +1,39 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.client; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ClientPlayerNetworkEvent; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT ) +public class ClientHooks +{ + @SubscribeEvent + public static void onWorldUnload( WorldEvent.Unload event ) + { + if( event.getWorld().isClientSide() ) + { + ClientMonitor.destroyAll(); + } + } + + @SubscribeEvent + public static void onLogIn( ClientPlayerNetworkEvent.LoggedInEvent event ) + { + ComputerCraft.clientComputerRegistry.reset(); + } + + @SubscribeEvent + public static void onLogOut( ClientPlayerNetworkEvent.LoggedOutEvent event ) + { + ComputerCraft.clientComputerRegistry.reset(); + } +} diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java index 14c4afc7b..196df7579 100644 --- a/src/main/java/dan200/computercraft/client/ClientRegistry.java +++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java @@ -6,13 +6,23 @@ package dan200.computercraft.client; import dan200.computercraft.ComputerCraft; +import dan200.computercraft.client.gui.*; +import dan200.computercraft.client.render.TileEntityMonitorRenderer; +import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TurtleModelLoader; +import dan200.computercraft.client.render.TurtlePlayerRenderer; import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.common.IColouredItem; +import dan200.computercraft.shared.computer.inventory.ContainerComputer; +import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.media.items.ItemDisk; import dan200.computercraft.shared.media.items.ItemTreasureDisk; +import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.util.Colour; +import net.minecraft.client.gui.ScreenManager; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -21,7 +31,9 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; /** * Registers textures and models for items. @@ -104,4 +116,41 @@ public static void onItemColours( ColorHandlerEvent.Item event ) Registry.ModBlocks.TURTLE_NORMAL.get(), Registry.ModBlocks.TURTLE_ADVANCED.get() ); } + + @SubscribeEvent + public static void setupClient( FMLClientSetupEvent event ) + { + registerContainers(); + + // While turtles themselves are not transparent, their upgrades may be. + RenderTypeLookup.setRenderLayer( Registry.ModBlocks.TURTLE_NORMAL.get(), RenderType.translucent() ); + RenderTypeLookup.setRenderLayer( Registry.ModBlocks.TURTLE_ADVANCED.get(), RenderType.translucent() ); + + // Monitors' textures have transparent fronts and so count as cutouts. + RenderTypeLookup.setRenderLayer( Registry.ModBlocks.MONITOR_NORMAL.get(), RenderType.cutout() ); + RenderTypeLookup.setRenderLayer( Registry.ModBlocks.MONITOR_ADVANCED.get(), RenderType.cutout() ); + + // Setup TESRs + net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.MONITOR_NORMAL.get(), TileEntityMonitorRenderer::new ); + net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.MONITOR_ADVANCED.get(), TileEntityMonitorRenderer::new ); + net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_NORMAL.get(), TileEntityTurtleRenderer::new ); + net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new ); + + RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new ); + } + + private static void registerContainers() + { + // My IDE doesn't think so, but we do actually need these generics. + + ScreenManager.>register( Registry.ModContainers.COMPUTER.get(), GuiComputer::create ); + ScreenManager.>register( Registry.ModContainers.POCKET_COMPUTER.get(), GuiComputer::createPocket ); + ScreenManager.register( Registry.ModContainers.TURTLE.get(), GuiTurtle::new ); + + ScreenManager.register( Registry.ModContainers.PRINTER.get(), GuiPrinter::new ); + ScreenManager.register( Registry.ModContainers.DISK_DRIVE.get(), GuiDiskDrive::new ); + ScreenManager.register( Registry.ModContainers.PRINTOUT.get(), GuiPrintout::new ); + + ScreenManager.>register( Registry.ModContainers.VIEW_COMPUTER.get(), GuiComputer::createView ); + } } diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java deleted file mode 100644 index e0b01fd0f..000000000 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.client.proxy; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.client.gui.*; -import dan200.computercraft.client.render.TileEntityMonitorRenderer; -import dan200.computercraft.client.render.TileEntityTurtleRenderer; -import dan200.computercraft.client.render.TurtlePlayerRenderer; -import dan200.computercraft.shared.Registry; -import dan200.computercraft.shared.computer.inventory.ContainerComputer; -import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; -import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; -import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; -import net.minecraft.client.gui.ScreenManager; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.client.registry.RenderingRegistry; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; - -@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD ) -public final class ComputerCraftProxyClient -{ - @SubscribeEvent - public static void setupClient( FMLClientSetupEvent event ) - { - registerContainers(); - - // While turtles themselves are not transparent, their upgrades may be. - RenderTypeLookup.setRenderLayer( Registry.ModBlocks.TURTLE_NORMAL.get(), RenderType.translucent() ); - RenderTypeLookup.setRenderLayer( Registry.ModBlocks.TURTLE_ADVANCED.get(), RenderType.translucent() ); - - // Monitors' textures have transparent fronts and so count as cutouts. - RenderTypeLookup.setRenderLayer( Registry.ModBlocks.MONITOR_NORMAL.get(), RenderType.cutout() ); - RenderTypeLookup.setRenderLayer( Registry.ModBlocks.MONITOR_ADVANCED.get(), RenderType.cutout() ); - - // Setup TESRs - ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.MONITOR_NORMAL.get(), TileEntityMonitorRenderer::new ); - ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.MONITOR_ADVANCED.get(), TileEntityMonitorRenderer::new ); - ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_NORMAL.get(), TileEntityTurtleRenderer::new ); - ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new ); - - RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new ); - } - - private static void registerContainers() - { - // My IDE doesn't think so, but we do actually need these generics. - - ScreenManager.>register( Registry.ModContainers.COMPUTER.get(), GuiComputer::create ); - ScreenManager.>register( Registry.ModContainers.POCKET_COMPUTER.get(), GuiComputer::createPocket ); - ScreenManager.register( Registry.ModContainers.TURTLE.get(), GuiTurtle::new ); - - ScreenManager.register( Registry.ModContainers.PRINTER.get(), GuiPrinter::new ); - ScreenManager.register( Registry.ModContainers.DISK_DRIVE.get(), GuiDiskDrive::new ); - ScreenManager.register( Registry.ModContainers.PRINTOUT.get(), GuiPrintout::new ); - - ScreenManager.>register( Registry.ModContainers.VIEW_COMPUTER.get(), GuiComputer::createView ); - } - - @Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT ) - public static final class ForgeHandlers - { - @SubscribeEvent - public static void onWorldUnload( WorldEvent.Unload event ) - { - if( event.getWorld().isClientSide() ) - { - ClientMonitor.destroyAll(); - } - } - } -} diff --git a/src/main/java/dan200/computercraft/data/Generators.java b/src/main/java/dan200/computercraft/data/Generators.java index 4dd693dc3..3ab280096 100644 --- a/src/main/java/dan200/computercraft/data/Generators.java +++ b/src/main/java/dan200/computercraft/data/Generators.java @@ -5,7 +5,7 @@ */ package dan200.computercraft.data; -import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; +import dan200.computercraft.shared.Registry; import net.minecraft.data.DataGenerator; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -17,7 +17,7 @@ public class Generators @SubscribeEvent public static void gather( GatherDataEvent event ) { - ComputerCraftProxyCommon.registerLoot(); + Registry.registerLoot(); DataGenerator generator = event.getGenerator(); generator.addProvider( new Recipes( generator ) ); diff --git a/src/main/java/dan200/computercraft/data/LootTables.java b/src/main/java/dan200/computercraft/data/LootTables.java index 9c3f9639e..dc6ea8152 100644 --- a/src/main/java/dan200/computercraft/data/LootTables.java +++ b/src/main/java/dan200/computercraft/data/LootTables.java @@ -10,7 +10,7 @@ import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; import dan200.computercraft.shared.data.HasComputerIdLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition; -import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; +import dan200.computercraft.shared.CommonHooks; import net.minecraft.block.Block; import net.minecraft.data.DataGenerator; import net.minecraft.util.ResourceLocation; @@ -46,7 +46,7 @@ protected void registerLoot( BiConsumer add ) computerDrop( add, Registry.ModBlocks.TURTLE_NORMAL ); computerDrop( add, Registry.ModBlocks.TURTLE_ADVANCED ); - add.accept( ComputerCraftProxyCommon.ForgeHandlers.LOOT_TREASURE_DISK, LootTable + add.accept( CommonHooks.LOOT_TREASURE_DISK, LootTable .lootTable() .setParamSet( LootParameterSets.ALL_PARAMS ) .build() ); diff --git a/src/main/java/dan200/computercraft/shared/CommonHooks.java b/src/main/java/dan200/computercraft/shared/CommonHooks.java new file mode 100644 index 000000000..75db335cf --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/CommonHooks.java @@ -0,0 +1,123 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.core.computer.MainThread; +import dan200.computercraft.core.tracking.Tracking; +import dan200.computercraft.shared.command.CommandComputerCraft; +import dan200.computercraft.shared.computer.core.IComputer; +import dan200.computercraft.shared.computer.core.IContainerComputer; +import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; +import net.minecraft.inventory.container.Container; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.storage.loot.ConstantRange; +import net.minecraft.world.storage.loot.LootPool; +import net.minecraft.world.storage.loot.LootTables; +import net.minecraft.world.storage.loot.TableLootEntry; +import net.minecraftforge.event.LootTableLoadEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.player.PlayerContainerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.server.FMLServerStartedEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * Miscellaneous hooks which are present on the client and server. + * + * These should possibly be refactored into separate classes at some point, but are fine here for now. + * + * @see dan200.computercraft.client.ClientHooks For client-specific ones. + */ +@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID ) +public final class CommonHooks +{ + private CommonHooks() + { + } + + @SubscribeEvent + public static void onServerTick( TickEvent.ServerTickEvent event ) + { + if( event.phase == TickEvent.Phase.START ) + { + MainThread.executePendingTasks(); + ComputerCraft.serverComputerRegistry.update(); + } + } + + @SubscribeEvent + public static void onContainerOpen( PlayerContainerEvent.Open event ) + { + // If we're opening a computer container then broadcast the terminal state + Container container = event.getContainer(); + if( container instanceof IContainerComputer ) + { + IComputer computer = ((IContainerComputer) container).getComputer(); + if( computer instanceof ServerComputer ) + { + ((ServerComputer) computer).sendTerminalState( event.getPlayer() ); + } + } + } + + @SubscribeEvent + public static void onServerStarting( FMLServerStartingEvent event ) + { + CommandComputerCraft.register( event.getCommandDispatcher() ); + } + + @SubscribeEvent + public static void onServerStarted( FMLServerStartedEvent event ) + { + ComputerCraft.serverComputerRegistry.reset(); + WirelessNetwork.resetNetworks(); + Tracking.reset(); + } + + @SubscribeEvent + public static void onServerStopped( FMLServerStoppedEvent event ) + { + ComputerCraft.serverComputerRegistry.reset(); + WirelessNetwork.resetNetworks(); + Tracking.reset(); + } + + public static final ResourceLocation LOOT_TREASURE_DISK = new ResourceLocation( ComputerCraft.MOD_ID, "treasure_disk" ); + + private static final Set TABLES = new HashSet<>( Arrays.asList( + LootTables.SIMPLE_DUNGEON, + LootTables.ABANDONED_MINESHAFT, + LootTables.STRONGHOLD_CORRIDOR, + LootTables.STRONGHOLD_CROSSING, + LootTables.STRONGHOLD_LIBRARY, + LootTables.DESERT_PYRAMID, + LootTables.JUNGLE_TEMPLE, + LootTables.IGLOO_CHEST, + LootTables.WOODLAND_MANSION, + LootTables.VILLAGE_CARTOGRAPHER + ) ); + + @SubscribeEvent + public static void lootLoad( LootTableLoadEvent event ) + { + ResourceLocation name = event.getName(); + if( !name.getNamespace().equals( "minecraft" ) || !TABLES.contains( name ) ) return; + + event.getTable().addPool( LootPool.lootPool() + .add( TableLootEntry.lootTableReference( LOOT_TREASURE_DISK ) ) + .setRolls( ConstantRange.exactly( 1 ) ) + .name( "computercraft_treasure" ) + .build() ); + } +} diff --git a/src/main/java/dan200/computercraft/shared/Registry.java b/src/main/java/dan200/computercraft/shared/Registry.java index a3a347fe5..f90d7c70c 100644 --- a/src/main/java/dan200/computercraft/shared/Registry.java +++ b/src/main/java/dan200/computercraft/shared/Registry.java @@ -7,8 +7,13 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.ComputerCraftAPI; +import dan200.computercraft.api.media.IMedia; +import dan200.computercraft.api.network.wired.IWiredElement; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.shared.command.arguments.ArgumentSerializers; import dan200.computercraft.shared.common.ColourableRecipe; import dan200.computercraft.shared.common.ContainerHeldItem; +import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider; import dan200.computercraft.shared.computer.blocks.BlockComputer; import dan200.computercraft.shared.computer.blocks.TileCommandComputer; import dan200.computercraft.shared.computer.blocks.TileComputer; @@ -17,11 +22,17 @@ import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.computer.items.ItemComputer; import dan200.computercraft.shared.computer.recipe.ComputerUpgradeRecipe; +import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; +import dan200.computercraft.shared.data.ConstantLootConditionSerializer; +import dan200.computercraft.shared.data.HasComputerIdLootCondition; +import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.media.items.ItemDisk; import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemTreasureDisk; +import dan200.computercraft.shared.media.items.RecordMedia; import dan200.computercraft.shared.media.recipes.DiskRecipe; import dan200.computercraft.shared.media.recipes.PrintoutRecipe; +import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.network.container.ContainerData; import dan200.computercraft.shared.network.container.HeldItemContainerData; @@ -29,6 +40,9 @@ import dan200.computercraft.shared.peripheral.diskdrive.BlockDiskDrive; import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; import dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive; +import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods; +import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods; +import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods; import dan200.computercraft.shared.peripheral.modem.wired.*; import dan200.computercraft.shared.peripheral.modem.wireless.BlockWirelessModem; import dan200.computercraft.shared.peripheral.modem.wireless.TileWirelessModem; @@ -52,29 +66,30 @@ import dan200.computercraft.shared.turtle.recipes.TurtleRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe; import dan200.computercraft.shared.turtle.upgrades.*; -import dan200.computercraft.shared.util.CreativeTabMain; -import dan200.computercraft.shared.util.FixedPointTileEntityType; -import dan200.computercraft.shared.util.ImpostorRecipe; -import dan200.computercraft.shared.util.ImpostorShapelessRecipe; +import dan200.computercraft.shared.util.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityType; import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.storage.loot.conditions.LootConditionManager; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fml.DeferredWorkQueue; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; @@ -333,6 +348,68 @@ public static void registerRecipeSerializers( RegistryEvent.Register { + registerProviders(); + ArgumentSerializers.register(); + registerLoot(); + } ); + + ComputerCraftAPI.registerGenericSource( new InventoryMethods() ); + ComputerCraftAPI.registerGenericSource( new FluidMethods() ); + ComputerCraftAPI.registerGenericSource( new EnergyMethods() ); + } + + private static void registerProviders() + { + // Register bundled power providers + ComputerCraftAPI.registerBundledRedstoneProvider( new DefaultBundledRedstoneProvider() ); + + // Register media providers + ComputerCraftAPI.registerMediaProvider( stack -> { + Item item = stack.getItem(); + if( item instanceof IMedia ) return (IMedia) item; + if( item instanceof MusicDiscItem ) return RecordMedia.INSTANCE; + return null; + } ); + + // Register capabilities + CapabilityManager.INSTANCE.register( IWiredElement.class, new NullStorage<>(), () -> null ); + CapabilityManager.INSTANCE.register( IPeripheral.class, new NullStorage<>(), () -> null ); + + // Register generic capabilities. This can technically be done off-thread, but we need it to happen + // after Forge's common setup, so this is easiest. + ComputerCraftAPI.registerGenericCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ); + ComputerCraftAPI.registerGenericCapability( CapabilityEnergy.ENERGY ); + ComputerCraftAPI.registerGenericCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY ); + } + + public static void registerLoot() + { + LootConditionManager.register( ConstantLootConditionSerializer.of( + new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ), + BlockNamedEntityLootCondition.class, + BlockNamedEntityLootCondition.INSTANCE + ) ); + + LootConditionManager.register( ConstantLootConditionSerializer.of( + new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ), + PlayerCreativeLootCondition.class, + PlayerCreativeLootCondition.INSTANCE + ) ); + + LootConditionManager.register( ConstantLootConditionSerializer.of( + new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ), + HasComputerIdLootCondition.class, + HasComputerIdLootCondition.INSTANCE + ) ); + } + public static void setup() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); diff --git a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java deleted file mode 100644 index f75f99f2a..000000000 --- a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.proxy; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.media.IMedia; -import dan200.computercraft.api.network.wired.IWiredElement; -import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.core.computer.MainThread; -import dan200.computercraft.core.tracking.Tracking; -import dan200.computercraft.shared.command.CommandComputerCraft; -import dan200.computercraft.shared.command.arguments.ArgumentSerializers; -import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider; -import dan200.computercraft.shared.computer.core.IComputer; -import dan200.computercraft.shared.computer.core.IContainerComputer; -import dan200.computercraft.shared.computer.core.ServerComputer; -import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; -import dan200.computercraft.shared.data.ConstantLootConditionSerializer; -import dan200.computercraft.shared.data.HasComputerIdLootCondition; -import dan200.computercraft.shared.data.PlayerCreativeLootCondition; -import dan200.computercraft.shared.media.items.RecordMedia; -import dan200.computercraft.shared.network.NetworkHandler; -import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods; -import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods; -import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods; -import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; -import dan200.computercraft.shared.util.NullStorage; -import net.minecraft.inventory.container.Container; -import net.minecraft.item.Item; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.storage.loot.ConstantRange; -import net.minecraft.world.storage.loot.LootPool; -import net.minecraft.world.storage.loot.LootTables; -import net.minecraft.world.storage.loot.TableLootEntry; -import net.minecraft.world.storage.loot.conditions.LootConditionManager; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.energy.CapabilityEnergy; -import net.minecraftforge.event.LootTableLoadEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.player.PlayerContainerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fml.DeferredWorkQueue; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.server.FMLServerStartedEvent; -import net.minecraftforge.fml.event.server.FMLServerStartingEvent; -import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; -import net.minecraftforge.items.CapabilityItemHandler; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD ) -public final class ComputerCraftProxyCommon -{ - @SubscribeEvent - @SuppressWarnings( "deprecation" ) - public static void init( FMLCommonSetupEvent event ) - { - NetworkHandler.setup(); - - DeferredWorkQueue.runLater( () -> { - registerProviders(); - ArgumentSerializers.register(); - registerLoot(); - } ); - - ComputerCraftAPI.registerGenericSource( new InventoryMethods() ); - ComputerCraftAPI.registerGenericSource( new FluidMethods() ); - ComputerCraftAPI.registerGenericSource( new EnergyMethods() ); - } - - public static void registerLoot() - { - LootConditionManager.register( ConstantLootConditionSerializer.of( - new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ), - BlockNamedEntityLootCondition.class, - BlockNamedEntityLootCondition.INSTANCE - ) ); - - LootConditionManager.register( ConstantLootConditionSerializer.of( - new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ), - PlayerCreativeLootCondition.class, - PlayerCreativeLootCondition.INSTANCE - ) ); - - LootConditionManager.register( ConstantLootConditionSerializer.of( - new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ), - HasComputerIdLootCondition.class, - HasComputerIdLootCondition.INSTANCE - ) ); - } - - private static void registerProviders() - { - // Register bundled power providers - ComputerCraftAPI.registerBundledRedstoneProvider( new DefaultBundledRedstoneProvider() ); - - // Register media providers - ComputerCraftAPI.registerMediaProvider( stack -> { - Item item = stack.getItem(); - if( item instanceof IMedia ) return (IMedia) item; - if( item instanceof MusicDiscItem ) return RecordMedia.INSTANCE; - return null; - } ); - - // Register capabilities - CapabilityManager.INSTANCE.register( IWiredElement.class, new NullStorage<>(), () -> null ); - CapabilityManager.INSTANCE.register( IPeripheral.class, new NullStorage<>(), () -> null ); - - // Register generic capabilities. This can technically be done off-thread, but we need it to happen - // after Forge's common setup, so this is easiest. - ComputerCraftAPI.registerGenericCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ); - ComputerCraftAPI.registerGenericCapability( CapabilityEnergy.ENERGY ); - ComputerCraftAPI.registerGenericCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY ); - } - - @Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID ) - public static final class ForgeHandlers - { - private ForgeHandlers() - { - } - - /* - @SubscribeEvent - public static void onConnectionOpened( FMLNetworkEvent.ClientConnectedToServerEvent event ) - { - ComputerCraft.clientComputerRegistry.reset(); - } - - @SubscribeEvent - public static void onConnectionClosed( FMLNetworkEvent.ClientDisconnectionFromServerEvent event ) - { - ComputerCraft.clientComputerRegistry.reset(); - } - */ - - @SubscribeEvent - public static void onServerTick( TickEvent.ServerTickEvent event ) - { - if( event.phase == TickEvent.Phase.START ) - { - MainThread.executePendingTasks(); - ComputerCraft.serverComputerRegistry.update(); - } - } - - @SubscribeEvent - public static void onContainerOpen( PlayerContainerEvent.Open event ) - { - // If we're opening a computer container then broadcast the terminal state - Container container = event.getContainer(); - if( container instanceof IContainerComputer ) - { - IComputer computer = ((IContainerComputer) container).getComputer(); - if( computer instanceof ServerComputer ) - { - ((ServerComputer) computer).sendTerminalState( event.getPlayer() ); - } - } - } - - @SubscribeEvent - public static void onServerStarting( FMLServerStartingEvent event ) - { - CommandComputerCraft.register( event.getCommandDispatcher() ); - } - - @SubscribeEvent - public static void onServerStarted( FMLServerStartedEvent event ) - { - ComputerCraft.serverComputerRegistry.reset(); - WirelessNetwork.resetNetworks(); - Tracking.reset(); - } - - @SubscribeEvent - public static void onServerStopped( FMLServerStoppedEvent event ) - { - ComputerCraft.serverComputerRegistry.reset(); - WirelessNetwork.resetNetworks(); - Tracking.reset(); - } - - public static final ResourceLocation LOOT_TREASURE_DISK = new ResourceLocation( ComputerCraft.MOD_ID, "treasure_disk" ); - - private static final Set TABLES = new HashSet<>( Arrays.asList( - LootTables.SIMPLE_DUNGEON, - LootTables.ABANDONED_MINESHAFT, - LootTables.STRONGHOLD_CORRIDOR, - LootTables.STRONGHOLD_CROSSING, - LootTables.STRONGHOLD_LIBRARY, - LootTables.DESERT_PYRAMID, - LootTables.JUNGLE_TEMPLE, - LootTables.IGLOO_CHEST, - LootTables.WOODLAND_MANSION, - LootTables.VILLAGE_CARTOGRAPHER - ) ); - - @SubscribeEvent - public static void lootLoad( LootTableLoadEvent event ) - { - ResourceLocation name = event.getName(); - if( !name.getNamespace().equals( "minecraft" ) || !TABLES.contains( name ) ) return; - - event.getTable().addPool( LootPool.lootPool() - .add( TableLootEntry.lootTableReference( LOOT_TREASURE_DISK ) ) - .setRolls( ConstantRange.exactly( 1 ) ) - .name( "computercraft_treasure" ) - .build() ); - } - } -}