diff --git a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java index a6f1d8db3..cd4d2f6b4 100644 --- a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java +++ b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java @@ -24,21 +24,21 @@ import dan200.computercraft.shared.*; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.wired.WiredNode; -import net.minecraft.block.entity.BlockEntity; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resource.ReloadableResourceManager; +import net.minecraft.server.MinecraftServer; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.server.ServerLifecycleHooks; import javax.annotation.Nonnull; +import javax.swing.text.html.Option; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.Optional; import static dan200.computercraft.shared.Capabilities.CAPABILITY_WIRED_ELEMENT; @@ -54,15 +54,15 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI public static InputStream getResourceFile( String domain, String subPath ) { - ReloadableResourceManager manager = (ReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().getResourceManager(); - try - { - return manager.getResource( new Identifier( domain, subPath ) ).getInputStream(); - } - catch( IOException ignored ) - { - return null; + if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { + ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServer) FabricLoader.getInstance().getGameInstance()).getDataPackManager(); + try { + return manager.getResource(new Identifier(domain, subPath)).getInputStream(); + } catch (IOException ignored) { + return null; + } } + return null; } @Nonnull @@ -70,8 +70,8 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI public String getInstalledVersion() { if( version != null ) return version; - return version = ModList.get().getModContainerById( ComputerCraft.MOD_ID ) - .map( x -> x.getModInfo().getVersion().toString() ) + return version = FabricLoader.getInstance().getModContainer( ComputerCraft.MOD_ID ) + .map( x -> x.getMetadata().getVersion().toString() ) .orElse( "unknown" ); } @@ -97,9 +97,12 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI @Override public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath ) { - ReloadableResourceManager manager = (ReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().getResourceManager(); - ResourceMount mount = ResourceMount.get( domain, subPath, manager ); - return mount.exists( "" ) ? mount : null; + if (FabricLoader.getInstance().getGameInstance() instanceof MinecraftServer) { + ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServer) FabricLoader.getInstance().getGameInstance()).getDataPackManager(); + ResourceMount mount = ResourceMount.get(domain, subPath, manager); + return mount.exists("") ? mount : null; + } + return null; } @Override @@ -160,9 +163,11 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI @Nonnull @Override - public LazyOptional getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public Optional getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) { - BlockEntity tile = world.getBlockEntity( pos ); - return tile == null ? LazyOptional.empty() : tile.getCapability( CAPABILITY_WIRED_ELEMENT, side ); + // TODO Fix this thing +// BlockEntity tile = world.getBlockEntity( pos ); +// return tile == null ? Optional.empty() : tile.getCapability( CAPABILITY_WIRED_ELEMENT, side ); + return Optional.empty(); } } diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java index 0b3511e7b..99176747f 100644 --- a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -23,10 +23,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Optional; /** * The static entry point to the ComputerCraft API. @@ -218,7 +218,7 @@ public final class ComputerCraftAPI * @see IWiredElement#getNode() */ @Nonnull - public static LazyOptional getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public static Optional getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return getInstance().getWiredElementAt( world, pos, side ); } @@ -275,6 +275,6 @@ public final class ComputerCraftAPI IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element ); @Nonnull - LazyOptional getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ); + Optional getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ); } } diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java index 88c8154a4..17ea8090e 100644 --- a/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java @@ -6,7 +6,6 @@ package dan200.computercraft.api.peripheral; import dan200.computercraft.api.lua.LuaFunction; -import net.minecraftforge.common.capabilities.Capability; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -14,8 +13,8 @@ import javax.annotation.Nullable; /** * The interface that defines a peripheral. * - * In order to expose a peripheral for your block or tile entity, you may either attach a {@link Capability}, or - * register a {@link IPeripheralProvider}. This cannot be implemented {@link IPeripheral} directly on the tile. + * In order to expose a peripheral for your block or tile entity, you register a {@link IPeripheralProvider}. + * This cannot be implemented {@link IPeripheral} directly on the tile. * * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing * {@link IDynamicPeripheral}. diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java index ed768f1a3..4d1a5f05d 100644 --- a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java @@ -5,17 +5,18 @@ */ package dan200.computercraft.api.peripheral; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nonnull; +import java.util.Optional; /** * This interface is used to create peripheral implementations for blocks. * - * If you have a {@link TileEntity} which acts as a peripheral, you may alternatively expose the {@link IPeripheral} + * If you have a {@link BlockEntity} which acts as a peripheral, you may alternatively expose the {@link IPeripheral} * capability. * * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) @@ -29,9 +30,9 @@ public interface IPeripheralProvider * @param world The world the block is in. * @param pos The position the block is at. * @param side The side to get the peripheral from. - * @return A peripheral, or {@link LazyOptional#empty()} if there is not a peripheral here you'd like to handle. + * @return A peripheral, or {@link Optional#empty()} if there is not a peripheral here you'd like to handle. * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) */ @Nonnull - LazyOptional getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ); + Optional getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ); } diff --git a/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java b/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java index ad2e1ee67..d2f29f714 100644 --- a/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java +++ b/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java @@ -10,7 +10,6 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.Util; -import net.minecraftforge.common.util.NonNullSupplier; import javax.annotation.Nonnull; import java.util.function.Supplier; @@ -24,49 +23,27 @@ public abstract class AbstractPocketUpgrade implements IPocketUpgrade { private final Identifier id; private final String adjective; - private final NonNullSupplier stack; + private final ItemStack stack; - protected AbstractPocketUpgrade( Identifier id, String adjective, NonNullSupplier stack ) + protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item ) { this.id = id; this.adjective = adjective; - this.stack = stack; + this.stack = new ItemStack(item); } - protected AbstractPocketUpgrade( Identifier id, NonNullSupplier item ) + protected AbstractPocketUpgrade( Identifier id, ItemConvertible item ) { this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item ); } protected AbstractPocketUpgrade( Identifier id, String adjective, ItemStack stack ) { - this( id, adjective, () -> stack ); + this.id = id; + this.adjective = adjective; + this.stack = stack; } - protected AbstractPocketUpgrade( Identifier id, ItemStack stack ) - { - this( id, () -> stack ); - } - - protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item ) - { - this( id, adjective, new CachedStack( () -> item ) ); - } - - protected AbstractPocketUpgrade( Identifier id, ItemConvertible item ) - { - this( id, new CachedStack( () -> item ) ); - } - - protected AbstractPocketUpgrade( Identifier id, String adjective, Supplier item ) - { - this( id, adjective, new CachedStack( item ) ); - } - - protected AbstractPocketUpgrade( Identifier id, Supplier item ) - { - this( id, new CachedStack( item ) ); - } @Nonnull @Override @@ -86,32 +63,6 @@ public abstract class AbstractPocketUpgrade implements IPocketUpgrade @Override public final ItemStack getCraftingItem() { - return stack.get(); - } - - /** - * Caches the construction of an item stack. - * - * @see dan200.computercraft.api.turtle.AbstractTurtleUpgrade For explanation of this class. - */ - private static final class CachedStack implements NonNullSupplier - { - private final Supplier provider; - private Item item; - private ItemStack stack; - - CachedStack( Supplier provider ) - { - this.provider = provider; - } - - @Nonnull - @Override - public ItemStack get() - { - Item item = provider.get().asItem(); - if( item == this.item && stack != null ) return stack; - return stack = new ItemStack( this.item = item ); - } + return stack; } } diff --git a/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java index e0dd3c142..3e0174dfe 100644 --- a/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java +++ b/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java @@ -10,7 +10,6 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.Util; -import net.minecraftforge.common.util.NonNullSupplier; import javax.annotation.Nonnull; import java.util.function.Supplier; @@ -25,50 +24,27 @@ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade private final Identifier id; private final TurtleUpgradeType type; private final String adjective; - private final NonNullSupplier stack; + private final ItemStack stack; - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, NonNullSupplier stack ) - { + protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item) { + this(id, type, adjective, new ItemStack(item)); + } + + protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack) { this.id = id; this.type = type; this.adjective = adjective; this.stack = stack; } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, NonNullSupplier stack ) - { - this( id, type, Util.createTranslationKey( "upgrade", id ) + ".adjective", stack ); + protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemConvertible item) { + this(id, type, new ItemStack(item)); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack ) - { - this( id, type, adjective, () -> stack ); + protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemStack stack) { + this(id, type, Util.createTranslationKey("upgrade", id) + ".adjective", stack); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemStack stack ) - { - this( id, type, () -> stack ); - } - - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item ) - { - this( id, type, adjective, new CachedStack( () -> item ) ); - } - - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemConvertible item ) - { - this( id, type, new CachedStack( () -> item ) ); - } - - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, Supplier item ) - { - this( id, type, adjective, new CachedStack( item ) ); - } - - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, Supplier item ) - { - this( id, type, new CachedStack( item ) ); - } @Nonnull @Override @@ -95,32 +71,6 @@ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade @Override public final ItemStack getCraftingItem() { - return stack.get(); - } - - /** - * A supplier which converts an item into an item stack. - * - * Constructing item stacks is somewhat expensive due to attaching capabilities. We cache it if given a consistent item. - */ - private static final class CachedStack implements NonNullSupplier - { - private final Supplier provider; - private Item item; - private ItemStack stack; - - CachedStack( Supplier provider ) - { - this.provider = provider; - } - - @Nonnull - @Override - public ItemStack get() - { - Item item = provider.get().asItem(); - if( item == this.item && stack != null ) return stack; - return stack = new ItemStack( this.item = item ); - } + return stack; } } diff --git a/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java b/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java new file mode 100644 index 000000000..2d8847721 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java @@ -0,0 +1,267 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.api.turtle; + +import java.util.Collection; +import java.util.OptionalInt; +import java.util.UUID; + +import javax.annotation.Nullable; +import javax.crypto.SecretKey; + +import com.mojang.authlib.GameProfile; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; + +import net.minecraft.block.entity.CommandBlockBlockEntity; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.command.argument.EntityAnchorArgumentType; +import net.minecraft.entity.Entity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.passive.HorseBaseEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.MessageType; +import net.minecraft.network.NetworkSide; +import net.minecraft.network.NetworkState; +import net.minecraft.network.Packet; +import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; +import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; +import net.minecraft.recipe.Recipe; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.network.ServerPlayerInteractionManager; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.village.TraderOfferList; +import net.minecraft.world.GameMode; +import net.minecraft.world.dimension.DimensionType; + +/** + * A wrapper for {@link ServerPlayerEntity} which denotes a "fake" player. + * + * Please note that this does not implement any of the traditional fake player behaviour. It simply exists to prevent me passing in normal players. + */ +public class FakePlayer extends ServerPlayerEntity { + public FakePlayer(ServerWorld world, GameProfile gameProfile) { + super(world.getServer(), world, gameProfile, new ServerPlayerInteractionManager(world)); + this.networkHandler = new FakeNetHandler(this); + } + + // region Direct networkHandler access + @Override + public void enterCombat() { } + + @Override + public void endCombat() { } + + @Override + public void tick() { } + + @Override + public void playerTick() { } + + @Override + public void onDeath(DamageSource damage) { } + + @Override + public boolean startRiding(Entity entity, boolean flag) { + return false; + } + + @Override + public void stopRiding() { } + + @Override + public void openEditSignScreen(SignBlockEntity tile) { } + + @Override + public OptionalInt openHandledScreen(@Nullable NamedScreenHandlerFactory container) { + return OptionalInt.empty(); + } + + @Override + public void sendTradeOffers(int id, TraderOfferList list, int level, int experience, boolean levelled, boolean refreshable) { } + + @Override + public void openHorseInventory(HorseBaseEntity horse, Inventory inventory) { } + + @Override + public void openEditBookScreen(ItemStack stack, Hand hand) { } + + @Override + public void openCommandBlockScreen(CommandBlockBlockEntity block) { } + + @Override + public void onSlotUpdate(ScreenHandler container, int slot, ItemStack stack) { } + + @Override + public void onHandlerRegistered(ScreenHandler container, DefaultedList defaultedList) { } + + @Override + public void onPropertyUpdate(ScreenHandler container, int key, int value) { } + + @Override + public void closeHandledScreen() { } + + @Override + public void updateCursorStack() { } + + @Override + public int unlockRecipes(Collection> recipes) { + return 0; + } + + // Indirect + @Override + public int lockRecipes(Collection> recipes) { + return 0; + } + + @Override + public void sendMessage(Text textComponent, boolean status) { } + + @Override + protected void consumeItem() { } + + @Override + public void lookAt(EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d) {} + + @Override + public void method_14222(EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target) { } + + @Override + protected void onStatusEffectApplied(StatusEffectInstance statusEffectInstance) { } + + @Override + protected void onStatusEffectUpgraded(StatusEffectInstance statusEffectInstance, boolean particles) { } + + @Override + protected void onStatusEffectRemoved(StatusEffectInstance statusEffectInstance) { } + + @Override + public void requestTeleport(double x, double y, double z) { } + + @Override + public void setGameMode(GameMode gameMode) { } + + @Override + public String getIp() { + return "[Fake Player]"; + } + + @Override + public void sendResourcePackUrl(String url, String hash) { } + + @Override + public void onStoppedTracking(Entity entity) { } + + @Override + public void setCameraEntity(Entity entity) { } + + @Override + public void teleport(ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw) { } + + @Override + public void sendInitialChunkPackets(ChunkPos chunkPos, Packet packet, Packet packet2) { } + + @Override + public void sendUnloadChunkPacket(ChunkPos chunkPos) { } + + @Override + public void playSound(SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch) { } + + @Override + public Entity moveToWorld(ServerWorld destination) { + return this; + } + + @Override + public void wakeUp(boolean bl, boolean updateSleepingPlayers) { + + } + + @Override + public void sendMessage(Text message, MessageType type, UUID senderUuid) { + + } + + private static class FakeNetHandler extends ServerPlayNetworkHandler { + FakeNetHandler(ServerPlayerEntity player) { + super(player.server, new FakeConnection(), player); + } + + @Override + public void disconnect(Text message) { } + + @Override + public void onVehicleMove(VehicleMoveC2SPacket move) { } + + @Override + public void onRequestCommandCompletions(RequestCommandCompletionsC2SPacket packet) { } + + @Override + public void sendPacket(Packet packet, @Nullable GenericFutureListener> listener) { } + } + + private static class FakeConnection extends ClientConnection { + FakeConnection() { + super(NetworkSide.CLIENTBOUND); + } + + @Override + public void channelActive(ChannelHandlerContext active) { + } + + @Override + public void setState(NetworkState state) { + } + + @Override + public void exceptionCaught(ChannelHandlerContext context, Throwable err) { + } + + @Override + protected void channelRead0(ChannelHandlerContext context, Packet packet) { + } + + @Override + public void send(Packet packet, @Nullable GenericFutureListener> listener) { + } + + @Override + public void tick() { + } + + @Override + public void disconnect(Text message) { + } + + @Override + public void setupEncryption(SecretKey key) { + } + + @Override + public void disableAutoRead() { + } + + @Override + public void setCompressionThreshold(int size) { + } + } +} diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java index 5129ab318..add7c8654 100644 --- a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java @@ -15,7 +15,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -148,24 +147,10 @@ public interface ITurtleAccess * Note: this inventory should only be accessed and modified on the server thread. * * @return This turtle's inventory - * @see #getItemHandler() */ @Nonnull Inventory getInventory(); - /** - * Get the inventory of this turtle as an {@link IItemHandlerModifiable}. - * - * Note: this inventory should only be accessed and modified on the server thread. - * - * @return This turtle's inventory - * @see #getInventory() - * @see IItemHandlerModifiable - * @see net.minecraftforge.items.CapabilityItemHandler#ITEM_HANDLER_CAPABILITY - */ - @Nonnull - IItemHandlerModifiable getItemHandler(); - /** * Determine whether this turtle will require fuel when performing actions. * diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java index a11ac4a87..44b6ff826 100644 --- a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java @@ -8,17 +8,11 @@ package dan200.computercraft.api.turtle; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.api.turtle.event.TurtleAttackEvent; -import dan200.computercraft.api.turtle.event.TurtleBlockEvent; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.world.BlockEvent; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -96,9 +90,6 @@ public interface ITurtleUpgrade * Will only be called for Tool turtle. Called when turtle.dig() or turtle.attack() is called * by the turtle, and the tool is required to do some work. * - * Conforming implementations should fire {@link BlockEvent.BreakEvent} and {@link TurtleBlockEvent.Dig} for - * digging, {@link AttackEntityEvent} and {@link TurtleAttackEvent} for attacking. - * * @param turtle Access to the turtle that the tool resides on. * @param side Which side of the turtle (left or right) the tool resides on. * @param verb Which action (dig or attack) the turtle is being called on to perform. @@ -119,10 +110,6 @@ public interface ITurtleUpgrade /** * Called to obtain the model to be used when rendering a turtle peripheral. * - * This can be obtained from {@link net.minecraft.client.renderer.ItemModelMesher#getItemModel(ItemStack)}, - * {@link net.minecraft.client.renderer.model.ModelManager#getModel(ModelResourceLocation)} or any other - * source. - * * @param turtle Access to the turtle that the upgrade resides on. This will be null when getting item models! * @param side Which side of the turtle (left or right) the upgrade resides on. * @return The model that you wish to be used to render your upgrade. diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleActionEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleActionEvent.java index 2f95cbb87..86a77d258 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleActionEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleActionEvent.java @@ -7,7 +7,6 @@ package dan200.computercraft.api.turtle.event; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleCommandResult; -import net.minecraftforge.eventbus.api.Cancelable; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -16,11 +15,11 @@ import java.util.Objects; /** * An event fired when a turtle is performing a known action. */ -@Cancelable public class TurtleActionEvent extends TurtleEvent { private final TurtleAction action; private String failureMessage; + private boolean cancelled = false; public TurtleActionEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action ) { @@ -44,7 +43,6 @@ public class TurtleActionEvent extends TurtleEvent * @see TurtleCommandResult#failure() * @deprecated Use {@link #setCanceled(boolean, String)} instead. */ - @Override @Deprecated public void setCanceled( boolean cancel ) { @@ -62,7 +60,7 @@ public class TurtleActionEvent extends TurtleEvent */ public void setCanceled( boolean cancel, @Nullable String failureMessage ) { - super.setCanceled( cancel ); + this.cancelled = true; this.failureMessage = cancel ? failureMessage : null; } @@ -78,4 +76,8 @@ public class TurtleActionEvent extends TurtleEvent { return failureMessage; } + + public boolean isCancelled() { + return cancelled; + } } diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java index a7a79fcbe..2e5844141 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java @@ -5,13 +5,8 @@ */ package dan200.computercraft.api.turtle.event; -import dan200.computercraft.api.turtle.ITurtleAccess; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.api.turtle.TurtleSide; -import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.api.turtle.*; import net.minecraft.entity.Entity; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.event.entity.player.AttackEntityEvent; import javax.annotation.Nonnull; import java.util.Objects; @@ -19,11 +14,6 @@ import java.util.Objects; /** * Fired when a turtle attempts to attack an entity. * - * This must be fired by {@link ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)}, - * as the base {@code turtle.attack()} command does not fire it. - * - * Note that such commands should also fire {@link AttackEntityEvent}, so you do not need to listen to both. - * * @see TurtleAction#ATTACK */ public class TurtleAttackEvent extends TurtlePlayerEvent @@ -32,7 +22,7 @@ public class TurtleAttackEvent extends TurtlePlayerEvent private final ITurtleUpgrade upgrade; private final TurtleSide side; - public TurtleAttackEvent( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side ) + public TurtleAttackEvent(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side ) { super( turtle, TurtleAction.ATTACK, player ); Objects.requireNonNull( target, "target cannot be null" ); diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java index 1fd67187d..37d85e9ab 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java @@ -6,16 +6,11 @@ package dan200.computercraft.api.turtle.event; import dan200.computercraft.api.lua.MethodResult; -import dan200.computercraft.api.turtle.ITurtleAccess; -import dan200.computercraft.api.turtle.ITurtleUpgrade; -import dan200.computercraft.api.turtle.TurtleSide; -import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.api.turtle.*; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.event.world.BlockEvent; import javax.annotation.Nonnull; import java.util.Map; @@ -38,7 +33,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent private final World world; private final BlockPos pos; - protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos ) + protected TurtleBlockEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos ) { super( turtle, action, player ); @@ -72,11 +67,6 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent /** * Fired when a turtle attempts to dig a block. * - * This must be fired by {@link ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)}, - * as the base {@code turtle.dig()} command does not fire it. - * - * Note that such commands should also fire {@link BlockEvent.BreakEvent}, so you do not need to listen to both. - * * @see TurtleAction#DIG */ public static class Dig extends TurtleBlockEvent diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleEvent.java index 1a980db85..a7178ff70 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleEvent.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.api.turtle.event; +import com.google.common.eventbus.EventBus; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraftforge.eventbus.api.Event; import javax.annotation.Nonnull; import java.util.Objects; @@ -19,24 +19,30 @@ import java.util.Objects; * * @see TurtleActionEvent */ -public abstract class TurtleEvent extends Event +public abstract class TurtleEvent { + public static final EventBus EVENT_BUS = new EventBus(); + private final ITurtleAccess turtle; - protected TurtleEvent( @Nonnull ITurtleAccess turtle ) - { - Objects.requireNonNull( turtle, "turtle cannot be null" ); + protected TurtleEvent(@Nonnull ITurtleAccess turtle) { + Objects.requireNonNull(turtle, "turtle cannot be null"); this.turtle = turtle; } + public static boolean post(TurtleActionEvent event) { + EVENT_BUS.post(event); + return event.isCancelled(); + } + /** * Get the turtle which is performing this action. * * @return The access for this turtle. */ @Nonnull - public ITurtleAccess getTurtle() - { - return turtle; + public ITurtleAccess getTurtle() { + return this.turtle; } + } diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java index f01436f6b..e685cd9a1 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java @@ -5,12 +5,12 @@ */ package dan200.computercraft.api.turtle.event; +import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.ITurtleAccess; +import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -21,9 +21,9 @@ import java.util.Objects; */ public abstract class TurtleInventoryEvent extends TurtleBlockEvent { - private final IItemHandler handler; + private final Inventory handler; - protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler handler ) + protected TurtleInventoryEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler ) { super( turtle, action, player, world, pos ); this.handler = handler; @@ -35,7 +35,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent * @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world. */ @Nullable - public IItemHandler getItemHandler() + public Inventory getItemHandler() { return handler; } @@ -47,7 +47,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent */ public static class Suck extends TurtleInventoryEvent { - public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler handler ) + public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler ) { super( turtle, TurtleAction.SUCK, player, world, pos, handler ); } @@ -62,7 +62,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent { private final ItemStack stack; - public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler handler, @Nonnull ItemStack stack ) + public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler, @Nonnull ItemStack stack ) { super( turtle, TurtleAction.DROP, player, world, pos, handler ); diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtlePlayerEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtlePlayerEvent.java index 476221171..ba8e75385 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtlePlayerEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtlePlayerEvent.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.api.turtle.event; +import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraftforge.common.util.FakePlayer; import javax.annotation.Nonnull; import java.util.Objects; diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java index 31f17679a..a47f739a7 100644 --- a/src/main/java/dan200/computercraft/client/ClientRegistry.java +++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java @@ -5,6 +5,7 @@ */ package dan200.computercraft.client; +import com.sun.org.apache.xpath.internal.operations.Mod; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.render.TurtleModelLoader; import dan200.computercraft.shared.Registry; @@ -13,29 +14,26 @@ 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.SpriteAtlasTexture; import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.resource.ResourceManager; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.ColorHandlerEvent; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.event.TextureStitchEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.client.model.ModelLoaderRegistry; -import net.minecraftforge.client.model.SimpleModelTransform; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; import java.util.HashSet; import java.util.Map; +import java.util.function.Consumer; /** * Registers textures and models for items. */ -@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD ) public final class ClientRegistry { private static final String[] EXTRA_MODELS = new String[] { @@ -69,42 +67,50 @@ public final class ClientRegistry private ClientRegistry() {} - @SubscribeEvent - public static void registerModels( ModelRegistryEvent event ) - { - ModelLoaderRegistry.registerLoader( new Identifier( ComputerCraft.MOD_ID, "turtle" ), TurtleModelLoader.INSTANCE ); - } - - @SubscribeEvent - public static void onTextureStitchEvent( TextureStitchEvent.Pre event ) - { - if( !event.getMap().getId().equals( PlayerScreenHandler.BLOCK_ATLAS_TEXTURE ) ) return; - - for( String extra : EXTRA_TEXTURES ) - { - event.addSprite( new Identifier( ComputerCraft.MOD_ID, extra ) ); + public static void onTextureStitchEvent(SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry) { + for (String extra : EXTRA_TEXTURES) { + registry.register(new Identifier(ComputerCraft.MOD_ID, extra)); } } - @SubscribeEvent - public static void onModelBakeEvent( ModelBakeEvent event ) - { - // Load all extra models - ModelLoader loader = event.getModelLoader(); - Map registry = event.getModelRegistry(); + public static void onModelBakeEvent(ResourceManager manager, Consumer out) { + for (String model : EXTRA_MODELS) { + out.accept(new ModelIdentifier(new Identifier(ComputerCraft.MOD_ID, model), "inventory")); + } + } - for( String modelName : EXTRA_MODELS ) - { - Identifier location = new Identifier( ComputerCraft.MOD_ID, "item/" + modelName ); - UnbakedModel model = loader.getOrLoadModel( location ); - model.getTextureDependencies( loader::getOrLoadModel, new HashSet<>() ); + public static void onItemColours() { + ColorProviderRegistry.ITEM.register((stack, layer) -> { + return layer == 1 ? ((ItemDisk) stack.getItem()).getColour(stack) : 0xFFFFFF, Registry.ModItems.DISK); + }); - BakedModel baked = model.bake( loader, ModelLoader.defaultTextureGetter(), SimpleModelTransform.IDENTITY, location ); - if( baked != null ) - { - registry.put( new ModelIdentifier( new Identifier( ComputerCraft.MOD_ID, modelName ), "inventory" ), baked ); + 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; + } } - } + }, 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, + ComputerCraft.Blocks.turtleNormal, + ComputerCraft.Blocks.turtleAdvanced); + } + + private static BakedModel bake(ModelLoader loader, UnbakedModel model) { + 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); } @SubscribeEvent diff --git a/src/main/java/dan200/computercraft/shared/Registry.java b/src/main/java/dan200/computercraft/shared/Registry.java index 7c5564c1c..0c2250b3e 100644 --- a/src/main/java/dan200/computercraft/shared/Registry.java +++ b/src/main/java/dan200/computercraft/shared/Registry.java @@ -69,6 +69,7 @@ import net.minecraft.item.Items; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.MutableRegistry; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -90,256 +91,221 @@ public final class Registry { } - public static final class ModBlocks - { - static final DeferredRegister BLOCKS = DeferredRegister.create( ForgeRegistries.BLOCKS, ComputerCraft.MOD_ID ); + public static void registerBlocks(MutableRegistry registry) { + // Computers + ComputerCraft.Blocks.computerNormal = new BlockComputer(FabricBlockSettings.of(Material.STONE) + .hardness(2.0f) + .build(), ComputerFamily.NORMAL, TileComputer.FACTORY_NORMAL); - private static Block.Properties properties() - { - return Block.Properties.of( Material.STONE ).strength( 2 ); - } + ComputerCraft.Blocks.computerAdvanced = new BlockComputer(FabricBlockSettings.of(Material.STONE) + .hardness(2.0f) + .build(), ComputerFamily.Advanced, TileComputer.FACTORY_ADVANCED); - private static Block.Properties turtleProperties() - { - return Block.Properties.of( Material.STONE ).strength( 2.5f ); - } + ComputerCraft.Blocks.computerCommand = new BlockComputer(FabricBlockSettings.of(Material.STONE) + .strength(-1, 6000000.0F) + .build(), ComputerFamily.Command, TileCommandComputer.FACTORY); - private static Block.Properties modemProperties() - { - return Block.Properties.of( Material.STONE ).strength( 1.5f ); - } + registry.add(new Identifier(ComputerCraft.MOD_ID, "computer_normal"), ComputerCraft.Blocks.computerNormal); + registry.add(new Identifier(ComputerCraft.MOD_ID, "computer_advanced"), ComputerCraft.Blocks.computerAdvanced); + registry.add(new Identifier(ComputerCraft.MOD_ID, "computer_command"), ComputerCraft.Blocks.computerCommand); - public static final RegistryObject COMPUTER_NORMAL = BLOCKS.register( "computer_normal", - () -> new BlockComputer( properties(), ComputerFamily.NORMAL, ModTiles.COMPUTER_NORMAL ) ); - public static final RegistryObject COMPUTER_ADVANCED = BLOCKS.register( "computer_advanced", - () -> new BlockComputer( properties(), ComputerFamily.ADVANCED, ModTiles.COMPUTER_ADVANCED ) ); + // Turtles + ComputerCraft.Blocks.turtleNormal = new BlockTurtle(FabricBlockSettings.of(Material.STONE) + .hardness(2.5f) + .build(), ComputerFamily.Normal, TileTurtle.FACTORY_NORMAL); - public static final RegistryObject COMPUTER_COMMAND = BLOCKS.register( "computer_command", () -> new BlockComputer( - Block.Properties.of( Material.STONE ).strength( -1, 6000000.0F ), - ComputerFamily.COMMAND, ModTiles.COMPUTER_COMMAND - ) ); + ComputerCraft.Blocks.turtleAdvanced = new BlockTurtle(FabricBlockSettings.of(Material.STONE) + .hardness(2.5f) + .build(), ComputerFamily.Advanced, TileTurtle.FACTORY_ADVANCED); - public static final RegistryObject TURTLE_NORMAL = BLOCKS.register( "turtle_normal", - () -> new BlockTurtle( turtleProperties(), ComputerFamily.NORMAL, ModTiles.TURTLE_NORMAL ) ); - public static final RegistryObject TURTLE_ADVANCED = BLOCKS.register( "turtle_advanced", - () -> new BlockTurtle( turtleProperties(), ComputerFamily.ADVANCED, ModTiles.TURTLE_ADVANCED ) ); + registry.add(new Identifier(ComputerCraft.MOD_ID, "turtle_normal"), ComputerCraft.Blocks.turtleNormal); + registry.add(new Identifier(ComputerCraft.MOD_ID, "turtle_advanced"), ComputerCraft.Blocks.turtleAdvanced); - public static final RegistryObject SPEAKER = BLOCKS.register( "speaker", () -> new BlockSpeaker( properties() ) ); - public static final RegistryObject DISK_DRIVE = BLOCKS.register( "disk_drive", () -> new BlockDiskDrive( properties() ) ); - public static final RegistryObject PRINTER = BLOCKS.register( "printer", () -> new BlockPrinter( properties() ) ); + // Peripherals + ComputerCraft.Blocks.speaker = new BlockSpeaker(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build()); - public static final RegistryObject MONITOR_NORMAL = BLOCKS.register( "monitor_normal", - () -> new BlockMonitor( properties(), ModTiles.MONITOR_NORMAL ) ); - public static final RegistryObject MONITOR_ADVANCED = BLOCKS.register( "monitor_advanced", - () -> new BlockMonitor( properties(), ModTiles.MONITOR_ADVANCED ) ); + ComputerCraft.Blocks.diskDrive = new BlockDiskDrive(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build()); - public static final RegistryObject WIRELESS_MODEM_NORMAL = BLOCKS.register( "wireless_modem_normal", - () -> new BlockWirelessModem( properties(), ModTiles.WIRELESS_MODEM_NORMAL ) ); - public static final RegistryObject WIRELESS_MODEM_ADVANCED = BLOCKS.register( "wireless_modem_advanced", - () -> new BlockWirelessModem( properties(), ModTiles.WIRELESS_MODEM_ADVANCED ) ); + ComputerCraft.Blocks.monitorNormal = new BlockMonitor(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build(), TileMonitor.FACTORY_NORMAL); - public static final RegistryObject WIRED_MODEM_FULL = BLOCKS.register( "wired_modem_full", - () -> new BlockWiredModemFull( modemProperties() ) ); - public static final RegistryObject CABLE = BLOCKS.register( "cable", () -> new BlockCable( modemProperties() ) ); + ComputerCraft.Blocks.monitorAdvanced = new BlockMonitor(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build(), TileMonitor.FACTORY_ADVANCED); + + ComputerCraft.Blocks.printer = new BlockPrinter(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build()); + + ComputerCraft.Blocks.wirelessModemNormal = new BlockWirelessModem(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build(), TileWirelessModem.FACTORY_NORMAL); + + ComputerCraft.Blocks.wirelessModemAdvanced = new BlockWirelessModem(FabricBlockSettings.of(Material.STONE) + .hardness(2) + .build(), TileWirelessModem.FACTORY_ADVANCED); + + ComputerCraft.Blocks.wiredModemFull = new BlockWiredModemFull(FabricBlockSettings.of(Material.STONE) + .hardness(1.5f) + .build()); + + ComputerCraft.Blocks.cable = new BlockCable(FabricBlockSettings.of(Material.STONE) + .hardness(1.5f) + .build()); + + registry.add(new Identifier(ComputerCraft.MOD_ID, "speaker"), ComputerCraft.Blocks.speaker); + registry.add(new Identifier(ComputerCraft.MOD_ID, "disk_drive"), ComputerCraft.Blocks.diskDrive); + registry.add(new Identifier(ComputerCraft.MOD_ID, "monitor_normal"), ComputerCraft.Blocks.monitorNormal); + registry.add(new Identifier(ComputerCraft.MOD_ID, "monitor_advanced"), ComputerCraft.Blocks.monitorAdvanced); + registry.add(new Identifier(ComputerCraft.MOD_ID, "printer"), ComputerCraft.Blocks.printer); + registry.add(new Identifier(ComputerCraft.MOD_ID, "wireless_modem_normal"), ComputerCraft.Blocks.wirelessModemNormal); + registry.add(new Identifier(ComputerCraft.MOD_ID, "wireless_modem_advanced"), ComputerCraft.Blocks.wirelessModemAdvanced); + registry.add(new Identifier(ComputerCraft.MOD_ID, "wired_modem_full"), ComputerCraft.Blocks.wiredModemFull); + registry.add(new Identifier(ComputerCraft.MOD_ID, "cable"), ComputerCraft.Blocks.cable); } - public static class ModTiles - { - static final DeferredRegister> TILES = DeferredRegister.create( ForgeRegistries.TILE_ENTITIES, ComputerCraft.MOD_ID ); + public static void registerTileEntities(MutableRegistry> registry) { + // Computers + registry.add(TileComputer.FACTORY_NORMAL.getId(), TileComputer.FACTORY_NORMAL); + registry.add(TileComputer.FACTORY_ADVANCED.getId(), TileComputer.FACTORY_ADVANCED); + registry.add(TileCommandComputer.FACTORY.getId(), TileCommandComputer.FACTORY); - private static RegistryObject> ofBlock( RegistryObject block, Function, T> factory ) - { - return TILES.register( block.getId().getPath(), () -> FixedPointTileEntityType.create( block, factory ) ); - } + // Turtles + registry.add(TileTurtle.FACTORY_NORMAL.getId(), TileTurtle.FACTORY_NORMAL); + registry.add(TileTurtle.FACTORY_ADVANCED.getId(), TileTurtle.FACTORY_ADVANCED); - public static final RegistryObject> MONITOR_NORMAL = - ofBlock( ModBlocks.MONITOR_NORMAL, f -> new TileMonitor( f, false ) ); - public static final RegistryObject> MONITOR_ADVANCED = - ofBlock( ModBlocks.MONITOR_ADVANCED, f -> new TileMonitor( f, true ) ); + // Peripherals + registry.add(TileSpeaker.FACTORY.getId(), TileSpeaker.FACTORY); + registry.add(TileDiskDrive.FACTORY.getId(), TileDiskDrive.FACTORY); + registry.add(TilePrinter.FACTORY.getId(), TilePrinter.FACTORY); - public static final RegistryObject> COMPUTER_NORMAL = - ofBlock( ModBlocks.COMPUTER_NORMAL, f -> new TileComputer( ComputerFamily.NORMAL, f ) ); - public static final RegistryObject> COMPUTER_ADVANCED = - ofBlock( ModBlocks.COMPUTER_ADVANCED, f -> new TileComputer( ComputerFamily.ADVANCED, f ) ); - public static final RegistryObject> COMPUTER_COMMAND = - ofBlock( ModBlocks.COMPUTER_COMMAND, f -> new TileCommandComputer( ComputerFamily.COMMAND, f ) ); + registry.add(TileMonitor.FACTORY_NORMAL.getId(), TileMonitor.FACTORY_NORMAL); + registry.add(TileMonitor.FACTORY_ADVANCED.getId(), TileMonitor.FACTORY_ADVANCED); - public static final RegistryObject> TURTLE_NORMAL = - ofBlock( ModBlocks.TURTLE_NORMAL, f -> new TileTurtle( f, ComputerFamily.NORMAL ) ); - public static final RegistryObject> TURTLE_ADVANCED = - ofBlock( ModBlocks.TURTLE_ADVANCED, f -> new TileTurtle( f, ComputerFamily.ADVANCED ) ); - - public static final RegistryObject> SPEAKER = ofBlock( ModBlocks.SPEAKER, TileSpeaker::new ); - public static final RegistryObject> DISK_DRIVE = ofBlock( ModBlocks.DISK_DRIVE, TileDiskDrive::new ); - public static final RegistryObject> PRINTER = ofBlock( ModBlocks.PRINTER, TilePrinter::new ); - public static final RegistryObject> WIRED_MODEM_FULL = ofBlock( ModBlocks.WIRED_MODEM_FULL, TileWiredModemFull::new ); - public static final RegistryObject> CABLE = ofBlock( ModBlocks.CABLE, TileCable::new ); - - public static final RegistryObject> WIRELESS_MODEM_NORMAL = - ofBlock( ModBlocks.WIRELESS_MODEM_NORMAL, f -> new TileWirelessModem( f, false ) ); - public static final RegistryObject> WIRELESS_MODEM_ADVANCED = - ofBlock( ModBlocks.WIRELESS_MODEM_ADVANCED, f -> new TileWirelessModem( f, true ) ); + registry.add(TileWirelessModem.FACTORY_NORMAL.getId(), TileWirelessModem.FACTORY_NORMAL); + registry.add(TileWirelessModem.FACTORY_ADVANCED.getId(), TileWirelessModem.FACTORY_ADVANCED); + registry.add(TileCable.FACTORY.getId(), TileCable.FACTORY); + registry.add(TileWiredModemFull.FACTORY.getId(), TileWiredModemFull.FACTORY); } - public static final class ModItems - { - static final DeferredRegister ITEMS = DeferredRegister.create( ForgeRegistries.ITEMS, ComputerCraft.MOD_ID ); + public static void registerItems(MutableRegistry registry) { + // Computer + ComputerCraft.Items.computerNormal = new ItemComputer(ComputerCraft.Blocks.computerNormal, defaultItem()); + ComputerCraft.Items.computerAdvanced = new ItemComputer(ComputerCraft.Blocks.computerAdvanced, defaultItem()); + ComputerCraft.Items.computerCommand = new ItemComputer(ComputerCraft.Blocks.computerCommand, defaultItem()); - private static Item.Settings properties() - { - return new Item.Settings().group( mainItemGroup ); - } + registerItemBlock(registry, ComputerCraft.Items.computerNormal); + registerItemBlock(registry, ComputerCraft.Items.computerAdvanced); + registerItemBlock(registry, ComputerCraft.Items.computerCommand); - private static RegistryObject ofBlock( RegistryObject parent, BiFunction supplier ) - { - return ITEMS.register( parent.getId().getPath(), () -> supplier.apply( parent.get(), properties() ) ); - } + // Turtle + ComputerCraft.Items.turtleNormal = new ItemTurtle(ComputerCraft.Blocks.turtleNormal, defaultItem()); + ComputerCraft.Items.turtleAdvanced = new ItemTurtle(ComputerCraft.Blocks.turtleAdvanced, defaultItem()); - public static final RegistryObject COMPUTER_NORMAL = ofBlock( ModBlocks.COMPUTER_NORMAL, ItemComputer::new ); - public static final RegistryObject COMPUTER_ADVANCED = ofBlock( ModBlocks.COMPUTER_ADVANCED, ItemComputer::new ); - public static final RegistryObject COMPUTER_COMMAND = ofBlock( ModBlocks.COMPUTER_COMMAND, ItemComputer::new ); + registerItemBlock(registry, ComputerCraft.Items.turtleNormal); + registerItemBlock(registry, ComputerCraft.Items.turtleAdvanced); - public static final RegistryObject POCKET_COMPUTER_NORMAL = ITEMS.register( "pocket_computer_normal", - () -> new ItemPocketComputer( properties().maxCount( 1 ), ComputerFamily.NORMAL ) ); - public static final RegistryObject POCKET_COMPUTER_ADVANCED = ITEMS.register( "pocket_computer_advanced", - () -> new ItemPocketComputer( properties().maxCount( 1 ), ComputerFamily.ADVANCED ) ); + // Pocket computer + ComputerCraft.Items.pocketComputerNormal = new ItemPocketComputer(defaultItem().maxCount(1), ComputerFamily.Normal); + ComputerCraft.Items.pocketComputerAdvanced = new ItemPocketComputer(defaultItem().maxCount(1), ComputerFamily.Advanced); - public static final RegistryObject TURTLE_NORMAL = ofBlock( ModBlocks.TURTLE_NORMAL, ItemTurtle::new ); - public static final RegistryObject TURTLE_ADVANCED = ofBlock( ModBlocks.TURTLE_ADVANCED, ItemTurtle::new ); + registry.add(new Identifier(ComputerCraft.MOD_ID, "pocket_computer_normal"), ComputerCraft.Items.pocketComputerNormal); + registry.add(new Identifier(ComputerCraft.MOD_ID, "pocket_computer_advanced"), ComputerCraft.Items.pocketComputerAdvanced); - public static final RegistryObject DISK = - ITEMS.register( "disk", () -> new ItemDisk( properties().maxCount( 1 ) ) ); - public static final RegistryObject TREASURE_DISK = - ITEMS.register( "treasure_disk", () -> new ItemTreasureDisk( properties().maxCount( 1 ) ) ); + // Floppy disk + ComputerCraft.Items.disk = new ItemDisk(defaultItem().maxCount(1)); + ComputerCraft.Items.treasureDisk = new ItemTreasureDisk(defaultItem().maxCount(1)); - public static final RegistryObject PRINTED_PAGE = ITEMS.register( "printed_page", - () -> new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.PAGE ) ); - public static final RegistryObject PRINTED_PAGES = ITEMS.register( "printed_pages", - () -> new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.PAGES ) ); - public static final RegistryObject PRINTED_BOOK = ITEMS.register( "printed_book", - () -> new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.BOOK ) ); + registry.add(new Identifier(ComputerCraft.MOD_ID, "disk"), ComputerCraft.Items.disk); + registry.add(new Identifier(ComputerCraft.MOD_ID, "treasure_disk"), ComputerCraft.Items.treasureDisk); - public static final RegistryObject SPEAKER = ofBlock( ModBlocks.SPEAKER, BlockItem::new ); - public static final RegistryObject DISK_DRIVE = ofBlock( ModBlocks.DISK_DRIVE, BlockItem::new ); - public static final RegistryObject PRINTER = ofBlock( ModBlocks.PRINTER, BlockItem::new ); - public static final RegistryObject MONITOR_NORMAL = ofBlock( ModBlocks.MONITOR_NORMAL, BlockItem::new ); - public static final RegistryObject MONITOR_ADVANCED = ofBlock( ModBlocks.MONITOR_ADVANCED, BlockItem::new ); - public static final RegistryObject WIRELESS_MODEM_NORMAL = ofBlock( ModBlocks.WIRELESS_MODEM_NORMAL, BlockItem::new ); - public static final RegistryObject WIRELESS_MODEM_ADVANCED = ofBlock( ModBlocks.WIRELESS_MODEM_ADVANCED, BlockItem::new ); - public static final RegistryObject WIRED_MODEM_FULL = ofBlock( ModBlocks.WIRED_MODEM_FULL, BlockItem::new ); + // Printouts + ComputerCraft.Items.printedPage = new ItemPrintout(defaultItem().maxCount(1), ItemPrintout.Type.PAGE); + ComputerCraft.Items.printedPages = new ItemPrintout(defaultItem().maxCount(1), ItemPrintout.Type.PAGES); + ComputerCraft.Items.printedBook = new ItemPrintout(defaultItem().maxCount(1), ItemPrintout.Type.BOOK); - public static final RegistryObject CABLE = ITEMS.register( "cable", - () -> new ItemBlockCable.Cable( ModBlocks.CABLE.get(), properties() ) ); - public static final RegistryObject WIRED_MODEM = ITEMS.register( "wired_modem", - () -> new ItemBlockCable.WiredModem( ModBlocks.CABLE.get(), properties() ) ); - } + registry.add(new Identifier(ComputerCraft.MOD_ID, "printed_page"), ComputerCraft.Items.printedPage); + registry.add(new Identifier(ComputerCraft.MOD_ID, "printed_pages"), ComputerCraft.Items.printedPages); + registry.add(new Identifier(ComputerCraft.MOD_ID, "printed_book"), ComputerCraft.Items.printedBook); + + // Peripherals + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.speaker, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.diskDrive, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.printer, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.monitorNormal, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.monitorAdvanced, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.wirelessModemNormal, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.wirelessModemAdvanced, defaultItem())); + registerItemBlock(registry, new BlockItem(ComputerCraft.Blocks.wiredModemFull, defaultItem())); + + ComputerCraft.Items.cable = new ItemBlockCable.Cable(ComputerCraft.Blocks.cable, defaultItem()); + ComputerCraft.Items.wiredModem = new ItemBlockCable.WiredModem(ComputerCraft.Blocks.cable, defaultItem()); + + registry.add(new Identifier(ComputerCraft.MOD_ID, "cable"), ComputerCraft.Items.cable); + registry.add(new Identifier(ComputerCraft.MOD_ID, "wired_modem"), ComputerCraft.Items.wiredModem); - @SubscribeEvent - public static void registerItems( RegistryEvent.Register event ) - { registerTurtleUpgrades(); registerPocketUpgrades(); } - private static void registerTurtleUpgrades() - { + private static Item.Settings defaultItem() { + return new Item.Settings().group(mainItemGroup); + } + + private static void registerItemBlock(MutableRegistry registry, BlockItem item) { + registry.add(net.minecraft.util.registry.Registry.BLOCK.getId(item.getBlock()), item); + } + + private static void registerTurtleUpgrades() { // Upgrades - ComputerCraft.TurtleUpgrades.wirelessModemNormal = new TurtleModem( false, new Identifier( ComputerCraft.MOD_ID, "wireless_modem_normal" ) ); - TurtleUpgrades.register( ComputerCraft.TurtleUpgrades.wirelessModemNormal ); + ComputerCraft.TurtleUpgrades.wirelessModemNormal = new TurtleModem(false, new Identifier(ComputerCraft.MOD_ID, "wireless_modem_normal")); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.wirelessModemNormal); - ComputerCraft.TurtleUpgrades.wirelessModemAdvanced = new TurtleModem( true, new Identifier( ComputerCraft.MOD_ID, "wireless_modem_advanced" ) ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.wirelessModemAdvanced ); + ComputerCraft.TurtleUpgrades.wirelessModemAdvanced = new TurtleModem(true, new Identifier(ComputerCraft.MOD_ID, "wireless_modem_advanced")); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.wirelessModemAdvanced); - ComputerCraft.TurtleUpgrades.speaker = new TurtleSpeaker( new Identifier( ComputerCraft.MOD_ID, "speaker" ) ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.speaker ); + ComputerCraft.TurtleUpgrades.speaker = new TurtleSpeaker(new Identifier(ComputerCraft.MOD_ID, "speaker")); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.speaker); - ComputerCraft.TurtleUpgrades.craftingTable = new TurtleCraftingTable( new Identifier( "minecraft", "crafting_table" ) ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.craftingTable ); + ComputerCraft.TurtleUpgrades.craftingTable = new TurtleCraftingTable(new Identifier("minecraft", "crafting_table")); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.craftingTable); - ComputerCraft.TurtleUpgrades.diamondSword = new TurtleSword( new Identifier( "minecraft", "diamond_sword" ), Items.DIAMOND_SWORD ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.diamondSword ); + ComputerCraft.TurtleUpgrades.diamondSword = new TurtleSword(new Identifier("minecraft", "diamond_sword"), Items.DIAMOND_SWORD); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.diamondSword); - ComputerCraft.TurtleUpgrades.diamondShovel = new TurtleShovel( new Identifier( "minecraft", "diamond_shovel" ), Items.DIAMOND_SHOVEL ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.diamondShovel ); + ComputerCraft.TurtleUpgrades.diamondShovel = new TurtleShovel(new Identifier("minecraft", "diamond_shovel"), Items.DIAMOND_SHOVEL); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.diamondShovel); - ComputerCraft.TurtleUpgrades.diamondPickaxe = new TurtleTool( new Identifier( "minecraft", "diamond_pickaxe" ), Items.DIAMOND_PICKAXE ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.diamondPickaxe ); + ComputerCraft.TurtleUpgrades.diamondPickaxe = new TurtleTool(new Identifier("minecraft", "diamond_pickaxe"), Items.DIAMOND_PICKAXE); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.diamondPickaxe); - ComputerCraft.TurtleUpgrades.diamondAxe = new TurtleAxe( new Identifier( "minecraft", "diamond_axe" ), Items.DIAMOND_AXE ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.diamondAxe ); + ComputerCraft.TurtleUpgrades.diamondAxe = new TurtleAxe(new Identifier("minecraft", "diamond_axe"), Items.DIAMOND_AXE); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.diamondAxe); - ComputerCraft.TurtleUpgrades.diamondHoe = new TurtleHoe( new Identifier( "minecraft", "diamond_hoe" ), Items.DIAMOND_HOE ); - ComputerCraftAPI.registerTurtleUpgrade( ComputerCraft.TurtleUpgrades.diamondHoe ); + ComputerCraft.TurtleUpgrades.diamondHoe = new TurtleHoe(new Identifier("minecraft", "diamond_hoe"), Items.DIAMOND_HOE); + ComputerCraftAPI.registerTurtleUpgrade(ComputerCraft.TurtleUpgrades.diamondHoe); } - private static void registerPocketUpgrades() - { - ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.wirelessModemNormal = new PocketModem( false ) ); - ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.wirelessModemAdvanced = new PocketModem( true ) ); - ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.speaker = new PocketSpeaker() ); + private static void registerPocketUpgrades() { + ComputerCraftAPI.registerPocketUpgrade(ComputerCraft.PocketUpgrades.wirelessModemNormal = new PocketModem(false)); + ComputerCraftAPI.registerPocketUpgrade(ComputerCraft.PocketUpgrades.wirelessModemAdvanced = new PocketModem(true)); + ComputerCraftAPI.registerPocketUpgrade(ComputerCraft.PocketUpgrades.speaker = new PocketSpeaker()); } - public static class ModEntities - { - static final DeferredRegister> ENTITIES = DeferredRegister.create( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID ); - - public static final RegistryObject> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () -> - EntityType.Builder.create( SpawnGroup.MISC ) - .disableSaving() - .disableSummon() - .setDimensions( 0, 0 ) - .build( ComputerCraft.MOD_ID + ":turtle_player" ) ); - } - - public static class ModContainers - { - static final DeferredRegister> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID ); - - public static final RegistryObject> COMPUTER = CONTAINERS.register( "computer", - () -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) ); - - public static final RegistryObject> POCKET_COMPUTER = CONTAINERS.register( "pocket_computer", - () -> ContainerData.toType( ComputerContainerData::new, ContainerPocketComputer::new ) ); - - public static final RegistryObject> TURTLE = CONTAINERS.register( "turtle", - () -> ContainerData.toType( ComputerContainerData::new, ContainerTurtle::new ) ); - - public static final RegistryObject> DISK_DRIVE = CONTAINERS.register( "disk_drive", - () -> new ScreenHandlerType<>( ContainerDiskDrive::new ) ); - - public static final RegistryObject> PRINTER = CONTAINERS.register( "printer", - () -> new ScreenHandlerType<>( ContainerPrinter::new ) ); - - public static final RegistryObject> PRINTOUT = CONTAINERS.register( "printout", - () -> ContainerData.toType( HeldItemContainerData::new, ContainerHeldItem::createPrintout ) ); - - public static final RegistryObject> VIEW_COMPUTER = CONTAINERS.register( "view_computer", - () -> ContainerData.toType( ViewComputerContainerData::new, ContainerViewComputer::new ) ); - } - - @SubscribeEvent - public static void registerRecipeSerializers( RegistryEvent.Register> event ) - { - event.getRegistry().registerAll( - ColourableRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "colour" ) ), - ComputerUpgradeRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "computer_upgrade" ) ), - PocketComputerUpgradeRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "pocket_computer_upgrade" ) ), - DiskRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "disk" ) ), - PrintoutRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "printout" ) ), - TurtleRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "turtle" ) ), - TurtleUpgradeRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "turtle_upgrade" ) ), - ImpostorShapelessRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "impostor_shapeless" ) ), - ImpostorRecipe.SERIALIZER.setRegistryName( new Identifier( ComputerCraft.MOD_ID, "impostor_shaped" ) ) - ); - } - - public static void setup() - { - IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - ModBlocks.BLOCKS.register( bus ); - ModTiles.TILES.register( bus ); - ModItems.ITEMS.register( bus ); - ModEntities.ENTITIES.register( bus ); - ModContainers.CONTAINERS.register( bus ); + public static void registerRecipes(MutableRegistry> registry) { + registry.add(new Identifier(ComputerCraft.MOD_ID, "colour"), ColourableRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "computer_upgrade"), ComputerUpgradeRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "pocket_computer_upgrade"), PocketComputerUpgradeRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "disk"), DiskRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "printout"), PrintoutRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "turtle"), TurtleRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "turtle_upgrade"), TurtleUpgradeRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "impostor_shaped"), ImpostorRecipe.SERIALIZER); + registry.add(new Identifier(ComputerCraft.MOD_ID, "impostor_shapeless"), ImpostorShapelessRecipe.SERIALIZER); } }