Jump to content

Recommended Posts

Posted

Minecraft Automodder

 

 

Introduction

 

The modding community is what keeps Minecraft alive and fresh. It allows for a myriad of gameplay possibilities, each player able to shape their experience however they desire. Forge has been able to realize so many potentials, but up until now you needed to have a background in programming with Java, spend countless hours finding out how Minecraft works, how Forge works, look up tutorials, and find every single bug that arises within your code. All of this on top of the already heavy workload of trying to create a unique ground-breaking mod to amaze and impress, and the work doesn't just stop there. Every time Minecraft updates you need to pick through your mountain of code making changes so it'll work with the latest version of Forge. The Minecraft Automodder aims to eliminate all of these problems.

 

NOTE: INFORMATION BELOW STATES INTENDED FEATURES THAT HAVE YET TO BE IMPLEMENTED!

If you're looking for something to use right at this very second, you'll need to look elsewhere as this is currently in it's pre-alpha stages of development and doesn't have a public version yet!

 

 

Features

 

It's all good and well to say we're going to address some problems, but what specifically are we going to add to make your modding experience a better one?

  • A Development Interface
    You won't need to look at a single line of code again! With a fully functional development environment, easily add and remove blocks, items, recipes, mobs, textures, anything you can imagine.
     
     
     
  • Automatic Updating
    The work of making the mod is taxing enough, why waste your time having to redo your code every time Minecraft updates when it can be done automatically? Now your full attention can be focused on content rather than updating!
     
     
     
  • Backwards Compatibility
    Don't you hate it when you want to use an old version of Minecraft for some nostalgic gameplay but your favourite mods were just in their budding development at the time and lack that crucial feature you just gotta have? We sure do, that's why all mods created with the Automodder will be able to be played on any version of Minecraft that it supports.
     
     
     
  • Easy Cross-Mod Development
    Have you ever wanted to add extra features to an already existing mod but can't decipher their code? Want to easily remove and replace the features you don't like about it? Now just simply import any existing Automodder mod and work directly alongside it.

 

How it Works

 

All of this sounds fine and dandy on paper, but you may be wondering how all of this is possible. The Automodder works as such: The first part is your mod file. When you create and save your mod, it creates a text file with an extension of .MCA for identification purposes. The second part is the Automodder support mod. This support mod is coded through Forge and is a true traditional mod coded just as any other mod is today.

 

Forge will still need to be installed, and the support mod will still need to be added like any other Forge mod. Upon loading the game for the first time, the support mod will create a new directory inside the mods folder specifically for Automodder mods, in which you will place the files of all the mods you want added to your game.

 

On startup, the support mod will run through these files, and dynamically add blocks, items, and everything else your mod includes. Since the support mod is the only true Forge mod, it's the only thing that needs to get updated, as it reads every Automodder mod the same way.

 

 

Questions and Answers

  • Will these mods be compatible with all the current Forge mods? I can't live without Buildcraft!
    Yes! Most Automodder mods should be compatible with all current Forge mods. It cannot be guaranteed, however, as I have no control over other modders methods of coding. A planned feature of being able to edit vanilla Minecraft will also break compatibility of some mods, for instance removing apples in your mod will make it incompatible with mods that use that block as a component in their recipes, although this is the only if you choose to edit vanilla mechanics in your mod and will not break compatibility with mods that choose not to utilize this feature. No other currently planned features will break compatibility.
     
     
     
  • How much control will I have with my mod, since it's only a text file and doesn't contain any actual code?
    You will have access to every feature that gets added to the development interface. This is a community focused project for you guys, so the features that get added will be heavily decided by you. Blocks, items, and recipes will have full customization over every property of them, as well as a custom event script to handle actions such as being mined, stepped on, eaten, etc. Once again, this is focused for you guys so if I deem something to be low priority and no-one says they want that particular feature then it may take a while before it gets added.
     
     
     
  • Okay then, I want this that, the other thing, and the kitchen sink.
    Woah there, slow down hotshot. While it's nice to have every feature imaginable straight from the get-go keep in mind that this project is being worked on by a single developer, and as such there's little possibility of multitasking twenty different features at once. Just state the main, important features that you want prioritized, everything else will come with time. If I see NBTTag support on the same post as flower rendering, I'll assume you want both of them equally and will be happy with either one, in which case chances are I'll take the simpler of the choices to add more features quicker. Once the main features you guys want are in then it's time to add in the lower priority ones that slipped by.
     
     
     
  • I've suggested my idea a hundred times this past hour and you still haven't added it in! What gives?
    Patience is key. I work on this when I can, but it's not a paid job and there are other things that get in the way, such as eating, sleeping, and this strange thing some people call a life. It'll get added when it gets added, but trying to force it with spam and threats will only get it further removed from the to-do list. I'm a jerk like that, it's something you'll have to deal with.
     
     
     
  • Is this going to be open source?
    Right now I'm debating on if it'll be open source or if I'll add data encryption to the .MCA files. I support open source mods, I love the concept of being able to help show other people how I program things, and I would love to have this open source, but if it is then the algorithms for data decryption will also be made public, rendering it moot. If the files are encrypted, it makes it virtually impossible to change the data within them, such as altering the author name and trying to pass someone else's mod off as your own. One solution to this is to upload an alternate source of the code that skips out on the data decryption, although this would be an added work load to have to change the source to work between encrypted data and how it is now.
     
    What's probably going to happen is I'll let the community decide what they'd rather have, encrypted files or source code. Then when most of the features have been added in and the code will only need to be updated when Forge updates rather than every time a new feature is added in, I'll release the other option. If people would rather have encryption, then chances are I'll upload the occasional source code, but it won't be the most up to date, it'll just be whenever I feel like putting in the extra work.
     
     
     
  • So how am I supposed to get my voice heard among the sea of comments then?
    There will be frequent polls set up for main features, and that's mainly how I'll decide what to add. Comments aren't completely out of the question, you may have an idea that I haven't thought of. If I think it's a good idea I'll probably add it into a future poll, and if I think it's an exceptional idea it may warrant an immediate inclusion into the Automodder.
     
     
     
  • How can I get on your good side?
    Common courtesy is the easiest way to make me willing to help/add a feature. Be nice to me and I'll be nice to you. Spelling and grammar is also a good way to get me to help. I'll be more likely to respond if you talk with proper capitalization at the beginning of sentences and the [QUESTION] tags being all capitals as shown below. I know spelling mistakes occur, but pls dnt ask y i nvr added a feature b4 lik dis, chances are I won't respond, again being the jerk that I am.
     
     
     
  • Feral Instinct? You have a subforum in the inactive mods section, why spam here rather than post there?
    That is an old subforum that was created by another member of the development team at the time, who is no longer with us. That subforum is no longer regulated by Feral Instinct and a notification has been sent with a request to take it down.
     
     
     
  • None of these answer my question!
    Leave a comment below! I'll try to answer it if I can, and if it's important enough I might add it to this list. Check for other similar questions first though, as if I see a repeat question it will be ignored. Make sure to prefix your post with [QUESTION], or it won't be answered. This is to help people search the inevitable mountain of arguably useless posts and make it so I won't need to answer the same question every other day. This will be enforced to make sure it's used. An example would be:
     
    [QUESTION]
    What is the purpose of the save as .txt option that's currently unimplemented?
     
    The question will be answered with a quote of the original post, followed by an answer, for example:
     
    [QUESTION]
    What is the purpose of the save as .txt option that's currently unimplemented?
     
    [ANSWER]
    This is a low priority planned feature that will allow you to save your files as actual code for Java to allow you to work on your mod normally. This is non-reversible, you won't be able to import this to an Automodder mod down the road, so make sure you save an .MCA file as well!
     
    When you're searching for previously asked questions, start with a search for [ANSWER] to see if I've given an answer to someone else already, and if not make sure to do a search of [QUESTION] to see if the question exists but I haven't been able to answer it yet. If you think you know the answer to a question I'd appreciate if you don't answer it tagged unless you know for 100% sure what the problem is, how to fix it, explain it properly, and use the proper formatting. Untagged discussions of the problem at hand with possible but not guarenteed solutions, are acceptable.
     
     
     
  • Is there anything else that I can do to help get my comment noticed?
    Yes there is! Below is a list of other tags that I'll be looking for. It is highly recommended that they be used. As mentioned above do a search using these tags before you post your own, your answer may have already been noted.
     
    [bUG] Used to submit a bug. Will be responded to with a post tagged [bUGFIX] to help with searching before posting to ensure no duplicate posts.
    [FEATURE] Used to request a feature. These might not be responded to directly, and will be added in the to-do list as I see fit.
    [GRAMMAR] Used to point out any spelling/grammatical errors in this document or in the download files. I'm big on grammar so every step towards perfection is greatly appreciated.
     
    Tags will be added and removed as I see fit. As per before, proper capitalization is highly recommended and improper use of tags to try and get a message noticed will not be tolerated.

 

Current Progress

 

Blocks:

Properties: 80%

Textures: 100%

Basic Eventing: 80%

 

Items:

Properties: 75%%

Textures: 100%

Basic Eventing: 80%

 

Recipes: COMPLETE

Shaped: 100%

Shapeless: 100%

Vanilla blocks/items: 100%

Automodder blocks/items: 100%

 

Planned tasks to do once progress list is completed:

Release: v0.1.0 ALPHA.

 

 

Important Information

 

Currently, although light work has been done on the development interface, there are no plans of it being released due to me wanting to push features first. Mods can be created using a regular text editor, and appropriate text tutorials will be uploaded to assist with anyone wishing to get a head start on mods made with this. This may change if enough people would rather I develop the interface in parallel with the Automodder.

 

 

Downloads

 

As stated above, there are no downloads yet, this is merely a placeholder for the future.

 

 

Final Words

 

Currently, this post is solely for the purpose of introducing the concept to the public, and seeing if it sparks any interest within the community. My goal is to help inspire new creative minds making mods when once they would've been turned away by the entry level requirements while providing all the tools needed to make truly magnificent mods, and that this helps the modding community grow upon what it already is.

If you've made it this far, then I would like to thank you for your time, and hopefully for your support in making this a milestone for Minecraft modding.

Posted

Umm.. I suggest you don't post it unless you can actually download. This won't help.

It is nice to have a placeholder for it and to let people know about it though so even if it doesn't help right now we know that it will be released and will make it much easier for the inexperienced coders to make a mod. Not saying that I will use it but it is a cool idea.

You can find my mod MechaniCraft at this link:

http://www.minecraftforge.net/forum/index.php/topic,13923.0.html

 

- Will11690

Posted

Oh and [FEATURE]

1.) This is probably counted in blocks but custom furnaces (EX:Ore grinders, powered machines).

2.) A type of power system api for powered machines so that they can run off of all current types of power(EX:RF, MJ, EU, etc.).

 

[ANSWER]

Short answer, both of these features are planned for a later update.

 

Long answer, custom furnaces, chests, and all similar objects all use NBTTagCompound and TileEntity mechanics, and in order to add furnace support the vast majority, if not the entirety of both of those would need to be added in. It's definitely going to be added in, just not in the first release and possibly not for a few releases after. Everything that can be done with these mechanics now will eventually be supported.

 

As for power system API's, they'll once again rely on the NBT tags and tile entities. Any mod that utilizes these will hopefully be fully supported, regardless of if it uses them to store a player name or control an entire energy system. That being said, any fields in a mod classes themselves used for data storage will not be able to be accessed through these mods. All data should be stored in NBT tags though, so ideally this won't cause an issue with mod compatibility and functionality.

 

It would also be advisable to note that the information above is my personal understanding of how Minecraft is coded, and I haven't looked into these aspects for quite a while, so this information may be outdated or altogether wrong.

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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Please post logs as described in the FAQ (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/), they will contain information that may help.  
    • I've been trying to find a solution for this for the past few days and cant seem to find it anywhere.   What i want to do is basically set my player's head pitch without the server noticing it. Basically client-side change.   Is there a way to do this? With mixins or anything else?   Thanks in advance.
    • Did you ever find a solution to this
    • I have followed a tutorial on how to generate ores for my mod though the data files have not been generated despite me running data in my IDE.  I have looked over and compared my code multiple times and the only differences are either with the IDs or with unnecessary code because of what my mod is (The mod is for the End so I don't need the Overworld or Nether ores), my folders are all in the right structure and no warnings are present when ran. I have been trying to figure this out for a few days now so help would be much appreciated.  The tutorial I was following.  My code -  public class ModBiomeModifiers { public static final ResourceKey<BiomeModifier> ADD_GAZITE_ORE = registerKey("add_gazite_ore"); public static final ResourceKey<BiomeModifier> TRANSCENDINE_GAZITE_ORE = registerKey("add_transcendine_ore"); public static void bootstrap(BootstrapContext<BiomeModifier> context) { var placedFeature = context.lookup(Registries.PLACED_FEATURE); var biomes = context.lookup(Registries.BIOME); context.register(ADD_GAZITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.GAZITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(TRANSCENDINE_GAZITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.TRANSCENDINE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); } private static ResourceKey<BiomeModifier> registerKey(String name) { return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } } The tutorial's code -  public class ModBiomeModifiers { public static final ResourceKey<BiomeModifier> ADD_ALEXANDRITE_ORE = registerKey("add_alexandrite_ore"); public static final ResourceKey<BiomeModifier> ADD_NETHER_ALEXANDRITE_ORE = registerKey("add_nether_alexandrite_ore"); public static final ResourceKey<BiomeModifier> ADD_END_ALEXANDRITE_ORE = registerKey("add_end_alexandrite_ore"); public static void bootstrap(BootstrapContext<BiomeModifier> context) { var placedFeature = context.lookup(Registries.PLACED_FEATURE); var biomes = context.lookup(Registries.BIOME); context.register(ADD_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_OVERWORLD), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); // Individual Biomes // context.register(ADD_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( // HolderSet.direct(biomes.getOrThrow(Biomes.PLAINS), biomes.getOrThrow(Biomes.BAMBOO_JUNGLE)), // HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.ALEXANDRITE_ORE_PLACED_KEY)), // GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(ADD_NETHER_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_NETHER), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.NETHER_ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(ADD_END_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.END_ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); } private static ResourceKey<BiomeModifier> registerKey(String name) { return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } }   ModConfiguredFeatures:   My code -  public class ModConfiguredFeatures { public static final ResourceKey<ConfiguredFeature<?, ?>> GAZITE_ORE_KEY = registerKey("gazite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> TRANSCENDINE_ORE_KEY = registerKey("transcendine_ore"); public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) { RuleTest endReplaceables = new BlockMatchTest(Blocks.END_STONE); register(context, GAZITE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.GAZITE_ORE.get().defaultBlockState(), 4)); register(context, TRANSCENDINE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.TRANSCENDINE_ORE.get().defaultBlockState(), 8)); List<OreConfiguration.TargetBlockState> EndOres = List.of( OreConfiguration.target(endReplaceables, ModBlocks.GAZITE_ORE.get().defaultBlockState()), OreConfiguration.target(endReplaceables, ModBlocks.TRANSCENDINE_ORE.get().defaultBlockState())); } public static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) { return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(BootstrapContext<ConfiguredFeature<?, ?>> context, ResourceKey<ConfiguredFeature<?, ?>> key, F feature, FC configuration) { context.register(key, new ConfiguredFeature<>(feature, configuration)); } }   The tutorial's code - public class ModConfiguredFeatures { public static final ResourceKey<ConfiguredFeature<?, ?>> OVERWORLD_ALEXANDRITE_ORE_KEY = registerKey("alexandrite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> NETHER_ALEXANDRITE_ORE_KEY = registerKey("nether_alexandrite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> END_ALEXANDRITE_ORE_KEY = registerKey("end_alexandrite_ore"); public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) { RuleTest stoneReplaceables = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); RuleTest deepslateReplaceables = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); RuleTest netherrackReplaceables = new BlockMatchTest(Blocks.NETHERRACK); RuleTest endReplaceables = new BlockMatchTest(Blocks.END_STONE); List<OreConfiguration.TargetBlockState> overworldAlexandriteOres = List.of( OreConfiguration.target(stoneReplaceables, ModBlocks.ALEXANDRITE_ORE.get().defaultBlockState()), OreConfiguration.target(deepslateReplaceables, ModBlocks.ALEXANDRITE_DEEPSLATE_ORE.get().defaultBlockState())); register(context, OVERWORLD_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(overworldAlexandriteOres, 9)); register(context, NETHER_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(netherrackReplaceables, ModBlocks.ALEXANDRITE_NETHER_ORE.get().defaultBlockState(), 9)); register(context, END_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.ALEXANDRITE_END_ORE.get().defaultBlockState(), 9)); } public static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) { return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(BootstrapContext<ConfiguredFeature<?, ?>> context, ResourceKey<ConfiguredFeature<?, ?>> key, F feature, FC configuration) { context.register(key, new ConfiguredFeature<>(feature, configuration)); } }   ModPlacedFeatures:   My code - public class ModPlacedFeatures { public static final ResourceKey<PlacedFeature> GAZITE_ORE_PLACED_KEY = registerKey("gazite_ore_placed"); public static final ResourceKey<PlacedFeature> TRANSCENDINE_ORE_PLACED_KEY = registerKey("transcendine_ore_placed"); public static void bootstrap(BootstrapContext<PlacedFeature> context) { var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); register(context, GAZITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.GAZITE_ORE_KEY), ModOrePlacement.commonOrePlacement(9, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(71)))); register(context, TRANSCENDINE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.GAZITE_ORE_KEY), ModOrePlacement.rareOrePlacement(6, HeightRangePlacement.uniform(VerticalAnchor.absolute(-32), VerticalAnchor.absolute(71)))); } private static ResourceKey<PlacedFeature> registerKey(String name) { return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } private static void register(BootstrapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration, List<PlacementModifier> modifiers) { context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); } }   the tutorial's code -  public class ModPlacedFeatures { public static final ResourceKey<PlacedFeature> ALEXANDRITE_ORE_PLACED_KEY = registerKey("alexandrite_ore_placed"); public static final ResourceKey<PlacedFeature> NETHER_ALEXANDRITE_ORE_PLACED_KEY = registerKey("nether_alexandrite_ore_placed"); public static final ResourceKey<PlacedFeature> END_ALEXANDRITE_ORE_PLACED_KEY = registerKey("end_alexandrite_ore_placed"); public static void bootstrap(BootstrapContext<PlacedFeature> context) { var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); register(context, ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.OVERWORLD_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); register(context, NETHER_ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.NETHER_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); register(context, END_ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.END_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); } private static ResourceKey<PlacedFeature> registerKey(String name) { return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } private static void register(BootstrapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration, List<PlacementModifier> modifiers) { context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); } }   ModOrePlacement:   My code -  public class ModOrePlacement { public static List<PlacementModifier> orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) { return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome()); } public static List<PlacementModifier> commonOrePlacement(int pCount, PlacementModifier pHeightRange) { return orePlacement(CountPlacement.of(pCount), pHeightRange); } public static List<PlacementModifier> rareOrePlacement(int pChance, PlacementModifier pHeightRange) { return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); } }   The tutorial's code -  public class ModOrePlacement { public static List<PlacementModifier> orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) { return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome()); } public static List<PlacementModifier> commonOrePlacement(int pCount, PlacementModifier pHeightRange) { return orePlacement(CountPlacement.of(pCount), pHeightRange); } public static List<PlacementModifier> rareOrePlacement(int pChance, PlacementModifier pHeightRange) { return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); } }  
    • I'm creating a modpack, and i just discovered that if i try to connect to a server it gives the error: Internal Exception: io.netty.handler.codec.DecoderException: java.lang.negativearraysizeexception -1   The client log:  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.