From b6757c416f929069e9b8cb18d6e83d3a02484be5 Mon Sep 17 00:00:00 2001 From: Devan-Kerman Date: Sat, 29 Aug 2020 22:06:04 -0500 Subject: [PATCH] ClientRegistry --- .../computercraft/client/ClientRegistry.java | 102 ++++--------- .../computercraft/client/FrameInfo.java | 41 +++--- .../proxy/ComputerCraftProxyClient.java | 138 +++++++++--------- .../shared/command/text/ChatHelpers.java | 1 - src/main/resources/fabric.mod.json | 3 +- 5 files changed, 127 insertions(+), 158 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java index 70f0d0dc0..9c7c71a42 100644 --- a/src/main/java/dan200/computercraft/client/ClientRegistry.java +++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java @@ -3,33 +3,34 @@ * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Send enquiries to dratcliffe@gmail.com */ + package dan200.computercraft.client; -import com.sun.org.apache.xpath.internal.operations.Mod; +import java.util.HashSet; +import java.util.function.Consumer; +import java.util.function.Function; + import dan200.computercraft.ComputerCraft; -import dan200.computercraft.client.render.TurtleModelLoader; import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.media.items.ItemDisk; import dan200.computercraft.shared.media.items.ItemTreasureDisk; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.util.Colour; -import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; -import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.render.model.ModelRotation; import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.ModelIdentifier; import net.minecraft.resource.ResourceManager; -import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; -import java.util.HashSet; -import java.util.Map; -import java.util.function.Consumer; +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; +import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; /** * Registers textures and models for items. @@ -38,8 +39,7 @@ import java.util.function.Consumer; "MethodCallSideOnly", "LocalVariableDeclarationSideOnly" }) -public final class ClientRegistry -{ +public final class ClientRegistry { private static final String[] EXTRA_MODELS = new String[] { "turtle_modem_normal_off_left", "turtle_modem_normal_on_left", @@ -58,7 +58,7 @@ public final class ClientRegistry "turtle_colour", "turtle_elf_overlay", - }; + }; private static final String[] EXTRA_TEXTURES = new String[] { // TODO: Gather these automatically from the model. Sadly the model loader isn't available @@ -67,7 +67,7 @@ public final class ClientRegistry "block/turtle_elf_overlay", "block/turtle_crafty_face", "block/turtle_speaker_face", - }; + }; private ClientRegistry() {} @@ -87,76 +87,38 @@ public final class ClientRegistry public static void onItemColours() { ColorProviderRegistry.ITEM.register((stack, layer) -> { return layer == 1 ? ((ItemDisk) stack.getItem()).getColour(stack) : 0xFFFFFF; - }); + }, Registry.ModItems.DISK); + + ColorProviderRegistry.ITEM.register((stack, layer) -> layer == 1 ? ItemTreasureDisk.getColour(stack) : 0xFFFFFF, Registry.ModItems.TREASURE_DISK); ColorProviderRegistry.ITEM.register((stack, layer) -> { switch (layer) { - case 0: - default: - return 0xFFFFFF; - case 1: // Frame colour - return IColouredItem.getColourBasic(stack); - case 2: // Light colour - { - int light = ItemPocketComputer.getLightState(stack); - return light == -1 ? Colour.BLACK.getHex() : light; - } + case 0: + default: + return 0xFFFFFF; + case 1: // Frame colour + return IColouredItem.getColourBasic(stack); + case 2: // Light colour + { + int light = ItemPocketComputer.getLightState(stack); + return light == -1 ? Colour.BLACK.getHex() : light; + } } }, Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED); // Setup turtle colours ColorProviderRegistry.ITEM.register((stack, tintIndex) -> tintIndex == 0 ? ((IColouredItem) stack.getItem()).getColour(stack) : 0xFFFFFF, - Registry.ModBlocks.TURTLE_NORMAL, + Registry.ModBlocks.TURTLE_NORMAL, Registry.ModBlocks.TURTLE_ADVANCED); } - private static BakedModel bake(ModelLoader loader, UnbakedModel model) { + private static BakedModel bake(ModelLoader loader, UnbakedModel model, Identifier identifier) { model.getTextureDependencies(loader::getOrLoadModel, new HashSet<>()); - SpriteAtlasTexture sprite = MinecraftClient.getInstance() - .getSpriteAtlas(); - return model.bake(loader, spriteIdentifier -> MinecraftClient.getInstance() - .getSpriteAtlas(spriteIdentifier.getAtlasId()).apply(spriteIdentifier.getTextureId()), ModelRotation.X0_Y0); + return model.bake(loader, + spriteIdentifier -> MinecraftClient.getInstance() + .getSpriteAtlas(spriteIdentifier.getAtlasId()) + .apply(spriteIdentifier.getTextureId()), + ModelRotation.X0_Y0, identifier); } - @SubscribeEvent - public static void onItemColours( ColorHandlerEvent.Item event ) - { - if( Registry.ModItems.DISK == null || Registry.ModBlocks.TURTLE_NORMAL == null ) - { - ComputerCraft.log.warn( "Block/item registration has failed. Skipping registration of item colours." ); - return; - } - - event.getItemColors().register( - ( stack, layer ) -> layer == 1 ? ((ItemDisk) stack.getItem()).getColour( stack ) : 0xFFFFFF, - Registry.ModItems.DISK.get() - ); - - event.getItemColors().register( - ( stack, layer ) -> layer == 1 ? ItemTreasureDisk.getColour( stack ) : 0xFFFFFF, - Registry.ModItems.TREASURE_DISK.get() - ); - - event.getItemColors().register( ( stack, layer ) -> { - switch( layer ) - { - case 0: - default: - return 0xFFFFFF; - case 1: // Frame colour - return IColouredItem.getColourBasic( stack ); - case 2: // Light colour - { - int light = ItemPocketComputer.getLightState( stack ); - return light == -1 ? Colour.BLACK.getHex() : light; - } - } - }, Registry.ModItems.POCKET_COMPUTER_NORMAL.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get() ); - - // Setup turtle colours - event.getItemColors().register( - ( stack, tintIndex ) -> tintIndex == 0 ? ((IColouredItem) stack.getItem()).getColour( stack ) : 0xFFFFFF, - Registry.ModBlocks.TURTLE_NORMAL.get(), Registry.ModBlocks.TURTLE_ADVANCED.get() - ); - } } diff --git a/src/main/java/dan200/computercraft/client/FrameInfo.java b/src/main/java/dan200/computercraft/client/FrameInfo.java index 00e72b67a..533f0a2bd 100644 --- a/src/main/java/dan200/computercraft/client/FrameInfo.java +++ b/src/main/java/dan200/computercraft/client/FrameInfo.java @@ -3,43 +3,42 @@ * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Send enquiries to dratcliffe@gmail.com */ + package dan200.computercraft.client; -import dan200.computercraft.ComputerCraft; -import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT ) -public final class FrameInfo -{ +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; + +public final class FrameInfo { private static int tick; private static long renderFrame; + static { - private FrameInfo() - { } - public static boolean getGlobalCursorBlink() - { + public static void init() { + ClientTickEvents.START_CLIENT_TICK.register(m -> { + tick++; + }); + } + + private FrameInfo() { + } + + public static boolean getGlobalCursorBlink() { return (tick / 8) % 2 == 0; } - public static long getRenderFrame() - { + public static long getRenderFrame() { return renderFrame; } @SubscribeEvent - public static void onTick( TickEvent.ClientTickEvent event ) - { - if( event.phase == TickEvent.Phase.START ) tick++; - } - - @SubscribeEvent - public static void onRenderTick( TickEvent.RenderTickEvent event ) - { - if( event.phase == TickEvent.Phase.START ) renderFrame++; + public static void onRenderTick(TickEvent.RenderTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + renderFrame++; + } } } diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index 91e417bea..628e47af2 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -3,10 +3,19 @@ * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Send enquiries to dratcliffe@gmail.com */ + package dan200.computercraft.client.proxy; +import java.util.function.Supplier; + import dan200.computercraft.ComputerCraft; -import dan200.computercraft.client.gui.*; +import dan200.computercraft.client.ClientRegistry; +import dan200.computercraft.client.FrameInfo; +import dan200.computercraft.client.gui.GuiComputer; +import dan200.computercraft.client.gui.GuiDiskDrive; +import dan200.computercraft.client.gui.GuiPrinter; +import dan200.computercraft.client.gui.GuiPrintout; +import dan200.computercraft.client.gui.GuiTurtle; import dan200.computercraft.client.render.TileEntityMonitorRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TurtlePlayerRenderer; @@ -17,6 +26,13 @@ import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; +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.minecraft.client.gui.screen.ingame.HandledScreens; import net.minecraft.client.item.ModelPredicateProvider; import net.minecraft.client.item.ModelPredicateProviderRegistry; @@ -24,84 +40,76 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayers; import net.minecraft.item.Item; import net.minecraft.util.Identifier; -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; -import java.util.function.Supplier; +import net.fabricmc.api.ClientModInitializer; -@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. - RenderLayers.setRenderLayer( Registry.ModBlocks.TURTLE_NORMAL.get(), RenderLayer.getTranslucent() ); - RenderLayers.setRenderLayer( Registry.ModBlocks.TURTLE_ADVANCED.get(), RenderLayer.getTranslucent() ); - - // Monitors' textures have transparent fronts and so count as cutouts. - RenderLayers.setRenderLayer( Registry.ModBlocks.MONITOR_NORMAL.get(), RenderLayer.getCutout() ); - RenderLayers.setRenderLayer( Registry.ModBlocks.MONITOR_ADVANCED.get(), RenderLayer.getCutout() ); - - // 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 ); - // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() ); - - RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new ); - - registerItemProperty( "state", - ( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(), - Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED - ); - registerItemProperty( "state", - ( stack, world, player ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0, - Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED - ); - } +@SuppressWarnings ("MethodCallSideOnly") +public final class ComputerCraftProxyClient implements ClientModInitializer { @SafeVarargs - private static void registerItemProperty( String name, ModelPredicateProvider getter, Supplier... items ) - { - Identifier id = new Identifier( ComputerCraft.MOD_ID, name ); - for( Supplier item : items ) - { - ModelPredicateProviderRegistry.register( item.get(), id, getter ); + private static void registerItemProperty(String name, ModelPredicateProvider getter, Supplier... items) { + Identifier id = new Identifier(ComputerCraft.MOD_ID, name); + for (Supplier item : items) { + ModelPredicateProviderRegistry.register(item.get(), id, getter); } } - private static void registerContainers() - { + private static void registerContainers() { // My IDE doesn't think so, but we do actually need these generics. - HandledScreens.>register( Registry.ModContainers.COMPUTER.get(), GuiComputer::create ); - HandledScreens.>register( Registry.ModContainers.POCKET_COMPUTER.get(), GuiComputer::createPocket ); - HandledScreens.register( Registry.ModContainers.TURTLE, GuiTurtle::new ); + HandledScreens.>register(Registry.ModContainers.COMPUTER.get(), GuiComputer::create); + HandledScreens.>register(Registry.ModContainers.POCKET_COMPUTER.get(), + GuiComputer::createPocket); + HandledScreens.register(Registry.ModContainers.TURTLE, GuiTurtle::new); - HandledScreens.register( Registry.ModContainers.PRINTER, GuiPrinter::new ); - HandledScreens.register( Registry.ModContainers.DISK_DRIVE, GuiDiskDrive::new ); - HandledScreens.register( Registry.ModContainers.PRINTOUT, GuiPrintout::new ); + HandledScreens.register(Registry.ModContainers.PRINTER, GuiPrinter::new); + HandledScreens.register(Registry.ModContainers.DISK_DRIVE, GuiDiskDrive::new); + HandledScreens.register(Registry.ModContainers.PRINTOUT, GuiPrintout::new); - HandledScreens.>register( Registry.ModContainers.VIEW_COMPUTER.get(), GuiComputer::createView ); + HandledScreens.>register(Registry.ModContainers.VIEW_COMPUTER.get(), + GuiComputer::createView); } - @Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT ) - public static final class ForgeHandlers - { + @Override + public void onInitializeClient() { + FrameInfo.init(); + registerContainers(); + + // While turtles themselves are not transparent, their upgrades may be. + RenderLayers.setRenderLayer(Registry.ModBlocks.TURTLE_NORMAL.get(), RenderLayer.getTranslucent()); + RenderLayers.setRenderLayer(Registry.ModBlocks.TURTLE_ADVANCED.get(), RenderLayer.getTranslucent()); + + // Monitors' textures have transparent fronts and so count as cutouts. + RenderLayers.setRenderLayer(Registry.ModBlocks.MONITOR_NORMAL.get(), RenderLayer.getCutout()); + RenderLayers.setRenderLayer(Registry.ModBlocks.MONITOR_ADVANCED.get(), RenderLayer.getCutout()); + + // 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); + // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() ); + + RenderingRegistry.registerEntityRenderingHandler(Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new); + + registerItemProperty("state", + (stack, world, player) -> ItemPocketComputer.getState(stack) + .ordinal(), + Registry.ModItems.POCKET_COMPUTER_NORMAL, + Registry.ModItems.POCKET_COMPUTER_ADVANCED); + registerItemProperty("state", + (stack, world, player) -> IColouredItem.getColourBasic(stack) != -1 ? 1 : 0, + Registry.ModItems.POCKET_COMPUTER_NORMAL, + Registry.ModItems.POCKET_COMPUTER_ADVANCED); + ClientRegistry.onItemColours(); + } + + @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().isClient() ) - { + public static void onWorldUnload(WorldEvent.Unload event) { + if (event.getWorld() + .isClient()) { ClientMonitor.destroyAll(); } } diff --git a/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java b/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java index be41f40b6..18497dcce 100644 --- a/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java +++ b/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java @@ -14,7 +14,6 @@ import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.*; /** * Various helpers for building chat messages. diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ac8e5d8bd..c50bbdfe3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,7 +27,8 @@ "environment": "*", "entrypoints": { "main": [ "dan200.computercraft.ComputerCraft" ], - "modmenu": [ "dan200.computercraft.client.ModMenuIntegration" ] + "modmenu": [ "dan200.computercraft.client.ModMenuIntegration" ], + "client": ["dan200.computercraft.client.proxy.ComputerCraftProxyClient"] }, "mixins": [ { "config": "computercraft.client.json", "environment": "client" },