diff --git a/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt b/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt index 73de8bea1..7cb210edf 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/RagiumClient.kt @@ -19,13 +19,17 @@ import hiiragi283.ragium.client.renderer.HTAlchemicalInfuserBlockEntityRenderer import hiiragi283.ragium.client.renderer.HTItemDisplayBlockEntityRenderer import hiiragi283.ragium.client.renderer.HTMetaMachineBlockEntityRenderer import hiiragi283.ragium.client.renderer.HTOblivionCubeEntityRenderer +import hiiragi283.ragium.client.util.getBlockEntity +import hiiragi283.ragium.client.util.getMachineEntity import hiiragi283.ragium.client.util.registerClient import hiiragi283.ragium.client.util.registerClientReceiver import hiiragi283.ragium.common.RagiumContents import hiiragi283.ragium.common.init.* import hiiragi283.ragium.common.machine.HTHeatGeneratorMachineEntity +import hiiragi283.ragium.common.machine.HTProcessorMachineEntity import hiiragi283.ragium.common.network.HTFloatingItemPayload import hiiragi283.ragium.common.network.HTInventoryPayload +import hiiragi283.ragium.common.network.HTMachineRecipePayload import hiiragi283.ragium.common.network.HTOpenBackpackPayload import io.wispforest.accessories.api.AccessoriesCapability import me.shedaniel.rei.api.common.entry.EntryIngredient @@ -154,7 +158,7 @@ object RagiumClient : ClientModInitializer, HTMachineTypeInitializer { ColorProviderRegistry.ITEM.register({ _: ItemStack, _: Int -> fluid.color.rgb }, fluid) } - ColorProviderRegistry.ITEM.register({ stack: ItemStack, tint: Int -> + ColorProviderRegistry.ITEM.register({ stack: ItemStack, _: Int -> stack.get(RagiumComponentTypes.COLOR)?.entityColor ?: -1 }, RagiumContents.Misc.BACKPACK) } @@ -197,14 +201,20 @@ object RagiumClient : ClientModInitializer, HTMachineTypeInitializer { context.client().gameRenderer.showFloatingItem(payload.stack) } + RagiumNetworks.MACHINE_RECIPE.registerClientReceiver { payload: HTMachineRecipePayload, context: ClientPlayNetworking.Context -> + val (pos: BlockPos, recipe: HTMachineRecipe) = payload + (context.getMachineEntity(pos) as? HTProcessorMachineEntity)?.currentRecipe = recipe + RagiumAPI.log { info("Received recipe!") } + } + RagiumNetworks.SET_STACK.registerClientReceiver { payload: HTInventoryPayload.Setter, context: ClientPlayNetworking.Context -> val (pos: BlockPos, slot: Int, stack: ItemStack) = payload - (context.player().world.getBlockEntity(pos) as? Inventory)?.setStack(slot, stack) + (context.getBlockEntity(pos) as? Inventory)?.setStack(slot, stack) } RagiumNetworks.REMOVE_STACK.registerClientReceiver { payload: HTInventoryPayload.Remover, context: ClientPlayNetworking.Context -> val (pos: BlockPos, slot: Int) = payload - (context.player().world.getBlockEntity(pos) as? Inventory)?.removeStack(slot) + (context.getBlockEntity(pos) as? Inventory)?.removeStack(slot) } } @@ -226,7 +236,7 @@ object RagiumClient : ClientModInitializer, HTMachineTypeInitializer { if (!isModLoaded("roughlyenoughitems")) return helper.modify(RagiumMachineTypes.FLUID_DRILL) { - set(INPUT_ENTRIES, { recipe: HTMachineRecipe -> + set(INPUT_ENTRIES) { recipe: HTMachineRecipe -> recipe .get(HTRecipeComponentTypes.BIOME) ?.let { biome: RegistryKey -> @@ -240,17 +250,17 @@ object RagiumClient : ClientModInitializer, HTMachineTypeInitializer { }?.let(EntryIngredient::of) ?.let(::listOf) ?: emptyList() - }) + } } helper.modify(RagiumMachineTypes.MOB_EXTRACTOR) { - set(INPUT_ENTRIES, { recipe: HTMachineRecipe -> + set(INPUT_ENTRIES) { recipe: HTMachineRecipe -> recipe .get(HTRecipeComponentTypes.ENTITY_TYPE) ?.let(SpawnEggItem::forEntity) ?.let(EntryIngredients::of) ?.let(::listOf) ?: emptyList() - }) + } } } } diff --git a/src/client/kotlin/hiiragi283/ragium/client/integration/rei/RagiumREIClient.kt b/src/client/kotlin/hiiragi283/ragium/client/integration/rei/RagiumREIClient.kt index 56a0b4c42..9a6cc85d2 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/integration/rei/RagiumREIClient.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/integration/rei/RagiumREIClient.kt @@ -8,7 +8,6 @@ import hiiragi283.ragium.api.recipe.alchemy.HTInfusionRecipe import hiiragi283.ragium.api.recipe.alchemy.HTTransformRecipe import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe import hiiragi283.ragium.api.trade.HTTradeOfferRegistry -import hiiragi283.ragium.client.gui.HTProcessorScreen import hiiragi283.ragium.client.integration.rei.category.HTAlchemyRecipeCategory import hiiragi283.ragium.client.integration.rei.category.HTMachineRecipeCategory import hiiragi283.ragium.client.integration.rei.category.HTTradeOfferCategory @@ -19,11 +18,9 @@ import hiiragi283.ragium.common.init.RagiumEnchantments import hiiragi283.ragium.common.init.RagiumMachineTypes import hiiragi283.ragium.common.init.RagiumRecipeTypes import hiiragi283.ragium.common.screen.HTProcessorScreenHandler -import me.shedaniel.math.Rectangle import me.shedaniel.rei.api.client.plugins.REIClientPlugin import me.shedaniel.rei.api.client.registry.category.CategoryRegistry import me.shedaniel.rei.api.client.registry.display.DisplayRegistry -import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry import me.shedaniel.rei.api.client.registry.transfer.simple.SimpleTransferHandler import me.shedaniel.rei.api.common.category.CategoryIdentifier @@ -137,14 +134,14 @@ object RagiumREIClient : REIClientPlugin { }*/ } - override fun registerScreens(registry: ScreenRegistry) { + /*override fun registerScreens(registry: ScreenRegistry) { // Machines registry.registerContainerClickArea( Rectangle(5 + 18 * 4, 5 + 18 * 1, 18, 18), HTProcessorScreen::class.java, - *getMachineIds().toTypedArray(), + *getMachineIds().toTypedArray(), ) - } + }*/ @Suppress("UnstableApiUsage") override fun registerTransferHandlers(registry: TransferHandlerRegistry) { diff --git a/src/client/kotlin/hiiragi283/ragium/client/model/HTMachineModel.kt b/src/client/kotlin/hiiragi283/ragium/client/model/HTMachineModel.kt index a70118dc4..1e067b2e5 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/model/HTMachineModel.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/model/HTMachineModel.kt @@ -7,7 +7,6 @@ import hiiragi283.ragium.api.extension.machineTier import hiiragi283.ragium.api.extension.machineType import hiiragi283.ragium.api.machine.HTMachineEntity import hiiragi283.ragium.api.machine.HTMachinePropertyKeys -import hiiragi283.ragium.api.machine.HTMachineTier import hiiragi283.ragium.api.machine.HTMachineType import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter @@ -84,37 +83,27 @@ data object HTMachineModel : UnbakedModel, BakedModel { context: RenderContext, ) { val machineEntity: HTMachineEntity = blockView.getMachineEntity(pos) ?: return - val type: HTMachineType = machineEntity.machineType - val tier: HTMachineTier = machineEntity.tier val frontDir: Direction = blockView.getBlockState(pos).getOrDefault(Properties.HORIZONTAL_FACING, Direction.NORTH) - emitMachineQuads(frontDir, type, tier, machineEntity, context) { - it.emitBlockQuads(blockView, state, pos, randomSupplier, context) - } + emitMachineFront(frontDir, machineEntity.machineType, machineEntity, context) } override fun emitItemQuads(stack: ItemStack, randomSupplier: Supplier, context: RenderContext) { - emitMachineQuads(Direction.NORTH, stack.machineType, stack.machineTier, null, context) { - it.emitItemQuads(stack, randomSupplier, context) - } + MinecraftClient + .getInstance() + .bakedModelManager + .getModel(ModelIdentifier(stack.machineTier.getHull().id, "")) + .emitItemQuads(stack, randomSupplier, context) + emitMachineFront(Direction.NORTH, stack.machineType, null, context) } @JvmStatic - private fun emitMachineQuads( + private fun emitMachineFront( frontDir: Direction, type: HTMachineType, - tier: HTMachineTier, machine: HTMachineEntity?, context: RenderContext, - hullRenderer: (BakedModel) -> Unit, ) { - // render hull model - MinecraftClient - .getInstance() - .bakedModelManager - .getModel(ModelIdentifier(tier.getHull().id, "")) - ?.apply(hullRenderer) - // render machine front val frontId = SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, type.getFrontTex(machine)) this.frontSprite = this.textureGetter.apply(frontId) val emitter: QuadEmitter = context.emitter diff --git a/src/client/kotlin/hiiragi283/ragium/client/renderer/HTMetaMachineBlockEntityRenderer.kt b/src/client/kotlin/hiiragi283/ragium/client/renderer/HTMetaMachineBlockEntityRenderer.kt index 4e6cc2a58..0343fc266 100644 --- a/src/client/kotlin/hiiragi283/ragium/client/renderer/HTMetaMachineBlockEntityRenderer.kt +++ b/src/client/kotlin/hiiragi283/ragium/client/renderer/HTMetaMachineBlockEntityRenderer.kt @@ -1,15 +1,22 @@ package hiiragi283.ragium.client.renderer import hiiragi283.ragium.api.extension.getOrNull +import hiiragi283.ragium.api.machine.HTMachineTier +import hiiragi283.ragium.api.machine.HTMachineType import hiiragi283.ragium.api.machine.multiblock.HTMultiblockController import hiiragi283.ragium.client.util.renderMultiblock import hiiragi283.ragium.common.block.entity.HTMetaMachineBlockEntity import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.block.BlockState +import net.minecraft.client.MinecraftClient +import net.minecraft.client.render.RenderLayers import net.minecraft.client.render.VertexConsumerProvider import net.minecraft.client.render.block.entity.BlockEntityRenderer import net.minecraft.client.util.math.MatrixStack import net.minecraft.state.property.Properties +import net.minecraft.util.math.random.Random +import net.minecraft.world.World @Environment(EnvType.CLIENT) object HTMetaMachineBlockEntityRenderer : BlockEntityRenderer { @@ -21,10 +28,24 @@ object HTMetaMachineBlockEntityRenderer : BlockEntityRenderer CustomPayload.Id.registerClientReceiver( } } +val ClientPlayNetworking.Context.world: ClientWorld? + get() = client().world + +fun ClientPlayNetworking.Context.getBlockEntity(pos: BlockPos): BlockEntity? = world?.getBlockEntity(pos) + +fun ClientPlayNetworking.Context.getMachineEntity(pos: BlockPos): HTMachineEntity? = world?.getMachineEntity(pos) + // HTFluidContent // fun HTFluidContent.registerClient(stillTex: Identifier, flowingTex: Identifier = stillTex, color: Int = -1) { diff --git a/src/client/kotlin/hiiragi283/ragium/data/RagiumLangProviders.kt b/src/client/kotlin/hiiragi283/ragium/data/RagiumLangProviders.kt index 03216f6f0..47f8763f5 100644 --- a/src/client/kotlin/hiiragi283/ragium/data/RagiumLangProviders.kt +++ b/src/client/kotlin/hiiragi283/ragium/data/RagiumLangProviders.kt @@ -192,6 +192,7 @@ object RagiumLangProviders { builder.add(RagiumContents.Misc.REMOVER_DYNAMITE, "Remover Dynamite") builder.add(RagiumContents.Misc.SOAP_INGOT, "Soap Ingot") builder.add(RagiumContents.Misc.SOLAR_PANEL, "Solar Panel") + builder.add(RagiumContents.Misc.TRADER_CATALOG, "Trader Catalog") builder.add(HTCrafterHammerItem.Behavior.DEFAULT, "Hammer Module (Default)") builder.add(HTCrafterHammerItem.Behavior.AXE, "Hammer Module (Axe)") @@ -333,6 +334,7 @@ object RagiumLangProviders { builder.add(RagiumContents.Misc.REMOVER_DYNAMITE, "削除用ダイナマイト") builder.add(RagiumContents.Misc.SOAP_INGOT, "石鹸インゴット") builder.add(RagiumContents.Misc.SOLAR_PANEL, "太陽光パネル") + builder.add(RagiumContents.Misc.TRADER_CATALOG, "行商人カタログ") builder.add(HTCrafterHammerItem.Behavior.DEFAULT, "ハンマーモジュール(デフォルト)") builder.add(HTCrafterHammerItem.Behavior.AXE, "ハンマーモジュール(アックス)") diff --git a/src/main/generated/assets/ragium/lang/en_us.json b/src/main/generated/assets/ragium/lang/en_us.json index 998271e7a..3a7bc314e 100644 --- a/src/main/generated/assets/ragium/lang/en_us.json +++ b/src/main/generated/assets/ragium/lang/en_us.json @@ -254,6 +254,7 @@ "item.ragium.sweet_berries_fluid_cube": "Fluid Cube (Sweet Berries)", "item.ragium.sweet_potato": "Sweet Potato", "item.ragium.tallow_fluid_cube": "Fluid Cube (Tallow)", + "item.ragium.trader_catalog": "Trader Catalog", "item.ragium.trinitrotoluene_fluid_cube": "Fluid Cube (Trinitrotoluene)", "item.ragium.water_fluid_cube": "Fluid Cube (Water)", "itemGroup.ragium.item": "Ragium - Items", diff --git a/src/main/generated/assets/ragium/lang/ja_jp.json b/src/main/generated/assets/ragium/lang/ja_jp.json index d2206b0f4..17b774ba8 100644 --- a/src/main/generated/assets/ragium/lang/ja_jp.json +++ b/src/main/generated/assets/ragium/lang/ja_jp.json @@ -250,6 +250,7 @@ "item.ragium.sweet_berries_fluid_cube": "液体キューブ(スイートベリー)", "item.ragium.sweet_potato": "サツマイモ", "item.ragium.tallow_fluid_cube": "液体キューブ(獣脂)", + "item.ragium.trader_catalog": "行商人カタログ", "item.ragium.trinitrotoluene_fluid_cube": "液体キューブ(トリニトロトルエン)", "item.ragium.water_fluid_cube": "液体キューブ(水)", "itemGroup.ragium.item": "Ragium - アイテム", diff --git a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/ethanol_fluid_cube.json b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/ethanol_fluid_cube.json index 62d1e050b..c8cbb5ca0 100644 --- a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/ethanol_fluid_cube.json +++ b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/ethanol_fluid_cube.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ragium:water_fluid_cube" + "items": "ragium:ethylene_fluid_cube" } ] }, @@ -15,7 +15,7 @@ "conditions": { "items": [ { - "items": "ragium:ethylene_fluid_cube" + "items": "ragium:water_fluid_cube" } ] }, diff --git a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/hydrogen_fluid_cube.json b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/hydrogen_fluid_cube.json index f17eedc34..3005dc6e8 100644 --- a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/hydrogen_fluid_cube.json +++ b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/hydrogen_fluid_cube.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ragium:water_fluid_cube" + "items": "ragium:methane_fluid_cube" } ] }, @@ -15,7 +15,7 @@ "conditions": { "items": [ { - "items": "ragium:methane_fluid_cube" + "items": "ragium:water_fluid_cube" } ] }, diff --git a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/nitro_fuel_fluid_cube.json b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/nitro_fuel_fluid_cube.json index 70e2b8380..f9eaa30df 100644 --- a/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/nitro_fuel_fluid_cube.json +++ b/src/main/generated/data/ragium/advancement/recipes/misc/chemical_reactor/nitro_fuel_fluid_cube.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ragium:fuel_fluid_cube" + "items": "#ragium:fluid_cubes/fuel" } ] }, diff --git a/src/main/generated/data/ragium/recipe/chemical_reactor/ethanol_fluid_cube.json b/src/main/generated/data/ragium/recipe/chemical_reactor/ethanol_fluid_cube.json index 20be2ef66..a0332e8e6 100644 --- a/src/main/generated/data/ragium/recipe/chemical_reactor/ethanol_fluid_cube.json +++ b/src/main/generated/data/ragium/recipe/chemical_reactor/ethanol_fluid_cube.json @@ -5,10 +5,10 @@ }, "inputs": [ { - "items": "ragium:water_fluid_cube" + "items": "ragium:ethylene_fluid_cube" }, { - "items": "ragium:ethylene_fluid_cube" + "items": "ragium:water_fluid_cube" } ], "machine_type": "ragium:chemical_reactor", diff --git a/src/main/generated/data/ragium/recipe/chemical_reactor/hydrogen_fluid_cube.json b/src/main/generated/data/ragium/recipe/chemical_reactor/hydrogen_fluid_cube.json index 38de97be5..8ee6b9898 100644 --- a/src/main/generated/data/ragium/recipe/chemical_reactor/hydrogen_fluid_cube.json +++ b/src/main/generated/data/ragium/recipe/chemical_reactor/hydrogen_fluid_cube.json @@ -5,10 +5,10 @@ }, "inputs": [ { - "items": "ragium:water_fluid_cube" + "items": "ragium:methane_fluid_cube" }, { - "items": "ragium:methane_fluid_cube" + "items": "ragium:water_fluid_cube" } ], "machine_type": "ragium:chemical_reactor", diff --git a/src/main/generated/data/ragium/recipe/chemical_reactor/nitro_fuel_fluid_cube.json b/src/main/generated/data/ragium/recipe/chemical_reactor/nitro_fuel_fluid_cube.json index 271341709..525ee87b5 100644 --- a/src/main/generated/data/ragium/recipe/chemical_reactor/nitro_fuel_fluid_cube.json +++ b/src/main/generated/data/ragium/recipe/chemical_reactor/nitro_fuel_fluid_cube.json @@ -3,7 +3,7 @@ "inputs": [ { "count": 4, - "items": "ragium:fuel_fluid_cube" + "items": "#ragium:fluid_cubes/fuel" }, { "items": "ragium:nitric_acid_fluid_cube" diff --git a/src/main/generated/data/ragium/tags/item/fluid_cubes/fuel.json b/src/main/generated/data/ragium/tags/item/fluid_cubes/fuel.json new file mode 100644 index 000000000..bb4168cab --- /dev/null +++ b/src/main/generated/data/ragium/tags/item/fluid_cubes/fuel.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ragium:bio_fuel_fluid_cube", + "ragium:fuel_fluid_cube", + "ragium:aromatic_compounds_fluid_cube" + ] +} \ No newline at end of file diff --git a/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumCodecExtensions.kt b/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumCodecExtensions.kt index bd748cdae..11af0dcbf 100644 --- a/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumCodecExtensions.kt +++ b/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumCodecExtensions.kt @@ -25,6 +25,10 @@ fun BlockEntity.sendPacket(action: (ServerPlayerEntity) -> Unit) { } } +fun World.sendPacket(action: (ServerPlayerEntity) -> Unit) { + (this as? ServerWorld)?.let(PlayerLookup::world)?.firstOrNull()?.let(action) +} + fun World.sendPacketForPlayers(action: (ServerPlayerEntity) -> Unit) { (this as? ServerWorld)?.let(PlayerLookup::world)?.forEach(action) } diff --git a/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumUtils.kt b/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumUtils.kt index 97f9722a6..34a4ba60c 100644 --- a/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumUtils.kt +++ b/src/main/kotlin/hiiragi283/ragium/api/extension/RagiumUtils.kt @@ -2,9 +2,13 @@ package hiiragi283.ragium.api.extension import com.google.common.collect.HashBasedTable import com.mojang.datafixers.util.Either +import hiiragi283.ragium.api.machine.HTMachineTier +import hiiragi283.ragium.api.machine.HTMachineType +import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe import hiiragi283.ragium.api.trade.HTMerchant import hiiragi283.ragium.api.util.HTTable import hiiragi283.ragium.api.util.HTWrappedTable +import hiiragi283.ragium.common.init.RagiumRecipeTypes import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction import net.fabricmc.loader.api.FabricLoader import net.minecraft.entity.EntityType @@ -108,6 +112,16 @@ fun > RecipeManager.getFirstMatch( predicate: (RecipeEntry) -> Boolean, ): RecipeEntry? = listAllOfType(type).firstOrNull(predicate) +fun > RecipeManager.getAllMatches( + type: RecipeType, + predicate: (RecipeEntry) -> Boolean, +): List> = listAllOfType(type).filter(predicate) + +fun RecipeManager.getMachineRecipes(type: HTMachineType, tier: HTMachineTier): List> = + getAllMatches(RagiumRecipeTypes.MACHINE) { entry: RecipeEntry -> + entry.value.let { it.type == type && it.minTier <= tier } + } + // Registry // fun createWrapperLookup(): RegistryWrapper.WrapperLookup = BuiltinRegistries.createWrapperLookup() diff --git a/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachineEntity.kt b/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachineEntity.kt index 7119f3fba..9d296d49f 100644 --- a/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachineEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachineEntity.kt @@ -7,12 +7,13 @@ import hiiragi283.ragium.api.machine.multiblock.HTMultiblockController import hiiragi283.ragium.api.util.HTDynamicPropertyDelegate import hiiragi283.ragium.common.block.entity.HTMetaMachineBlockEntity import io.github.cottonmc.cotton.gui.PropertyDelegateHolder +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory import net.minecraft.block.BlockState import net.minecraft.entity.player.PlayerEntity import net.minecraft.nbt.NbtCompound import net.minecraft.registry.RegistryWrapper -import net.minecraft.screen.NamedScreenHandlerFactory import net.minecraft.screen.PropertyDelegate +import net.minecraft.server.network.ServerPlayerEntity import net.minecraft.text.Text import net.minecraft.util.ActionResult import net.minecraft.util.hit.BlockHitResult @@ -21,13 +22,24 @@ import net.minecraft.world.World abstract class HTMachineEntity(val machineType: HTMachineType, val tier: HTMachineTier) : HTDelegatedInventory.Simple, - NamedScreenHandlerFactory, + ExtendedScreenHandlerFactory, PropertyDelegateHolder { + companion object { + const val MAX_PROPERTIES = 4 + } + constructor(type: HTMachineConvertible, tier: HTMachineTier) : this(type.asMachine(), tier) lateinit var parentBE: HTMetaMachineBlockEntity private set + val world: World? + get() = parentBE.world + val pos: BlockPos + get() = parentBE.pos + val packet: HTMachinePacket + get() = HTMachinePacket(machineType, tier, parentBE.pos) + fun setParentBE(parentBE: HTMetaMachineBlockEntity) { check(parentBE.machineEntity == this) this.parentBE = parentBE @@ -48,6 +60,8 @@ abstract class HTMachineEntity(val machineType: HTMachineType, val tier: HTMachi RagiumAPI.log { info(nbt.toString()) } } + open fun onWorldUpdated(world: World) {} + open fun onUse( state: BlockState, world: World, @@ -73,10 +87,12 @@ abstract class HTMachineEntity(val machineType: HTMachineType, val tier: HTMachi open fun tickSecond(world: World, pos: BlockPos, state: BlockState) {} - // NamedScreenHandlerFactory // + // ExtendedScreenHandlerFactory // override fun getDisplayName(): Text = tier.createPrefixedText(machineType) + override fun getScreenOpeningData(player: ServerPlayerEntity): HTMachinePacket = packet + // PropertyDelegateHolder // var ticks: Int = 0 @@ -84,12 +100,12 @@ abstract class HTMachineEntity(val machineType: HTMachineType, val tier: HTMachi open val tickRate: Int get() = tier.tickRate - override fun getPropertyDelegate(): PropertyDelegate = HTDynamicPropertyDelegate(2, ::getProperty) + override fun getPropertyDelegate(): PropertyDelegate = HTDynamicPropertyDelegate(MAX_PROPERTIES, ::getProperty) protected open fun getProperty(index: Int): Int = when (index) { 0 -> ticks 1 -> tickRate - else -> throw IndexOutOfBoundsException(index) + else -> -1 } // Factory // diff --git a/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachinePacket.kt b/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachinePacket.kt new file mode 100644 index 000000000..add0874d8 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/api/machine/HTMachinePacket.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.api.machine + +import net.minecraft.network.RegistryByteBuf +import net.minecraft.network.codec.PacketCodec +import net.minecraft.util.math.BlockPos + +data class HTMachinePacket(val machineType: HTMachineType, val tier: HTMachineTier, val pos: BlockPos) { + companion object { + @JvmField + val DEFAULT = HTMachinePacket(HTMachineType.DEFAULT, HTMachineTier.PRIMITIVE, BlockPos.ORIGIN) + + @JvmField + val PACKET_CODEC: PacketCodec = PacketCodec.tuple( + HTMachineTypeRegistry.PACKET_CODEC, + HTMachinePacket::machineType, + HTMachineTier.PACKET_CODEC, + HTMachinePacket::tier, + BlockPos.PACKET_CODEC, + HTMachinePacket::pos, + ::HTMachinePacket, + ) + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipe.kt b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipe.kt index aab046a8e..662a40dee 100644 --- a/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipe.kt +++ b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipe.kt @@ -110,8 +110,8 @@ class HTMachineRecipe( // Input // class Input private constructor( - private val currentType: HTMachineType, - private val currentTier: HTMachineTier, + val currentType: HTMachineType, + val currentTier: HTMachineTier, private val first: ItemStack, private val second: ItemStack, private val third: ItemStack, diff --git a/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessor.kt b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessor.kt index fa2f35be8..281223d48 100644 --- a/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessor.kt +++ b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessor.kt @@ -12,6 +12,7 @@ import hiiragi283.ragium.api.recipe.HTRequireScanRecipe import hiiragi283.ragium.api.world.HTDataDriveManager import net.minecraft.item.ItemStack import net.minecraft.recipe.RecipeEntry +import net.minecraft.recipe.RecipeManager import net.minecraft.recipe.RecipeType import net.minecraft.recipe.input.RecipeInput import net.minecraft.util.Identifier @@ -19,11 +20,13 @@ import net.minecraft.util.math.BlockPos import net.minecraft.world.World import kotlin.jvm.optionals.getOrNull -class HTMachineRecipeProcessor>( +class HTMachineRecipeProcessor>( private val inventory: HTSimpleInventory, - private val recipeType: RecipeType, - private val inputFactory: (HTMachineType, HTMachineTier, HTSimpleInventory) -> T, + recipeType: RecipeType, + private val inputFactory: (HTMachineType, HTMachineTier, HTSimpleInventory) -> I, ) { + private val matchGetter: RecipeManager.MatchGetter = RecipeManager.createCachedMatchGetter(recipeType) + fun process( world: World, pos: BlockPos, @@ -42,11 +45,11 @@ class HTMachineRecipeProcessor>( pos: BlockPos, machineType: HTMachineType, tier: HTMachineTier, - ): DataResult { - val recipeEntry: RecipeEntry = world.recipeManager - .getFirstMatch(recipeType, inputFactory(machineType, tier, inventory), world) + ): DataResult { + val recipeEntry: RecipeEntry = matchGetter + .getFirstMatch(inputFactory(machineType, tier, inventory), world) .getOrNull() ?: return DataResult.error { "Could not find matching recipe!" } - val recipe: U = recipeEntry.value + val recipe: T = recipeEntry.value val recipeId: Identifier = recipeEntry.id if (!canAcceptOutputs(recipe)) return DataResult.error { "Could not insert recipe outputs to slots!" } if (!machineType.getOrDefault(HTMachinePropertyKeys.PROCESSOR_CONDITION)(world, pos, machineType, tier)) { @@ -66,7 +69,7 @@ class HTMachineRecipeProcessor>( return DataResult.success(recipe) } - private fun canAcceptOutputs(recipe: U): Boolean { + private fun canAcceptOutputs(recipe: T): Boolean { recipe.outputs.forEachIndexed { index: Int, result: HTRecipeResult -> val stackIn: ItemStack = inventory.getStack(index + 4) if (!result.canAccept(stackIn)) { @@ -76,18 +79,14 @@ class HTMachineRecipeProcessor>( return true } - private fun modifyOutput(slot: Int, recipe: U) { + private fun modifyOutput(slot: Int, recipe: T) { inventory.modifyStack(slot + 4) { stackIn: ItemStack -> recipe.getOutput(slot)?.modifyStack(stackIn) ?: stackIn } } - private fun decrementInput(slot: Int, recipe: U) { + private fun decrementInput(slot: Int, recipe: T) { val delCount: Int = recipe.getInput(slot)?.count ?: return inventory.getStack(slot).count -= delCount } - - // Builder // - - class Builder } diff --git a/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessorNew.kt b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessorNew.kt new file mode 100644 index 000000000..54992f719 --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/api/recipe/machine/HTMachineRecipeProcessorNew.kt @@ -0,0 +1,76 @@ +package hiiragi283.ragium.api.recipe.machine + +import hiiragi283.ragium.api.inventory.HTSimpleInventory +import hiiragi283.ragium.api.machine.HTMachinePropertyKeys +import hiiragi283.ragium.api.machine.HTMachineTier +import hiiragi283.ragium.api.machine.HTMachineType +import hiiragi283.ragium.api.recipe.HTRecipeResult +import net.minecraft.item.ItemStack +import net.minecraft.util.math.BlockPos +import net.minecraft.world.World + +object HTMachineRecipeProcessorNew { + @JvmStatic + fun process( + world: World, + pos: BlockPos, + recipe: HTMachineRecipe?, + input: HTMachineRecipe.Input, + inventory: HTSimpleInventory, + ): Boolean = processInternal(world, pos, recipe, input, inventory) + + @JvmStatic + private fun processInternal( + world: World, + pos: BlockPos, + recipe: HTMachineRecipe?, + input: HTMachineRecipe.Input, + inventory: HTSimpleInventory, + ): Boolean { + if (recipe == null) return false + if (!recipe.matches(input, world)) return false + if (!canAcceptOutputs(recipe, inventory)) return false + val machineType: HTMachineType = input.currentType + val tier: HTMachineTier = input.currentTier + if (!machineType.getOrDefault(HTMachinePropertyKeys.PROCESSOR_CONDITION)( + world, + pos, + machineType, + tier, + ) + ) { + return false + } + modifyOutput(0, recipe, inventory) + modifyOutput(1, recipe, inventory) + modifyOutput(2, recipe, inventory) + decrementInput(0, recipe, inventory) + decrementInput(1, recipe, inventory) + decrementInput(2, recipe, inventory) + return true + } + + @JvmStatic + private fun canAcceptOutputs(recipe: HTMachineRecipe, inventory: HTSimpleInventory): Boolean { + recipe.outputs.forEachIndexed { index: Int, result: HTRecipeResult -> + val stackIn: ItemStack = inventory.getStack(index + 4) + if (!result.canAccept(stackIn)) { + return false + } + } + return true + } + + @JvmStatic + private fun modifyOutput(slot: Int, recipe: HTMachineRecipe, inventory: HTSimpleInventory) { + inventory.modifyStack(slot + 4) { stackIn: ItemStack -> + recipe.getOutput(slot)?.modifyStack(stackIn) ?: stackIn + } + } + + @JvmStatic + private fun decrementInput(slot: Int, recipe: HTMachineRecipe, inventory: HTSimpleInventory) { + val delCount: Int = recipe.getInput(slot)?.count ?: return + inventory.getStack(slot).count -= delCount + } +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt b/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt index 89daef44c..e09f24945 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/RagiumCommon.kt @@ -22,6 +22,7 @@ object RagiumCommon : ModInitializer { RagiumAdvancementCriteria RagiumBlockEntityTypes RagiumBlocks + RagiumBlockEntityTypes.init() RagiumEntityTypes.init() RagiumFluids.init() RagiumRecipeSerializers @@ -32,17 +33,15 @@ object RagiumCommon : ModInitializer { RagiumContentRegister.registerContents() HTHardModeResourceCondition.init() - RagiumBlockEntityTypes.init() - RagiumCauldronBehaviors.init() + HTTradeOfferRegistry.init() RagiumCommands.init() RagiumEventHandlers.init() + RagiumFeatures.init() RagiumItemGroup.init() + RagiumMaterialItemRecipes.init() RagiumNetworks.init() - RagiumFeatures.init() - HTTradeOfferRegistry.init() - RagiumApiLookupInit.init() - RagiumMaterialItemRecipes.init() + RagiumContentRegister.initRegistry() RagiumAPI.log { info("Ragium initialized!") } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMetaMachineBlockEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMetaMachineBlockEntity.kt index dbba4d97b..28dcc8a75 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMetaMachineBlockEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/block/entity/HTMetaMachineBlockEntity.kt @@ -2,13 +2,11 @@ package hiiragi283.ragium.common.block.entity import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.inventory.HTSimpleInventory -import hiiragi283.ragium.api.machine.HTMachineEntity -import hiiragi283.ragium.api.machine.HTMachinePropertyKeys -import hiiragi283.ragium.api.machine.HTMachineTier -import hiiragi283.ragium.api.machine.HTMachineType +import hiiragi283.ragium.api.machine.* import hiiragi283.ragium.common.init.RagiumBlockEntityTypes import hiiragi283.ragium.common.init.RagiumBlocks import io.github.cottonmc.cotton.gui.PropertyDelegateHolder +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory import net.minecraft.block.BlockState import net.minecraft.component.ComponentMap import net.minecraft.entity.player.PlayerEntity @@ -16,9 +14,9 @@ import net.minecraft.entity.player.PlayerInventory import net.minecraft.nbt.NbtCompound import net.minecraft.registry.RegistryWrapper import net.minecraft.screen.ArrayPropertyDelegate -import net.minecraft.screen.NamedScreenHandlerFactory import net.minecraft.screen.PropertyDelegate import net.minecraft.screen.ScreenHandler +import net.minecraft.server.network.ServerPlayerEntity import net.minecraft.text.Text import net.minecraft.util.ActionResult import net.minecraft.util.Identifier @@ -28,11 +26,19 @@ import net.minecraft.world.World class HTMetaMachineBlockEntity(pos: BlockPos, state: BlockState) : HTBlockEntityBase(RagiumBlockEntityTypes.META_MACHINE, pos, state), - NamedScreenHandlerFactory, + ExtendedScreenHandlerFactory, PropertyDelegateHolder { var machineEntity: HTMachineEntity? = null private set + val definition: HTMachinePacket + get() = machineEntity?.packet ?: HTMachinePacket.DEFAULT + + override fun setWorld(world: World) { + super.setWorld(world) + machineEntity?.onWorldUpdated(world) + } + override fun writeNbt(nbt: NbtCompound, registryLookup: RegistryWrapper.WrapperLookup) { machineEntity?.writeToNbt(nbt, registryLookup) super.writeNbt(nbt, registryLookup) @@ -69,8 +75,7 @@ class HTMetaMachineBlockEntity(pos: BlockPos, state: BlockState) : } private fun initMachineEntity(machineType: HTMachineType, tier: HTMachineTier) { - this.machineEntity = - machineType.get(HTMachinePropertyKeys.MACHINE_FACTORY)?.create(machineType, tier) + this.machineEntity = machineType[HTMachinePropertyKeys.MACHINE_FACTORY]?.create(machineType, tier) this.machineEntity?.setParentBE(this) } @@ -115,7 +120,10 @@ class HTMetaMachineBlockEntity(pos: BlockPos, state: BlockState) : override fun getDisplayName(): Text = machineEntity?.displayName ?: RagiumBlocks.META_MACHINE.name + override fun getScreenOpeningData(player: ServerPlayerEntity): HTMachinePacket = definition + // PropertyDelegateHolder // - override fun getPropertyDelegate(): PropertyDelegate = machineEntity?.propertyDelegate ?: ArrayPropertyDelegate(2) + override fun getPropertyDelegate(): PropertyDelegate = + machineEntity?.propertyDelegate ?: ArrayPropertyDelegate(HTMachineEntity.MAX_PROPERTIES) } diff --git a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumCauldronBehaviors.kt b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumCauldronBehaviors.kt deleted file mode 100644 index f0bdced82..000000000 --- a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumCauldronBehaviors.kt +++ /dev/null @@ -1,42 +0,0 @@ -package hiiragi283.ragium.common.init - -import hiiragi283.ragium.api.extension.dropStackAt -import hiiragi283.ragium.api.extension.isOf -import hiiragi283.ragium.common.RagiumContents -import net.minecraft.block.BlockState -import net.minecraft.block.LeveledCauldronBlock -import net.minecraft.block.cauldron.CauldronBehavior -import net.minecraft.entity.player.PlayerEntity -import net.minecraft.item.ItemConvertible -import net.minecraft.item.ItemStack -import net.minecraft.util.Hand -import net.minecraft.util.ItemActionResult -import net.minecraft.util.math.BlockPos -import net.minecraft.world.World - -object RagiumCauldronBehaviors { - @JvmStatic - fun init() { - register( - CauldronBehavior.WATER_CAULDRON_BEHAVIOR, - RagiumContents.Dusts.CRUDE_RAGINITE, - ) { state: BlockState, world: World, pos: BlockPos, player: PlayerEntity, _: Hand, stack: ItemStack -> - if (stack.isOf(RagiumContents.Dusts.CRUDE_RAGINITE)) { - if (!world.isClient) { - val count: Int = stack.count - stack.count = -1 - dropStackAt(player, ItemStack(RagiumContents.Dusts.RAGINITE, count)) - LeveledCauldronBlock.decrementFluidLevel(state, world, pos) - } - ItemActionResult.success(world.isClient) - } else { - ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION - } - } - } - - @JvmStatic - private fun register(map: CauldronBehavior.CauldronBehaviorMap, item: ItemConvertible, behavior: CauldronBehavior) { - map.map[item.asItem()] = behavior - } -} diff --git a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumContentRegister.kt b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumContentRegister.kt index 860b5998e..1f8a24bf5 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumContentRegister.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumContentRegister.kt @@ -3,22 +3,34 @@ package hiiragi283.ragium.common.init import hiiragi283.ragium.api.accessory.HTAccessoryRegistry import hiiragi283.ragium.api.accessory.HTAccessorySlotTypes import hiiragi283.ragium.api.content.HTContentRegister -import hiiragi283.ragium.api.extension.blockSettings -import hiiragi283.ragium.api.extension.itemSettings -import hiiragi283.ragium.api.extension.tier +import hiiragi283.ragium.api.extension.* import hiiragi283.ragium.api.tags.RagiumItemTags import hiiragi283.ragium.common.RagiumContents +import hiiragi283.ragium.common.block.entity.HTMetaMachineBlockEntity import hiiragi283.ragium.common.item.HTCrafterHammerItem import hiiragi283.ragium.common.item.HTMetaMachineBlockItem import net.fabricmc.fabric.api.registry.FuelRegistry -import net.minecraft.block.Block -import net.minecraft.block.Blocks -import net.minecraft.block.PillarBlock +import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage +import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage +import net.minecraft.block.* +import net.minecraft.block.cauldron.CauldronBehavior +import net.minecraft.block.entity.BlockEntity import net.minecraft.component.type.FoodComponent import net.minecraft.entity.effect.StatusEffectInstance import net.minecraft.entity.effect.StatusEffects +import net.minecraft.entity.player.PlayerEntity import net.minecraft.item.Item +import net.minecraft.item.ItemConvertible +import net.minecraft.item.ItemStack +import net.minecraft.util.DyeColor +import net.minecraft.util.Hand +import net.minecraft.util.ItemActionResult import net.minecraft.util.Rarity +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction +import net.minecraft.world.World +import team.reborn.energy.api.EnergyStorage +import team.reborn.energy.api.base.InfiniteEnergyStorage object RagiumContentRegister : HTContentRegister { @JvmStatic @@ -94,8 +106,6 @@ object RagiumContentRegister : HTContentRegister { RagiumContents.Fluids.entries.forEach { fluid: RagiumContents.Fluids -> registerItem(fluid, fluid.createItem()) } - - initRegistry() } @JvmStatic @@ -135,7 +145,27 @@ object RagiumContentRegister : HTContentRegister { } @JvmStatic - private fun initRegistry() { + fun initRegistry() { + // ApiLookup + ItemStorage.SIDED.registerForBlockEntity({ blockEntity: HTMetaMachineBlockEntity, direction: Direction? -> + blockEntity.machineEntity?.let { InventoryStorage.of(it, direction) } + }, RagiumBlockEntityTypes.META_MACHINE) + + ItemStorage.SIDED.registerForBlocks({ world: World, _: BlockPos, state: BlockState, _: BlockEntity?, direction: Direction? -> + val color: DyeColor = state.getOrNull(RagiumBlockProperties.COLOR) ?: return@registerForBlocks null + world.backpackManager + ?.get(color) + ?.let { InventoryStorage.of(it, direction) } + }, RagiumBlocks.BACKPACK_INTERFACE) + + EnergyStorage.SIDED.registerForBlocks( + { _: World, _: BlockPos, _: BlockState, _: BlockEntity?, _: Direction? -> InfiniteEnergyStorage.INSTANCE }, + RagiumBlocks.CREATIVE_SOURCE, + ) + + EnergyStorage.SIDED.registerForBlocks({ world: World, _: BlockPos, _: BlockState, _: BlockEntity?, _: Direction? -> + world.energyNetwork + }, RagiumBlocks.NETWORK_INTERFACE) // Accessory HTAccessoryRegistry.register(RagiumContents.Armors.STELLA_GOGGLE) { equippedAction = HTAccessoryRegistry.EquippedAction { @@ -175,8 +205,30 @@ object RagiumContentRegister : HTContentRegister { } slotType = HTAccessorySlotTypes.FACE } + // Cauldron + registerCauldron( + CauldronBehavior.WATER_CAULDRON_BEHAVIOR, + RagiumContents.Dusts.CRUDE_RAGINITE, + ) { state: BlockState, world: World, pos: BlockPos, player: PlayerEntity, _: Hand, stack: ItemStack -> + if (stack.isOf(RagiumContents.Dusts.CRUDE_RAGINITE)) { + if (!world.isClient) { + val count: Int = stack.count + stack.count = -1 + dropStackAt(player, ItemStack(RagiumContents.Dusts.RAGINITE, count)) + LeveledCauldronBlock.decrementFluidLevel(state, world, pos) + } + ItemActionResult.success(world.isClient) + } else { + ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION + } + } // Fuel Time FuelRegistry.INSTANCE.add(RagiumItemTags.FUEL_CUBES, 200 * 8) FuelRegistry.INSTANCE.add(RagiumContents.Fluids.NITRO_FUEL, 200 * 16) } + + @JvmStatic + private fun registerCauldron(map: CauldronBehavior.CauldronBehaviorMap, item: ItemConvertible, behavior: CauldronBehavior) { + map.map[item.asItem()] = behavior + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumNetworks.kt b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumNetworks.kt index 833d29512..22e23e6bc 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumNetworks.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumNetworks.kt @@ -2,8 +2,10 @@ package hiiragi283.ragium.common.init import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.extension.openBackpackScreen +import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe import hiiragi283.ragium.common.network.HTFloatingItemPayload import hiiragi283.ragium.common.network.HTInventoryPayload +import hiiragi283.ragium.common.network.HTMachineRecipePayload import hiiragi283.ragium.common.network.HTOpenBackpackPayload import io.wispforest.accessories.api.AccessoriesCapability import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry @@ -22,6 +24,10 @@ object RagiumNetworks { val FLOATING_ITEM: CustomPayload.Id = registerS2C("floating_item", HTFloatingItemPayload.PACKET_CODEC) + @JvmField + val MACHINE_RECIPE: CustomPayload.Id = + registerS2C("machine_recipe", HTMachineRecipePayload.PACKET_CODEC) + @JvmField val OPEN_BACKPACK: CustomPayload.Id = registerC2S("open_backpack", HTOpenBackpackPayload.PACKET_CODEC) @@ -78,6 +84,11 @@ object RagiumNetworks { ServerPlayNetworking.send(player, HTInventoryPayload.createPacket(pos, slot, stack)) } + @JvmStatic + fun sendMachineRecipes(player: ServerPlayerEntity, pos: BlockPos, recipe: HTMachineRecipe) { + ServerPlayNetworking.send(player, HTMachineRecipePayload(pos, recipe)) + } + @JvmStatic fun sendFloatingItem(player: ServerPlayerEntity, stack: ItemStack) { ServerPlayNetworking.send(player, HTFloatingItemPayload(stack)) diff --git a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumScreenHandlerTypes.kt b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumScreenHandlerTypes.kt index 3337e0f5b..b8fe48fb4 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumScreenHandlerTypes.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/init/RagiumScreenHandlerTypes.kt @@ -1,9 +1,13 @@ package hiiragi283.ragium.common.init import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.machine.HTMachinePacket import hiiragi283.ragium.common.screen.HTAlchemicalInfuserHandler import hiiragi283.ragium.common.screen.HTGeneratorScreenHandler import hiiragi283.ragium.common.screen.HTProcessorScreenHandler +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType +import net.minecraft.network.RegistryByteBuf +import net.minecraft.network.codec.PacketCodec import net.minecraft.registry.Registries import net.minecraft.registry.Registry import net.minecraft.resource.featuretoggle.FeatureFlags @@ -16,13 +20,24 @@ object RagiumScreenHandlerTypes { register("generator", ::HTGeneratorScreenHandler) @JvmField - val PROCESSOR: ScreenHandlerType = - register("processor", ::HTProcessorScreenHandler) + val PROCESSOR: ExtendedScreenHandlerType = + registerExtended("processor", ::HTProcessorScreenHandler, HTMachinePacket.PACKET_CODEC) @JvmField val ALCHEMICAL_INFUSER: ScreenHandlerType = register("alchemical_infuser", ::HTAlchemicalInfuserHandler) + @JvmStatic + private fun registerExtended( + name: String, + factory: ExtendedScreenHandlerType.ExtendedFactory, + packetCodec: PacketCodec, + ): ExtendedScreenHandlerType = Registry.register( + Registries.SCREEN_HANDLER, + RagiumAPI.id(name), + ExtendedScreenHandlerType(factory, packetCodec), + ) + @JvmStatic private fun register(name: String, factory: ScreenHandlerType.Factory): ScreenHandlerType = Registry.register( Registries.SCREEN_HANDLER, diff --git a/src/main/kotlin/hiiragi283/ragium/common/machine/HTHeatGeneratorMachineEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/machine/HTHeatGeneratorMachineEntity.kt index a377b7391..1fb7246d2 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/machine/HTHeatGeneratorMachineEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/machine/HTHeatGeneratorMachineEntity.kt @@ -72,7 +72,7 @@ class HTHeatGeneratorMachineEntity(tier: HTMachineTier) : HTGeneratorMachineEnti override fun getProperty(index: Int): Int = when (index) { 0 -> fuelTime - burningTime 1 -> fuelTime - else -> throw IndexOutOfBoundsException(index) + else -> -1 } override val parent: HTSidedInventory = HTSidedStorageBuilder(2) diff --git a/src/main/kotlin/hiiragi283/ragium/common/machine/HTProcessorMachineEntity.kt b/src/main/kotlin/hiiragi283/ragium/common/machine/HTProcessorMachineEntity.kt index 6b804f44d..2c06cf34c 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/machine/HTProcessorMachineEntity.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/machine/HTProcessorMachineEntity.kt @@ -1,5 +1,6 @@ package hiiragi283.ragium.common.machine +import hiiragi283.ragium.api.extension.sendPacket import hiiragi283.ragium.api.inventory.HTSidedStorageBuilder import hiiragi283.ragium.api.inventory.HTSimpleInventory import hiiragi283.ragium.api.inventory.HTStorageIO @@ -7,23 +8,49 @@ import hiiragi283.ragium.api.inventory.HTStorageSide import hiiragi283.ragium.api.machine.HTMachineConvertible import hiiragi283.ragium.api.machine.HTMachineEntity import hiiragi283.ragium.api.machine.HTMachineTier -import hiiragi283.ragium.api.machine.HTMachineType import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe -import hiiragi283.ragium.api.recipe.machine.HTMachineRecipeProcessor -import hiiragi283.ragium.common.init.RagiumRecipeTypes +import hiiragi283.ragium.api.recipe.machine.HTMachineRecipeProcessorNew +import hiiragi283.ragium.common.init.RagiumNetworks import hiiragi283.ragium.common.screen.HTProcessorScreenHandler import net.minecraft.block.BlockState import net.minecraft.component.ComponentMap import net.minecraft.entity.player.PlayerEntity import net.minecraft.entity.player.PlayerInventory +import net.minecraft.nbt.NbtCompound +import net.minecraft.registry.RegistryWrapper +import net.minecraft.screen.PropertyDelegate import net.minecraft.screen.ScreenHandler import net.minecraft.screen.ScreenHandlerContext +import net.minecraft.server.network.ServerPlayerEntity import net.minecraft.util.math.BlockPos import net.minecraft.world.World open class HTProcessorMachineEntity(type: HTMachineConvertible, tier: HTMachineTier) : HTMachineEntity(type, tier) { + override fun writeNbt(nbt: NbtCompound, registryLookup: RegistryWrapper.WrapperLookup) { + nbt.putInt("recipe_index", currentIndex) + } + + override fun readNbt(nbt: NbtCompound, registryLookup: RegistryWrapper.WrapperLookup) { + currentIndex = nbt.getInt("recipe_index") + } + override fun tickSecond(world: World, pos: BlockPos, state: BlockState) { - HTMachineRecipeProcessor( + HTMachineRecipeProcessorNew.process( + world, + pos, + currentRecipe, + HTMachineRecipe.Input.create( + machineType, + tier, + getStack(0), + getStack(1), + getStack(2), + getStack(3), + ComponentMap.builder().apply { getCustomData(world, pos, state, this) }.build(), + ), + parent, + ) + /*HTMachineRecipeProcessor( parent, RagiumRecipeTypes.MACHINE, ) { machineType: HTMachineType, tier: HTMachineTier, inventory: HTSimpleInventory -> @@ -36,7 +63,7 @@ open class HTProcessorMachineEntity(type: HTMachineConvertible, tier: HTMachineT inventory.getStack(3), ComponentMap.builder().apply { getCustomData(world, pos, state, this) }.build(), ) - }.process(world, pos, machineType, tier) + }.process(world, pos, machineType, tier)*/ } open fun getCustomData( @@ -57,5 +84,48 @@ open class HTProcessorMachineEntity(type: HTMachineConvertible, tier: HTMachineT .buildSimple() final override fun createMenu(syncId: Int, playerInventory: PlayerInventory, player: PlayerEntity): ScreenHandler = - HTProcessorScreenHandler(syncId, playerInventory, ScreenHandlerContext.create(parentBE.world, parentBE.pos)) + HTProcessorScreenHandler( + syncId, + playerInventory, + packet, + ScreenHandlerContext.create(parentBE.world, parentBE.pos), + ) + + var currentIndex: Int = 0 + private set + var maxIndex: Int = -1 + private set + var currentRecipe: HTMachineRecipe? = null + set(value) { + field = value + if (value != null) { + world?.sendPacket { player: ServerPlayerEntity -> + RagiumNetworks.sendMachineRecipes( + player, + pos, + value, + ) + } + } + } + + override fun getPropertyDelegate(): PropertyDelegate = object : PropertyDelegate { + override fun get(index: Int): Int = when (index) { + 0 -> ticks + 1 -> tickRate + 2 -> currentIndex + 3 -> maxIndex + else -> -1 + } + + override fun set(index: Int, value: Int) { + when (index) { + 2 -> currentIndex = value + 3 -> maxIndex = value + else -> Unit + } + } + + override fun size(): Int = MAX_PROPERTIES + } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/network/HTMachineRecipePayload.kt b/src/main/kotlin/hiiragi283/ragium/common/network/HTMachineRecipePayload.kt new file mode 100644 index 000000000..35905c10e --- /dev/null +++ b/src/main/kotlin/hiiragi283/ragium/common/network/HTMachineRecipePayload.kt @@ -0,0 +1,23 @@ +package hiiragi283.ragium.common.network + +import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe +import hiiragi283.ragium.common.init.RagiumNetworks +import net.minecraft.network.RegistryByteBuf +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.packet.CustomPayload +import net.minecraft.util.math.BlockPos + +data class HTMachineRecipePayload(val pos: BlockPos, val recipe: HTMachineRecipe) : CustomPayload { + companion object { + @JvmField + val PACKET_CODEC: PacketCodec = PacketCodec.tuple( + BlockPos.PACKET_CODEC, + HTMachineRecipePayload::pos, + HTMachineRecipe.PACKET_CODEC, + HTMachineRecipePayload::recipe, + ::HTMachineRecipePayload, + ) + } + + override fun getId(): CustomPayload.Id = RagiumNetworks.MACHINE_RECIPE +} diff --git a/src/main/kotlin/hiiragi283/ragium/common/screen/HTGeneratorScreenHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/screen/HTGeneratorScreenHandler.kt index b79f27144..a41d59bd8 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/screen/HTGeneratorScreenHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/screen/HTGeneratorScreenHandler.kt @@ -2,6 +2,7 @@ package hiiragi283.ragium.common.screen import hiiragi283.ragium.api.RagiumAPI import hiiragi283.ragium.api.extension.machineInventory +import hiiragi283.ragium.api.machine.HTMachineEntity import hiiragi283.ragium.common.init.RagiumScreenHandlerTypes import io.github.cottonmc.cotton.gui.SyncedGuiDescription import io.github.cottonmc.cotton.gui.widget.WBar @@ -18,7 +19,7 @@ class HTGeneratorScreenHandler(syncId: Int, playerInv: PlayerInventory, ctx: Scr syncId, playerInv, ctx.machineInventory(2), - getBlockPropertyDelegate(ctx, 2), + getBlockPropertyDelegate(ctx, HTMachineEntity.MAX_PROPERTIES), ) { init { val root = WGridPanel() diff --git a/src/main/kotlin/hiiragi283/ragium/common/screen/HTProcessorScreenHandler.kt b/src/main/kotlin/hiiragi283/ragium/common/screen/HTProcessorScreenHandler.kt index 2d0b5e9bf..a2d745a6b 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/screen/HTProcessorScreenHandler.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/screen/HTProcessorScreenHandler.kt @@ -1,42 +1,121 @@ package hiiragi283.ragium.common.screen +import com.mojang.serialization.Codec import hiiragi283.ragium.api.RagiumAPI +import hiiragi283.ragium.api.extension.getMachineEntity +import hiiragi283.ragium.api.extension.getMachineRecipes import hiiragi283.ragium.api.extension.machineInventory +import hiiragi283.ragium.api.machine.HTMachineEntity +import hiiragi283.ragium.api.machine.HTMachinePacket +import hiiragi283.ragium.api.machine.HTMachineTier +import hiiragi283.ragium.api.machine.HTMachineType +import hiiragi283.ragium.api.recipe.HTIngredient +import hiiragi283.ragium.api.recipe.HTRecipeResult +import hiiragi283.ragium.api.recipe.machine.HTMachineRecipe import hiiragi283.ragium.common.init.RagiumScreenHandlerTypes +import hiiragi283.ragium.common.machine.HTProcessorMachineEntity import io.github.cottonmc.cotton.gui.SyncedGuiDescription -import io.github.cottonmc.cotton.gui.widget.WBar -import io.github.cottonmc.cotton.gui.widget.WGridPanel -import io.github.cottonmc.cotton.gui.widget.WItemSlot +import io.github.cottonmc.cotton.gui.networking.NetworkSide +import io.github.cottonmc.cotton.gui.networking.ScreenNetworking +import io.github.cottonmc.cotton.gui.widget.* import io.github.cottonmc.cotton.gui.widget.data.Insets +import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon import net.minecraft.entity.player.PlayerInventory +import net.minecraft.item.ItemStack +import net.minecraft.item.Items +import net.minecraft.recipe.Ingredient +import net.minecraft.recipe.RecipeEntry import net.minecraft.screen.ScreenHandlerContext +import net.minecraft.text.MutableText +import net.minecraft.text.Text +import net.minecraft.util.Identifier +import net.minecraft.util.math.BlockPos +import kotlin.math.max +import kotlin.math.min -class HTProcessorScreenHandler(syncId: Int, playerInv: PlayerInventory, ctx: ScreenHandlerContext = ScreenHandlerContext.EMPTY) : - SyncedGuiDescription( +class HTProcessorScreenHandler( + syncId: Int, + playerInv: PlayerInventory, + packet: HTMachinePacket, + ctx: ScreenHandlerContext = ScreenHandlerContext.EMPTY, +) : SyncedGuiDescription( RagiumScreenHandlerTypes.PROCESSOR, syncId, playerInv, ctx.machineInventory(7), - getBlockPropertyDelegate(ctx, 2), + getBlockPropertyDelegate(ctx, HTMachineEntity.MAX_PROPERTIES), ) { + companion object { + @JvmField + val UPDATE_INDEX: Identifier = RagiumAPI.id("update_index") + + @JvmField + val UPDATE_PREVIEW: Identifier = RagiumAPI.id("update_preview") + + @JvmField + val MAX_INDEX: Identifier = RagiumAPI.id("max_index") + + @JvmStatic + private val defaultPreview: List + get() = listOf(Items.GLASS_PANE.defaultStack) + + @JvmStatic + private fun itemOf(input: HTIngredient?): WItem = WItem(input?.matchingStacks ?: defaultPreview) + + @JvmStatic + private fun itemOf(catalyst: Ingredient?): WItem = + WItem(catalyst?.matchingStacks?.takeIf(Array::isNotEmpty)?.toList() ?: defaultPreview) + + @JvmStatic + private fun itemOf(output: HTRecipeResult?): WItem = WItem(output?.toStack()?.let(::listOf) ?: defaultPreview) + + @JvmStatic + private fun createPreview(recipe: HTMachineRecipe?): Array = arrayOf( + itemOf(recipe?.getInput(0)), + itemOf(recipe?.getInput(1)), + itemOf(recipe?.getInput(2)), + itemOf(recipe?.catalyst), + itemOf(recipe?.getOutput(2)), + itemOf(recipe?.getOutput(2)), + itemOf(recipe?.getOutput(2)), + ) + } + + private val pos: BlockPos = packet.pos + private val recipePreviews: Array + private val recipes: List> + init { - val root = WGridPanel() - setRootPanel(root) - root.setInsets(Insets.ROOT_PANEL) + val (machineType: HTMachineType, machineTier: HTMachineTier) = packet + val machineText: MutableText = machineTier.createPrefixedText(machineType) + + recipes = world.recipeManager.getMachineRecipes(machineType, machineTier) + val firstRecipe: HTMachineRecipe? = recipes.getOrNull(0)?.value + firstRecipe?.let(::updateRecipe) + recipePreviews = createPreview(firstRecipe) + ScreenNetworking.of(this, NetworkSide.CLIENT).send(MAX_INDEX, Codec.INT, recipes.size) + + val rootTab = WTabPanel() + setRootPanel(rootTab) + titleVisible = false + // Main Panel + val mainPanel = WGridPanel() + mainPanel.setInsets(Insets.ROOT_PANEL) + mainPanel.add(WLabel(machineText), 0, 0) // input slots - root.add(WItemSlot.of(blockInventory, 0), 1, 1) - root.add(WItemSlot.of(blockInventory, 1), 2, 1) - root.add(WItemSlot.of(blockInventory, 2), 3, 1) + mainPanel.add(WItemSlot.of(blockInventory, 0), 1, 1) + mainPanel.add(WItemSlot.of(blockInventory, 1), 2, 1) + mainPanel.add(WItemSlot.of(blockInventory, 2), 3, 1) // catalyst slot - root.add(WItemSlot.of(blockInventory, 3), 4, 2) + mainPanel.add(WItemSlot.of(blockInventory, 3), 4, 2) // output slots - root.add(WItemSlot.of(blockInventory, 4).setInsertingAllowed(false), 5, 1) - root.add(WItemSlot.of(blockInventory, 5).setInsertingAllowed(false), 6, 1) - root.add(WItemSlot.of(blockInventory, 6).setInsertingAllowed(false), 7, 1) + mainPanel.add(WItemSlot.of(blockInventory, 4).setInsertingAllowed(false), 5, 1) + mainPanel.add(WItemSlot.of(blockInventory, 5).setInsertingAllowed(false), 6, 1) + mainPanel.add(WItemSlot.of(blockInventory, 6).setInsertingAllowed(false), 7, 1) // player inventory - root.add(createPlayerInventoryPanel(), 0, 3) + mainPanel.add(createPlayerInventoryPanel(), 0, 3) // right arrow - root.add( + mainPanel.add( WBar( RagiumAPI.id("textures/gui/progress_base.png"), RagiumAPI.id("textures/gui/progress_bar.png"), @@ -47,6 +126,77 @@ class HTProcessorScreenHandler(syncId: Int, playerInv: PlayerInventory, ctx: Scr 4, 1, ) - root.validate(this) + mainPanel.validate(this) + // Add to tab + rootTab.add(mainPanel) { + it.icon(ItemIcon(machineType.createItemStack(machineTier))) + it.tooltip(machineText) + } + // Recipe Panel + val recipePanel = WGridPanel() + recipePanel.setInsets(Insets.ROOT_PANEL) + recipePanel.add(WLabel(Text.literal("Recipe Selecting")), 0, 0) + // Back Button + recipePanel.add( + WButton(ItemIcon(Items.RED_DYE)).setOnClick { + val currentIndex: Int = propertyDelegate.get(2) + ScreenNetworking + .of(this, NetworkSide.CLIENT) + .send(UPDATE_INDEX, Codec.INT, max(0, currentIndex - 1)) + }, + 2, + 2, + ) + // Recipe Previews + recipePanel.add(recipePreviews[0], 1, 1) + recipePanel.add(recipePreviews[1], 2, 1) + recipePanel.add(recipePreviews[2], 3, 1) + recipePanel.add(recipePreviews[3], 4, 2) + recipePanel.add(recipePreviews[4], 5, 1) + recipePanel.add(recipePreviews[5], 6, 1) + recipePanel.add(recipePreviews[6], 7, 1) + // recipePanel.add(WDynamicLabel { "Current index; ${propertyDelegate.get(2)}" }, 4, 2) + // next Button + recipePanel.add( + WButton(ItemIcon(Items.BLUE_DYE)).setOnClick { + val currentIndex: Int = propertyDelegate.get(2) + ScreenNetworking + .of(this, NetworkSide.CLIENT) + .send(UPDATE_INDEX, Codec.INT, min(currentIndex + 1, propertyDelegate.get(3) - 1)) + }, + 6, + 2, + ) + // player inventory + recipePanel.add(createPlayerInventoryPanel(), 0, 3) + // Add to tab + rootTab.add(recipePanel) { + it.icon(ItemIcon(Items.WRITABLE_BOOK)) + it.tooltip(Text.literal("Recipe Selecting")) + } + + // Networking + ScreenNetworking.of(this, NetworkSide.SERVER).receive(UPDATE_INDEX, Codec.INT) { index: Int -> + propertyDelegate.set(2, index) + val recipe: HTMachineRecipe = recipes.getOrNull(index)?.value ?: return@receive + updateRecipe(recipe) + ScreenNetworking.of(this, NetworkSide.SERVER).send(UPDATE_PREVIEW, HTMachineRecipe.CODEC.codec(), recipe) + } + + ScreenNetworking.of(this, NetworkSide.SERVER).receive(MAX_INDEX, Codec.INT) { index: Int -> + propertyDelegate.set(3, index) + } + + ScreenNetworking + .of(this, NetworkSide.CLIENT) + .receive(UPDATE_PREVIEW, HTMachineRecipe.CODEC.codec()) { recipe: HTMachineRecipe -> + createPreview(recipe).forEachIndexed { index: Int, wItem: WItem -> + recipePreviews[index].items = wItem.items + } + } + } + + private fun updateRecipe(recipe: HTMachineRecipe) { + (world.getMachineEntity(pos) as? HTProcessorMachineEntity)?.currentRecipe = recipe } } diff --git a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumApiLookupInit.kt b/src/main/kotlin/hiiragi283/ragium/common/unused/RagiumApiLookupInit.kt similarity index 52% rename from src/main/kotlin/hiiragi283/ragium/common/init/RagiumApiLookupInit.kt rename to src/main/kotlin/hiiragi283/ragium/common/unused/RagiumApiLookupInit.kt index 2762b62f7..66c5a02f3 100644 --- a/src/main/kotlin/hiiragi283/ragium/common/init/RagiumApiLookupInit.kt +++ b/src/main/kotlin/hiiragi283/ragium/common/unused/RagiumApiLookupInit.kt @@ -1,42 +1,6 @@ -package hiiragi283.ragium.common.init - -import hiiragi283.ragium.api.extension.backpackManager -import hiiragi283.ragium.api.extension.energyNetwork -import hiiragi283.ragium.api.extension.getOrNull -import hiiragi283.ragium.common.block.entity.HTMetaMachineBlockEntity -import net.fabricmc.fabric.api.lookup.v1.block.BlockApiLookup -import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage -import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage -import net.minecraft.block.BlockState -import net.minecraft.block.entity.BlockEntity -import net.minecraft.util.DyeColor -import net.minecraft.util.math.BlockPos -import net.minecraft.util.math.Direction -import net.minecraft.world.World -import team.reborn.energy.api.EnergyStorage -import team.reborn.energy.api.base.InfiniteEnergyStorage +package hiiragi283.ragium.common.unused object RagiumApiLookupInit { - @JvmStatic - fun init() { - initItemStorage() - initElectric() - } - - @JvmStatic - fun initItemStorage() { - ItemStorage.SIDED.registerForBlockEntity({ blockEntity: HTMetaMachineBlockEntity, direction: Direction? -> - blockEntity.machineEntity?.let { InventoryStorage.of(it, direction) } - }, RagiumBlockEntityTypes.META_MACHINE) - - ItemStorage.SIDED.registerForBlocks({ world: World, _: BlockPos, state: BlockState, _: BlockEntity?, direction: Direction? -> - val color: DyeColor = state.getOrNull(RagiumBlockProperties.COLOR) ?: return@registerForBlocks null - world.backpackManager - ?.get(color) - ?.let { InventoryStorage.of(it, direction) } - }, RagiumBlocks.BACKPACK_INTERFACE) - } - /*@JvmStatic private fun initHeat() { HEAT.registerForBlocks(provideStatic(true), RagiumContents.CREATIVE_SOURCE) @@ -65,15 +29,6 @@ object RagiumApiLookupInit { @JvmStatic private fun initElectric() { - EnergyStorage.SIDED.registerForBlocks( - provideStatic(InfiniteEnergyStorage.INSTANCE), - RagiumBlocks.CREATIVE_SOURCE, - ) - - EnergyStorage.SIDED.registerForBlocks({ world: World, _: BlockPos, _: BlockState, _: BlockEntity?, _: Direction? -> - world.energyNetwork - }, RagiumBlocks.NETWORK_INTERFACE) - /*ENERGY.registerForBlocks({ world: World, pos: BlockPos, state: BlockState, _: BlockEntity?, direction: Direction? -> if (direction != null) { val axis: Direction.Axis = state.get(Properties.AXIS) @@ -95,8 +50,4 @@ object RagiumApiLookupInit { ENERGY.find(world, posTo, stateTo, blockEntityTo, facing.opposite) }, RagiumContents.GEAR_BOX)*/ } - - @JvmStatic - private fun provideStatic(value: A): BlockApiLookup.BlockApiProvider = - BlockApiLookup.BlockApiProvider { _: World, _: BlockPos, _: BlockState, _: BlockEntity?, _: C? -> value } } diff --git a/src/main/resources/assets/ragium/textures/item/trader_catalog.png b/src/main/resources/assets/ragium/textures/item/trader_catalog.png new file mode 100644 index 000000000..6f67741db Binary files /dev/null and b/src/main/resources/assets/ragium/textures/item/trader_catalog.png differ diff --git a/src/main/resources/assets/ragium/textures/models/armor/steel_layer_2.png b/src/main/resources/assets/ragium/textures/models/armor/steel_layer_2.png new file mode 100644 index 000000000..5a5e20752 Binary files /dev/null and b/src/main/resources/assets/ragium/textures/models/armor/steel_layer_2.png differ