diff --git a/build.gradle b/build.gradle index 39d8001..72e048f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,9 @@ -plugins { + plugins { id 'java-library' id 'eclipse' id 'idea' id 'maven-publish' - id 'net.neoforged.gradle.userdev' version '7.0.163' + id 'net.neoforged.gradle.userdev' version '7.0.176' } tasks.named('wrapper', Wrapper).configure { @@ -112,8 +112,7 @@ dependencies { // For all intends and purposes: You can treat this dependency as if it is a normal library you would use. implementation "net.neoforged:neoforge:${neo_version}" - localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}" - compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}:api" + implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}" // localRuntime "io.codechicken:CodeChickenLib:${mc_version}-${ccl_version}:universal" // localRuntime "com.brandon3055.draconicevolution:Draconic-Evolution:${minecraft_version}-3.1.2.588:universal" @@ -155,9 +154,9 @@ tasks.withType(ProcessResources).configureEach { mod_description : mod_description, curios_version_range : curios_version_range, - if_version_range : if_version_range,/* + if_version_range : if_version_range, bc_version_range : bc_version_range, - flux_version_range : flux_version_range*/ + flux_version_range : flux_version_range ] inputs.properties replaceProperties diff --git a/gradle.properties b/gradle.properties index be80546..de0856e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,14 @@ org.gradle.daemon=false org.gradle.debug=false # you can also find the latest versions at: https://parchmentmc.org/docs/getting-started -neogradle.subsystems.parchment.minecraftVersion=1.21 -neogradle.subsystems.parchment.mappingsVersion=2024.07.28 +neogradle.subsystems.parchment.minecraftVersion=1.21.1 +neogradle.subsystems.parchment.mappingsVersion=2024.11.17 neogradle.subsystems.devLogin.enabled=true # Environment Properties minecraft_version=1.21.1 minecraft_version_range=[1.21,1.21.1) -neo_version=21.1.55 +neo_version=21.1.92 neo_version_range=[21.1,) loader_version_range=[4,) @@ -26,19 +26,19 @@ mod_description=A mod that adds item charger blocks in tiers and a wireless one # Dependencies -curios_version=9.0.10+1.21 -curios_version_range=[9.0.10+1.21,) +curios_version=9.0.15+1.21.1 +curios_version_range=[9.0.10+1.21.1,) # ccl_version=4.4.0.+ # bc_version=3.2.1.+ -# bc_version_range=[3.2.1.+,) +bc_version_range=[3.2.1.+,) # Flux-Networks-1.20.1-7.2.1 # flux_version=5234697 -# flux_version_range=[7.2,) +flux_version_range=[7.2,) # industrialforegoing-1.21-3.6.10 -if_version=5732195 -if_version_range=[3.6.10,) -# titanium-1.21-4.0.21 -titanium_version=5726400 \ No newline at end of file +if_version=6030556 +if_version_range=[1.21-3.6.15,) +# titanium-1.21-4.0.30 +titanium_version=5897690 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e4a5f61..adda1f2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index fd1434c..b976617 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,5 +7,5 @@ pluginManagement { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0' } \ No newline at end of file diff --git a/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 b/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 deleted file mode 100644 index d73bdb3..0000000 --- a/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 +++ /dev/null @@ -1,42 +0,0 @@ -// 1.20.1 2024-09-14T02:48:06.7045754 Registrate Provider for chargers [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] -8414d2f8dd66709fee6bb6384ed6003c3dee1e5a assets/chargers/blockstates/charger_creative.json -3792e9381196c8ffa0a6965a2a05d389f60b5c95 assets/chargers/blockstates/charger_t1.json -25bdc385d9e5cf3dbb17b546a5af3659ba985819 assets/chargers/blockstates/charger_t2.json -d212b963fcdf9ae026f36c24bf90c47eb118a9f5 assets/chargers/blockstates/charger_t3.json -baee84976ea206a8ec2d5b4a02e5c20b7adfa1b3 assets/chargers/blockstates/charger_t4.json -38da81727571161309afa868262fea2aea5529d8 assets/chargers/blockstates/wireless_charger.json -825536c186d8fe2adb678d47c128a0a9adb8b098 assets/chargers/lang/en_ud.json -aab3656baf0e353c0ff89a24c9546473d043ced0 assets/chargers/lang/en_us.json -359e60783bbc261e58cf72b368da076f82988a0e assets/chargers/models/block/charger_tier_1.json -fbd6ce8fe00f240dd45f6e5e4266ea922d1b63c7 assets/chargers/models/block/charger_tier_2.json -d7fe7d288133b9666add9ceadab3bf989acc94c2 assets/chargers/models/block/charger_tier_3.json -46716e8843f56cae848de7907cfa673c8af9332b assets/chargers/models/block/charger_tier_4.json -f680b517ce9701b731adaa2a69e549cff2a1574e assets/chargers/models/block/creative_charger.json -47489096cca4f17d70a6f1b884f55d8a2e572b90 assets/chargers/models/block/wireless_charger_disabled.json -67b8e5962c2e28aa1deaaaf79cbb4ada1e1dfffa assets/chargers/models/block/wireless_charger_enabled.json -4dd89249b1f3c7f290a8e332d87d628de6f745d8 assets/chargers/models/item/charger_creative.json -0fc9a642f00b4db755843f9466651a70d6c3394b assets/chargers/models/item/charger_t1.json -102a411024d8e97b9d94596e798df64aca0bb07b assets/chargers/models/item/charger_t2.json -45b99d71fa9b56472af76bb94239afeff6b2a2d4 assets/chargers/models/item/charger_t3.json -27f093709bcd7647ed5487cdacd67fbd3d9205ba assets/chargers/models/item/charger_t4.json -220e4fff52d1b790bf7d637fc707b8f99392787e assets/chargers/models/item/wireless_charger.json -47b77c2a5f4e79f87664bf1cab230ac931e985b5 data/chargers/advancements/recipes/redstone/charger_t1.json -89a2912122aaf2f58856224981d69ca720f104c5 data/chargers/advancements/recipes/redstone/charger_t2.json -78d83a3a9319b9323295ad1e2df00eef0d7fd2c3 data/chargers/advancements/recipes/redstone/charger_t3.json -bebd8067b527a5a32d76c9f628228c4f8eb50701 data/chargers/advancements/recipes/redstone/charger_t4.json -1a6249f76304d9b4532736a54a372233f9394c89 data/chargers/advancements/recipes/redstone/wireless_charger.json -1afd73af2888f4da76bfeb16b8a064d4bac2a52e data/chargers/loot_tables/blocks/charger_creative.json -2dc52b6ea1bd571dd7aa9693a3abec16b205be6d data/chargers/loot_tables/blocks/charger_t1.json -84f2bbe76a985fad77fbdbc37876d3d753e659db data/chargers/loot_tables/blocks/charger_t2.json -c12925fb1262d9633194929d06b0ae9667bc7e7b data/chargers/loot_tables/blocks/charger_t3.json -c610f3da72900665a3d8ecf635c3c19516dd1eb6 data/chargers/loot_tables/blocks/charger_t4.json -72531419e763c3a2c618133660ba16e6e54b5bc3 data/chargers/loot_tables/blocks/wireless_charger.json -099d104d6c3e2a0984f62e863e632562615455f2 data/chargers/recipes/charger_t1.json -19c28cb03513db6835c9bb037dd9ffaf5f853c32 data/chargers/recipes/charger_t2.json -d496b5cd2857e3454712e00350a955d5a3f7a2b4 data/chargers/recipes/charger_t3.json -323b7848ed1635dbc4412048dc27a829c2f33ce2 data/chargers/recipes/charger_t4.json -872e0ee42c60419233ccce24b8e907215c940520 data/chargers/recipes/wireless_charger.json -9596b69eed507a7c84470fb89813addc3bb046e2 data/minecraft/tags/blocks/mineable/pickaxe.json -6620d130a62bf575f058803e24e7cb739222acd3 data/minecraft/tags/blocks/needs_diamond_tool.json -2832bc540df3fe30f4f5fca04a116987d8f869e1 data/minecraft/tags/blocks/needs_iron_tool.json -3886d5089b5c880b453d1273311b88b3b9def584 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/main/java/se/gory_moon/chargers/ChargersMod.java b/src/main/java/se/gory_moon/chargers/ChargersMod.java index ef4a7b1..ebc9dd5 100644 --- a/src/main/java/se/gory_moon/chargers/ChargersMod.java +++ b/src/main/java/se/gory_moon/chargers/ChargersMod.java @@ -13,16 +13,17 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import se.gory_moon.chargers.block.BlockRegistry; import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.crafting.RecipeSerializers; -import se.gory_moon.chargers.data.ChargerLanguageProvider; +import se.gory_moon.chargers.data.*; +import se.gory_moon.chargers.handler.CapabilityRegistrationHandler; +import se.gory_moon.chargers.item.ChargerDataComponents; import se.gory_moon.chargers.item.ItemRegistry; -import se.gory_moon.chargers.network.PacketHandler; +import se.gory_moon.chargers.network.PayloadRegister; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -33,23 +34,24 @@ public class ChargersMod { public ChargersMod(IEventBus modBus, ModContainer container) { - modBus.addListener(this::setup); modBus.addListener(this::buildTabContents); modBus.addListener(this::gatherData); + modBus.addListener(PayloadRegister::onPayloadRegister); + modBus.addListener(CapabilityRegistrationHandler::registerCapabilities); - BlockRegistry.init(); - BlockEntityRegistry.init(); - ItemRegistry.init(); + BlockRegistry.BLOCKS.register(modBus);; + BlockRegistry.BLOCK_TYPES.register(modBus); + BlockEntityRegistry.BlOCK_ENTITIES.register(modBus); + BlockEntityRegistry.MENU_TYPES.register(modBus); + ItemRegistry.ITEMS.register(modBus); + ItemRegistry.CREATIVE_TABS.register(modBus); + ChargerDataComponents.DATA_COMPONENTS.register(modBus); - RecipeSerializers.RECIPE_SERIALIZERS.register(FMLJavaModLoadingContext.get().getModEventBus()); + RecipeSerializers.RECIPE_SERIALIZER.register(modBus); container.registerConfig(ModConfig.Type.SERVER, Configs.serverSpec); container.registerConfig(ModConfig.Type.COMMON, Configs.commonSpec); } - private void setup(FMLCommonSetupEvent event) { - PacketHandler.init(); - } - private void gatherData(GatherDataEvent event) { DataGenerator gen = event.getGenerator(); PackOutput packOutput = gen.getPackOutput(); @@ -63,6 +65,11 @@ private void gatherData(GatherDataEvent event) { Optional.of(new InclusiveRange<>(0, Integer.MAX_VALUE))))); gen.addProvider(event.includeClient(), new ChargerLanguageProvider(packOutput)); + gen.addProvider(event.includeClient(), new ChargerBlockStateProvider(packOutput, existingFileHelper)); + gen.addProvider(event.includeClient(), new ChargerItemModelProvider(packOutput, existingFileHelper)); + + gen.addProvider(event.includeServer(), new ChargerRecipeProvider(packOutput, lookupProvider)); + gen.addProvider(event.includeServer(), new ChargerLootTableProvider(packOutput, lookupProvider)); } public void buildTabContents(BuildCreativeModeTabContentsEvent event) { diff --git a/src/main/java/se/gory_moon/chargers/Configs.java b/src/main/java/se/gory_moon/chargers/Configs.java index 9d5b1be..1cf01ec 100644 --- a/src/main/java/se/gory_moon/chargers/Configs.java +++ b/src/main/java/se/gory_moon/chargers/Configs.java @@ -121,7 +121,7 @@ public static class Common { .push("compat"); curiosCompat = builder - .comment("If curios compat should be enabled") + .comment("If the wireless charger should charge curios items") .define("curios_compat", true); builder.pop(2); diff --git a/src/main/java/se/gory_moon/chargers/Constants.java b/src/main/java/se/gory_moon/chargers/Constants.java index 16eae84..c0b8f22 100644 --- a/src/main/java/se/gory_moon/chargers/Constants.java +++ b/src/main/java/se/gory_moon/chargers/Constants.java @@ -1,31 +1,14 @@ package se.gory_moon.chargers; -import net.minecraft.resources.ResourceLocation; - public class Constants { public static final String MOD_ID = "chargers"; - public static ResourceLocation NET_ID = ResourceLocation.fromNamespaceAndPath(MOD_ID, "net"); - public static final String CHARGER_T1_BLOCK = "charger_t1"; - public static final String CHARGER_T1_NAME = "Charger Tier I"; - public static final String CHARGER_T2_BLOCK = "charger_t2"; - public static final String CHARGER_T2_NAME = "Charger Tier II"; - public static final String CHARGER_T3_BLOCK = "charger_t3"; - public static final String CHARGER_T3_NAME = "Charger Tier III"; - public static final String CHARGER_T4_BLOCK = "charger_t4"; - public static final String CHARGER_T4_NAME = "Charger Tier IV"; - public static final String CHARGER_CREATIVE_BLOCK = "charger_creative"; - public static final String CHARGER_CREATIVE_NAME = "Creative Charger"; - - public static final String CHARGER_BLOCK_ENTITY = "charger"; - public static final String CHARGER_CONTAINER = "charger"; - public static final String WIRELESS_CHARGER_BLOCK = "wireless_charger"; - public static final String WIRELESS_CHARGER_NAME = "Wireless Charger"; - public static final String WIRELESS_CHARGER_BLOCK_ENTITY = WIRELESS_CHARGER_BLOCK; + + public static final String CHARGER_BLOCK = "charger"; } diff --git a/src/main/java/se/gory_moon/chargers/LangKeys.java b/src/main/java/se/gory_moon/chargers/LangKeys.java index 759f05a..399a421 100644 --- a/src/main/java/se/gory_moon/chargers/LangKeys.java +++ b/src/main/java/se/gory_moon/chargers/LangKeys.java @@ -16,6 +16,9 @@ public enum LangKeys { GUI_DETAILS_OUT("gui.details.out"), GUI_IO_MORE("gui.io.more"), + TOOLTIP_WIRELESS_CHARGER("tooltip.chargers.wireless_charger"), + + CREATIVE_TAB("itemGroup.chargers.chargers"), PACK_DESCRIPTION("pack.player_mobs.description"); diff --git a/src/main/java/se/gory_moon/chargers/Utils.java b/src/main/java/se/gory_moon/chargers/Utils.java index 3c0ef90..1c8d752 100644 --- a/src/main/java/se/gory_moon/chargers/Utils.java +++ b/src/main/java/se/gory_moon/chargers/Utils.java @@ -22,7 +22,6 @@ public static String formatAndClean(long number) { public static void addEnergyTooltip(ItemStack stack, List tooltip) { IEnergyStorage energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) { - String stored; String max; if (energyStorage instanceof CustomEnergyStorage storage) { diff --git a/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java b/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java index 06f9c9b..bc9fe06 100644 --- a/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java +++ b/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java @@ -1,223 +1,92 @@ package se.gory_moon.chargers.block; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.DataIngredient; -import com.tterrag.registrate.util.entry.BlockEntry; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.item.Rarity; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MapColor; -import net.minecraftforge.common.Tags; -import se.gory_moon.chargers.ChargersMod; -import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; -import se.gory_moon.chargers.crafting.UpgradeChargerRecipeBuilder; -import se.gory_moon.chargers.item.ChargerBlockItem; -import se.gory_moon.chargers.item.ItemRegistry; -import se.gory_moon.chargers.item.WirelessChargerBlockItem; - -import static se.gory_moon.chargers.Constants.*; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import se.gory_moon.chargers.Constants; public final class BlockRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Constants.MOD_ID); + public static final DeferredRegister> BLOCK_TYPES = DeferredRegister.create(BuiltInRegistries.BLOCK_TYPE, Constants.MOD_ID); - public static final BlockEntry CHARGER_BLOCK_T1 = REGISTRATE.object(CHARGER_T1_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T1_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T1 = BLOCKS.registerBlock( + Constants.CHARGER_T1_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.I, properties), + Block.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_GRAY) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_1", - provider.modLoc("block/charger_tier_1_side"), - provider.modLoc("block/charger_tier_1"), - provider.modLoc("block/charger_tier_1_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.COMMON)) - .recipe((context, provider) -> { - DataIngredient iron = DataIngredient.tag(Tags.Items.INGOTS_IRON); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - - var builder = ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, context.get()) - .define('I', iron) - .define('R', redstone) - .define('B', redstoneBlock); - builder.pattern("IRI").pattern("IBI").pattern("IRI"); - builder.unlockedBy("has_" + provider.safeName(iron), iron.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstone), redstone.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstoneBlock), redstoneBlock.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_T2 = REGISTRATE.object(CHARGER_T2_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T2_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T2 = BLOCKS.registerBlock( + Constants.CHARGER_T2_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.II, properties), + BlockBehaviour.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.GOLD) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_2", - provider.modLoc("block/charger_tier_2_side"), - provider.modLoc("block/charger_tier_2"), - provider.modLoc("block/charger_tier_2_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .recipe((context, provider) -> { - DataIngredient gold = DataIngredient.tag(Tags.Items.INGOTS_GOLD); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t1 = DataIngredient.items(ItemRegistry.CHARGER_T1_ITEM.get()); - - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('G', gold) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t1); - builder.pattern("GRG").pattern("GBG").pattern("GCG"); - builder.unlockedBy("has_" + provider.safeName(charger_t1), charger_t1.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_T3 = REGISTRATE.object(CHARGER_T3_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T3_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T3 = BLOCKS.registerBlock( + Constants.CHARGER_T3_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.III, properties), + Block.Properties.of() .strength(10, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_CYAN) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_IRON_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_3", - provider.modLoc("block/charger_tier_3_side"), - provider.modLoc("block/charger_tier_3"), - provider.modLoc("block/charger_tier_3_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.RARE)) - .recipe((context, provider) -> { - DataIngredient diamond = DataIngredient.tag(Tags.Items.GEMS_DIAMOND); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t2 = DataIngredient.items(ItemRegistry.CHARGER_T2_ITEM.get()); + .requiresCorrectToolForDrops() + ); - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('D', diamond) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t2); - builder.pattern("DRD").pattern("DBD").pattern("DCD"); - builder.unlockedBy("has_" + provider.safeName(charger_t2), charger_t2.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); - - public static final BlockEntry CHARGER_BLOCK_T4 = REGISTRATE.object(CHARGER_T4_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T4_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T4 = BLOCKS.registerBlock( + Constants.CHARGER_T4_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.IV, properties), + BlockBehaviour.Properties.of() .strength(30, 1200) .sound(SoundType.NETHERITE_BLOCK) .mapColor(MapColor.COLOR_BLACK) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_DIAMOND_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_4", - provider.modLoc("block/charger_tier_4_side"), - provider.modLoc("block/charger_tier_4"), - provider.modLoc("block/charger_tier_4_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.EPIC)) - .recipe((context, provider) -> { - DataIngredient netherite = DataIngredient.tag(Tags.Items.INGOTS_NETHERITE); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t3 = DataIngredient.items(ItemRegistry.CHARGER_T3_ITEM.get()); - - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('N', netherite) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t3); - builder.pattern("NRN").pattern("NBN").pattern("NCN"); - builder.unlockedBy("has_" + provider.safeName(charger_t3), charger_t3.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_CREATIVE = REGISTRATE.object(CHARGER_CREATIVE_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_CREATIVE_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_CREATIVE = BLOCKS.registerBlock( + Constants.CHARGER_CREATIVE_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.C, properties), + BlockBehaviour.Properties.of() .strength(50, 1200) .sound(SoundType.NETHERITE_BLOCK) .mapColor(MapColor.COLOR_PURPLE) - .requiresCorrectToolForDrops()) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("creative_charger", - provider.modLoc("block/charger_creative_side"), - provider.modLoc("block/charger_creative"), - provider.modLoc("block/charger_creative_top")))) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_DIAMOND_TOOL) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.EPIC)) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry WIRELESS_CHARGER = REGISTRATE.object(WIRELESS_CHARGER_BLOCK) - .block(WirelessChargerBlock::new) - .simpleBlockEntity(WirelessChargerBlockEntity::new) - .lang(WIRELESS_CHARGER_NAME) - .properties(properties -> properties + public static final DeferredBlock WIRELESS_CHARGER = BLOCKS.registerBlock( + Constants.WIRELESS_CHARGER_BLOCK, + WirelessChargerBlock::new, + BlockBehaviour.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_GRAY) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE) - .blockstate((ctx, provider) -> provider.getVariantBuilder(ctx.get()) - .partialState().with(WirelessChargerBlock.POWERED, false) - .modelForState().modelFile(provider.models().cubeAll("wireless_charger_disabled", provider.modLoc("block/wireless_charger_disabled"))).addModel() - .partialState().with(WirelessChargerBlock.POWERED, true) - .modelForState().modelFile(provider.models().cubeAll("wireless_charger_enabled", provider.modLoc("block/wireless_charger_enabled"))).addModel() - ) - .item(WirelessChargerBlockItem::new) - .model((context, provider) -> provider.blockItem(() -> context.get().getBlock(), "_disabled")) - .recipe((context, provider) -> { - DataIngredient iron = DataIngredient.tag(Tags.Items.INGOTS_IRON); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient enderPearls = DataIngredient.tag(Tags.Items.ENDER_PEARLS); - - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, context.get()) - .define('I', iron) - .define('R', redstone) - .define('B', redstoneBlock) - .define('E', enderPearls); - builder.pattern("IEI").pattern("IBI").pattern("IRI"); - builder.unlockedBy("has_" + provider.safeName(enderPearls), enderPearls.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(iron), iron.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstone), redstone.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstoneBlock), redstoneBlock.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); - - - private BlockRegistry() {} - - public static void init() {} + .requiresCorrectToolForDrops() + ); + + public static final DeferredHolder, MapCodec> CHARGER_CODEC = BLOCK_TYPES.register( + Constants.CHARGER_BLOCK, + () -> RecordCodecBuilder.mapCodec(instance -> + instance.group( + ChargerBlock.Tier.CODEC.fieldOf("tier").forGetter(ChargerBlock::getTier), + BlockBehaviour.propertiesCodec() + ).apply(instance, ChargerBlock::new)) + ); + + public static final DeferredHolder, MapCodec> WIRELESS_CHARGER_CODEC = BLOCK_TYPES.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> BlockBehaviour.simpleCodec(WirelessChargerBlock::new) + ); } diff --git a/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java b/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java index 7828b16..30fc365 100644 --- a/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java @@ -1,48 +1,52 @@ package se.gory_moon.chargers.block; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.util.StringRepresentable; import net.minecraft.world.Containers; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.util.NonNullSupplier; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.block.entity.ChargerBlockEntity; import javax.annotation.Nullable; +import java.util.function.Supplier; public class ChargerBlock extends EnergyBlock { - public ChargerBlock(Block.Properties properties) { + private final Tier tier; + + public ChargerBlock(Tier tier, Block.Properties properties) { super(properties); + this.tier = tier; + } + + @Override + protected @NotNull MapCodec codec() { + return BlockRegistry.CHARGER_CODEC.value(); } @Override - public @NotNull InteractionResult use(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult result) { + public @NotNull InteractionResult useWithoutItem(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull BlockHitResult result) { if (level.isClientSide) return InteractionResult.SUCCESS; - BlockEntity blockEntity = level.getBlockEntity(pos); - if (blockEntity instanceof ChargerBlockEntity) { - if (player.isShiftKeyDown()) - return InteractionResult.FAIL; - - player.openMenu((ChargerBlockEntity) blockEntity); - } - - return InteractionResult.SUCCESS; + player.openMenu(state.getMenuProvider(level, pos)); + return InteractionResult.CONSUME; } @Override @@ -50,8 +54,9 @@ public void onRemove(@NotNull BlockState state, Level level, @NotNull BlockPos p if (!level.isClientSide) { BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof ChargerBlockEntity chargerEntity) { - for(int i = 0; i < chargerEntity.inventoryHandler.getSlots(); ++i) { - ItemStack stack = chargerEntity.inventoryHandler.getStackInSlot(i); + var inventoryHandler = chargerEntity.getInventoryHandler(); + for(int i = 0; i < inventoryHandler.getSlots(); ++i) { + ItemStack stack = inventoryHandler.getStackInSlot(i); if (!stack.isEmpty()) Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), stack); } @@ -62,7 +67,7 @@ public void onRemove(@NotNull BlockState state, Level level, @NotNull BlockPos p @Override public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - if (stack.hasCustomHoverName()) { + if (stack.has(DataComponents.CUSTOM_NAME)) { BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof ChargerBlockEntity) { ((ChargerBlockEntity)blockEntity).setCustomName(stack.getHoverName()); @@ -71,36 +76,41 @@ public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull Bl super.setPlacedBy(level, pos, state, placer, stack); } - @Nullable @Override - public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { - ChargerBlockEntity charger = BlockEntityRegistry.CHARGER_BE.create(pos, state); - charger.setTier(Tier.byBlock(this)); - return charger; + public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { + return createEnergyTicker(level, type, BlockEntityRegistry.CHARGER_BE.get()); } @Nullable @Override - public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { - return createEnergyTicker(level, type, BlockEntityRegistry.CHARGER_BE.get()); + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return new ChargerBlockEntity(pos, state, tier); + } + + public Tier getTier() { + return tier; } - public enum Tier { - I(0, () -> Configs.SERVER.tier1), - II(1, () -> Configs.SERVER.tier2), - III(2, () -> Configs.SERVER.tier3), - IV(3, () -> Configs.SERVER.tier4), - C(4, () -> Configs.SERVER.tier4); + public enum Tier implements StringRepresentable { + I(0, "tier_1", () -> Configs.SERVER.tier1), + II(1, "tier_2", () -> Configs.SERVER.tier2), + III(2, "tier_3", () -> Configs.SERVER.tier3), + IV(3, "tier_4", () -> Configs.SERVER.tier4), + C(4, "creative", () -> Configs.SERVER.tier4); private final int id; - private final NonNullSupplier tierSupplier; + private final String name; + private final Supplier tierSupplier; @Nullable private Configs.Server.Tier tier = null; private static final ChargerBlock.Tier[] ID_LOOKUP = new ChargerBlock.Tier[values().length]; - Tier(int id, NonNullSupplier tierSupplier) { + public static final Codec CODEC = StringRepresentable.fromEnum(Tier::values); + + Tier(int id, String name, Supplier tierSupplier) { this.id = id; + this.name = name; this.tierSupplier = tierSupplier; } @@ -113,23 +123,28 @@ public boolean isCreative() { } public long getStorage() { - return getTier().storage.get(); + return getTierConfig().storage.get(); } public long getMaxIn() { - return getTier().maxInput.get(); + return getTierConfig().maxInput.get(); } public long getMaxOut() { - return getTier().maxOutput.get(); + return getTierConfig().maxOutput.get(); } - private Configs.Server.Tier getTier() { + private Configs.Server.Tier getTierConfig() { if (tier == null) tier = tierSupplier.get(); return tier; } + @Override + public @NotNull String getSerializedName() { + return name; + } + public static Tier byID(int id) { if (id < 0 || id >= ID_LOOKUP.length) { id = 0; @@ -138,23 +153,6 @@ public static Tier byID(int id) { return ID_LOOKUP[id]; } - public static Tier byItem(BlockItem item) { - return byBlock(item.getBlock()); - } - - public static Tier byBlock(Block block) { - if (BlockRegistry.CHARGER_BLOCK_T2.is(block)) - return Tier.II; - else if (BlockRegistry.CHARGER_BLOCK_T3.is(block)) - return Tier.III; - else if (BlockRegistry.CHARGER_BLOCK_T4.is(block)) - return Tier.IV; - else if (BlockRegistry.CHARGER_BLOCK_CREATIVE.is(block)) - return Tier.C; - - return Tier.I; - } - static { for (Tier tier : values()) { ID_LOOKUP[tier.getId()] = tier; diff --git a/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java b/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java index c325c8c..0a09b95 100644 --- a/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java @@ -12,12 +12,12 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.block.entity.EnergyHolderBlockEntity; import se.gory_moon.chargers.item.ChargerBlockItem; +import se.gory_moon.chargers.item.ChargerDataComponents; import se.gory_moon.chargers.item.WirelessChargerBlockItem; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -44,7 +44,7 @@ public void playerDestroy(Level level, @NotNull Player player, @NotNull BlockPos ItemStack drop = new ItemStack(this, 1); if (entity instanceof EnergyHolderBlockEntity energyBlock && energyBlock.getStorage() != null) { - drop.getOrCreateTag().putLong(CustomEnergyStorage.ENERGY_TAG, energyBlock.getStorage().getLongEnergyStored()); + drop.set(ChargerDataComponents.ENERGY, energyBlock.getStorage().getLongEnergyStored()); } popResource(level, pos, drop); @@ -53,16 +53,14 @@ public void playerDestroy(Level level, @NotNull Player player, @NotNull BlockPos @Override public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - if ((stack.getItem() instanceof WirelessChargerBlockItem || stack.getItem() instanceof ChargerBlockItem) && stack.getCapability(ForgeCapabilities.ENERGY).isPresent()) { + if ((stack.getItem() instanceof WirelessChargerBlockItem || stack.getItem() instanceof ChargerBlockItem) && stack.getCapability(Capabilities.EnergyStorage.ITEM) != null) { BlockEntity blockEntity = level.getBlockEntity(pos); - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); + IEnergyStorage storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); - if (blockEntity instanceof EnergyHolderBlockEntity energyHolderBlock) { - capability.ifPresent(energyStorage -> { - if (energyStorage instanceof CustomEnergyStorage && energyHolderBlock.getStorage() != null) { - energyHolderBlock.getStorage().deserializeNBT(((CustomEnergyStorage) energyStorage).serializeNBT()); - } - }); + if (blockEntity instanceof EnergyHolderBlockEntity energyHolderBlock && + storage instanceof CustomEnergyStorage customEnergyStorage && + energyHolderBlock.getStorage() != null) { + energyHolderBlock.getStorage().deserializeNBT(level.registryAccess(), customEnergyStorage.serializeNBT(level.registryAccess())); } } } diff --git a/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java b/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java index c75f689..da2ea41 100644 --- a/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java @@ -1,13 +1,14 @@ package se.gory_moon.chargers.block; +import com.mojang.serialization.MapCodec; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -26,6 +27,11 @@ public class WirelessChargerBlock extends EnergyBlock { + @Override + protected @NotNull MapCodec codec() { + return BlockRegistry.WIRELESS_CHARGER_CODEC.value(); + } + public static BooleanProperty POWERED = BooleanProperty.create("powered"); public WirelessChargerBlock(Block.Properties properties) { @@ -34,7 +40,7 @@ public WirelessChargerBlock(Block.Properties properties) { } @Override - public InteractionResult use(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult result) { + public @NotNull InteractionResult useWithoutItem(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull BlockHitResult result) { if (level.isClientSide) return InteractionResult.SUCCESS; @@ -65,13 +71,13 @@ protected void createBlockStateDefinition(StateDefinition.Builder BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { return createEnergyTicker(level, type, BlockEntityRegistry.WIRELESS_CHARGER_BE.get()); } } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java b/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java index e9cd5ca..0449735 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java @@ -1,32 +1,41 @@ package se.gory_moon.chargers.block.entity; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.entry.BlockEntityEntry; -import com.tterrag.registrate.util.entry.MenuEntry; -import net.minecraftforge.registries.ForgeRegistries; -import se.gory_moon.chargers.ChargersMod; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; -import se.gory_moon.chargers.client.ChargerScreen; +import se.gory_moon.chargers.block.BlockRegistry; import se.gory_moon.chargers.inventory.ChargerMenu; -import static se.gory_moon.chargers.Constants.CHARGER_BLOCK_ENTITY; -import static se.gory_moon.chargers.Constants.WIRELESS_CHARGER_BLOCK_ENTITY; -import static se.gory_moon.chargers.block.BlockRegistry.*; +import java.util.function.Supplier; public final class BlockEntityRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); + public static final DeferredRegister> BlOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, Constants.MOD_ID); + public static final DeferredRegister> MENU_TYPES = DeferredRegister.create(BuiltInRegistries.MENU, Constants.MOD_ID); - public static final BlockEntityEntry CHARGER_BE = REGISTRATE.object(CHARGER_BLOCK_ENTITY) - .blockEntity(ChargerBlockEntity::new) - .validBlocks(CHARGER_BLOCK_T1, CHARGER_BLOCK_T2, CHARGER_BLOCK_T3, CHARGER_BLOCK_T4, CHARGER_BLOCK_CREATIVE) - .register(); + public static final Supplier> CHARGER_BE = BlOCK_ENTITIES.register( + Constants.CHARGER_BLOCK, + () -> BlockEntityType.Builder.of( + ChargerBlockEntity::new, + BlockRegistry.CHARGER_BLOCK_T1.get(), + BlockRegistry.CHARGER_BLOCK_T2.get(), + BlockRegistry.CHARGER_BLOCK_T3.get(), + BlockRegistry.CHARGER_BLOCK_T4.get(), + BlockRegistry.CHARGER_BLOCK_CREATIVE.get() + ).build(null)); - public static final BlockEntityEntry WIRELESS_CHARGER_BE = BlockEntityEntry.cast(REGISTRATE.get(WIRELESS_CHARGER_BLOCK_ENTITY, ForgeRegistries.Keys.BLOCK_ENTITY_TYPES)); + public static final Supplier> WIRELESS_CHARGER_BE = BlOCK_ENTITIES.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> BlockEntityType.Builder.of( + WirelessChargerBlockEntity::new, + BlockRegistry.WIRELESS_CHARGER.get() + ).build(null) + ); - public static final MenuEntry CHARGER_CONTAINER = REGISTRATE.object(Constants.CHARGER_CONTAINER) - .menu(ChargerMenu::new, () -> ChargerScreen::new) - .register(); + public static final Supplier> CHARGER_CONTAINER = MENU_TYPES.register( + Constants.CHARGER_BLOCK, + () -> new MenuType<>(ChargerMenu::new, FeatureFlags.DEFAULT_FLAGS)); - private BlockEntityRegistry() {} - public static void init() {} } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java index fbcefa8..a25aac7 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java @@ -1,7 +1,7 @@ package se.gory_moon.chargers.block.entity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -12,11 +12,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import se.gory_moon.chargers.block.ChargerBlock; @@ -33,15 +29,19 @@ public class ChargerBlockEntity extends EnergyHolderBlockEntity implements Namea public static final int OUTPUT_SLOT = 1; public static final int CHARGE_SLOT = 2; - public ChargerItemStackHandler inventoryHandler; - private final LazyOptional lazyInventory = LazyOptional.of(() -> inventoryHandler); + private final ChargerItemStackHandler inventoryHandler; private ChargerBlock.Tier tier = ChargerBlock.Tier.I; @Nullable private Component customName; - public ChargerBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { - super(blockEntityType, pos, state); + public ChargerBlockEntity(BlockPos pos, BlockState state, ChargerBlock.Tier tier) { + this(pos, state); + setTier(tier); + } + + public ChargerBlockEntity(BlockPos pos, BlockState state) { + super(BlockEntityRegistry.CHARGER_BE.get(), pos, state); inventoryHandler = new ChargerItemStackHandler() { @Override protected void onContentsChanged(int slot) { @@ -50,6 +50,10 @@ protected void onContentsChanged(int slot) { }; } + public ChargerItemStackHandler getInventoryHandler() { + return inventoryHandler; + } + public void setTier(ChargerBlock.Tier tier) { this.tier = tier; setStorage(new CustomEnergyStorage(tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative())); @@ -85,30 +89,22 @@ public void tickServer() { } @Override - public void load(@NotNull CompoundTag compound) { - inventoryHandler.deserializeNBT(compound.getCompound(INVENTORY_TAG)); + public void loadAdditional(@NotNull CompoundTag compound, @NotNull HolderLookup.Provider registries) { + inventoryHandler.deserializeNBT(registries, compound.getCompound(INVENTORY_TAG)); setTier(ChargerBlock.Tier.byID(compound.getInt(TIER_TAG))); if (compound.contains(CUSTOM_NAME_TAG, Tag.TAG_STRING)) - this.customName = Component.Serializer.fromJson(compound.getString(CUSTOM_NAME_TAG)); + this.customName = Component.Serializer.fromJson(compound.getString(CUSTOM_NAME_TAG), registries); - super.load(compound); + super.loadAdditional(compound, registries); } @Override - protected void saveAdditional(@NotNull CompoundTag tag) { - super.saveAdditional(tag); - tag.put(INVENTORY_TAG, inventoryHandler.serializeNBT()); + protected void saveAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + tag.put(INVENTORY_TAG, inventoryHandler.serializeNBT(registries)); tag.putInt(TIER_TAG, tier.getId()); if (this.customName != null) - tag.putString(CUSTOM_NAME_TAG, Component.Serializer.toJson(this.customName)); - } - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER) - return lazyInventory.cast(); - return super.getCapability(cap, side); + tag.putString(CUSTOM_NAME_TAG, Component.Serializer.toJson(this.customName, registries)); } public void setCustomName(@Nullable Component name) { @@ -144,6 +140,6 @@ public Component getCustomName() { @Nullable @Override public AbstractContainerMenu createMenu(int containerId, @NotNull Inventory playerInventory, @NotNull Player playerEntity) { - return new ChargerMenu(BlockEntityRegistry.CHARGER_CONTAINER.get(), containerId, playerInventory, inventoryHandler, energyData, ContainerLevelAccess.create(getLevel(), getBlockPos())); + return new ChargerMenu(containerId, playerInventory, inventoryHandler, energyData, ContainerLevelAccess.create(getLevel(), getBlockPos())); } } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java b/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java index d228faa..37b4c1a 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java @@ -2,10 +2,8 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.items.ItemStackHandler; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.ItemStackHandler; import javax.annotation.Nonnull; @@ -29,11 +27,11 @@ public int getSlotLimit(int slot) { @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { if (!stack.isEmpty()) { - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); + var storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); if (slot == 0) { - return capability.map(energyStorage -> energyStorage.receiveEnergy(1, true)).orElse(0) > 0; + return (storage != null ? storage.receiveEnergy(1, true) : 0) > 0; } else if (slot == 2) { - return capability.map(energyStorage -> energyStorage.extractEnergy(1, true)).orElse(0) > 0; + return (storage != null ? storage.extractEnergy(1, true) : 0) > 0; } } return false; @@ -54,8 +52,8 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { if (slot == 0) return ItemStack.EMPTY; if (slot == 2) { - LazyOptional capability = getStackInSlot(2).getCapability(ForgeCapabilities.ENERGY); - if (capability.map(energyStorage -> energyStorage.extractEnergy(1, true)).orElse(0) > 0) + var storage = getStackInSlot(2).getCapability(Capabilities.EnergyStorage.ITEM); + if ((storage != null ? storage.extractEnergy(1, true) : 0) > 0) return ItemStack.EMPTY; } return super.extractItem(slot, amount, simulate); diff --git a/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java index 9e7c24e..c750958 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java @@ -2,20 +2,17 @@ import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.capabilities.ItemCapability; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat; import se.gory_moon.chargers.compat.fn.FluxNetworksCompat; import se.gory_moon.chargers.inventory.ChargerData; @@ -30,9 +27,8 @@ public abstract class EnergyHolderBlockEntity extends BlockEntity { @Nullable private CustomEnergyStorage storage = null; - private LazyOptional lazyStorage = LazyOptional.of(() -> storage); - private final Map, Pair>> compatWrappers = new HashMap<>(); + private final Map, Pair> compatWrappers = new HashMap<>(); protected final ChargerData energyData = new ChargerData() { public long get(int index) { @@ -62,8 +58,6 @@ public EnergyHolderBlockEntity(BlockEntityType blockEntityType, BlockPos pos, public void setStorage(CustomEnergyStorage storage) { this.storage = storage; - lazyStorage.invalidate(); - lazyStorage = LazyOptional.of(() -> storage); if (BrandonsCoreCompat.INSTANCE.isLoaded()) { BrandonsCoreCompat.INSTANCE.createOpWrapper(storage, compatWrappers); @@ -72,17 +66,8 @@ public void setStorage(CustomEnergyStorage storage) { if (FluxNetworksCompat.INSTANCE.isLoaded()) { FluxNetworksCompat.INSTANCE.createFNWrapper(storage, compatWrappers); } - } - @Override - public void invalidateCaps() { - if (lazyStorage != null) - lazyStorage.invalidate(); - lazyStorage = null; - compatWrappers.forEach((capability, lazyOptionalPair) -> lazyOptionalPair.second().invalidate()); - compatWrappers.clear(); - - super.invalidateCaps(); + invalidateCapabilities(); } @Nullable @@ -96,17 +81,17 @@ public void tickServer() { } @Override - public void load(@NotNull CompoundTag compound) { - super.load(compound); + public void loadAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); if (storage != null) - storage.deserializeNBT(compound.getCompound(STORAGE_TAG)); + storage.deserializeNBT(registries, tag.getCompound(STORAGE_TAG)); } @Override - protected void saveAdditional(@NotNull CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); if (storage != null) - tag.put(STORAGE_TAG, storage.serializeNBT()); + tag.put(STORAGE_TAG, storage.serializeNBT(registries)); } @Nullable @@ -116,24 +101,11 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { } @Override - public @NotNull CompoundTag getUpdateTag() { - return saveWithoutMetadata(); - } - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - - if (BrandonsCoreCompat.INSTANCE.isOpCapability(cap)) - return compatWrappers.get(cap).second().cast(); - - if (FluxNetworksCompat.INSTANCE.isOpCapability(cap)) - return compatWrappers.get(cap).second().cast(); - - if (cap == ForgeCapabilities.ENERGY) - return lazyStorage.cast(); - - return super.getCapability(cap, side); + public @NotNull CompoundTag getUpdateTag(@NotNull HolderLookup.Provider registries) { + CompoundTag tag = new CompoundTag(); + saveAdditional(tag, registries); + return tag; + //return saveWithoutMetadata(registries); } public static void tickServer(Level level, BlockPos pos, BlockState state, EnergyHolderBlockEntity blockEntity) { diff --git a/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java index bade112..11de68e 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java @@ -4,9 +4,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.network.PacketDistributor; import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.block.WirelessChargerBlock; import se.gory_moon.chargers.compat.ChargeCompat; @@ -21,8 +19,8 @@ public class WirelessChargerBlockEntity extends EnergyHolderBlockEntity { private long lastPowered = -1; private long availableEnergy; - public WirelessChargerBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { - super(blockEntityType, pos, state); + public WirelessChargerBlockEntity(BlockPos pos, BlockState state) { + super(BlockEntityRegistry.WIRELESS_CHARGER_BE.get(), pos, state); setStorage(new CustomEnergyStorage( Configs.SERVER.wireless.storage.get(), Configs.SERVER.wireless.maxInput.get(), @@ -67,7 +65,7 @@ public void tickServer() { super.tickServer(); if (getStorage() != null && (lastPowered == -1 || (lastPowered == 0 && getStorage().getLongEnergyStored() > 0) || (lastPowered > 0 && getStorage().getLongEnergyStored() == 0))) { if (!level.isClientSide) { - PacketDistributor.TRACKING_CHUNK.with(() -> getLevel().getChunkAt(getBlockPos())).send(getUpdatePacket()); + getLevel().sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), WirelessChargerBlock.UPDATE_CLIENTS); } lastPowered = getStorage().getLongEnergyStored(); setChanged(); @@ -100,7 +98,6 @@ public boolean canCharge() { } public boolean isPowered() { - //noinspection deprecation return getLevel() != null && getLevel().isAreaLoaded(getBlockPos(), 1) && getLevel().getBestNeighborSignal(getBlockPos()) > 0; } diff --git a/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java b/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java index 6ee18bd..efa61c1 100644 --- a/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java +++ b/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java @@ -19,7 +19,7 @@ public class ChargerScreen extends AbstractContainerScreen { - private static final ResourceLocation CHARGER_GUI_TEXTURE = new ResourceLocation(Constants.MOD_ID, "textures/gui/charger.png"); + private static final ResourceLocation CHARGER_GUI_TEXTURE = ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "textures/gui/charger.png"); public ChargerScreen(ChargerMenu container, Inventory playerInventory, Component title) { super(container, playerInventory, title); @@ -36,7 +36,7 @@ protected void init() { @Override public void render(@NotNull GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { - this.renderBackground(graphics); + this.renderBackground(graphics, pMouseX, pMouseY, pPartialTick); super.render(graphics, pMouseX, pMouseY, pPartialTick); if (pMouseX >= leftPos + 44 && pMouseX <= leftPos + 44 + 16 && pMouseY >= topPos + 14 && pMouseY <= topPos + 84) { diff --git a/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java b/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java index 1f3ac1a..ca20c1e 100644 --- a/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java @@ -1,6 +1,7 @@ package se.gory_moon.chargers.compat; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.energy.IEnergyStorage; import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat; import se.gory_moon.chargers.compat.industrial.IndustrialForegoingCompat; @@ -32,16 +33,16 @@ private int cap(long value) { * @param callback A callback that is called when the */ public void dischargeItem(ItemStack stack, CustomEnergyStorage blockStorage, Runnable callback) { - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); - capability.ifPresent(energyStorage -> { + IEnergyStorage storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { long extractAmount = Math.min(blockStorage.getLongMaxEnergyStored() - blockStorage.getLongEnergyStored(), blockStorage.getMaxInput()); - long transferred = extractAmount(energyStorage, extractAmount); + long transferred = extractAmount(storage, extractAmount); if (transferred > 0) { blockStorage.receiveLongEnergy(transferred, false); callback.run(); } - }); + } } /** @@ -70,19 +71,19 @@ public boolean chargeItem(ItemStack stack, CustomEnergyStorage blockStorage, Con public boolean chargeItem(ItemStack stack, CustomEnergyStorage blockStorage, long overrideTransfer, Consumer transferredCallback) { AtomicBoolean charged = new AtomicBoolean(false); - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); - capability.ifPresent(itemStorage -> { + IEnergyStorage storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { var transferRequest = overrideTransfer; if (transferRequest < 0) transferRequest = blockStorage.extractLongEnergy(blockStorage.getLongMaxEnergyStored(), true); - var transferred = receiveAmount(itemStorage, transferRequest); + var transferred = receiveAmount(storage, transferRequest); if (transferred > 0) { transferredCallback.accept(transferred); } - charged.set(isStorageFull(itemStorage)); - }); + charged.set(isStorageFull(storage)); + } return charged.get(); } diff --git a/src/main/java/se/gory_moon/chargers/compat/Curios.java b/src/main/java/se/gory_moon/chargers/compat/Curios.java index dbbc965..d034d25 100644 --- a/src/main/java/se/gory_moon/chargers/compat/Curios.java +++ b/src/main/java/se/gory_moon/chargers/compat/Curios.java @@ -9,7 +9,6 @@ import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; diff --git a/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java b/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java index 4f376e6..51a661e 100644 --- a/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java @@ -1,9 +1,9 @@ package se.gory_moon.chargers.compat.bc; -import com.brandon3055.brandonscore.api.power.IOPStorage; -import com.brandon3055.brandonscore.capability.CapabilityOP; import it.unimi.dsi.fastutil.Pair; import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.ItemCapability; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -36,9 +36,9 @@ public boolean isLoaded() { * @return The amount that was successfully extracted, or empty if the storage wasn't an IOPStorage */ public Optional extractAmount(IEnergyStorage storage, long extractAmount) { - if (storage instanceof IOPStorage opStorage) { + /* if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.extractOP(extractAmount, false)); - } + }*/ return Optional.empty(); } @@ -50,9 +50,9 @@ public Optional extractAmount(IEnergyStorage storage, long extractAmount) * @return The amount that was successfully inserted, or empty if the storage wasn't an IOPStorage */ public Optional receiveAmount(IEnergyStorage storage, long receiveAmount) { - if (storage instanceof IOPStorage opStorage) { + /*if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.receiveOP(receiveAmount, false)); - } + }*/ return Optional.empty(); } @@ -63,25 +63,21 @@ public Optional receiveAmount(IEnergyStorage storage, long receiveAmount) * @return If the storage is full or not, or empty if the storage wasn't an IOPStorage */ public Optional isStorageFull(IEnergyStorage storage) { - if (storage instanceof IOPStorage opStorage) { + /*if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.getOPStored() >= opStorage.getMaxOPStored()); - } + }*/ return Optional.empty(); } /** - * Checks if BrandonsCore is loaded and that the provided capability is an OP cap + * Registers the OP cap to the different chargers * - * @param cap The cap to check - * @param The cap type - * @return If the provided cap is a OP cap + * @param event The event used to register capabilities */ - public boolean isOpCapability(@NotNull Capability cap) { + public void registerOPCapability(@NotNull RegisterCapabilitiesEvent event) { if (loaded) { - return cap == CapabilityOP.OP; + // TODO } - - return false; } /** @@ -90,11 +86,11 @@ public boolean isOpCapability(@NotNull Capability cap) { * @param storage The storage to wrap * @param compatWrappers The map holding the wrappers */ - public void createOpWrapper(CustomEnergyStorage storage, Map, Pair>> compatWrappers) { - if (compatWrappers.containsKey(CapabilityOP.OP)) { + public void createOpWrapper(CustomEnergyStorage storage, Map, Pair> compatWrappers) { + /*if (compatWrappers.containsKey(CapabilityOP.OP)) { compatWrappers.get(CapabilityOP.OP).second().invalidate(); } var opWrapper = new OpStorageWrapper(storage); - compatWrappers.put(CapabilityOP.OP, Pair.of(opWrapper, LazyOptional.of(() -> opWrapper))); + compatWrappers.put(CapabilityOP.OP, Pair.of(opWrapper, LazyOptional.of(() -> opWrapper)));*/ } } diff --git a/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java b/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java index 84f3f7c..af68d7b 100644 --- a/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java @@ -2,6 +2,8 @@ import it.unimi.dsi.fastutil.Pair; import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.ItemCapability; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -27,18 +29,14 @@ public boolean isLoaded() { } /** - * Checks if Flux Networks is loaded and that the provided capability is an FNEnergy cap + * Registers the FNEnergy cap to the different chargers * - * @param cap The cap to check - * @param The cap type - * @return If the provided cap is a FNEnergy cap + * @param event The event used to register capabilities */ - public boolean isOpCapability(@NotNull Capability cap) { + public void registerFNCapability(@NotNull RegisterCapabilitiesEvent event) { if (loaded) { - return cap == FluxCapabilities.FN_ENERGY_STORAGE; + // TODO } - - return false; } /** @@ -47,11 +45,11 @@ public boolean isOpCapability(@NotNull Capability cap) { * @param storage The storage to wrap * @param compatWrappers The map holding the wrappers */ - public void createFNWrapper(CustomEnergyStorage storage, Map, Pair>> compatWrappers) { - if (compatWrappers.containsKey(FluxCapabilities.FN_ENERGY_STORAGE)) { + public void createFNWrapper(CustomEnergyStorage storage, Map, Pair> compatWrappers) { + /*if (compatWrappers.containsKey(FluxCapabilities.FN_ENERGY_STORAGE)) { compatWrappers.get(FluxCapabilities.FN_ENERGY_STORAGE).second().invalidate(); } var fnWrapper = new FNStorageWrapper(storage); - compatWrappers.put(FluxCapabilities.FN_ENERGY_STORAGE, Pair.of(fnWrapper, LazyOptional.of(() -> fnWrapper))); + compatWrappers.put(FluxCapabilities.FN_ENERGY_STORAGE, Pair.of(fnWrapper, LazyOptional.of(() -> fnWrapper)));*/ } } diff --git a/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java b/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java index 5e328fd..ae72b53 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java +++ b/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java @@ -1,14 +1,16 @@ package se.gory_moon.chargers.crafting; +import net.minecraft.core.registries.Registries; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; public class RecipeSerializers { - public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, Constants.MOD_ID); + public static final DeferredRegister> RECIPE_SERIALIZER = DeferredRegister.create(Registries.RECIPE_SERIALIZER, Constants.MOD_ID); - public static final RegistryObject UPGRADE_SERIALIZER = RECIPE_SERIALIZERS.register("upgrade_charger", UpgradeChargerRecipeSerializer::new); + public static final DeferredHolder, UpgradeChargerRecipeSerializer> UPGRADE_SERIALIZER = RECIPE_SERIALIZER.register( + "upgrade_charger", + UpgradeChargerRecipeSerializer::new); } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java index 127d8ac..ce736e5 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java @@ -1,15 +1,9 @@ package se.gory_moon.chargers.crafting; -import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.core.HolderLookup; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraft.world.item.crafting.*; +import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.item.ChargerBlockItem; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -17,8 +11,8 @@ import java.util.concurrent.atomic.AtomicLong; public class UpgradeChargerRecipe extends ShapedRecipe { - public UpgradeChargerRecipe(ResourceLocation id, String group, CraftingBookCategory category, int width, int height, NonNullList ingredients, ItemStack output) { - super(id, group, category, width, height, ingredients, output); + public UpgradeChargerRecipe(String group, CraftingBookCategory category, ShapedRecipePattern pattern, ItemStack output, boolean showNotification) { + super(group, category, pattern, output, showNotification); } @Override @@ -27,31 +21,35 @@ public UpgradeChargerRecipe(ResourceLocation id, String group, CraftingBookCateg } @Override - public @NotNull ItemStack assemble(@NotNull CraftingContainer inv, @NotNull RegistryAccess access) { - var out = getResultItem(access).copy(); + public @NotNull ItemStack assemble(@NotNull CraftingInput input, HolderLookup.@NotNull Provider registries) { + var out = getResultItem(registries).copy(); if (out.getItem() instanceof ChargerBlockItem) { AtomicLong energy = new AtomicLong(); - for (int i = 0; i < inv.getContainerSize(); i++) { - ItemStack item = inv.getItem(i); - if (!item.isEmpty() && item.getItem() instanceof ChargerBlockItem) - item.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(storage -> { + for (int i = 0; i < input.size(); i++) { + ItemStack item = input.getItem(i); + if (!item.isEmpty() && item.getItem() instanceof ChargerBlockItem) { + var storage = item.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { if (storage instanceof CustomEnergyStorage customEnergyStorage) energy.addAndGet(customEnergyStorage.getLongEnergyStored()); else energy.addAndGet(storage.getEnergyStored()); - }); + } + } } - out.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(storage -> - out.getOrCreateTag().putLong(CustomEnergyStorage.ENERGY_TAG, Math.min(energy.get(), ((CustomEnergyStorage) storage).getLongMaxEnergyStored()))); + var outStorage = out.getCapability(Capabilities.EnergyStorage.ITEM); + if (outStorage instanceof CustomEnergyStorage customEnergyStorage) { + customEnergyStorage.setEnergy(Math.min(energy.get(), customEnergyStorage.getLongMaxEnergyStored())); + } return out; } - return super.assemble(inv, access); + return super.assemble(input, registries); } - public ShapedRecipe toVanilla() { - return new ShapedRecipe(getId(), getGroup(), category(), getWidth(), getHeight(), getIngredients(), getResultItem(null)); + public ShapedRecipe toVanilla(HolderLookup.Provider registries) { + return new ShapedRecipe(getGroup(), category(), pattern, getResultItem(registries)); } } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java index 5280f55..b487535 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java @@ -1,69 +1,118 @@ package se.gory_moon.chargers.crafting; -import com.google.gson.JsonObject; -import net.minecraft.data.recipes.FinishedRecipe; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRequirements; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.ShapedRecipePattern; import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; -public class UpgradeChargerRecipeBuilder extends ShapedRecipeBuilder { - public UpgradeChargerRecipeBuilder(RecipeCategory pCategory, ItemLike pResult, int pCount) { - super(pCategory, pResult, pCount); - } +public class UpgradeChargerRecipeBuilder implements RecipeBuilder { - public static UpgradeChargerRecipeBuilder builder(RecipeCategory category, ItemLike result) { - return builder(category, result, 1); - } + private final RecipeCategory category; + @Nullable + private String group; + private final List rows = Lists.newArrayList(); + private final Map key = Maps.newLinkedHashMap(); + private final Map> criteria = new LinkedHashMap<>(); + private final Item result; + private final ItemStack resultStack; - public static UpgradeChargerRecipeBuilder builder(RecipeCategory category, ItemLike result, int count) { - return new UpgradeChargerRecipeBuilder(category, result, count); + public UpgradeChargerRecipeBuilder(RecipeCategory pCategory, ItemLike pResult) { + category = pCategory; + result = pResult.asItem(); + resultStack = new ItemStack(pResult); } - @Override - public void save(@NotNull RecipeOutput recipeOutput, @NotNull ResourceLocation id) { - Consumer dummyConsumer = recipe -> finishedRecipeConsumer.accept(new Result(recipe)); - super.save(dummyConsumer, recipeId); + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, TagKey tag) { + return define(symbol, Ingredient.of(tag)); } - public static class Result implements FinishedRecipe { - private final FinishedRecipe recipe; + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, ItemLike item) { + return define(symbol, Ingredient.of(item)); + } - public Result(FinishedRecipe recipe) { - this.recipe = recipe; + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, Ingredient ingredient) { + if (key.containsKey(symbol)) { + throw new IllegalArgumentException("Symbol '" + symbol + "' is already defined!"); + } else if (symbol == ' ') { + throw new IllegalArgumentException("Symbol ' ' (whitespace) is reserved and cannot be defined"); + } else { + key.put(symbol, ingredient); + return this; } + } - @Override - public void serializeRecipeData(@NotNull JsonObject json) { - recipe.serializeRecipeData(json); + /** + * Adds a new entry to the patterns for this recipe. + */ + public UpgradeChargerRecipeBuilder pattern(String pattern) { + if (!rows.isEmpty() && pattern.length() != rows.getFirst().length()) { + throw new IllegalArgumentException("Pattern must be the same width on every line!"); + } else { + rows.add(pattern); + return this; } + } - @Override - public @NotNull ResourceLocation getId() { - return recipe.getId(); - } + public @NotNull UpgradeChargerRecipeBuilder unlockedBy(@NotNull String name, @NotNull Criterion criterion) { + criteria.put(name, criterion); + return this; + } - @Override - public @NotNull RecipeSerializer getType() { - return RecipeSerializers.UPGRADE_SERIALIZER.get(); - } + @Override + public @NotNull UpgradeChargerRecipeBuilder group(@Nullable String groupName) { + group = groupName; + return this; + } - @Nullable - @Override - public JsonObject serializeAdvancement() { - return recipe.serializeAdvancement(); - } + @Override + public @NotNull Item getResult() { + return result; + } - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return recipe.getAdvancementId(); - } + @Override + public void save(@NotNull RecipeOutput recipeOutput, @NotNull ResourceLocation id) { + ShapedRecipePattern shapedrecipepattern = ShapedRecipePattern.of(this.key, this.rows); + Advancement.Builder advancement$builder = recipeOutput.advancement() + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(id)) + .rewards(AdvancementRewards.Builder.recipe(id)) + .requirements(AdvancementRequirements.Strategy.OR); + this.criteria.forEach(advancement$builder::addCriterion); + var recipe = new UpgradeChargerRecipe( + Objects.requireNonNullElse(this.group, ""), + RecipeBuilder.determineBookCategory(this.category), + shapedrecipepattern, + this.resultStack, + true + ); + recipeOutput.accept(id, recipe, advancement$builder.build(id.withPrefix("recipes/" + this.category.getFolderName() + "/"))); } } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java index 2e1eb76..1ab1d57 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java @@ -1,42 +1,48 @@ package se.gory_moon.chargers.crafting; -import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapedRecipePattern; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class UpgradeChargerRecipeSerializer implements RecipeSerializer { + private final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.STRING.optionalFieldOf("group", "").forGetter(ShapedRecipe::getGroup), + CraftingBookCategory.CODEC.fieldOf("category").orElse(CraftingBookCategory.MISC).forGetter(ShapedRecipe::category), + ShapedRecipePattern.MAP_CODEC.forGetter(recipe -> recipe.pattern), + ItemStack.STRICT_CODEC.fieldOf("result").forGetter(recipe -> recipe.getResultItem(null)), + Codec.BOOL.optionalFieldOf("show_notification", Boolean.TRUE).forGetter(ShapedRecipe::showNotification) + ).apply(instance, UpgradeChargerRecipe::new) + ); - @Override - public MapCodec codec() { - return null; - } + private final StreamCodec STREAM_CODEC = StreamCodec.of( + UpgradeChargerRecipeSerializer::toNetwork, UpgradeChargerRecipeSerializer::fromNetwork + ); @Override - public StreamCodec streamCodec() { - return null; + public @NotNull MapCodec codec() { + return CODEC; } @Override - public @NotNull UpgradeChargerRecipe fromJson(@NotNull ResourceLocation recipeId, @NotNull JsonObject json) { - ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.fromJson(recipeId, json); - return new UpgradeChargerRecipe(basic.getId(), basic.getGroup(), basic.category(), basic.getWidth(), basic.getHeight(), basic.getIngredients(), basic.getResultItem(null)); + public @NotNull StreamCodec streamCodec() { + return STREAM_CODEC; } - @Override - public @Nullable UpgradeChargerRecipe fromNetwork(@NotNull ResourceLocation recipeId, @NotNull FriendlyByteBuf buffer) { - ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.fromNetwork(recipeId, buffer); - return basic != null ? new UpgradeChargerRecipe(basic.getId(), basic.getGroup(), basic.category(), basic.getWidth(), basic.getHeight(), basic.getIngredients(), basic.getResultItem(null)) : null; + public static UpgradeChargerRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { + ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.streamCodec().decode(buffer); + return new UpgradeChargerRecipe(basic.getGroup(), basic.category(), basic.pattern, basic.getResultItem(buffer.registryAccess()), basic.showNotification()); } - @Override - public void toNetwork(@NotNull FriendlyByteBuf buffer, UpgradeChargerRecipe recipe) { - RecipeSerializer.SHAPED_RECIPE.toNetwork(buffer, recipe.toVanilla()); + public static void toNetwork(@NotNull RegistryFriendlyByteBuf buffer, UpgradeChargerRecipe recipe) { + RecipeSerializer.SHAPED_RECIPE.streamCodec().encode(buffer, recipe.toVanilla(buffer.registryAccess())); } } diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java new file mode 100644 index 0000000..16a5804 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java @@ -0,0 +1,59 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.block.WirelessChargerBlock; + +public class ChargerBlockStateProvider extends BlockStateProvider { + + public ChargerBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { + super(output, Constants.MOD_ID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + simpleBlock(BlockRegistry.CHARGER_BLOCK_T1.get(), + models().cubeBottomTop("charger_tier_1", + modLoc("block/charger_tier_1_side"), + modLoc("block/charger_tier_1"), + modLoc("block/charger_tier_1_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T2.get(), + models().cubeBottomTop("charger_tier_2", + modLoc("block/charger_tier_2_side"), + modLoc("block/charger_tier_2"), + modLoc("block/charger_tier_2_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T3.get(), + models().cubeBottomTop("charger_tier_3", + modLoc("block/charger_tier_3_side"), + modLoc("block/charger_tier_3"), + modLoc("block/charger_tier_3_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T4.get(), + models().cubeBottomTop("charger_tier_4", + modLoc("block/charger_tier_4_side"), + modLoc("block/charger_tier_4"), + modLoc("block/charger_tier_4_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), + models().cubeBottomTop("charger_creative", + modLoc("block/charger_creative_side"), + modLoc("block/charger_creative"), + modLoc("block/charger_creative_top")) + ); + + getVariantBuilder(BlockRegistry.WIRELESS_CHARGER.get()) + .partialState().with(WirelessChargerBlock.POWERED, false) + .modelForState().modelFile(models().cubeAll("wireless_charger_disabled", modLoc("block/wireless_charger_disabled"))).addModel() + .partialState().with(WirelessChargerBlock.POWERED, true) + .modelForState().modelFile(models().cubeAll("wireless_charger_enabled", modLoc("block/wireless_charger_enabled"))).addModel(); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java new file mode 100644 index 0000000..9fbb221 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java @@ -0,0 +1,40 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.BlockTags; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.block.BlockRegistry; + +import java.util.concurrent.CompletableFuture; + +public class ChargerBlockTagsProvider extends BlockTagsProvider { + + public ChargerBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, Constants.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(BlockTags.MINEABLE_WITH_PICKAXE) + .add( + BlockRegistry.CHARGER_BLOCK_T1.get(), + BlockRegistry.CHARGER_BLOCK_T2.get(), + BlockRegistry.CHARGER_BLOCK_T3.get(), + BlockRegistry.CHARGER_BLOCK_T4.get(), + BlockRegistry.CHARGER_BLOCK_CREATIVE.get() + ); + + tag(BlockTags.NEEDS_STONE_TOOL) + .add(BlockRegistry.CHARGER_BLOCK_T2.get()); + + tag(BlockTags.NEEDS_IRON_TOOL) + .add(BlockRegistry.CHARGER_BLOCK_T3.get()); + + tag(BlockTags.NEEDS_DIAMOND_TOOL) + .add(BlockRegistry.CHARGER_BLOCK_T4.get()); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java new file mode 100644 index 0000000..404afe6 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java @@ -0,0 +1,25 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.client.model.generators.ItemModelProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.item.ItemRegistry; + +public class ChargerItemModelProvider extends ItemModelProvider { + + public ChargerItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { + super(output, Constants.MOD_ID, existingFileHelper); + } + + @Override + protected void registerModels() { + withExistingParent(ItemRegistry.CHARGER_T1_ITEM.getId().toString(), modLoc("block/charger_t1")); + withExistingParent(ItemRegistry.CHARGER_T2_ITEM.getId().toString(), modLoc("block/charger_t2")); + withExistingParent(ItemRegistry.CHARGER_T3_ITEM.getId().toString(), modLoc("block/charger_t3")); + withExistingParent(ItemRegistry.CHARGER_T4_ITEM.getId().toString(), modLoc("block/charger_t4")); + withExistingParent(ItemRegistry.CHARGER_CREATIVE_ITEM.getId().toString(), modLoc("block/charger_creative")); + + withExistingParent(ItemRegistry.CHARGER_WIRELESS_ITEM.getId().toString(), modLoc("block/charger_wireless_disabled")); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java index ec04e6f..15282ca 100644 --- a/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java +++ b/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java @@ -14,7 +14,16 @@ public ChargerLanguageProvider(PackOutput packOutput) { @Override protected void addTranslations() { - addTooltip(BlockRegistry.WIRELESS_CHARGER, "Can be disabled with redstone power"); + add(BlockRegistry.CHARGER_BLOCK_T1.get(), "Charger Tier I"); + add(BlockRegistry.CHARGER_BLOCK_T2.get(), "Charger Tier II"); + add(BlockRegistry.CHARGER_BLOCK_T3.get(), "Charger Tier III"); + add(BlockRegistry.CHARGER_BLOCK_T4.get(), "Charger Tier IV"); + add(BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), "Creative Charger"); + add(BlockRegistry.WIRELESS_CHARGER.get(), "Wireless Charger"); + + add(LangKeys.TOOLTIP_WIRELESS_CHARGER.key(), "Can be disabled with redstone power"); + add(LangKeys.CREATIVE_TAB.key(), "Chargers"); + add(LangKeys.CHAT_WIRELESS_CHARGER_INFO.key(), "Status: %s, Power: %s/%s FE"); add(LangKeys.CHAT_ENABLED.key(), "Enabled"); add(LangKeys.CHAT_DISABLED.key(), "Disabled"); diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java new file mode 100644 index 0000000..dd45da1 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java @@ -0,0 +1,54 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import org.jetbrains.annotations.NotNull; +import se.gory_moon.chargers.block.BlockRegistry; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class ChargerLootTableProvider extends LootTableProvider { + + public ChargerLootTableProvider(PackOutput output, CompletableFuture registries) { + super(output, Set.of(), List.of( + new SubProviderEntry( + ChargerBlockLootSubProvider::new, + LootContextParamSets.BLOCK + ) + ), registries); + } + + private static class ChargerBlockLootSubProvider extends BlockLootSubProvider { + + private ChargerBlockLootSubProvider(HolderLookup.Provider registries) { + super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected @NotNull Iterable getKnownBlocks() { + return BlockRegistry.BLOCKS.getEntries() + .stream() + .map(holder -> (Block) holder.value()) + .toList(); + } + + @Override + protected void generate() { + dropSelf(BlockRegistry.CHARGER_BLOCK_T1.get()); + dropSelf(BlockRegistry.CHARGER_BLOCK_T2.get()); + dropSelf(BlockRegistry.CHARGER_BLOCK_T3.get()); + dropSelf(BlockRegistry.CHARGER_BLOCK_T4.get()); + dropSelf(BlockRegistry.CHARGER_BLOCK_CREATIVE.get()); + dropSelf(BlockRegistry.WIRELESS_CHARGER.get()); + } + } +} + + diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java new file mode 100644 index 0000000..008ddb2 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java @@ -0,0 +1,96 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; +import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.crafting.UpgradeChargerRecipeBuilder; +import se.gory_moon.chargers.item.ItemRegistry; + +import java.util.concurrent.CompletableFuture; + +public class ChargerRecipeProvider extends RecipeProvider { + public ChargerRecipeProvider(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + + @Override + protected void buildRecipes(@NotNull RecipeOutput output) { + var chargerT1Item = ItemRegistry.CHARGER_T1_ITEM.get(); + var chargerT2Item = ItemRegistry.CHARGER_T2_ITEM.get(); + var chargerT3Item = ItemRegistry.CHARGER_T3_ITEM.get(); + var chargerT4Item = ItemRegistry.CHARGER_T4_ITEM.get(); + + var iron = Ingredient.of(Tags.Items.INGOTS_IRON); + var redstone = Ingredient.of(Tags.Items.DUSTS_REDSTONE); + var redstoneBlock = Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE); + var gold = Ingredient.of(Tags.Items.INGOTS_GOLD); + var diamond = Ingredient.of(Tags.Items.GEMS_DIAMOND); + var netherite = Ingredient.of(Tags.Items.INGOTS_NETHERITE); + var enderPearls = Ingredient.of(Tags.Items.ENDER_PEARLS); + + var chargerT1 = Ingredient.of(chargerT1Item); + var chargerT2 = Ingredient.of(chargerT2Item); + var chargerT3 = Ingredient.of(chargerT3Item); + + // T1 Charger + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, chargerT1Item) + .define('I', iron) + .define('R', redstone) + .define('B', redstoneBlock) + .pattern("IRI").pattern("IBI").pattern("IRI") + .unlockedBy("has_ingots_iron", has(Tags.Items.INGOTS_IRON)) + .unlockedBy("has_dusts_redstone", has(Tags.Items.DUSTS_REDSTONE)) + .unlockedBy("has_blocks_redstone", has(Tags.Items.STORAGE_BLOCKS_REDSTONE)) + .save(output); + + // T2 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT2Item) + .define('G', gold) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT1) + .pattern("GRG").pattern("GBG").pattern("GCG") + .unlockedBy("has_charger_t1", has(chargerT1Item)) + .save(output); + + // T3 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT3Item) + .define('D', diamond) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT2) + .pattern("DRD").pattern("DBD").pattern("DCD") + .unlockedBy("has_charger_t2", has(chargerT2Item)) + .save(output); + + // T4 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT4Item) + .define('N', netherite) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT3) + .pattern("NRN").pattern("NBN").pattern("NCN") + .unlockedBy("has_charger_t3", has(chargerT3Item)) + .save(output); + + // Wireless charger + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, BlockRegistry.WIRELESS_CHARGER.get()) + .define('I', iron) + .define('R', redstone) + .define('B', redstoneBlock) + .define('E', enderPearls) + .pattern("IEI").pattern("IBI").pattern("IRI") + .unlockedBy("has_ender_pearls", has(Tags.Items.ENDER_PEARLS)) + .unlockedBy("has_ingots_iron", has(Tags.Items.INGOTS_IRON)) + .unlockedBy("has_dusts_redstone", has(Tags.Items.DUSTS_REDSTONE)) + .unlockedBy("has_blocks_redstone", has(Tags.Items.STORAGE_BLOCKS_REDSTONE)) + .save(output); + } +} diff --git a/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java b/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java new file mode 100644 index 0000000..2e672d6 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java @@ -0,0 +1,62 @@ +package se.gory_moon.chargers.handler; + +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import se.gory_moon.chargers.Configs; +import se.gory_moon.chargers.block.ChargerBlock; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; +import se.gory_moon.chargers.item.ChargerBlockItem; +import se.gory_moon.chargers.item.ItemRegistry; +import se.gory_moon.chargers.power.CustomItemEnergyStorage; + +public class CapabilityRegistrationHandler { + + public static void registerCapabilities(RegisterCapabilitiesEvent event) { + + // Blocks + event.registerBlockEntity( + Capabilities.EnergyStorage.BLOCK, + BlockEntityRegistry.CHARGER_BE.get(), + (entity, side) -> entity.getStorage() + ); + + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + BlockEntityRegistry.CHARGER_BE.get(), + (entity, context) -> entity.getInventoryHandler() + ); + + event.registerBlockEntity( + Capabilities.EnergyStorage.BLOCK, + BlockEntityRegistry.WIRELESS_CHARGER_BE.get(), + (entity, side) -> entity.getStorage() + ); + + // TODO register compat capabilities + + + // Items + event.registerItem( + Capabilities.EnergyStorage.ITEM, + (stack, context) -> { + ChargerBlock block = (ChargerBlock) ((ChargerBlockItem) stack.getItem()).getBlock(); + ChargerBlock.Tier tier = block.getTier(); + return new CustomItemEnergyStorage(stack, tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative()); + }, + ItemRegistry.CHARGER_T1_ITEM, + ItemRegistry.CHARGER_T2_ITEM, + ItemRegistry.CHARGER_T3_ITEM, + ItemRegistry.CHARGER_T4_ITEM, + ItemRegistry.CHARGER_CREATIVE_ITEM + ); + + event.registerItem( + Capabilities.EnergyStorage.ITEM, + (stack, context) -> new CustomItemEnergyStorage(stack, + Configs.SERVER.wireless.storage.get(), + Configs.SERVER.wireless.maxInput.get(), + Configs.SERVER.wireless.maxOutput.get()), + ItemRegistry.CHARGER_WIRELESS_ITEM + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java b/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java index 961b5e0..f5bb6a6 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java +++ b/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java @@ -7,38 +7,36 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.DataSlot; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.SimpleContainerData; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.event.entity.player.PlayerContainerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.player.PlayerContainerEvent; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.network.PacketDistributor; +import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.Constants; import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.block.entity.ChargerItemStackHandler; -import se.gory_moon.chargers.network.PacketHandler; -import se.gory_moon.chargers.network.WindowPropPacket; -import se.gory_moon.chargers.network.WindowPropPacket.SyncPair; +import se.gory_moon.chargers.network.WindowPropPayload; +import se.gory_moon.chargers.network.WindowPropPayload.SyncPair; import java.util.ArrayList; import java.util.List; import static net.minecraft.world.inventory.InventoryMenu.*; -@Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +@EventBusSubscriber(modid = Constants.MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ChargerMenu extends AbstractContainerMenu { private static final ResourceLocation[] ARMOR_SLOT_TEXTURES = new ResourceLocation[]{EMPTY_ARMOR_SLOT_BOOTS, EMPTY_ARMOR_SLOT_LEGGINGS, EMPTY_ARMOR_SLOT_CHESTPLATE, EMPTY_ARMOR_SLOT_HELMET}; private static final EquipmentSlot[] EQUIPMENT_SLOTS = new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}; - public static final ResourceLocation EMPTY_CHARGE_SLOT = new ResourceLocation(Constants.MOD_ID, "item/empty_charge_slot"); + public static final ResourceLocation EMPTY_CHARGE_SLOT = ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "item/empty_charge_slot"); private final IItemHandler itemHandler; private final ChargerData energyData; @@ -49,12 +47,12 @@ public class ChargerMenu extends AbstractContainerMenu { private final Slot outputSlot; private final Slot chargeSlot; - public ChargerMenu(MenuType containerType, int containerId, Inventory inventory) { - this(containerType, containerId, inventory, new ChargerItemStackHandler(), new SimpleChargerData(7), ContainerLevelAccess.NULL); + public ChargerMenu(int containerId, Inventory inventory) { + this(containerId, inventory, new ChargerItemStackHandler(), new SimpleChargerData(7), ContainerLevelAccess.NULL); } - public ChargerMenu(MenuType container, int containerId, Inventory playerInventory, ChargerItemStackHandler itemHandler, ChargerData energyData, ContainerLevelAccess access) { - super(container, containerId); + public ChargerMenu(int containerId, Inventory playerInventory, ChargerItemStackHandler itemHandler, ChargerData energyData, ContainerLevelAccess access) { + super(BlockEntityRegistry.CHARGER_CONTAINER.get(), containerId); this.itemHandler = itemHandler; this.energyData = energyData; @@ -81,13 +79,13 @@ public int getMaxStackSize() { } @Override - public boolean mayPlace(ItemStack stack) { + public boolean mayPlace(@NotNull ItemStack stack) { return stack.canEquip(slot, playerInventory.player); } - public boolean mayPickup(Player player) { + public boolean mayPickup(@NotNull Player player) { ItemStack itemstack = this.getItem(); - return (itemstack.isEmpty() || player.isCreative() || !EnchantmentHelper.hasBindingCurse(itemstack)) && super.mayPickup(player); + return (itemstack.isEmpty() || player.isCreative() || !EnchantmentHelper.has(itemstack, EnchantmentEffectComponents.PREVENT_ARMOR_CHANGE)) && super.mayPickup(player); } }.setBackground(InventoryMenu.BLOCK_ATLAS, ARMOR_SLOT_TEXTURES[slot.getIndex()])); } @@ -107,8 +105,10 @@ public void broadcastChanges() { } if (!toSync.isEmpty()) { - PacketDistributor.PacketTarget target = PacketDistributor.NMLIST.with(usingPlayers.stream().map(serverPlayer -> serverPlayer.connection.connection)::toList); - PacketHandler.INSTANCE.send(target, new WindowPropPacket(this.containerId, toSync)); + var payload = new WindowPropPayload(this.containerId, toSync); + for (ServerPlayer player : usingPlayers) { + PacketDistributor.sendToPlayer(player, payload); + } } super.broadcastChanges(); @@ -124,7 +124,7 @@ public void setData(int id, long data) { } @Override - public ItemStack quickMoveStack(Player player, int index) { + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = slots.get(index); @@ -174,7 +174,7 @@ else if(!Curios.isLoaded() && ) */ } @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T1.get()) || stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T2.get()) || stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T3.get()) || @@ -233,7 +233,7 @@ public static void onContainerOpened(PlayerContainerEvent.Open event) { for (int i = 0; i < menu.customTracked.size(); ++i) toSync.add(new SyncPair(i, menu.customTracked.get(i).get())); - PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new WindowPropPacket(menu.containerId, toSync)); + PacketDistributor.sendToPlayer(serverPlayer, new WindowPropPayload(menu.containerId, toSync)); } } diff --git a/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java b/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java index 0fd0145..bf5fc2c 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java +++ b/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java @@ -2,8 +2,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.block.entity.ChargerItemStackHandler; import javax.annotation.Nonnull; @@ -15,7 +16,7 @@ public InputSlot(IItemHandler itemHandler, int index, int xPosition, int yPositi } @Override - public boolean mayPickup(Player playerIn) { + public boolean mayPickup(@NotNull Player playerIn) { return !((ChargerItemStackHandler)getItemHandler()).extractItemInternal(getSlotIndex(), 1, true).isEmpty(); } diff --git a/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java b/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java index b97224e..b258ec2 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java +++ b/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java @@ -1,8 +1,9 @@ package se.gory_moon.chargers.inventory; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; public class OutputSlot extends SlotItemHandler { @@ -11,7 +12,7 @@ public OutputSlot(IItemHandler itemHandler, int index, int xPosition, int yPosit } @Override - public boolean mayPlace(ItemStack stack) { + public boolean mayPlace(@NotNull ItemStack stack) { return false; } } diff --git a/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java b/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java index e069de1..718b863 100644 --- a/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java +++ b/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java @@ -1,6 +1,5 @@ package se.gory_moon.chargers.item; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; @@ -9,14 +8,13 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.LangKeys; import se.gory_moon.chargers.Utils; +import se.gory_moon.chargers.block.ChargerBlock; import se.gory_moon.chargers.block.ChargerBlock.Tier; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; -import javax.annotation.Nullable; import java.util.List; public class ChargerBlockItem extends BlockItem { @@ -25,25 +23,21 @@ public ChargerBlockItem(Block block, Item.Properties builder) { super(block, builder); } - @Nullable - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - Tier tier = Tier.byItem(this); - return new ItemEnergyCapabilityProvider(new CustomItemEnergyStorage(stack, tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative())); - } - @Override public void onCraftedBy(ItemStack stack, @NotNull Level level, @NotNull Player player) { - stack.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(energyStorage -> energyStorage.receiveEnergy(0, false)); + var storage = stack.getCapability(Capabilities.EnergyStorage.ITEM, null); + if (storage != null) + storage.receiveEnergy(0, false); } @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flagIn) { - Tier tier = Tier.byItem(this); + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip, @NotNull TooltipFlag flagIn) { + ChargerBlock block = (ChargerBlock) getBlock(); + Tier tier = block.getTier(); if (tier.isCreative()) tooltip.add(Component.translatable(LangKeys.CHAT_STORED_INFINITE_INFO.key())); else Utils.addEnergyTooltip(stack, tooltip); - super.appendHoverText(stack, level, tooltip, flagIn); + super.appendHoverText(stack, context, tooltip, flagIn); } } diff --git a/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java b/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java new file mode 100644 index 0000000..9e11c33 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java @@ -0,0 +1,20 @@ +package se.gory_moon.chargers.item; + +import com.mojang.serialization.Codec; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.codec.ByteBufCodecs; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import se.gory_moon.chargers.Constants; + +public class ChargerDataComponents { + public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, Constants.MOD_ID); + + public static final DeferredHolder, DataComponentType> ENERGY = DATA_COMPONENTS.registerComponentType( + "energy", + builder -> builder + .persistent(Codec.LONG) + .networkSynchronized(ByteBufCodecs.VAR_LONG) + ); +} diff --git a/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java b/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java deleted file mode 100644 index 6ee28d0..0000000 --- a/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package se.gory_moon.chargers.item; - -import net.minecraft.core.Direction; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.LazyOptional; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class ItemEnergyCapabilityProvider implements ICapabilityProvider { - - private CustomItemEnergyStorage storage; - private final LazyOptional lazyStorage = LazyOptional.of(() -> storage); - - public ItemEnergyCapabilityProvider(CustomItemEnergyStorage storage) { - this.storage = storage; - } - - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (cap == ForgeCapabilities.ENERGY) { - return lazyStorage.cast(); - } - return LazyOptional.empty(); - } -} diff --git a/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java b/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java index 060b46b..8b0e184 100644 --- a/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java +++ b/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java @@ -1,40 +1,70 @@ package se.gory_moon.chargers.item; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; -import net.minecraftforge.registries.ForgeRegistries; -import se.gory_moon.chargers.ChargersMod; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Rarity; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.LangKeys; +import se.gory_moon.chargers.block.BlockRegistry; + +import java.util.function.Supplier; public final class ItemRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); - private static final RegistryEntry CHARGERS_TAB = REGISTRATE.defaultCreativeTab(Constants.MOD_ID, - b -> b.withTabsBefore(CreativeModeTabs.SPAWN_EGGS).icon(ItemRegistry.CHARGER_T1_ITEM::asStack)) - .register(); - - public static final ItemEntry CHARGER_T1_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T1_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T2_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T2_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T3_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T3_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T4_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T4_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_CREATIVE_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_CREATIVE_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_WIRELESS_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.WIRELESS_CHARGER_BLOCK, ForgeRegistries.Keys.ITEMS)); - - public ItemRegistry() {} - - public static void init() { - // Manually add the items to control the order - REGISTRATE.modifyCreativeModeTab(CHARGERS_TAB.getKey(), modifier -> { - modifier.accept(CHARGER_T1_ITEM.get()); - modifier.accept(CHARGER_T2_ITEM.get()); - modifier.accept(CHARGER_T3_ITEM.get()); - modifier.accept(CHARGER_T4_ITEM.get()); - modifier.accept(CHARGER_CREATIVE_ITEM.get()); - modifier.accept(CHARGER_WIRELESS_ITEM.get()); - }); - } + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Constants.MOD_ID); + public static final DeferredRegister CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Constants.MOD_ID); + + public static final DeferredItem CHARGER_T1_ITEM = ITEMS.register( + Constants.CHARGER_T1_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.CHARGER_BLOCK_T1.get(), new Item.Properties() + .rarity(Rarity.COMMON) + .component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T2_ITEM = ITEMS.register( + Constants.CHARGER_T2_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.CHARGER_BLOCK_T2.get(), new Item.Properties() + .rarity(Rarity.UNCOMMON) + .component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T3_ITEM = ITEMS.register( + Constants.CHARGER_T3_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.CHARGER_BLOCK_T3.get(), new Item.Properties() + .rarity(Rarity.RARE) + .component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T4_ITEM = ITEMS.register( + Constants.CHARGER_T4_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.CHARGER_BLOCK_T4.get(), new Item.Properties() + .rarity(Rarity.EPIC) + .component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_CREATIVE_ITEM = ITEMS.register( + Constants.CHARGER_CREATIVE_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), new Item.Properties() + .rarity(Rarity.EPIC) + .component(ChargerDataComponents.ENERGY, Long.MAX_VALUE))); + + public static final DeferredItem CHARGER_WIRELESS_ITEM = ITEMS.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> new ChargerBlockItem(BlockRegistry.WIRELESS_CHARGER.get(), new Item.Properties() + .component(ChargerDataComponents.ENERGY, 0L))); + + private static final Supplier CHARGERS_TAB = CREATIVE_TABS.register(Constants.MOD_ID, () -> CreativeModeTab.builder() + .title(Component.translatable(LangKeys.CREATIVE_TAB.key())) + .icon(ItemRegistry.CHARGER_T1_ITEM::toStack) + .withTabsBefore(CreativeModeTabs.SPAWN_EGGS) + .displayItems((parameters, output) -> { + output.accept(CHARGER_T1_ITEM.get()); + output.accept(CHARGER_T2_ITEM.get()); + output.accept(CHARGER_T3_ITEM.get()); + output.accept(CHARGER_T4_ITEM.get()); + output.accept(CHARGER_CREATIVE_ITEM.get()); + output.accept(CHARGER_WIRELESS_ITEM.get()); + }).build()); } diff --git a/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java b/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java index 011a470..238758e 100644 --- a/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java +++ b/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java @@ -1,6 +1,5 @@ package se.gory_moon.chargers.item; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; @@ -9,10 +8,10 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; -import se.gory_moon.chargers.Configs; +import se.gory_moon.chargers.LangKeys; import se.gory_moon.chargers.Utils; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; import javax.annotation.Nullable; import java.util.List; @@ -23,23 +22,16 @@ public WirelessChargerBlockItem(Block block, Item.Properties builder) { super(block, builder); } - @Nullable - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - return new ItemEnergyCapabilityProvider(new CustomItemEnergyStorage(stack, - Configs.SERVER.wireless.storage.get(), - Configs.SERVER.wireless.maxInput.get(), - Configs.SERVER.wireless.maxOutput.get())); - } - @Override public void onCraftedBy(ItemStack stack, @NotNull Level level, @NotNull Player player) { - stack.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(energyStorage -> energyStorage.receiveEnergy(0, false)); + var storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) + storage.receiveEnergy(0, false); } @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flag) { + public void appendHoverText(@NotNull ItemStack stack, @Nullable TooltipContext context, @NotNull List tooltip, @NotNull TooltipFlag flag) { Utils.addEnergyTooltip(stack, tooltip); - tooltip.add(Component.translatable(getDescriptionId() + ".desc")); + tooltip.add(Component.translatable(LangKeys.TOOLTIP_WIRELESS_CHARGER.key())); } } diff --git a/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java b/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java new file mode 100644 index 0000000..9dfdf40 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java @@ -0,0 +1,16 @@ +package se.gory_moon.chargers.network; + +import net.minecraft.client.Minecraft; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import se.gory_moon.chargers.inventory.ChargerMenu; + +public class ClientPayloadHandler { + + public static void handleWindowProp(final WindowPropPayload payload, final IPayloadContext ctx) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player != null && mc.player.containerMenu.containerId == payload.containerId()) { + payload.data().forEach(p -> ((ChargerMenu) mc.player.containerMenu).setData(p.id(), p.data())); + } + } + +} diff --git a/src/main/java/se/gory_moon/chargers/network/PacketHandler.java b/src/main/java/se/gory_moon/chargers/network/PacketHandler.java deleted file mode 100644 index f2cc6cb..0000000 --- a/src/main/java/se/gory_moon/chargers/network/PacketHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package se.gory_moon.chargers.network; - -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import se.gory_moon.chargers.Constants; - -import java.util.Objects; - -public class PacketHandler { - - public static SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder.named(Constants.NET_ID) - .clientAcceptedVersions(s -> Objects.equals(s, "1")) - .serverAcceptedVersions(s -> Objects.equals(s, "1")) - .networkProtocolVersion(() -> "1") - .simpleChannel(); - - public static void init() { - INSTANCE.messageBuilder(WindowPropPacket.class, 0, NetworkDirection.PLAY_TO_CLIENT) - .encoder(WindowPropPacket::encode) - .decoder(WindowPropPacket::new) - .consumerMainThread(WindowPropPacket::handle) - .add(); - } -} diff --git a/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java b/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java new file mode 100644 index 0000000..bb187c3 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java @@ -0,0 +1,19 @@ +package se.gory_moon.chargers.network; + +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +public class PayloadRegister { + + @SubscribeEvent + public static void onPayloadRegister(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); + + registrar.playToClient( + WindowPropPayload.TYPE, + WindowPropPayload.STREAM_CODEC, + ClientPayloadHandler::handleWindowProp + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java b/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java deleted file mode 100644 index 59dc4d6..0000000 --- a/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java +++ /dev/null @@ -1,46 +0,0 @@ -package se.gory_moon.chargers.network; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import se.gory_moon.chargers.inventory.ChargerMenu; - -import java.util.List; -import java.util.function.Supplier; - -public class WindowPropPacket { - - private final int containerId; - private final List data; - - public WindowPropPacket(FriendlyByteBuf buf) { - this(buf.readUnsignedByte(), buf.readList(byteBuf -> new SyncPair(byteBuf.readShort(), byteBuf.readLong()))); - } - - public WindowPropPacket(int containerId, List data) { - this.containerId = containerId; - this.data = data; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeByte(containerId); - buf.writeCollection(data, (byteBuf, p) -> p.write(byteBuf)); - } - - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - Minecraft mc = Minecraft.getInstance(); - if (mc.player != null && mc.player.containerMenu.containerId == containerId) { - data.forEach(p -> ((ChargerMenu) mc.player.containerMenu).setData(p.id, p.data)); - } - }); - ctx.get().setPacketHandled(true); - } - - public record SyncPair(int id, long data) { - public void write(FriendlyByteBuf buf) { - buf.writeShort(id); - buf.writeLong(data); - } - } - -} diff --git a/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java b/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java new file mode 100644 index 0000000..052d970 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java @@ -0,0 +1,40 @@ +package se.gory_moon.chargers.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static se.gory_moon.chargers.Constants.MOD_ID; + +public record WindowPropPayload(int containerId, List data) implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(MOD_ID, "window_prop")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, + WindowPropPayload::containerId, + SyncPair.STREAM_CODEC.apply(ByteBufCodecs.list()), + WindowPropPayload::data, + WindowPropPayload::new + ); + + @Override + public @NotNull Type type() { + return TYPE; + } + + public record SyncPair(int id, long data) { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, + SyncPair::id, + ByteBufCodecs.VAR_LONG, + SyncPair::data, + SyncPair::new + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java b/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java index c6090c9..bffc166 100644 --- a/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java +++ b/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java @@ -136,25 +136,14 @@ public long getMaxOutput() { @Override public void deserializeNBT(@NotNull HolderLookup.Provider provider, @NotNull Tag nbt) { if (nbt instanceof CompoundTag compound) { - if (compound.contains(ENERGY_TAG, Tag.TAG_INT)) - energy = compound.getInt(ENERGY_TAG); - else - energy = compound.getLong(ENERGY_TAG); - - if (compound.contains(IN_TAG, Tag.TAG_FLOAT)) - averageIn = (long) compound.getFloat(IN_TAG); - else - averageIn = compound.getLong(IN_TAG); - - if (compound.contains(IN_TAG, Tag.TAG_FLOAT)) - averageOut = (long) compound.getFloat(OUT_TAG); - else - averageOut = compound.getLong(OUT_TAG); + energy = compound.getLong(ENERGY_TAG); + averageIn = compound.getLong(IN_TAG); + averageOut = compound.getLong(OUT_TAG); } } @Override - public @UnknownNullability Tag serializeNBT(@NotNull HolderLookup.Provider provider) { + public @UnknownNullability Tag serializeNBT(@NotNull HolderLookup.Provider registries) { CompoundTag compound = new CompoundTag(); compound.putLong(ENERGY_TAG, this.getLongEnergyStored()); compound.putLong(IN_TAG, in.getAverage()); diff --git a/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java b/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java index 0f76a93..2f905ca 100644 --- a/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java +++ b/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java @@ -1,8 +1,7 @@ package se.gory_moon.chargers.power; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; +import se.gory_moon.chargers.item.ChargerDataComponents; public class CustomItemEnergyStorage extends CustomEnergyStorage { @@ -26,15 +25,14 @@ public int getEnergyStored() { public long getLongEnergyStored() { if (this.creative) return Long.MAX_VALUE; - CompoundTag tag = stack.getOrCreateTag(); - if (tag.contains(ENERGY_TAG, Tag.TAG_INT)) - return tag.getInt(ENERGY_TAG); - else - return tag.getLong(ENERGY_TAG); + return stack.getOrDefault(ChargerDataComponents.ENERGY, 0L); } @Override protected void setEnergyInternal(long energy) { - stack.getOrCreateTag().putLong(ENERGY_TAG, getLongEnergyStored() + energy); + stack.update( + ChargerDataComponents.ENERGY, + 0L, + e -> e + energy); } } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 0c4900e..b956e3f 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -26,19 +26,19 @@ versionRange = "${curios_version_range}" ordering = "BEFORE" side = "BOTH" -[[dependencies.${ mod_id }]] -modId = "brandonscore" -type = "optional" -versionRange = "$(bc_version_range)" -ordering = "AFTER" -side = "BOTH" +#[[dependencies.${ mod_id }]] +#modId = "brandonscore" +#type = "optional" +#versionRange = "${bc_version_range}" +#ordering = "AFTER" +#side = "BOTH" -[[dependencies.${ mod_id }]] -modId = "fluxnetworks" -type = "optional" -versionRange = "${flux_version_range}" -ordering = "AFTER" -side = "BOTH" +#[[dependencies.${ mod_id }]] +#modId = "fluxnetworks" +#type = "optional" +#versionRange = "${flux_version_range}" +#ordering = "AFTER" +#side = "BOTH" [[dependencies.${ mod_id }]] modId = "industrialforegoing"