4 ms·
I don't know if it was done with modding in mind or not, but the transition to data packs was a non-trivial addition of mod support.
by xboxnolifes 1y ago
I don't know if it was done with modding in mind or not, but the transition to data packs was a non-trivial addition of mod support.
- immibis 1y agoAt the cost of inner-platform-effecting all the game code. Long-time software engineers know all about the inner platform effect - if not, see [1]. Instead of writing directly what you want, something like: new Block("mymod:mystone").setShape(Shapes.CUBE).setTexture("mymod:stone_texture").setStepSound(Sounds.STEP_ON_STONE)... you now have to do some of this inline (the part that can't be customized in data packs): new Block("mymod:mystone").setStepSound(Sounds.STEP_ON_STONE)... but the rest is looked up across 5 different cross-referenced JSON files full of magic values with no autocomplete or syntax highlighting. Start with an indirection layer in assets/mymod/blockstates/mystone.json: [2] {"variants": {"": {"model": "mystone"}}} then of course you have to actually specify how to display the block: [3] {"parent": "minecraft:block/cube_all", "textures": {"all": "fabric-docs-reference:block/steel_block"}} (you see that? there are inheritance and variables in Minecraft's ad-hoc JSON language) You need a second file to specify how to display the item when it's held in your hand. Usually it's similar boilerplate. But have a look at the abomination that is "item property overrides" [4] [5] as an example of inner-platforming. Instead of render(is_cast ? cast_model : uncast_model); there's this whole infrastructure of a registry of item property predicates written in Java which can then be referenced in JSON to select a different model file under specific conditions. [1] https://thedailywtf.com/articles/the_inner-platform_effect https://thedailywtf.com/articles/the_inner-platform_effect [2] https://docs.minecraftforge.net/en/1.12.x/models/blockstates/introduction/ https://docs.minecraftforge.net/en/1.12.x/models/blockstates... [3] https://docs.fabricmc.net/develop/data-generation/block-models https://docs.fabricmc.net/develop/data-generation/block-mode... [4] https://docs.minecraftforge.net/en/1.12.x/models/overrides/ https://docs.minecraftforge.net/en/1.12.x/models/overrides/ [5] https://minecraft.fandom.com/wiki/Tutorials/Models#Example:_Fishing_Rod https://minecraft.fandom.com/wiki/Tutorials/Models#Example:_...
- tehbeard 1y agoA key part you're missing either willfully or ignorantly is that they're midway through the refactoring to make it data driven, so you have these odd/rough edges. Yes, having to declare json files for your new block in your mod is a pain... Meanwhile what it was built for, resource packs, this actually gives a good amount of power to the pack maker without having to ask the client to run untrusted java code.
- accrual 1y agoI was just watching a cool video on "world gen modders" where the author demonstrated by tweaking just a few values in a custom JSON it was possible to create new kinds of landscapes. At least in their corner it seems like the JSON files are exactly what they want to use to achieve their goals.
- immibis 1y agoIt was like that when it was in Java, too. Just tweak just a few values in a custom Java class. Plus you could be as weird as you wanted instead of limited to a very rigid format. You weren't limited to tweaking values. You can still override it in Java code instead of tweaking values, but it's much more painful because all the existing code is geared towards reading the tweakable values.
- immibis 1y agoIt's not data-driven, it's still code-driven, just now the code is written in shitty-JSON-language. This is how the inner platform effect works. See also the configuration complexity clock [1]. [1] https://mikehadlow.blogspot.com/2012/05/configuration-complexity-clock.html https://mikehadlow.blogspot.com/2012/05/configuration-comple...
- tsunagatta 1y agoHonest question: what’s the alternative to inner-platform-effecting if you still want a system that’s highly user-customizable at runtime?