From cf6f9f506e11ca90ee7ff79ef1acf2f5ff370eb6 Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Thu, 15 Aug 2024 02:53:14 +0200 Subject: [PATCH 1/8] untested port & some rewrites --- .gitignore | 1 + build.gradle | 74 +++++---------- build.properties | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 9 +- .../vazkii/morphtool/AttachementRecipe.java | 74 ++++++--------- .../java/vazkii/morphtool/ClientHandler.java | 57 ++++++------ .../java/vazkii/morphtool/ConfigHandler.java | 16 ++-- src/main/java/vazkii/morphtool/MorphTool.java | 49 +++++----- .../vazkii/morphtool/MorphToolClient.java | 31 +++++++ .../java/vazkii/morphtool/MorphToolItem.java | 27 +++++- .../vazkii/morphtool/MorphingHandler.java | 93 +++++++++++++------ .../java/vazkii/morphtool/Registries.java | 24 +++-- .../data_components/ToolContentComponent.java | 21 +++++ .../morphtool/network/MessageMorphTool.java | 63 ++++++------- .../morphtool/network/NetworkHandler.java | 26 ------ .../vazkii/morphtool/proxy/ClientProxy.java | 4 +- .../vazkii/morphtool/proxy/CommonProxy.java | 4 +- .../{mods.toml => neoforge.mods.toml} | 14 ++- .../{recipes => recipe}/attachment.json | 0 .../resources/data/morphtool/recipe/tool.json | 17 ++++ .../data/morphtool/recipes/tool.json | 17 ---- 22 files changed, 341 insertions(+), 292 deletions(-) create mode 100644 src/main/java/vazkii/morphtool/MorphToolClient.java create mode 100644 src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java delete mode 100644 src/main/java/vazkii/morphtool/network/NetworkHandler.java rename src/main/resources/META-INF/{mods.toml => neoforge.mods.toml} (64%) rename src/main/resources/data/morphtool/{recipes => recipe}/attachment.json (100%) create mode 100644 src/main/resources/data/morphtool/recipe/tool.json delete mode 100644 src/main/resources/data/morphtool/recipes/tool.json diff --git a/.gitignore b/.gitignore index c53f725..c044b64 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ Thumbs.db ## ForgeGradle /run +/runs ## eclipse /.settings diff --git a/build.gradle b/build.gradle index 42a48fc..3adeddc 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,7 @@ plugins { id 'maven-publish' id 'pmd' id 'com.diffplug.spotless' version '5.12.5' - id 'net.minecraftforge.gradle' version '5.1.+' - id 'org.parchmentmc.librarian.forgegradle' version '1.+' - id 'org.spongepowered.mixin' version '0.7.+' + id 'net.neoforged.gradle.userdev' version '7.0.145' } ext.configFile = file('build.properties') @@ -13,9 +11,16 @@ ext.config = parseConfig(configFile) version = "${config.version}-${config.build_number}" group = "vazkii.${config.mod_id}" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = config.mod_name -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +repositories { + mavenLocal() +} + +base { + archivesName = config.mod_name +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(21) compileJava.options.compilerArgs << "-Xlint:all,-classfile,-processing,-deprecation" << "-Werror" @@ -23,50 +28,14 @@ if (System.getenv('BUILD_NUMBER') != null) { version += "." + System.getenv('BUILD_NUMBER') } -minecraft { - // The mappings can be changed at any time, and must be in the following format. - // snapshot_YYYYMMDD Snapshot are built nightly. - // stable_# Stables are built at the discretion of the MCP team. - // Use non-default mappings at your own risk. they may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - - mappings channel: "${config.mapping_channel}", version: "${config.mapping_version}" - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - morphtool { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' +runs { + configureEach { + systemProperty 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + systemProperty 'forge.logging.console.level', 'debug' + modSource project.sourceSets.main + } - mods { - morphtool { - source sourceSets.main - } - } - } + client { } } @@ -77,7 +46,9 @@ repositories { } dependencies { - minecraft "net.minecraftforge:forge:${config.mc_version}-${config.forge_version}" + implementation "net.neoforged:neoforge:21.1.1" + + implementation "curse.maven:applied-energistics-2-223794:5610903" } spotless { @@ -96,7 +67,6 @@ pmd { toolVersion '6.22.0' // no way around this warning unless we upgrade Gradle, apparently //incrementalAnalysis.set(true) - ruleSets.clear() ruleSetFiles = files("spotless/pmd-ruleset.xml") } @@ -115,7 +85,7 @@ task incrementBuildNumber { import java.util.regex.Pattern task sortArtifacts(type: Copy) { - from jar.destinationDir + from jar.getDestinationDirectory() into config.dir_output //Put each jar with a classifier in a subfolder with the classifier as its name eachFile { @@ -142,7 +112,7 @@ def parseConfig(File config) { jar { //rename the default output, for some better... sanity with scipts - archiveName = "${baseName}-${version}.${extension}" + //archiveName = "${archiveBaseName}-${archiveVersion}.${archiveExtension}" manifest { attributes([ diff --git a/build.properties b/build.properties index 8477aa3..03c4db8 100644 --- a/build.properties +++ b/build.properties @@ -1,11 +1,11 @@ #Wed Aug 07 18:14:56 UTC 2024 -mapping_channel=parchment -forge_version=47.1.3 +neoforge_version=21.1.1 mod_id=morphtool dir_repo=./ build_number=39 dir_output=../Build Output/Morphtool/ -mapping_version=2023.09.03-1.20.1 -version=1.7 +version=1.8 mod_name=Morph-o-Tool -mc_version=1.20.1 +mc_version=1.21.1 +neogradle.subsystems.parchment.minecraftVersion=1.21 +neogradle.subsystems.parchment.mappingsVersion=2024.07.28 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 52d9360..ca448a9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip diff --git a/settings.gradle b/settings.gradle index e27d173..c686339 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,11 +1,12 @@ pluginManagement { repositories { gradlePluginPortal() - jcenter() mavenCentral() - maven { url = 'https://maven.minecraftforge.net/' } - maven { url = 'https://maven.parchmentmc.org' } - maven { url = "https://repo.spongepowered.org/repository/maven-public/" } + mavenLocal() + maven { url = 'https://maven.neoforged.net/releases' } } +} +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } \ No newline at end of file diff --git a/src/main/java/vazkii/morphtool/AttachementRecipe.java b/src/main/java/vazkii/morphtool/AttachementRecipe.java index 6b0adef..a94e33e 100644 --- a/src/main/java/vazkii/morphtool/AttachementRecipe.java +++ b/src/main/java/vazkii/morphtool/AttachementRecipe.java @@ -1,30 +1,29 @@ package vazkii.morphtool; -import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.CustomRecipe; -import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.ForgeRegistries; +import vazkii.morphtool.data_components.ToolContentComponent; + +import java.util.ArrayList; +import java.util.List; public class AttachementRecipe extends CustomRecipe { - public AttachementRecipe(ResourceLocation idIn, CraftingBookCategory pCategory) { - super(idIn, pCategory); + public AttachementRecipe(CraftingBookCategory pCategory) { + super(pCategory); } @Override - public boolean matches(CraftingContainer var1, Level var2) { + public boolean matches(CraftingInput input, Level var2) { boolean foundTool = false; boolean foundTarget = false; - for (int i = 0; i < var1.getContainerSize(); i++) { - ItemStack stack = var1.getItem(i); + for (int i = 0; i < input.size(); i++) { + ItemStack stack = input.getItem(i); if (!stack.isEmpty()) { if (isTarget(stack)) { if (foundTarget) { @@ -46,12 +45,12 @@ public boolean matches(CraftingContainer var1, Level var2) { } @Override - public ItemStack assemble(CraftingContainer var1, RegistryAccess pRegistryAccess) { + public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) { ItemStack tool = ItemStack.EMPTY; ItemStack target = ItemStack.EMPTY; - for (int i = 0; i < var1.getContainerSize(); i++) { - ItemStack stack = var1.getItem(i); + for (int i = 0; i < input.size(); i++) { + ItemStack stack = input.getItem(i); if (!stack.isEmpty()) { if (stack.is(Registries.MORPH_TOOL.get())) { tool = stack; @@ -61,27 +60,24 @@ public ItemStack assemble(CraftingContainer var1, RegistryAccess pRegistryAccess } } + if (!tool.has(Registries.TOOL_CONTENT)) return ItemStack.EMPTY; ItemStack copy = tool.copy(); - CompoundTag cmp = copy.getTag(); - if (cmp == null) { - cmp = new CompoundTag(); - copy.setTag(cmp); - } - - if (!cmp.contains(MorphingHandler.TAG_MORPH_TOOL_DATA)) { - cmp.put(MorphingHandler.TAG_MORPH_TOOL_DATA, new CompoundTag()); - } - - CompoundTag morphData = cmp.getCompound(MorphingHandler.TAG_MORPH_TOOL_DATA); String mod = MorphingHandler.getModFromStack(target); - - if (morphData.contains(mod)) { - return ItemStack.EMPTY; + ToolContentComponent contents = copy.get(Registries.TOOL_CONTENT); + List contentStacks = new ArrayList<>(List.copyOf(copy.get(Registries.TOOL_CONTENT).contents())); + + //This assures that only one item of a mod is in the tool + if (!contentStacks.isEmpty()) { + for (ItemStack contentStack : contentStacks) { + if (BuiltInRegistries.ITEM.getKey(contentStack.getItem()).getNamespace().equals(mod)) { + return ItemStack.EMPTY; + } + } } - CompoundTag modCmp = new CompoundTag(); - target.save(modCmp); - morphData.put(mod, modCmp); + contentStacks.add(target); + + copy.set(Registries.TOOL_CONTENT, new ToolContentComponent(contentStacks)); return copy; } @@ -109,7 +105,7 @@ public boolean isTarget(ItemStack stack) { return false; } - ResourceLocation registryNameRL = ForgeRegistries.ITEMS.getKey(stack.getItem()); + ResourceLocation registryNameRL = BuiltInRegistries.ITEM.getKey(stack.getItem()); String registryName = registryNameRL.toString(); if (ConfigHandler.whitelistedItems.get().contains(registryName) || ConfigHandler.whitelistedItems.get().contains(registryName + ":" + stack.getDamageValue())) { return true; @@ -125,16 +121,6 @@ public boolean isTarget(ItemStack stack) { return false; } - @Override - public ItemStack getResultItem(RegistryAccess pRegistryAccess) { - return ItemStack.EMPTY; - } - - @Override - public NonNullList getRemainingItems(CraftingContainer inv) { - return NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); - } - @Override public RecipeSerializer getSerializer() { return Registries.ATTACHMENT.get(); diff --git a/src/main/java/vazkii/morphtool/ClientHandler.java b/src/main/java/vazkii/morphtool/ClientHandler.java index 7bba066..cb117b7 100644 --- a/src/main/java/vazkii/morphtool/ClientHandler.java +++ b/src/main/java/vazkii/morphtool/ClientHandler.java @@ -1,22 +1,21 @@ package vazkii.morphtool; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.event.TickEvent.ClientTickEvent; -import net.minecraftforge.event.TickEvent.Phase; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.network.PacketDistributor; +import vazkii.morphtool.data_components.ToolContentComponent; import vazkii.morphtool.network.MessageMorphTool; -import vazkii.morphtool.network.NetworkHandler; import java.util.ArrayList; import java.util.Collections; @@ -24,14 +23,13 @@ @OnlyIn(Dist.CLIENT) public class ClientHandler { - public static final ClientHandler INSTANCE = new ClientHandler(); protected static boolean autoMode = true; @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onTick(ClientTickEvent event) { + public void onTick(ClientTickEvent.Post event) { Player player = Minecraft.getInstance().player; - if (player != null && event.phase == Phase.END && autoMode) { + if (player != null && autoMode) { ItemStack mainHandItem = player.getItemInHand(ConfigHandler.invertHandShift.get() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); if (MorphingHandler.isMorphTool(mainHandItem)) { ItemStack newStack = mainHandItem; @@ -45,10 +43,10 @@ public void onTick(ClientTickEvent event) { newStack = MorphingHandler.getShiftStackForMod(mainHandItem, modlook); } - if (newStack != mainHandItem && !ItemStack.isSameItemSameTags(newStack, mainHandItem)) { + if (newStack != mainHandItem && !ItemStack.isSameItemSameComponents(newStack, mainHandItem)) { var inventory = player.getInventory(); inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : inventory.selected, newStack); - NetworkHandler.sendToServer(new MessageMorphTool(newStack, inventory.selected)); + PacketDistributor.sendToServer(new MessageMorphTool(newStack, inventory.selected)); MorphTool.proxy.updateEquippedItem(); } } @@ -73,28 +71,36 @@ public void onMouseEvent(InputEvent.MouseScrollingEvent event) { } //Manual Scroll for Morph (excluding looked at a mod block incase it also needs scrolling) - if (event.getScrollDelta() != 0 && player.isCrouching() && !modlook.equals(mod)) { - if (mainHandItem.getTag() != null) { - CompoundTag morphData = mainHandItem.getTag().getCompound(MorphingHandler.TAG_MORPH_TOOL_DATA); - mod = event.getScrollDelta() < 0 ? nextMod(morphData, mod) : previousMod(morphData, mod); + if (event.getScrollDeltaY() != 0 && player.isCrouching() && !modlook.equals(mod)) { //TODO scroll delta y or x? + if (mainHandItem.has(Registries.TOOL_CONTENT) && mainHandItem.get(Registries.TOOL_CONTENT) != null) { + ToolContentComponent contents = mainHandItem.get(Registries.TOOL_CONTENT); + mod = event.getScrollDeltaY() < 0 ? nextMod(contents, mod) : previousMod(contents, mod); newStack = MorphingHandler.getShiftStackForMod(mainHandItem, mod); autoMode = mod.equals("morphtool"); event.setCanceled(true); } } - if (newStack != mainHandItem && !ItemStack.isSameItemSameTags(newStack, mainHandItem)) { + if (newStack != mainHandItem && !ItemStack.isSameItemSameComponents(newStack, mainHandItem)) { var inventory = player.getInventory(); inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : inventory.selected, newStack); - NetworkHandler.sendToServer(new MessageMorphTool(newStack, inventory.selected)); + PacketDistributor.sendToServer(new MessageMorphTool(newStack, inventory.selected)); MorphTool.proxy.updateEquippedItem(); } } } } - public static String nextMod(CompoundTag morphData, String mod) { - List mods = new ArrayList<>(morphData.getAllKeys()); + public static List getModsFromStacks(ToolContentComponent toolContents) { + List mods = new ArrayList<>(); + for (ItemStack stack : toolContents.contents()) { + mods.add(MorphingHandler.getModFromStack(stack)); + } + return mods; + } + + public static String nextMod(ToolContentComponent toolContents, String mod) { + List mods = getModsFromStacks(toolContents); mods.add("morphtool"); if (!mod.equals("morphtool")) { mods.add(mod); @@ -109,8 +115,8 @@ public static String nextMod(CompoundTag morphData, String mod) { return mods.get(retid); } - public static String previousMod(CompoundTag morphData, String mod) { - List mods = new ArrayList<>(morphData.getAllKeys()); + public static String previousMod(ToolContentComponent toolContents, String mod) { + List mods = getModsFromStacks(toolContents); mods.add("morphtool"); if (!mod.equals("morphtool")) { mods.add(mod); @@ -124,5 +130,4 @@ public static String previousMod(CompoundTag morphData, String mod) { } return mods.get(retid); } - -} +} \ No newline at end of file diff --git a/src/main/java/vazkii/morphtool/ConfigHandler.java b/src/main/java/vazkii/morphtool/ConfigHandler.java index 5d78105..19e00a2 100644 --- a/src/main/java/vazkii/morphtool/ConfigHandler.java +++ b/src/main/java/vazkii/morphtool/ConfigHandler.java @@ -2,27 +2,27 @@ import com.google.common.base.Predicates; import com.google.common.collect.Lists; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.apache.commons.lang3.tuple.Pair; import java.util.List; public class ConfigHandler { - public static ForgeConfigSpec.BooleanValue allItems; - public static ForgeConfigSpec.BooleanValue invertHandShift; - public static ForgeConfigSpec.ConfigValue> whitelistedItems, whitelistedNames, blacklistedMods; - public static ForgeConfigSpec.ConfigValue> aliasesList; + public static ModConfigSpec.BooleanValue allItems; + public static ModConfigSpec.BooleanValue invertHandShift; + public static ModConfigSpec.ConfigValue> whitelistedItems, whitelistedNames, blacklistedMods; + public static ModConfigSpec.ConfigValue> aliasesList; static final ConfigHandler CONFIG; - static final ForgeConfigSpec CONFIG_SPEC; + static final ModConfigSpec CONFIG_SPEC; static { - final Pair specPair = new ForgeConfigSpec.Builder().configure(ConfigHandler::new); + final Pair specPair = new ModConfigSpec.Builder().configure(ConfigHandler::new); CONFIG = specPair.getLeft(); CONFIG_SPEC = specPair.getRight(); } - public ConfigHandler(ForgeConfigSpec.Builder builder) { + public ConfigHandler(ModConfigSpec.Builder builder) { allItems = builder.define("Allow all items to be added", false); invertHandShift = builder.define("Morph in the offhand instead of mainhand", false); diff --git a/src/main/java/vazkii/morphtool/MorphTool.java b/src/main/java/vazkii/morphtool/MorphTool.java index 4a396a2..583257d 100644 --- a/src/main/java/vazkii/morphtool/MorphTool.java +++ b/src/main/java/vazkii/morphtool/MorphTool.java @@ -1,45 +1,42 @@ package vazkii.morphtool; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import vazkii.morphtool.network.NetworkHandler; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; +import vazkii.morphtool.network.MessageMorphTool; import vazkii.morphtool.proxy.ClientProxy; import vazkii.morphtool.proxy.CommonProxy; @Mod(MorphTool.MOD_ID) +@EventBusSubscriber(modid = MorphTool.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class MorphTool { public static final String MOD_ID = "morphtool"; public static CommonProxy proxy; - public MorphTool() { - IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - bus.addListener(this::commonSetup); - + public MorphTool(IEventBus bus, ModContainer modContainer) { + Registries.DATA_COMPONENTS.register(bus); Registries.ITEMS.register(bus); Registries.SERIALIZERS.register(bus); - bus.addListener(this::addToCreativeTab); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ConfigHandler.CONFIG_SPEC); + modContainer.registerConfig(ModConfig.Type.COMMON, ConfigHandler.CONFIG_SPEC); - proxy = DistExecutor.safeRunForDist(() -> ClientProxy::new, () -> CommonProxy::new); + proxy = new CommonProxy(); proxy.preInit(); } - private void commonSetup(FMLCommonSetupEvent event) { - NetworkHandler.register(); - } - - private void addToCreativeTab(BuildCreativeModeTabContentsEvent event) { - if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { - event.accept(Registries.MORPH_TOOL); - } + @SubscribeEvent + public static void registerPayloadHandler(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); + registrar.playToServer( + MessageMorphTool.TYPE, + MessageMorphTool.STREAM_CODEC, + new MessageMorphTool.Handler() + ); } - } diff --git a/src/main/java/vazkii/morphtool/MorphToolClient.java b/src/main/java/vazkii/morphtool/MorphToolClient.java new file mode 100644 index 0000000..2647a57 --- /dev/null +++ b/src/main/java/vazkii/morphtool/MorphToolClient.java @@ -0,0 +1,31 @@ +package vazkii.morphtool; + +import net.minecraft.world.item.CreativeModeTabs; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.gui.ConfigurationScreen; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import vazkii.morphtool.proxy.ClientProxy; +import vazkii.morphtool.proxy.CommonProxy; + +@Mod(value = MorphTool.MOD_ID, dist = Dist.CLIENT) +public class MorphToolClient { + public static CommonProxy proxy; + + public MorphToolClient(IEventBus bus, ModContainer modContainer) { + bus.addListener(this::addToCreativeTab); + + proxy = new ClientProxy(); + proxy.preInit(); + modContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); + } + + private void addToCreativeTab(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { + event.accept(Registries.MORPH_TOOL); + } + } +} diff --git a/src/main/java/vazkii/morphtool/MorphToolItem.java b/src/main/java/vazkii/morphtool/MorphToolItem.java index f390203..72f141d 100644 --- a/src/main/java/vazkii/morphtool/MorphToolItem.java +++ b/src/main/java/vazkii/morphtool/MorphToolItem.java @@ -2,7 +2,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.Item; @@ -13,14 +12,14 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; +import vazkii.morphtool.data_components.ToolContentComponent; -import javax.annotation.Nullable; import java.util.List; public class MorphToolItem extends Item { - public MorphToolItem() { - super(new Properties().stacksTo(1)); + public MorphToolItem(Properties properties) { + super(properties.stacksTo(1).component(Registries.IS_MORPH_TOOL, false).component(Registries.TOOL_CONTENT, ToolContentComponent.EMPTY)); } @Override @@ -35,7 +34,13 @@ public InteractionResult useOn(UseOnContext context) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag advanced) { + public void appendHoverText(ItemStack stack, Item.TooltipContext tooltipContext, List tooltip, TooltipFlag advanced) { + if (!stack.has(Registries.TOOL_CONTENT)) return; + + ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); + if (contents == null || contents.isEmpty()) return; + + /* if (!stack.hasTag() || !stack.getTag().contains(MorphingHandler.TAG_MORPH_TOOL_DATA)) { return; } @@ -45,7 +50,17 @@ public void appendHoverText(ItemStack stack, @Nullable Level world, List consumer) { if (stack != null && !stack.isEmpty() && isMorphTool(stack) && !stack.is(Registries.MORPH_TOOL.get())) { - CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA).copy(); + ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); + //CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA).copy(); + + ItemStack morph = makeMorphedStack(stack, MINECRAFT, contents); + String mod = getModFromStack(stack); + List newStacks = new ArrayList<>(List.copyOf(contents.contents())); + newStacks.remove(getStackFromMod(contents, mod)); + ToolContentComponent newContents = new ToolContentComponent(newStacks); - ItemStack morph = makeMorphedStack(stack, MINECRAFT, morphData); + /* CompoundTag newMorphData = morph.getTag().getCompound(TAG_MORPH_TOOL_DATA); newMorphData.remove(getModFromStack(stack)); + */ + if (!itemBroken) { if (!e.getCommandSenderWorld().isClientSide) { ItemEntity newItem = new ItemEntity(e.getCommandSenderWorld(), e.getX(), e.getY(), e.getZ(), morph); @@ -66,6 +70,8 @@ public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBro } ItemStack copy = stack.copy(); + copy.set(Registries.TOOL_CONTENT, newContents); + /* CompoundTag copyCmp = copy.getTag(); if (copyCmp == null) { copyCmp = new CompoundTag(); @@ -78,6 +84,8 @@ public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBro copyCmp.remove(TAG_MORPH_TOOL_DISPLAY_NAME); copyCmp.remove(TAG_MORPH_TOOL_DATA); + */ + consumer.accept(copy); } else { consumer.accept(morph); @@ -86,7 +94,7 @@ public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBro } public static String getModFromState(BlockState state) { - return getModOrAlias(ForgeRegistries.BLOCKS.getKey(state.getBlock()).getNamespace()); + return getModOrAlias(BuiltInRegistries.BLOCK.getKey(state.getBlock()).getNamespace()); } public static String getModFromStack(ItemStack stack) { @@ -109,7 +117,7 @@ public static String getModOrAlias(String mod) { } public static ItemStack getShiftStackForMod(ItemStack stack, String mod) { - if (!stack.hasTag()) { + if (!stack.has(Registries.TOOL_CONTENT)) { return stack; } @@ -118,13 +126,16 @@ public static ItemStack getShiftStackForMod(ItemStack stack, String mod) { return stack; } - CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA); - return makeMorphedStack(stack, mod, morphData); + ToolContentComponent contentComponent = stack.get(Registries.TOOL_CONTENT); + return makeMorphedStack(stack, mod, contentComponent); } - public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod, CompoundTag morphData) { + public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod, ToolContentComponent contentComponent) { String currentMod = getModFromStack(currentStack); + ToolContentComponent currentStackComponent = new ToolContentComponent(List.of(currentStack)); + + /* CompoundTag currentCmp = new CompoundTag(); currentStack.save(currentCmp); currentCmp = currentCmp.copy(); @@ -132,32 +143,43 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo currentCmp.getCompound("tag").remove(TAG_MORPH_TOOL_DATA); } + */ + if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID)) { - morphData.put(currentMod, currentCmp); + contentComponent = currentStackComponent; } ItemStack stack; if (targetMod.equals(MINECRAFT)) { stack = new ItemStack(Registries.MORPH_TOOL.get()); } else { - CompoundTag targetCmp = morphData.getCompound(targetMod); - morphData.remove(targetMod); + stack = getStackFromMod(contentComponent, targetMod); - stack = ItemStack.of(targetCmp); if (stack.isEmpty()) { stack = new ItemStack(Registries.MORPH_TOOL.get()); } } + /* if (!stack.hasTag()) { stack.setTag(new CompoundTag()); } + */ + + stack.set(Registries.TOOL_CONTENT, contentComponent); + stack.set(Registries.IS_MORPH_TOOL, true); + + /* CompoundTag stackCmp = stack.getTag(); stackCmp.put(TAG_MORPH_TOOL_DATA, morphData); stackCmp.putBoolean(TAG_MORPHING_TOOL, true); + */ + if (!stack.is(Registries.MORPH_TOOL.get())) { + + /* CompoundTag displayName = new CompoundTag(); CompoundTag ogDisplayName = displayName; displayName.putString("text", Component.Serializer.toJson(stack.getHoverName())); @@ -173,16 +195,29 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo stackCmp.put(TAG_MORPH_TOOL_DISPLAY_NAME, displayName); displayName = ogDisplayName; } + + */ - Component stackName = rawComp.setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); + Component stackName = Component.literal(stack.getDisplayName().getString()).setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); Component comp = Component.translatable("morphtool.sudo_name", stackName); - stack.setHoverName(comp); + stack.set(DataComponents.ITEM_NAME, comp); } stack.setCount(1); return stack; } + public static ItemStack getStackFromMod(ToolContentComponent component, String mod) { + if (component != null && !component.isEmpty()) { + for (ItemStack contentStack : component.contents()) { + if (BuiltInRegistries.ITEM.getKey(contentStack.getItem()).getNamespace().equals(mod)) { + return contentStack; + } + } + } + return ItemStack.EMPTY; + } + private static final Map modNames = new HashMap<>(); static { @@ -205,7 +240,7 @@ public static boolean isMorphTool(ItemStack stack) { return true; } - return stack.hasTag() && stack.getTag().getBoolean(TAG_MORPHING_TOOL); + return stack.has(Registries.IS_MORPH_TOOL) && Boolean.TRUE.equals(stack.get(Registries.IS_MORPH_TOOL)); } public static HitResult raycast(Entity e, double len) { diff --git a/src/main/java/vazkii/morphtool/Registries.java b/src/main/java/vazkii/morphtool/Registries.java index c920200..eae1ff4 100644 --- a/src/main/java/vazkii/morphtool/Registries.java +++ b/src/main/java/vazkii/morphtool/Registries.java @@ -1,18 +1,28 @@ package vazkii.morphtool; +import com.mojang.serialization.Codec; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import vazkii.morphtool.data_components.ToolContentComponent; + +import java.util.function.Supplier; public final class Registries { - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MorphTool.MOD_ID); - public static final DeferredRegister> SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, MorphTool.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MorphTool.MOD_ID); + public static final DeferredRegister> SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, MorphTool.MOD_ID); + public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(MorphTool.MOD_ID); + + public static final Supplier> IS_MORPH_TOOL = DATA_COMPONENTS.registerComponentType("is_morph_tool", builder -> builder.persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL)); + public static final Supplier> TOOL_CONTENT = DATA_COMPONENTS.registerComponentType("tool_content", builder -> builder.persistent(ToolContentComponent.CODEC).networkSynchronized(ToolContentComponent.STREAM_CODEC)); - public static final RegistryObject MORPH_TOOL = ITEMS.register("tool", MorphToolItem::new); + public static final DeferredItem MORPH_TOOL = ITEMS.registerItem("tool", MorphToolItem::new, new Item.Properties().stacksTo(1)); - public static final RegistryObject> ATTACHMENT = SERIALIZERS.register("attachment", () -> new SimpleCraftingRecipeSerializer<>(AttachementRecipe::new)); + public static final Supplier> ATTACHMENT = SERIALIZERS.register("attachment", () -> new SimpleCraftingRecipeSerializer<>(AttachementRecipe::new)); } diff --git a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java new file mode 100644 index 0000000..333da74 --- /dev/null +++ b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java @@ -0,0 +1,21 @@ +package vazkii.morphtool.data_components; + +import com.mojang.serialization.Codec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public record ToolContentComponent(List contents) { + public static final ToolContentComponent EMPTY = new ToolContentComponent(List.of()); + public static final Codec CODEC = ItemStack.CODEC.listOf().xmap(ToolContentComponent::new, component -> component.contents); + public static final StreamCodec STREAM_CODEC = ItemStack.STREAM_CODEC + .apply(ByteBufCodecs.list()) + .map(ToolContentComponent::new, component -> component.contents); + + public boolean isEmpty() { + return this.contents.isEmpty(); + } +} diff --git a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java index 6ae17dc..4286f5a 100644 --- a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java +++ b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java @@ -1,50 +1,45 @@ package vazkii.morphtool.network; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +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 net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadHandler; import vazkii.morphtool.ConfigHandler; +import vazkii.morphtool.MorphTool; import vazkii.morphtool.MorphingHandler; import java.util.function.Supplier; -public class MessageMorphTool { - public ItemStack stack; - public int slot; - - public MessageMorphTool() {} - - public MessageMorphTool(ItemStack stack, int slot) { - this.stack = stack; - this.slot = slot; +public record MessageMorphTool(ItemStack stack, int slot) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(MorphTool.MOD_ID, "tool_data")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ItemStack.STREAM_CODEC, + MessageMorphTool::stack, + ByteBufCodecs.VAR_INT, + MessageMorphTool::slot, + MessageMorphTool::new + ); + + @Override + public Type type() { + return TYPE; } - public static void serialize(final MessageMorphTool msg, final FriendlyByteBuf buf) { - buf.writeItem(msg.stack); - buf.writeVarInt(msg.slot); - } - - public static MessageMorphTool deserialize(final FriendlyByteBuf buf) { - final MessageMorphTool msg = new MessageMorphTool(); - msg.stack = buf.readItem(); - msg.slot = buf.readVarInt(); - return msg; - } + public static class Handler implements IPayloadHandler { - public static void handle(MessageMorphTool msg, Supplier ctx) { - NetworkEvent.Context context = ctx.get(); - Player player = context.getSender(); - if (player != null) { - context.enqueueWork(() -> { - ItemStack mainHandItem = player.getItemInHand(ConfigHandler.invertHandShift.get() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); - if (MorphingHandler.isMorphTool(mainHandItem) && msg.stack != mainHandItem && !ItemStack.isSameItem(msg.stack, mainHandItem)) { - var inventory = player.getInventory(); - inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : msg.slot, msg.stack); - } - }); + public void handle(final MessageMorphTool msg, final IPayloadContext context) { + Player player = context.player(); + ItemStack mainHandItem = player.getItemInHand(ConfigHandler.invertHandShift.get() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); + if (MorphingHandler.isMorphTool(mainHandItem) && msg.stack() != mainHandItem && !ItemStack.isSameItem(msg.stack(), mainHandItem)) { + var inventory = player.getInventory(); + inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : msg.slot(), msg.stack()); + } } - context.setPacketHandled(true); } } diff --git a/src/main/java/vazkii/morphtool/network/NetworkHandler.java b/src/main/java/vazkii/morphtool/network/NetworkHandler.java deleted file mode 100644 index 7477b7d..0000000 --- a/src/main/java/vazkii/morphtool/network/NetworkHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package vazkii.morphtool.network; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import vazkii.morphtool.MorphTool; - -public class NetworkHandler { - private static SimpleChannel channel; - private static int id = 0; - - public static void register() { - final String protocolVersion = "1"; - channel = NetworkRegistry.ChannelBuilder.named(new ResourceLocation(MorphTool.MOD_ID, "main")) - .networkProtocolVersion(() -> protocolVersion) - .clientAcceptedVersions(protocolVersion::equals) - .serverAcceptedVersions(protocolVersion::equals) - .simpleChannel(); - channel.registerMessage(id++, MessageMorphTool.class, MessageMorphTool::serialize, MessageMorphTool::deserialize, MessageMorphTool::handle); - } - - public static void sendToServer(MSG msg) { - channel.sendToServer(msg); - } - -} diff --git a/src/main/java/vazkii/morphtool/proxy/ClientProxy.java b/src/main/java/vazkii/morphtool/proxy/ClientProxy.java index 18c27ba..fa5973c 100644 --- a/src/main/java/vazkii/morphtool/proxy/ClientProxy.java +++ b/src/main/java/vazkii/morphtool/proxy/ClientProxy.java @@ -2,7 +2,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.world.InteractionHand; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.common.NeoForge; import vazkii.morphtool.ClientHandler; import vazkii.morphtool.ConfigHandler; @@ -11,7 +11,7 @@ public class ClientProxy extends CommonProxy { @Override public void preInit() { super.preInit(); - MinecraftForge.EVENT_BUS.register(ClientHandler.INSTANCE); + NeoForge.EVENT_BUS.register(ClientHandler.INSTANCE); } @Override diff --git a/src/main/java/vazkii/morphtool/proxy/CommonProxy.java b/src/main/java/vazkii/morphtool/proxy/CommonProxy.java index 1ea7cb9..eabfd54 100644 --- a/src/main/java/vazkii/morphtool/proxy/CommonProxy.java +++ b/src/main/java/vazkii/morphtool/proxy/CommonProxy.java @@ -1,12 +1,12 @@ package vazkii.morphtool.proxy; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.common.NeoForge; import vazkii.morphtool.MorphingHandler; public class CommonProxy { public void preInit() { - MinecraftForge.EVENT_BUS.register(MorphingHandler.INSTANCE); + NeoForge.EVENT_BUS.register(MorphingHandler.INSTANCE); } public void updateEquippedItem() { diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 64% rename from src/main/resources/META-INF/mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index bfaa284..76933c3 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[47,)" +loaderVersion="[4,)" issueTrackerURL="https://github.com/Vazkii/Morph-o-Tool" license="Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License" @@ -11,8 +11,14 @@ authors="Vazkii, MoreThanHidden, Uraneptus" description='''The wrench to end all wrenches.''' [[dependencies.morphtool]] - modId="forge" - mandatory=true - versionRange="[47.1.0,)" + modId="neoforge" + type="required" + versionRange="[21.0.143,)" ordering="AFTER" side="BOTH" +[[dependencies.morphtool]] + modId="minecraft" + type="required" + versionRange="[1.21,)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/data/morphtool/recipes/attachment.json b/src/main/resources/data/morphtool/recipe/attachment.json similarity index 100% rename from src/main/resources/data/morphtool/recipes/attachment.json rename to src/main/resources/data/morphtool/recipe/attachment.json diff --git a/src/main/resources/data/morphtool/recipe/tool.json b/src/main/resources/data/morphtool/recipe/tool.json new file mode 100644 index 0000000..7a0f70d --- /dev/null +++ b/src/main/resources/data/morphtool/recipe/tool.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " GB", + " IR", + "I " + ], + "key": { + "R": {"tag": "c:dyes/red"}, + "G": {"tag": "c:dyes/green"}, + "B": {"tag": "c:dyes/blue"}, + "I": {"tag": "c:ingots/iron"} + }, + "result": { + "id": "morphtool:tool" + } +} \ No newline at end of file diff --git a/src/main/resources/data/morphtool/recipes/tool.json b/src/main/resources/data/morphtool/recipes/tool.json deleted file mode 100644 index 7cea197..0000000 --- a/src/main/resources/data/morphtool/recipes/tool.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " GB", - " IR", - "I " - ], - "key": { - "R": {"tag": "forge:dyes/red"}, - "G": {"tag": "forge:dyes/green"}, - "B": {"tag": "forge:dyes/blue"}, - "I": {"tag": "forge:ingots/iron"} - }, - "result": { - "item": "morphtool:tool" - } -} \ No newline at end of file From 31009e5b251fb2703fa8c5549a02a439cd89b7d2 Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Tue, 15 Oct 2024 18:07:49 +0200 Subject: [PATCH 2/8] improved networking, content component & other stuff --- .../vazkii/morphtool/AttachementRecipe.java | 14 +++- .../java/vazkii/morphtool/ClientHandler.java | 7 +- src/main/java/vazkii/morphtool/MorphTool.java | 19 +---- .../java/vazkii/morphtool/MorphToolItem.java | 13 +++- .../vazkii/morphtool/MorphingHandler.java | 77 ++++++++++++------- .../java/vazkii/morphtool/Registries.java | 5 +- .../data_components/ToolContentComponent.java | 60 ++++++++++++++- .../morphtool/network/MessageMorphTool.java | 43 +++++++---- .../morphtool/network/NetworkHandler.java | 22 ++++++ 9 files changed, 189 insertions(+), 71 deletions(-) create mode 100644 src/main/java/vazkii/morphtool/network/NetworkHandler.java diff --git a/src/main/java/vazkii/morphtool/AttachementRecipe.java b/src/main/java/vazkii/morphtool/AttachementRecipe.java index a94e33e..3aeea85 100644 --- a/src/main/java/vazkii/morphtool/AttachementRecipe.java +++ b/src/main/java/vazkii/morphtool/AttachementRecipe.java @@ -64,7 +64,11 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) { ItemStack copy = tool.copy(); String mod = MorphingHandler.getModFromStack(target); ToolContentComponent contents = copy.get(Registries.TOOL_CONTENT); - List contentStacks = new ArrayList<>(List.copyOf(copy.get(Registries.TOOL_CONTENT).contents())); + if (contents == null) { + return ItemStack.EMPTY; + } + /* + List contentStacks = new ArrayList<>(List.copyOf(copy.get(Registries.TOOL_CONTENT).getItems())); //This assures that only one item of a mod is in the tool if (!contentStacks.isEmpty()) { @@ -79,6 +83,14 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) { copy.set(Registries.TOOL_CONTENT, new ToolContentComponent(contentStacks)); + */ + ToolContentComponent.Mutable mutable = new ToolContentComponent.Mutable(contents); + if (!target.isEmpty()) { + mutable.tryInsert(target); + } + copy.set(Registries.TOOL_CONTENT, mutable.toImmutable()); + + return copy; } diff --git a/src/main/java/vazkii/morphtool/ClientHandler.java b/src/main/java/vazkii/morphtool/ClientHandler.java index cb117b7..fe2fa37 100644 --- a/src/main/java/vazkii/morphtool/ClientHandler.java +++ b/src/main/java/vazkii/morphtool/ClientHandler.java @@ -16,6 +16,7 @@ import net.neoforged.neoforge.network.PacketDistributor; import vazkii.morphtool.data_components.ToolContentComponent; import vazkii.morphtool.network.MessageMorphTool; +import vazkii.morphtool.network.NetworkHandler; import java.util.ArrayList; import java.util.Collections; @@ -46,7 +47,7 @@ public void onTick(ClientTickEvent.Post event) { if (newStack != mainHandItem && !ItemStack.isSameItemSameComponents(newStack, mainHandItem)) { var inventory = player.getInventory(); inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : inventory.selected, newStack); - PacketDistributor.sendToServer(new MessageMorphTool(newStack, inventory.selected)); + NetworkHandler.sendToServer(new MessageMorphTool(newStack, inventory.selected)); MorphTool.proxy.updateEquippedItem(); } } @@ -84,7 +85,7 @@ public void onMouseEvent(InputEvent.MouseScrollingEvent event) { if (newStack != mainHandItem && !ItemStack.isSameItemSameComponents(newStack, mainHandItem)) { var inventory = player.getInventory(); inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : inventory.selected, newStack); - PacketDistributor.sendToServer(new MessageMorphTool(newStack, inventory.selected)); + NetworkHandler.sendToServer(new MessageMorphTool(newStack, inventory.selected)); MorphTool.proxy.updateEquippedItem(); } } @@ -93,7 +94,7 @@ public void onMouseEvent(InputEvent.MouseScrollingEvent event) { public static List getModsFromStacks(ToolContentComponent toolContents) { List mods = new ArrayList<>(); - for (ItemStack stack : toolContents.contents()) { + for (ItemStack stack : toolContents.getItems()) { mods.add(MorphingHandler.getModFromStack(stack)); } return mods; diff --git a/src/main/java/vazkii/morphtool/MorphTool.java b/src/main/java/vazkii/morphtool/MorphTool.java index 583257d..ca7de63 100644 --- a/src/main/java/vazkii/morphtool/MorphTool.java +++ b/src/main/java/vazkii/morphtool/MorphTool.java @@ -1,25 +1,21 @@ package vazkii.morphtool; import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -import net.neoforged.neoforge.network.registration.PayloadRegistrar; -import vazkii.morphtool.network.MessageMorphTool; -import vazkii.morphtool.proxy.ClientProxy; +import vazkii.morphtool.network.NetworkHandler; import vazkii.morphtool.proxy.CommonProxy; @Mod(MorphTool.MOD_ID) -@EventBusSubscriber(modid = MorphTool.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class MorphTool { public static final String MOD_ID = "morphtool"; public static CommonProxy proxy; public MorphTool(IEventBus bus, ModContainer modContainer) { + bus.addListener(NetworkHandler::registerPayloadHandler); + Registries.DATA_COMPONENTS.register(bus); Registries.ITEMS.register(bus); Registries.SERIALIZERS.register(bus); @@ -30,13 +26,4 @@ public MorphTool(IEventBus bus, ModContainer modContainer) { proxy.preInit(); } - @SubscribeEvent - public static void registerPayloadHandler(final RegisterPayloadHandlersEvent event) { - final PayloadRegistrar registrar = event.registrar("1"); - registrar.playToServer( - MessageMorphTool.TYPE, - MessageMorphTool.STREAM_CODEC, - new MessageMorphTool.Handler() - ); - } } diff --git a/src/main/java/vazkii/morphtool/MorphToolItem.java b/src/main/java/vazkii/morphtool/MorphToolItem.java index 72f141d..4f9bd42 100644 --- a/src/main/java/vazkii/morphtool/MorphToolItem.java +++ b/src/main/java/vazkii/morphtool/MorphToolItem.java @@ -53,11 +53,18 @@ public void appendHoverText(ItemStack stack, Item.TooltipContext tooltipContext, */ if (Screen.hasShiftDown()) { - for (ItemStack contentStack : contents.contents()) { + for (ItemStack contentStack : contents.getItems()) { if (!contentStack.isEmpty()) { - String name = contentStack.getHoverName().getString(); + Component name; + if (contentStack.has(Registries.OG_DISPLAY_NAME)) { + name = contentStack.get(Registries.OG_DISPLAY_NAME); + } else { + name = contentStack.getHoverName(); + } + + String mod = MorphingHandler.getModFromStack(contentStack); - tooltip.add(Component.literal(" " + mod + " : " + name)); + tooltip.add(Component.literal(" " + mod + " : " + name.getString())); } } /* diff --git a/src/main/java/vazkii/morphtool/MorphingHandler.java b/src/main/java/vazkii/morphtool/MorphingHandler.java index 5dd14f0..9276b47 100644 --- a/src/main/java/vazkii/morphtool/MorphingHandler.java +++ b/src/main/java/vazkii/morphtool/MorphingHandler.java @@ -1,11 +1,11 @@ package vazkii.morphtool; import net.minecraft.ChatFormatting; +import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; @@ -20,6 +20,7 @@ import net.neoforged.neoforge.event.entity.item.ItemTossEvent; import net.neoforged.neoforge.event.entity.player.PlayerDestroyItemEvent; import net.neoforged.neoforgespi.language.IModInfo; +import org.jetbrains.annotations.NotNull; import vazkii.morphtool.data_components.ToolContentComponent; import java.util.*; @@ -46,14 +47,15 @@ public void onItemBroken(PlayerDestroyItemEvent event) { removeItemFromTool(event.getEntity(), event.getOriginal(), true, (ItemStack morph) -> event.getEntity().setItemInHand(event.getHand(), morph)); } + //TODO next fix this public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBroken, Consumer consumer) { if (stack != null && !stack.isEmpty() && isMorphTool(stack) && !stack.is(Registries.MORPH_TOOL.get())) { ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); //CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA).copy(); - ItemStack morph = makeMorphedStack(stack, MINECRAFT, contents); + ItemStack morph = makeMorphedStack(stack, MINECRAFT); String mod = getModFromStack(stack); - List newStacks = new ArrayList<>(List.copyOf(contents.contents())); + List newStacks = new ArrayList<>(List.copyOf(contents.getItems())); newStacks.remove(getStackFromMod(contents, mod)); ToolContentComponent newContents = new ToolContentComponent(newStacks); @@ -126,34 +128,22 @@ public static ItemStack getShiftStackForMod(ItemStack stack, String mod) { return stack; } - ToolContentComponent contentComponent = stack.get(Registries.TOOL_CONTENT); - return makeMorphedStack(stack, mod, contentComponent); + return makeMorphedStack(stack, mod); } - public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod, ToolContentComponent contentComponent) { + public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod) { String currentMod = getModFromStack(currentStack); + ToolContentComponent currentContent = currentStack.get(Registries.TOOL_CONTENT); + ToolContentComponent newStackComponent = new ToolContentComponent(List.of(currentStack)); + if (currentContent == null) return ItemStack.EMPTY; - ToolContentComponent currentStackComponent = new ToolContentComponent(List.of(currentStack)); - - /* - CompoundTag currentCmp = new CompoundTag(); - currentStack.save(currentCmp); - currentCmp = currentCmp.copy(); - if (currentCmp.contains("tag")) { - currentCmp.getCompound("tag").remove(TAG_MORPH_TOOL_DATA); - } - - */ - - if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID)) { - contentComponent = currentStackComponent; - } + ToolContentComponent.Mutable mutable = getMutable(currentContent, newStackComponent, currentMod); ItemStack stack; if (targetMod.equals(MINECRAFT)) { stack = new ItemStack(Registries.MORPH_TOOL.get()); } else { - stack = getStackFromMod(contentComponent, targetMod); + stack = getStackFromMod(currentContent, targetMod); if (stack.isEmpty()) { stack = new ItemStack(Registries.MORPH_TOOL.get()); @@ -164,10 +154,11 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo if (!stack.hasTag()) { stack.setTag(new CompoundTag()); } - */ - stack.set(Registries.TOOL_CONTENT, contentComponent); + mutable.remove(stack); + + stack.set(Registries.TOOL_CONTENT, mutable.toImmutable()); stack.set(Registries.IS_MORPH_TOOL, true); /* @@ -183,7 +174,7 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo CompoundTag displayName = new CompoundTag(); CompoundTag ogDisplayName = displayName; displayName.putString("text", Component.Serializer.toJson(stack.getHoverName())); - + if (stackCmp.contains(TAG_MORPH_TOOL_DISPLAY_NAME)) { displayName = (CompoundTag) stackCmp.get(TAG_MORPH_TOOL_DISPLAY_NAME); } else { @@ -197,19 +188,49 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo } */ + + + Component hoverName = stack.getHoverName(); + + if (!stack.has(Registries.OG_DISPLAY_NAME)) { + stack.set(Registries.OG_DISPLAY_NAME, hoverName); + } else { + hoverName = stack.get(Registries.OG_DISPLAY_NAME); + } - Component stackName = Component.literal(stack.getDisplayName().getString()).setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); + Component stackName = Component.literal(hoverName.getString()).setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); Component comp = Component.translatable("morphtool.sudo_name", stackName); - stack.set(DataComponents.ITEM_NAME, comp); + stack.set(DataComponents.CUSTOM_NAME, comp); + } stack.setCount(1); return stack; } + private static ToolContentComponent.Mutable getMutable(ToolContentComponent currentContent, ToolContentComponent newStackComponent, String currentMod) { + ToolContentComponent.Mutable currentContentMutable = new ToolContentComponent.Mutable(currentContent); + ToolContentComponent.Mutable newStackComponentMutable = new ToolContentComponent.Mutable(newStackComponent); + + /* + CompoundTag currentCmp = new CompoundTag(); + currentStack.save(currentCmp); + currentCmp = currentCmp.copy(); + if (currentCmp.contains("tag")) { + currentCmp.getCompound("tag").remove(TAG_MORPH_TOOL_DATA); + } + + */ + + if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID)) { + currentContentMutable.tryInsert(newStackComponent.getItems().getFirst()); + } + return currentContentMutable; + } + public static ItemStack getStackFromMod(ToolContentComponent component, String mod) { if (component != null && !component.isEmpty()) { - for (ItemStack contentStack : component.contents()) { + for (ItemStack contentStack : component.getItems()) { if (BuiltInRegistries.ITEM.getKey(contentStack.getItem()).getNamespace().equals(mod)) { return contentStack; } diff --git a/src/main/java/vazkii/morphtool/Registries.java b/src/main/java/vazkii/morphtool/Registries.java index eae1ff4..b236681 100644 --- a/src/main/java/vazkii/morphtool/Registries.java +++ b/src/main/java/vazkii/morphtool/Registries.java @@ -3,6 +3,8 @@ import com.mojang.serialization.Codec; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.RecipeSerializer; @@ -19,7 +21,8 @@ public final class Registries { public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(MorphTool.MOD_ID); public static final Supplier> IS_MORPH_TOOL = DATA_COMPONENTS.registerComponentType("is_morph_tool", builder -> builder.persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL)); - public static final Supplier> TOOL_CONTENT = DATA_COMPONENTS.registerComponentType("tool_content", builder -> builder.persistent(ToolContentComponent.CODEC).networkSynchronized(ToolContentComponent.STREAM_CODEC)); + public static final Supplier> TOOL_CONTENT = DATA_COMPONENTS.registerComponentType("tool_content", builder -> builder.persistent(ToolContentComponent.CODEC).networkSynchronized(ToolContentComponent.STREAM_CODEC).cacheEncoding()); + public static final Supplier> OG_DISPLAY_NAME = DATA_COMPONENTS.register("og_display_name", () -> DataComponentType.builder().persistent(ComponentSerialization.FLAT_CODEC).networkSynchronized(ComponentSerialization.STREAM_CODEC).build()); public static final DeferredItem MORPH_TOOL = ITEMS.registerItem("tool", MorphToolItem::new, new Item.Properties().stacksTo(1)); diff --git a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java index 333da74..a85c5c1 100644 --- a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java +++ b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java @@ -6,16 +6,68 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; +import java.util.ArrayList; import java.util.List; -public record ToolContentComponent(List contents) { +public class ToolContentComponent { public static final ToolContentComponent EMPTY = new ToolContentComponent(List.of()); - public static final Codec CODEC = ItemStack.CODEC.listOf().xmap(ToolContentComponent::new, component -> component.contents); + public static final Codec CODEC = ItemStack.CODEC.listOf().xmap(ToolContentComponent::new, component -> component.items); public static final StreamCodec STREAM_CODEC = ItemStack.STREAM_CODEC .apply(ByteBufCodecs.list()) - .map(ToolContentComponent::new, component -> component.contents); + .map(ToolContentComponent::new, component -> component.items); + final List items; + + public ToolContentComponent(List contents) { + this.items = contents; + } public boolean isEmpty() { - return this.contents.isEmpty(); + return this.items.isEmpty(); + } + + public List getItems() { + return this.items; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } else { + return object instanceof ToolContentComponent component && ItemStack.listMatches(this.items, component.items); + } + } + + @Override + public int hashCode() { + return ItemStack.hashStackList(this.items); + } + + @Override + public String toString() { + return "ToolContents" + this.items; + } + + public static class Mutable { + private final List items; + + public Mutable(ToolContentComponent component) { + this.items = new ArrayList<>(component.items); + } + + public void tryInsert(ItemStack stack) { + if (!stack.isEmpty()) { + ItemStack itemstack1 = stack.copy(); + this.items.add(itemstack1); + } + } + + public void remove(ItemStack stack) { + this.items.remove(stack); + } + + public ToolContentComponent toImmutable() { + return new ToolContentComponent(List.copyOf(this.items)); + } } } diff --git a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java index 4286f5a..ba4c93f 100644 --- a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java +++ b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java @@ -1,10 +1,13 @@ package vazkii.morphtool.network; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; 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 net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -17,29 +20,39 @@ import java.util.function.Supplier; public record MessageMorphTool(ItemStack stack, int slot) implements CustomPacketPayload { - public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(MorphTool.MOD_ID, "tool_data")); - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ItemStack.STREAM_CODEC, - MessageMorphTool::stack, - ByteBufCodecs.VAR_INT, - MessageMorphTool::slot, + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(MorphTool.MOD_ID, "tool_data")); + public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec( + MessageMorphTool::serialize, MessageMorphTool::new ); + public MessageMorphTool(final RegistryFriendlyByteBuf buf) { + this(ItemStack.STREAM_CODEC.decode(buf), buf.readInt()); + } + + public void serialize(final RegistryFriendlyByteBuf buf) { + ItemStack.STREAM_CODEC.encode(buf, stack); + buf.writeInt(slot); + } + @Override public Type type() { return TYPE; } - public static class Handler implements IPayloadHandler { - - public void handle(final MessageMorphTool msg, final IPayloadContext context) { - Player player = context.player(); - ItemStack mainHandItem = player.getItemInHand(ConfigHandler.invertHandShift.get() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); - if (MorphingHandler.isMorphTool(mainHandItem) && msg.stack() != mainHandItem && !ItemStack.isSameItem(msg.stack(), mainHandItem)) { - var inventory = player.getInventory(); - inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : msg.slot(), msg.stack()); + public static void handle(MessageMorphTool msg, final IPayloadContext ctx) { + ctx.enqueueWork(() -> { + if (ctx.player() instanceof ServerPlayer player) { + ItemStack mainHandItem = player.getItemInHand(ConfigHandler.invertHandShift.get() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); + if (MorphingHandler.isMorphTool(mainHandItem) && msg.stack() != mainHandItem && !ItemStack.isSameItem(msg.stack(), mainHandItem)) { + var inventory = player.getInventory(); + inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : msg.slot(), msg.stack()); + } } - } + }).exceptionally(e -> { + // Handle exception + ctx.disconnect(Component.translatable("akashictome.networking.morph_tome.failed", e.getMessage())); + return null; + }); } } diff --git a/src/main/java/vazkii/morphtool/network/NetworkHandler.java b/src/main/java/vazkii/morphtool/network/NetworkHandler.java new file mode 100644 index 0000000..8e42a51 --- /dev/null +++ b/src/main/java/vazkii/morphtool/network/NetworkHandler.java @@ -0,0 +1,22 @@ +package vazkii.morphtool.network; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +public class NetworkHandler { + + public static void registerPayloadHandler(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); + registrar.playToServer( + MessageMorphTool.TYPE, + MessageMorphTool.STREAM_CODEC, + MessageMorphTool::handle + ); + } + + public static void sendToServer(CustomPacketPayload msg) { + PacketDistributor.sendToServer(msg); + } +} From 96769d420f3b90edf546ad1d76def68a0d24d93b Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Tue, 22 Oct 2024 23:45:45 +0200 Subject: [PATCH 3/8] fixed stress test results --- .../java/vazkii/morphtool/ClientHandler.java | 3 +- .../vazkii/morphtool/MorphingHandler.java | 55 +++++++++++++------ .../data_components/ToolContentComponent.java | 15 ++++- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/main/java/vazkii/morphtool/ClientHandler.java b/src/main/java/vazkii/morphtool/ClientHandler.java index fe2fa37..e07ff06 100644 --- a/src/main/java/vazkii/morphtool/ClientHandler.java +++ b/src/main/java/vazkii/morphtool/ClientHandler.java @@ -72,7 +72,7 @@ public void onMouseEvent(InputEvent.MouseScrollingEvent event) { } //Manual Scroll for Morph (excluding looked at a mod block incase it also needs scrolling) - if (event.getScrollDeltaY() != 0 && player.isCrouching() && !modlook.equals(mod)) { //TODO scroll delta y or x? + if (event.getScrollDeltaY() != 0 && player.isCrouching() && !modlook.equals(mod)) { if (mainHandItem.has(Registries.TOOL_CONTENT) && mainHandItem.get(Registries.TOOL_CONTENT) != null) { ToolContentComponent contents = mainHandItem.get(Registries.TOOL_CONTENT); mod = event.getScrollDeltaY() < 0 ? nextMod(contents, mod) : previousMod(contents, mod); @@ -81,7 +81,6 @@ public void onMouseEvent(InputEvent.MouseScrollingEvent event) { event.setCanceled(true); } } - if (newStack != mainHandItem && !ItemStack.isSameItemSameComponents(newStack, mainHandItem)) { var inventory = player.getInventory(); inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : inventory.selected, newStack); diff --git a/src/main/java/vazkii/morphtool/MorphingHandler.java b/src/main/java/vazkii/morphtool/MorphingHandler.java index 9276b47..f73e9dc 100644 --- a/src/main/java/vazkii/morphtool/MorphingHandler.java +++ b/src/main/java/vazkii/morphtool/MorphingHandler.java @@ -44,21 +44,31 @@ public void onItemDropped(ItemTossEvent event) { @SubscribeEvent public void onItemBroken(PlayerDestroyItemEvent event) { - removeItemFromTool(event.getEntity(), event.getOriginal(), true, (ItemStack morph) -> event.getEntity().setItemInHand(event.getHand(), morph)); + removeItemFromTool(event.getEntity(), event.getOriginal(), true, morph -> event.getEntity().setItemInHand(event.getHand(), morph)); } - //TODO next fix this public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBroken, Consumer consumer) { if (stack != null && !stack.isEmpty() && isMorphTool(stack) && !stack.is(Registries.MORPH_TOOL.get())) { ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); + if (contents == null) return; + ToolContentComponent.Mutable mutable = new ToolContentComponent.Mutable(contents); //CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA).copy(); - ItemStack morph = makeMorphedStack(stack, MINECRAFT); - String mod = getModFromStack(stack); + mutable.remove(stack); + + stack.set(Registries.TOOL_CONTENT, mutable.toImmutable()); + + ItemStack morph = makeMorphedStack(stack, MINECRAFT, true); + + + + /* List newStacks = new ArrayList<>(List.copyOf(contents.getItems())); newStacks.remove(getStackFromMod(contents, mod)); ToolContentComponent newContents = new ToolContentComponent(newStacks); + */ + /* CompoundTag newMorphData = morph.getTag().getCompound(TAG_MORPH_TOOL_DATA); newMorphData.remove(getModFromStack(stack)); @@ -66,13 +76,16 @@ public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBro */ if (!itemBroken) { - if (!e.getCommandSenderWorld().isClientSide) { + if (!e.getCommandSenderWorld().isClientSide) { ItemEntity newItem = new ItemEntity(e.getCommandSenderWorld(), e.getX(), e.getY(), e.getZ(), morph); e.getCommandSenderWorld().addFreshEntity(newItem); } ItemStack copy = stack.copy(); - copy.set(Registries.TOOL_CONTENT, newContents); + copy.remove(Registries.TOOL_CONTENT); + copy.remove(Registries.IS_MORPH_TOOL); + copy.remove(DataComponents.CUSTOM_NAME); + copy.remove(Registries.OG_DISPLAY_NAME); /* CompoundTag copyCmp = copy.getTag(); if (copyCmp == null) { @@ -128,16 +141,17 @@ public static ItemStack getShiftStackForMod(ItemStack stack, String mod) { return stack; } - return makeMorphedStack(stack, mod); + return makeMorphedStack(stack, mod, false); } - public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod) { + public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMod, boolean calledOnRemove) { String currentMod = getModFromStack(currentStack); ToolContentComponent currentContent = currentStack.get(Registries.TOOL_CONTENT); + currentStack.remove(Registries.TOOL_CONTENT); ToolContentComponent newStackComponent = new ToolContentComponent(List.of(currentStack)); if (currentContent == null) return ItemStack.EMPTY; - ToolContentComponent.Mutable mutable = getMutable(currentContent, newStackComponent, currentMod); + ToolContentComponent.Mutable mutable = getMutable(currentContent, newStackComponent, currentMod, calledOnRemove); ItemStack stack; if (targetMod.equals(MINECRAFT)) { @@ -190,13 +204,9 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo */ - Component hoverName = stack.getHoverName(); - if (!stack.has(Registries.OG_DISPLAY_NAME)) { - stack.set(Registries.OG_DISPLAY_NAME, hoverName); - } else { - hoverName = stack.get(Registries.OG_DISPLAY_NAME); - } + + Component hoverName = getOrSetOGName(stack); Component stackName = Component.literal(hoverName.getString()).setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); Component comp = Component.translatable("morphtool.sudo_name", stackName); @@ -208,7 +218,18 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo return stack; } - private static ToolContentComponent.Mutable getMutable(ToolContentComponent currentContent, ToolContentComponent newStackComponent, String currentMod) { + private static Component getOrSetOGName(ItemStack stack) { + Component hoverName = stack.getHoverName(); + if (!stack.has(Registries.OG_DISPLAY_NAME)) { + stack.set(Registries.OG_DISPLAY_NAME, hoverName); + } else { + hoverName = stack.get(Registries.OG_DISPLAY_NAME); + } + + return hoverName; + } + + private static ToolContentComponent.Mutable getMutable(ToolContentComponent currentContent, ToolContentComponent newStackComponent, String currentMod, boolean calledOnRemove) { ToolContentComponent.Mutable currentContentMutable = new ToolContentComponent.Mutable(currentContent); ToolContentComponent.Mutable newStackComponentMutable = new ToolContentComponent.Mutable(newStackComponent); @@ -222,7 +243,7 @@ private static ToolContentComponent.Mutable getMutable(ToolContentComponent curr */ - if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID)) { + if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID) && !calledOnRemove) { currentContentMutable.tryInsert(newStackComponent.getItems().getFirst()); } return currentContentMutable; diff --git a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java index a85c5c1..d73c3b7 100644 --- a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java +++ b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java @@ -1,17 +1,22 @@ package vazkii.morphtool.data_components; import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.BundleContents; +import org.apache.commons.lang3.math.Fraction; import java.util.ArrayList; import java.util.List; public class ToolContentComponent { public static final ToolContentComponent EMPTY = new ToolContentComponent(List.of()); - public static final Codec CODEC = ItemStack.CODEC.listOf().xmap(ToolContentComponent::new, component -> component.items); + public static final Codec CODEC = ItemStack.CODEC + .listOf() + .flatXmap(ToolContentComponent::checkAndCreate, component -> DataResult.success(component.items)); public static final StreamCodec STREAM_CODEC = ItemStack.STREAM_CODEC .apply(ByteBufCodecs.list()) .map(ToolContentComponent::new, component -> component.items); @@ -21,6 +26,14 @@ public ToolContentComponent(List contents) { this.items = contents; } + private static DataResult checkAndCreate(List p_381706_) { + try { + return DataResult.success(new ToolContentComponent(p_381706_)); + } catch (ArithmeticException arithmeticexception) { + return DataResult.error(() -> "Excessive total bundle weight"); + } + } + public boolean isEmpty() { return this.items.isEmpty(); } From 34aaafe305397026d3d8c9ff9c262e3f3754bb59 Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Wed, 23 Oct 2024 00:14:06 +0200 Subject: [PATCH 4/8] clean up --- build.gradle | 7 +- .../vazkii/morphtool/AttachementRecipe.java | 29 +--- .../java/vazkii/morphtool/ClientHandler.java | 4 +- .../java/vazkii/morphtool/ConfigHandler.java | 18 ++- src/main/java/vazkii/morphtool/MorphTool.java | 2 +- .../vazkii/morphtool/MorphToolClient.java | 25 +-- .../java/vazkii/morphtool/MorphToolItem.java | 40 +---- .../vazkii/morphtool/MorphingHandler.java | 99 ++---------- .../java/vazkii/morphtool/Registries.java | 2 + .../data_components/ToolContentComponent.java | 143 +++++++++--------- .../morphtool/network/MessageMorphTool.java | 12 +- .../morphtool/network/NetworkHandler.java | 22 +-- .../vazkii/morphtool/proxy/ClientProxy.java | 1 + .../vazkii/morphtool/proxy/CommonProxy.java | 1 + .../assets/morphtool/lang/en_us.json | 11 +- 15 files changed, 149 insertions(+), 267 deletions(-) diff --git a/build.gradle b/build.gradle index 3adeddc..ea510a8 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'eclipse' id 'maven-publish' id 'pmd' - id 'com.diffplug.spotless' version '5.12.5' + id 'com.diffplug.spotless' version '6.25.0' id 'net.neoforged.gradle.userdev' version '7.0.145' } @@ -64,9 +64,8 @@ spotless { } pmd { - toolVersion '6.22.0' - // no way around this warning unless we upgrade Gradle, apparently - //incrementalAnalysis.set(true) + toolVersion '6.35.0' + incrementalAnalysis.set(true) ruleSetFiles = files("spotless/pmd-ruleset.xml") } diff --git a/src/main/java/vazkii/morphtool/AttachementRecipe.java b/src/main/java/vazkii/morphtool/AttachementRecipe.java index 3aeea85..d5ab1ca 100644 --- a/src/main/java/vazkii/morphtool/AttachementRecipe.java +++ b/src/main/java/vazkii/morphtool/AttachementRecipe.java @@ -4,12 +4,13 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.Level; -import vazkii.morphtool.data_components.ToolContentComponent; -import java.util.ArrayList; -import java.util.List; +import vazkii.morphtool.data_components.ToolContentComponent; public class AttachementRecipe extends CustomRecipe { @@ -60,37 +61,21 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) { } } - if (!tool.has(Registries.TOOL_CONTENT)) return ItemStack.EMPTY; + if (!tool.has(Registries.TOOL_CONTENT)) + return ItemStack.EMPTY; ItemStack copy = tool.copy(); String mod = MorphingHandler.getModFromStack(target); ToolContentComponent contents = copy.get(Registries.TOOL_CONTENT); if (contents == null) { return ItemStack.EMPTY; } - /* - List contentStacks = new ArrayList<>(List.copyOf(copy.get(Registries.TOOL_CONTENT).getItems())); - - //This assures that only one item of a mod is in the tool - if (!contentStacks.isEmpty()) { - for (ItemStack contentStack : contentStacks) { - if (BuiltInRegistries.ITEM.getKey(contentStack.getItem()).getNamespace().equals(mod)) { - return ItemStack.EMPTY; - } - } - } - - contentStacks.add(target); - copy.set(Registries.TOOL_CONTENT, new ToolContentComponent(contentStacks)); - - */ ToolContentComponent.Mutable mutable = new ToolContentComponent.Mutable(contents); if (!target.isEmpty()) { mutable.tryInsert(target); } copy.set(Registries.TOOL_CONTENT, mutable.toImmutable()); - return copy; } diff --git a/src/main/java/vazkii/morphtool/ClientHandler.java b/src/main/java/vazkii/morphtool/ClientHandler.java index e07ff06..387cae3 100644 --- a/src/main/java/vazkii/morphtool/ClientHandler.java +++ b/src/main/java/vazkii/morphtool/ClientHandler.java @@ -13,7 +13,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.InputEvent; -import net.neoforged.neoforge.network.PacketDistributor; + import vazkii.morphtool.data_components.ToolContentComponent; import vazkii.morphtool.network.MessageMorphTool; import vazkii.morphtool.network.NetworkHandler; @@ -130,4 +130,4 @@ public static String previousMod(ToolContentComponent toolContents, String mod) } return mods.get(retid); } -} \ No newline at end of file +} diff --git a/src/main/java/vazkii/morphtool/ConfigHandler.java b/src/main/java/vazkii/morphtool/ConfigHandler.java index 19e00a2..f261c73 100644 --- a/src/main/java/vazkii/morphtool/ConfigHandler.java +++ b/src/main/java/vazkii/morphtool/ConfigHandler.java @@ -2,7 +2,9 @@ import com.google.common.base.Predicates; import com.google.common.collect.Lists; + import net.neoforged.neoforge.common.ModConfigSpec; + import org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -23,10 +25,10 @@ public class ConfigHandler { } public ConfigHandler(ModConfigSpec.Builder builder) { - allItems = builder.define("Allow all items to be added", false); - invertHandShift = builder.define("Morph in the offhand instead of mainhand", false); + allItems = builder.define("allow_all_items", false); //Allow all items to be added + invertHandShift = builder.define("offhand_morph", false); //Morph in the offhand instead of mainhand - whitelistedItems = builder.defineList("Whitelisted Items", + whitelistedItems = builder.defineList("whitelist_items", //"Whitelisted Items" Lists.newArrayList("botania:twig_wand", "appliedenergistics2:network_tool", "immersiveengineering:tool", @@ -35,23 +37,26 @@ public ConfigHandler(ModConfigSpec.Builder builder) { "bloodmagic:ritual_reader", "draconicevolution:crystal_binder", "crossroads:omnimeter"), + String::new, Predicates.alwaysTrue()); - whitelistedNames = builder.defineList("Whitelisted Names", + whitelistedNames = builder.defineList("whitelist_names", //"Whitelisted Names" Lists.newArrayList("wrench", "screwdriver", "hammer", "rotator", "configurator", "crowbar"), + String::new, Predicates.alwaysTrue()); - blacklistedMods = builder.defineList("Blacklisted Mods", + blacklistedMods = builder.defineList("blacklist_mods", //Blacklisted Mods Lists.newArrayList("tconstruct", "intangible"), + String::new, Predicates.alwaysTrue()); - aliasesList = builder.defineList("Mod Aliases", + aliasesList = builder.defineList("mod_aliasses", //Mod Aliases Lists.newArrayList("nautralpledge=botania", "thermalexpansion=thermalfoundation", "thermaldynamics=thermalfoundation", @@ -72,6 +77,7 @@ public ConfigHandler(ModConfigSpec.Builder builder) { "buildcraftsilicon=buildcraft", "cabletiers=refinedstorage", "extrastorage=refinedstorage"), + String::new, Predicates.alwaysTrue()); } diff --git a/src/main/java/vazkii/morphtool/MorphTool.java b/src/main/java/vazkii/morphtool/MorphTool.java index ca7de63..9f6f65a 100644 --- a/src/main/java/vazkii/morphtool/MorphTool.java +++ b/src/main/java/vazkii/morphtool/MorphTool.java @@ -2,9 +2,9 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; -import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; + import vazkii.morphtool.network.NetworkHandler; import vazkii.morphtool.proxy.CommonProxy; diff --git a/src/main/java/vazkii/morphtool/MorphToolClient.java b/src/main/java/vazkii/morphtool/MorphToolClient.java index 2647a57..87cc363 100644 --- a/src/main/java/vazkii/morphtool/MorphToolClient.java +++ b/src/main/java/vazkii/morphtool/MorphToolClient.java @@ -8,24 +8,25 @@ import net.neoforged.neoforge.client.gui.ConfigurationScreen; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; + import vazkii.morphtool.proxy.ClientProxy; import vazkii.morphtool.proxy.CommonProxy; @Mod(value = MorphTool.MOD_ID, dist = Dist.CLIENT) public class MorphToolClient { - public static CommonProxy proxy; + public static CommonProxy proxy; - public MorphToolClient(IEventBus bus, ModContainer modContainer) { - bus.addListener(this::addToCreativeTab); + public MorphToolClient(IEventBus bus, ModContainer modContainer) { + bus.addListener(this::addToCreativeTab); - proxy = new ClientProxy(); - proxy.preInit(); - modContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); - } + proxy = new ClientProxy(); + proxy.preInit(); + modContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); + } - private void addToCreativeTab(BuildCreativeModeTabContentsEvent event) { - if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { - event.accept(Registries.MORPH_TOOL); - } - } + private void addToCreativeTab(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { + event.accept(Registries.MORPH_TOOL); + } + } } diff --git a/src/main/java/vazkii/morphtool/MorphToolItem.java b/src/main/java/vazkii/morphtool/MorphToolItem.java index 4f9bd42..6555170 100644 --- a/src/main/java/vazkii/morphtool/MorphToolItem.java +++ b/src/main/java/vazkii/morphtool/MorphToolItem.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; + import vazkii.morphtool.data_components.ToolContentComponent; import java.util.List; @@ -35,23 +36,12 @@ public InteractionResult useOn(UseOnContext context) { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext tooltipContext, List tooltip, TooltipFlag advanced) { - if (!stack.has(Registries.TOOL_CONTENT)) return; - - ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); - if (contents == null || contents.isEmpty()) return; - - /* - if (!stack.hasTag() || !stack.getTag().contains(MorphingHandler.TAG_MORPH_TOOL_DATA)) { + if (!stack.has(Registries.TOOL_CONTENT)) return; - } - CompoundTag data = stack.getTag().getCompound(MorphingHandler.TAG_MORPH_TOOL_DATA); - if (data.getAllKeys().isEmpty()) { + ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); + if (contents == null || contents.isEmpty()) return; - } - - */ - if (Screen.hasShiftDown()) { for (ItemStack contentStack : contents.getItems()) { if (!contentStack.isEmpty()) { @@ -62,32 +52,10 @@ public void appendHoverText(ItemStack stack, Item.TooltipContext tooltipContext, name = contentStack.getHoverName(); } - String mod = MorphingHandler.getModFromStack(contentStack); tooltip.add(Component.literal(" " + mod + " : " + name.getString())); } } - /* - for (String s : data.getAllKeys()) { - CompoundTag cmp = data.getCompound(s); - if (cmp != null) { - ItemStack modStack = ItemStack.of(cmp); - if (!stack.isEmpty()) { - String name = modStack.getHoverName().getString(); - if (modStack.hasTag() && modStack.getTag().contains(MorphingHandler.TAG_MORPH_TOOL_DISPLAY_NAME)) { - CompoundTag rawName = ((CompoundTag) modStack.getTag().get(MorphingHandler.TAG_MORPH_TOOL_DISPLAY_NAME)); - Component nameComp = Component.Serializer.fromJson(rawName.getString("text")); - if(nameComp != null) - name = nameComp.getString(); - } - String mod = MorphingHandler.getModFromStack(modStack); - - tooltip.add(Component.literal(" " + mod + " : " + name)); - } - } - } - - */ } else { tooltip.add(Component.translatable(MorphTool.MOD_ID + ".misc.shift_for_info")); } diff --git a/src/main/java/vazkii/morphtool/MorphingHandler.java b/src/main/java/vazkii/morphtool/MorphingHandler.java index f73e9dc..3581874 100644 --- a/src/main/java/vazkii/morphtool/MorphingHandler.java +++ b/src/main/java/vazkii/morphtool/MorphingHandler.java @@ -1,10 +1,8 @@ package vazkii.morphtool; import net.minecraft.ChatFormatting; -import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.world.entity.Entity; @@ -20,10 +18,13 @@ import net.neoforged.neoforge.event.entity.item.ItemTossEvent; import net.neoforged.neoforge.event.entity.player.PlayerDestroyItemEvent; import net.neoforged.neoforgespi.language.IModInfo; -import org.jetbrains.annotations.NotNull; + import vazkii.morphtool.data_components.ToolContentComponent; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.function.Consumer; public final class MorphingHandler { @@ -50,33 +51,16 @@ public void onItemBroken(PlayerDestroyItemEvent event) { public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBroken, Consumer consumer) { if (stack != null && !stack.isEmpty() && isMorphTool(stack) && !stack.is(Registries.MORPH_TOOL.get())) { ToolContentComponent contents = stack.get(Registries.TOOL_CONTENT); - if (contents == null) return; + if (contents == null) + return; ToolContentComponent.Mutable mutable = new ToolContentComponent.Mutable(contents); - //CompoundTag morphData = stack.getTag().getCompound(TAG_MORPH_TOOL_DATA).copy(); - mutable.remove(stack); - stack.set(Registries.TOOL_CONTENT, mutable.toImmutable()); ItemStack morph = makeMorphedStack(stack, MINECRAFT, true); - - - /* - List newStacks = new ArrayList<>(List.copyOf(contents.getItems())); - newStacks.remove(getStackFromMod(contents, mod)); - ToolContentComponent newContents = new ToolContentComponent(newStacks); - - */ - - /* - CompoundTag newMorphData = morph.getTag().getCompound(TAG_MORPH_TOOL_DATA); - newMorphData.remove(getModFromStack(stack)); - - */ - if (!itemBroken) { - if (!e.getCommandSenderWorld().isClientSide) { + if (!e.getCommandSenderWorld().isClientSide) { ItemEntity newItem = new ItemEntity(e.getCommandSenderWorld(), e.getX(), e.getY(), e.getZ(), morph); e.getCommandSenderWorld().addFreshEntity(newItem); } @@ -86,20 +70,6 @@ public static void removeItemFromTool(Entity e, ItemStack stack, boolean itemBro copy.remove(Registries.IS_MORPH_TOOL); copy.remove(DataComponents.CUSTOM_NAME); copy.remove(Registries.OG_DISPLAY_NAME); - /* - CompoundTag copyCmp = copy.getTag(); - if (copyCmp == null) { - copyCmp = new CompoundTag(); - copy.setTag(copyCmp); - } - - copyCmp.remove("display"); - - copyCmp.remove(TAG_MORPHING_TOOL); - copyCmp.remove(TAG_MORPH_TOOL_DISPLAY_NAME); - copyCmp.remove(TAG_MORPH_TOOL_DATA); - - */ consumer.accept(copy); } else { @@ -149,7 +119,8 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo ToolContentComponent currentContent = currentStack.get(Registries.TOOL_CONTENT); currentStack.remove(Registries.TOOL_CONTENT); ToolContentComponent newStackComponent = new ToolContentComponent(List.of(currentStack)); - if (currentContent == null) return ItemStack.EMPTY; + if (currentContent == null) + return ItemStack.EMPTY; ToolContentComponent.Mutable mutable = getMutable(currentContent, newStackComponent, currentMod, calledOnRemove); @@ -164,54 +135,16 @@ public static ItemStack makeMorphedStack(ItemStack currentStack, String targetMo } } - /* - if (!stack.hasTag()) { - stack.setTag(new CompoundTag()); - } - */ - mutable.remove(stack); stack.set(Registries.TOOL_CONTENT, mutable.toImmutable()); stack.set(Registries.IS_MORPH_TOOL, true); - /* - CompoundTag stackCmp = stack.getTag(); - stackCmp.put(TAG_MORPH_TOOL_DATA, morphData); - stackCmp.putBoolean(TAG_MORPHING_TOOL, true); - - */ - if (!stack.is(Registries.MORPH_TOOL.get())) { - - /* - CompoundTag displayName = new CompoundTag(); - CompoundTag ogDisplayName = displayName; - displayName.putString("text", Component.Serializer.toJson(stack.getHoverName())); - - if (stackCmp.contains(TAG_MORPH_TOOL_DISPLAY_NAME)) { - displayName = (CompoundTag) stackCmp.get(TAG_MORPH_TOOL_DISPLAY_NAME); - } else { - stackCmp.put(TAG_MORPH_TOOL_DISPLAY_NAME, displayName); - } - - MutableComponent rawComp = Component.Serializer.fromJson(displayName.getString("text")); - if(rawComp == null) { - stackCmp.put(TAG_MORPH_TOOL_DISPLAY_NAME, displayName); - displayName = ogDisplayName; - } - - */ - - - - Component hoverName = getOrSetOGName(stack); - Component stackName = Component.literal(hoverName.getString()).setStyle(Style.EMPTY.applyFormats(ChatFormatting.GREEN)); Component comp = Component.translatable("morphtool.sudo_name", stackName); stack.set(DataComponents.CUSTOM_NAME, comp); - } stack.setCount(1); @@ -231,18 +164,6 @@ private static Component getOrSetOGName(ItemStack stack) { private static ToolContentComponent.Mutable getMutable(ToolContentComponent currentContent, ToolContentComponent newStackComponent, String currentMod, boolean calledOnRemove) { ToolContentComponent.Mutable currentContentMutable = new ToolContentComponent.Mutable(currentContent); - ToolContentComponent.Mutable newStackComponentMutable = new ToolContentComponent.Mutable(newStackComponent); - - /* - CompoundTag currentCmp = new CompoundTag(); - currentStack.save(currentCmp); - currentCmp = currentCmp.copy(); - if (currentCmp.contains("tag")) { - currentCmp.getCompound("tag").remove(TAG_MORPH_TOOL_DATA); - } - - */ - if (!currentMod.equalsIgnoreCase(MINECRAFT) && !currentMod.equalsIgnoreCase(MorphTool.MOD_ID) && !calledOnRemove) { currentContentMutable.tryInsert(newStackComponent.getItems().getFirst()); } diff --git a/src/main/java/vazkii/morphtool/Registries.java b/src/main/java/vazkii/morphtool/Registries.java index b236681..f4ab9a5 100644 --- a/src/main/java/vazkii/morphtool/Registries.java +++ b/src/main/java/vazkii/morphtool/Registries.java @@ -1,6 +1,7 @@ package vazkii.morphtool; import com.mojang.serialization.Codec; + import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; @@ -11,6 +12,7 @@ import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; + import vazkii.morphtool.data_components.ToolContentComponent; import java.util.function.Supplier; diff --git a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java index d73c3b7..705650c 100644 --- a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java +++ b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java @@ -2,85 +2,84 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; + import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.BundleContents; -import org.apache.commons.lang3.math.Fraction; import java.util.ArrayList; import java.util.List; public class ToolContentComponent { - public static final ToolContentComponent EMPTY = new ToolContentComponent(List.of()); - public static final Codec CODEC = ItemStack.CODEC - .listOf() - .flatXmap(ToolContentComponent::checkAndCreate, component -> DataResult.success(component.items)); - public static final StreamCodec STREAM_CODEC = ItemStack.STREAM_CODEC - .apply(ByteBufCodecs.list()) - .map(ToolContentComponent::new, component -> component.items); - final List items; - - public ToolContentComponent(List contents) { - this.items = contents; - } - - private static DataResult checkAndCreate(List p_381706_) { - try { - return DataResult.success(new ToolContentComponent(p_381706_)); - } catch (ArithmeticException arithmeticexception) { - return DataResult.error(() -> "Excessive total bundle weight"); - } - } - - public boolean isEmpty() { - return this.items.isEmpty(); - } - - public List getItems() { - return this.items; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } else { - return object instanceof ToolContentComponent component && ItemStack.listMatches(this.items, component.items); - } - } - - @Override - public int hashCode() { - return ItemStack.hashStackList(this.items); - } - - @Override - public String toString() { - return "ToolContents" + this.items; - } - - public static class Mutable { - private final List items; - - public Mutable(ToolContentComponent component) { - this.items = new ArrayList<>(component.items); - } - - public void tryInsert(ItemStack stack) { - if (!stack.isEmpty()) { - ItemStack itemstack1 = stack.copy(); - this.items.add(itemstack1); - } - } - - public void remove(ItemStack stack) { - this.items.remove(stack); - } - - public ToolContentComponent toImmutable() { - return new ToolContentComponent(List.copyOf(this.items)); - } - } + public static final ToolContentComponent EMPTY = new ToolContentComponent(List.of()); + public static final Codec CODEC = ItemStack.CODEC + .listOf() + .flatXmap(ToolContentComponent::checkAndCreate, component -> DataResult.success(component.items)); + public static final StreamCodec STREAM_CODEC = ItemStack.STREAM_CODEC + .apply(ByteBufCodecs.list()) + .map(ToolContentComponent::new, component -> component.items); + final List items; + + public ToolContentComponent(List contents) { + this.items = contents; + } + + private static DataResult checkAndCreate(List p_381706_) { + try { + return DataResult.success(new ToolContentComponent(p_381706_)); + } catch (ArithmeticException arithmeticexception) { + return DataResult.error(() -> "Excessive total bundle weight"); + } + } + + public boolean isEmpty() { + return this.items.isEmpty(); + } + + public List getItems() { + return this.items; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } else { + return object instanceof ToolContentComponent component && ItemStack.listMatches(this.items, component.items); + } + } + + @Override + public int hashCode() { + return ItemStack.hashStackList(this.items); + } + + @Override + public String toString() { + return "ToolContents" + this.items; + } + + public static class Mutable { + private final List items; + + public Mutable(ToolContentComponent component) { + this.items = new ArrayList<>(component.items); + } + + public void tryInsert(ItemStack stack) { + if (!stack.isEmpty()) { + ItemStack itemstack1 = stack.copy(); + this.items.add(itemstack1); + } + } + + public void remove(ItemStack stack) { + this.items.remove(stack); + } + + public ToolContentComponent toImmutable() { + return new ToolContentComponent(List.copyOf(this.items)); + } + } } diff --git a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java index ba4c93f..b1d90cb 100644 --- a/src/main/java/vazkii/morphtool/network/MessageMorphTool.java +++ b/src/main/java/vazkii/morphtool/network/MessageMorphTool.java @@ -1,24 +1,18 @@ package vazkii.morphtool.network; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.chat.Component; -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 net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.network.handling.IPayloadContext; -import net.neoforged.neoforge.network.handling.IPayloadHandler; + import vazkii.morphtool.ConfigHandler; import vazkii.morphtool.MorphTool; import vazkii.morphtool.MorphingHandler; -import java.util.function.Supplier; - public record MessageMorphTool(ItemStack stack, int slot) implements CustomPacketPayload { public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(MorphTool.MOD_ID, "tool_data")); public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec( @@ -49,10 +43,6 @@ public static void handle(MessageMorphTool msg, final IPayloadContext ctx) { inventory.setItem(ConfigHandler.invertHandShift.get() ? inventory.getContainerSize() - 1 : msg.slot(), msg.stack()); } } - }).exceptionally(e -> { - // Handle exception - ctx.disconnect(Component.translatable("akashictome.networking.morph_tome.failed", e.getMessage())); - return null; }); } } diff --git a/src/main/java/vazkii/morphtool/network/NetworkHandler.java b/src/main/java/vazkii/morphtool/network/NetworkHandler.java index 8e42a51..715edcc 100644 --- a/src/main/java/vazkii/morphtool/network/NetworkHandler.java +++ b/src/main/java/vazkii/morphtool/network/NetworkHandler.java @@ -7,16 +7,16 @@ public class NetworkHandler { - public static void registerPayloadHandler(final RegisterPayloadHandlersEvent event) { - final PayloadRegistrar registrar = event.registrar("1"); - registrar.playToServer( - MessageMorphTool.TYPE, - MessageMorphTool.STREAM_CODEC, - MessageMorphTool::handle - ); - } + public static void registerPayloadHandler(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); + registrar.playToServer( + MessageMorphTool.TYPE, + MessageMorphTool.STREAM_CODEC, + MessageMorphTool::handle + ); + } - public static void sendToServer(CustomPacketPayload msg) { - PacketDistributor.sendToServer(msg); - } + public static void sendToServer(CustomPacketPayload msg) { + PacketDistributor.sendToServer(msg); + } } diff --git a/src/main/java/vazkii/morphtool/proxy/ClientProxy.java b/src/main/java/vazkii/morphtool/proxy/ClientProxy.java index fa5973c..5e320f8 100644 --- a/src/main/java/vazkii/morphtool/proxy/ClientProxy.java +++ b/src/main/java/vazkii/morphtool/proxy/ClientProxy.java @@ -3,6 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.world.InteractionHand; import net.neoforged.neoforge.common.NeoForge; + import vazkii.morphtool.ClientHandler; import vazkii.morphtool.ConfigHandler; diff --git a/src/main/java/vazkii/morphtool/proxy/CommonProxy.java b/src/main/java/vazkii/morphtool/proxy/CommonProxy.java index eabfd54..247ef99 100644 --- a/src/main/java/vazkii/morphtool/proxy/CommonProxy.java +++ b/src/main/java/vazkii/morphtool/proxy/CommonProxy.java @@ -1,6 +1,7 @@ package vazkii.morphtool.proxy; import net.neoforged.neoforge.common.NeoForge; + import vazkii.morphtool.MorphingHandler; public class CommonProxy { diff --git a/src/main/resources/assets/morphtool/lang/en_us.json b/src/main/resources/assets/morphtool/lang/en_us.json index 109f52c..9bd1362 100644 --- a/src/main/resources/assets/morphtool/lang/en_us.json +++ b/src/main/resources/assets/morphtool/lang/en_us.json @@ -1,5 +1,14 @@ { "morphtool.sudo_name": "Morphing Tool (%s)", "item.morphtool.tool": "Morphing Tool", - "morphtool.misc.shift_for_info": "§7Hold §bSHIFT§7 for more info" + "morphtool.misc.shift_for_info": "§7Hold §bSHIFT§7 for more info", + "morphtool.configuration.title": "Title", + "morphtool.configuration.offhand_morph.tooltip": "Morph in the offhand instead of mainhand", + "morphtool.configuration.section.morphtool.common.toml.title": "Morph-o-Tool Config", + "morphtool.configuration.blacklist_mods": "Blacklisted Mods", + "morphtool.configuration.offhand_morph": "Offhand Morph", + "morphtool.configuration.whitelist_items": "Whitelisted Items", + "morphtool.configuration.whitelist_names": "Whitelisted Names", + "morphtool.configuration.mod_aliasses": "Mod Aliases", + "morphtool.configuration.allow_all_items": "Allow all Items" } \ No newline at end of file From ac96468fd8d33e70277f9b642dbb75835752dddf Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Wed, 23 Oct 2024 11:05:06 +0200 Subject: [PATCH 5/8] update actions & scrips --- .github/workflows/gradle.yml | 26 ++++++++-------- push_tag.py | 58 +++++++++++++++++++----------------- scripts/upload_releases.sh | 42 +++++++++++++------------- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index e1589c2..d8f5180 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -6,16 +6,16 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - name: Validate gradlew integrity - uses: gradle/wrapper-validation-action@v1 + uses: gradle/actions/wrapper-validation@v3 - name: Cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -35,7 +35,7 @@ jobs: run: | VERSION=$(awk -F '=' '/^version/ { print $2; }' build.properties) BUILD=$(awk -F '=' '/build_number/ { print $2; }' build.properties) - echo "forge=build/libs/Morph-o-Tool-${VERSION}-${BUILD}.jar" >> "$GITHUB_OUTPUT" + echo "neoforge=build/libs/Morph-o-Tool-${VERSION}-${BUILD}.jar" >> "$GITHUB_OUTPUT" - name: Sign jars env: SIGNING_KEY: ${{ secrets.VIOLET_MOON_SIGNING_KEY }} @@ -43,20 +43,20 @@ jobs: run: | echo "${SIGNING_KEY}" | gpg --import - gpg --local-user "Violet Moon Signing Key" --armor \ - --detach-sign ${{ steps.calculate_artifact_names.outputs.forge }} - - name: Archive Forge Artifacts - uses: actions/upload-artifact@v2 + --detach-sign ${{ steps.calculate_artifact_names.outputs.neoforge }} + - name: Archive NeoForge Artifacts + uses: actions/upload-artifact@v4 with: - name: Forge + name: NeoForge path: | - ${{ steps.calculate_artifact_names.outputs.forge }} - ${{ steps.calculate_artifact_names.outputs.forge }}.asc + ${{ steps.calculate_artifact_names.outputs.neoforge }} + ${{ steps.calculate_artifact_names.outputs.neoforge }}.asc - name: Upload Releases if: startsWith(github.ref, 'refs/tags/release-') env: GH_TOKEN: ${{ github.token }} GIT_REF: ${{ github.ref }} - FORGE_JAR: ${{ steps.calculate_artifact_names.outputs.forge }} + NEOFORGE_JAR: ${{ steps.calculate_artifact_names.outputs.neoforge }} CURSEFORGE_TOKEN: ${{ secrets.VAZKII_CURSEFORGE_TOKEN }} MODRINTH_TOKEN: ${{ secrets.VAZKII_MODRINTH_TOKEN }} run: | diff --git a/push_tag.py b/push_tag.py index 6675f61..105ed9f 100644 --- a/push_tag.py +++ b/push_tag.py @@ -2,34 +2,36 @@ import re from jproperties import Properties + def main(): - build = Properties() - with open('build.properties', 'rb') as f: - build.load(f , "utf-8") - - mc_version, mcv_meta = build['mc_version'] - version, v_meta = build['version'] - build_number, bn_meta = build['build_number'] - - print('MC Version:', mc_version) - print('Version:', version) - print('Build Number', build_number) - - changelog = '-m "Changelog:" ' - with open('changelog.txt', 'r') as f: - content = f.read() - - content = content.replace('"', '\''); - changelog = changelog + re.sub(r'(- .+)\n?', '-m "\g<1>" ', content) - - os.system('git tag -a release-{}-{}-{} {}'.format(mc_version, version, build_number, changelog)) - - build['build_number'] = str(int(build_number) + 1) - with open("build.properties", "wb") as f: - build.store(f, encoding="utf-8") - - os.system('git commit -a -m build') - os.system('git push origin master release-{}-{}-{}'.format(mc_version, version, build_number)) + build = Properties() + with open('build.properties', 'rb') as f: + build.load(f, "utf-8") + + mc_version, mcv_meta = build['mc_version'] + version, v_meta = build['version'] + build_number, bn_meta = build['build_number'] + + print('MC Version:', mc_version) + print('Version:', version) + print('Build Number', build_number) + + changelog = '-m "Changelog:" ' + with open('changelog.txt', 'r') as f: + content = f.read() + + content = content.replace('"', '\''); + changelog = changelog + re.sub(r'(- .+)\n?', '-m "\g<1>" ', content) + + os.system('git tag -a release-{}-{}-{} {}'.format(mc_version, version, build_number, changelog)) + + build['build_number'] = str(int(build_number) + 1) + with open("build.properties", "wb") as f: + build.store(f, encoding="utf-8") + + os.system('git commit -a -m build') + os.system('git push origin master release-{}-{}-{}'.format(mc_version, version, build_number)) + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/scripts/upload_releases.sh b/scripts/upload_releases.sh index 3efe2f1..a3b750c 100755 --- a/scripts/upload_releases.sh +++ b/scripts/upload_releases.sh @@ -19,19 +19,19 @@ function release_github() { -f tag_name="${TAGNAME}")" GH_RELEASE_PAGE=$(echo "$GH_RELEASE_RESPONSE" | jq -r .html_url) - echo >&2 'Uploading Forge Jar and Signature to GitHub' - gh release upload "${TAGNAME}" "${FORGE_JAR}#Forge Jar" - gh release upload "${TAGNAME}" "${FORGE_JAR}.asc#Forge Signature" + echo >&2 'Uploading NeoForge Jar and Signature to GitHub' + gh release upload "${TAGNAME}" "${NEOFORGE_JAR}#NeoForge Jar" + gh release upload "${TAGNAME}" "${NEOFORGE_JAR}.asc#NeoForge Signature" } function release_modrinth() { - echo >&2 'Uploading Forge Jar to Modrinth' - local MODRINTH_FORGE_SPEC - MODRINTH_FORGE_SPEC=$(cat <&2 'Uploading NeoForge Jar to Modrinth' + local MODRINTH_NEOFORGE_SPEC + MODRINTH_NEOFORGE_SPEC=$(cat <&2 'Uploading Forge Jar to CurseForge' - local CURSEFORGE_FORGE_SPEC - CURSEFORGE_FORGE_SPEC=$(cat <&2 'Uploading NeoForge Jar to CurseForge' + local CURSEFORGE_NEOFORGE_SPEC + CURSEFORGE_NEOFORGE_SPEC=$(cat < Date: Thu, 26 Dec 2024 03:33:57 +0100 Subject: [PATCH 6/8] bump versions --- build.gradle | 2 ++ build.properties | 4 ++-- .../morphtool/data_components/ToolContentComponent.java | 8 ++------ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index ea510a8..4e9f22b 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,9 @@ repositories { dependencies { implementation "net.neoforged:neoforge:21.1.1" + //test mods implementation "curse.maven:applied-energistics-2-223794:5610903" + implementation "curse.maven:storage-drawers-223852:5840297" } spotless { diff --git a/build.properties b/build.properties index 03c4db8..67e7b69 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ #Wed Aug 07 18:14:56 UTC 2024 -neoforge_version=21.1.1 +neoforge_version=21.1.90 mod_id=morphtool dir_repo=./ build_number=39 @@ -8,4 +8,4 @@ version=1.8 mod_name=Morph-o-Tool mc_version=1.21.1 neogradle.subsystems.parchment.minecraftVersion=1.21 -neogradle.subsystems.parchment.mappingsVersion=2024.07.28 +neogradle.subsystems.parchment.mappingsVersion=2024.11.17 diff --git a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java index 705650c..30f57cb 100644 --- a/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java +++ b/src/main/java/vazkii/morphtool/data_components/ToolContentComponent.java @@ -25,12 +25,8 @@ public ToolContentComponent(List contents) { this.items = contents; } - private static DataResult checkAndCreate(List p_381706_) { - try { - return DataResult.success(new ToolContentComponent(p_381706_)); - } catch (ArithmeticException arithmeticexception) { - return DataResult.error(() -> "Excessive total bundle weight"); - } + private static DataResult checkAndCreate(List stacks) { + return DataResult.success(new ToolContentComponent(stacks)); } public boolean isEmpty() { From 03289c30353f5434bf9f0bf4a94f74e258574d28 Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Thu, 26 Dec 2024 04:18:53 +0100 Subject: [PATCH 7/8] update changelog --- changelog.txt | 4 +--- src/main/java/vazkii/morphtool/AttachementRecipe.java | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/changelog.txt b/changelog.txt index 58a8094..deab754 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1 @@ -- Ported to 1.20.1 (1.21 port is coming next) -- Fixed: Rotation feature not working -- Fixed: Removing an Item from the Tool changes its title to the raw name \ No newline at end of file +- Ported to 1.21.1 \ No newline at end of file diff --git a/src/main/java/vazkii/morphtool/AttachementRecipe.java b/src/main/java/vazkii/morphtool/AttachementRecipe.java index d5ab1ca..01f17b0 100644 --- a/src/main/java/vazkii/morphtool/AttachementRecipe.java +++ b/src/main/java/vazkii/morphtool/AttachementRecipe.java @@ -64,7 +64,6 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) { if (!tool.has(Registries.TOOL_CONTENT)) return ItemStack.EMPTY; ItemStack copy = tool.copy(); - String mod = MorphingHandler.getModFromStack(target); ToolContentComponent contents = copy.get(Registries.TOOL_CONTENT); if (contents == null) { return ItemStack.EMPTY; From 045449842053986bf5c4a4e27eb3a4aa91bdba5f Mon Sep 17 00:00:00 2001 From: Uraneptus Date: Thu, 26 Dec 2024 04:19:15 +0100 Subject: [PATCH 8/8] build --- build.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.properties b/build.properties index 67e7b69..078fa48 100644 --- a/build.properties +++ b/build.properties @@ -1,8 +1,8 @@ -#Wed Aug 07 18:14:56 UTC 2024 +#Thu Dec 26 03:19:15 UTC 2024 neoforge_version=21.1.90 mod_id=morphtool dir_repo=./ -build_number=39 +build_number=40 dir_output=../Build Output/Morphtool/ version=1.8 mod_name=Morph-o-Tool