Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.15.2] Advice needed on selecting Map<K, V> implementation


 Share

Recommended Posts

Heya,

 

So, I have a class of tool called DrillItem, and I want to add a feature called "ore depletion." It's like stripping wood, except it's for ores. Depleting an ore spawns that ore's specific ItemStack at the player and replaces the ore with the next less depleted form. For example, if I right-clicked with a Diamond Drill on Coal Ore, it would turn into Depleted Coal Ore and give me 1 coal. If I right-clicked on the Depleted Coal Ore, it would turn to Twice Depleted Coal Ore and give me 1 more coal. If I right-clicked on the Twice Depleted Coal Ore, it would turn to Thrice Depleted Coal Ore and give me 1 more coal. If I right-clicked on the Thrice Depleted Coal Ore one final time, it would turn to stone and give me 1 more coal.

 

I want to use an implementation of Map<Block, Block> to control what each ore turns into when depleted, and a Map<Block, Supplier<ItemStack>> to determine what ItemStack comes out. I copied code from the AxeItem class's stripping map to create these maps. However, I am adding a static method registerDepletableOre that would allow other modders to add their ores to the system, and I want the maps to be mutable to that end. The Builder method of creating the map, which I am using now, doesn't do the trick for me. What other mutable implementations of Map should I use to make my map mutable?

Link to comment
Share on other sites

That sounds very similar to what I did. My implementation is just "you mine the block" and not a special tool.

I handled the variants as a variant value (the silk-touch and block item issue I dealt with using a custom loot table function).

 

https://github.com/Draco18s/ReasonableRealism/blob/1.14.4/src/main/java/com/draco18s/harderores/block/ore/HardOreBlock.java

 

I don't necessarily think this was a great solution, but it made more sense to leave the "density" as a query-able block property (for several reasons) rather than separate blocks.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Howdy

As per the earlier posts I'd suggest you just use a HashMap without a builder.

Longer term I think it would be a good idea to have your stripping information as a loot table (or possibly a custom recipe type if the loot table becomes unwieldy) so that it can be customised by folks in data packs, no coding required.

 

-TGG

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Hi everyone, I use the Curse Forge app for overwatch and I created a plain 1.17.1 forge 37.1.0 profile. It crashes immediately when I click "play" in the minecraft launcher. I just installed Java 16 and set minecraft to use it in the curse forge app settings. I don't have any mods installed and my log looks like this: [12:36:42] [main/INFO]: ModLauncher running: args [--username, MrKatuffel, --version, forge-37.1.0, --gameDir, C:\Users\Benni\Documents\Minecraft\Instances\1.17.1, --assetsDir, C:\Users\Benni\Documents\Minecraft\Install\assets, --assetIndex, 1.17, --uuid, 2021e6cbc7bc4d2a81effa163cfd62d9, --accessToken, ????????, --userType, mojang, --versionType, release, --width, 1024, --height, 768, --launchTarget, forgeclient, --fml.forgeVersion, 37.1.0, --fml.mcVersion, 1.17.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20210706.113038] [12:36:42] [main/INFO]: ModLauncher 9.0.7+91+master.8569cdf starting: java version 16.0.1 by Microsoft [12:36:42] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.4 Source=union:/C:/Users/Benni/Documents/Minecraft/Install/libraries/org/spongepowered/mixin/0.8.4/mixin-0.8.4.jar%2318! Service=ModLauncher Env=CLIENT [12:36:43] [main/INFO]: Found mod file fmlcore-1.17.1-37.1.0.jar of type LIBRARY with locator net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@6cc0bcf6 [12:36:43] [main/INFO]: Found mod file javafmllanguage-1.17.1-37.1.0.jar of type LANGPROVIDER with locator net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@6cc0bcf6 [12:36:43] [main/INFO]: Found mod file mclanguage-1.17.1-37.1.0.jar of type LANGPROVIDER with locator net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@6cc0bcf6 [12:36:43] [main/INFO]: Found mod file client-1.17.1-20210706.113038-srg.jar of type MOD with locator net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@6cc0bcf6 [12:36:43] [main/INFO]: Found mod file forge-1.17.1-37.1.0-universal.jar of type MOD with locator net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@6cc0bcf6 So I can see it is indeed using Java 16. The error message of the minecraft launcher is just: So that isn't helping. Anyone have any ideas?
    • Further testing revealed that Forge will not successfully load any library in the IDE at all, if the library is not a mod. This means this is either a Forge bug, or the way to include a library at runtime has been changed. Tested with a random library for Java not included in Minecraft or Forge: build.gradle dependencies { minecraft 'net.minecraftforge:forge:1.18-38.0.8' implementation 'com.github.ben-manes.caffeine:caffeine:3.0.4' } ExampleMod.java package com.example.examplemod; import com.github.benmanes.caffeine.cache.Caffeine; import net.minecraftforge.fml.common.Mod; @Mod("examplemod") public class ExampleMod { public ExampleMod() { Caffeine<Object, Object> graphs = Caffeine.newBuilder(); } } Will result in java.lang.NoClassDefFoundError: com/github/benmanes/caffeine/cache/Caffeine Should I file a bug report?
    • Thank you! I managed to get this working finally after puzzling through it, and your answer gave me a good place to start. I ended up using a combination of several for loops and an int array which was filled with the values of my "weight" json attribute for each recipe. Iterating through each recipe in my main list, I could add to a new array several repeats of the same number for the weight, and this number would correlate to a specific recipe in the main list. E.g. if the weight for the recipe in index 0 was 5, then 0 would be added to the array 5 times. My random number would then be chosen from this new array, and the recipe fetched from the main list using it. This works like an absolute charm. Hope this helps anyone else that might stumble on this thread! 
    • What should you set the Ingredient parameter of SimpleCookingRecipeBuilder.cooking() to?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.