Update to 1.20.1

This commit is contained in:
QuImUfu 2023-07-02 14:54:17 +02:00
parent 344ae127a9
commit 0003fc6c6b
15 changed files with 681 additions and 962 deletions

View File

@ -12,6 +12,11 @@ Put jsons with the same structure as
src/main/resources/data/simple_creator/items/test_item.json src/main/resources/data/simple_creator/items/test_item.json
src/main/resources/data/simple_creator/blocks/test_block.json src/main/resources/data/simple_creator/blocks/test_block.json
``` ```
in a (newly introduced) global datapack `(minecraft root)/datapacks`. in a (newly introduced) global folder `(minecraft root)/simplyCreated`
This datapack needs a `pack.mcmeta`. (automatically created on first startup).
If you set `enableTestThings: true`, example ones will be copied.
After a restart, the so created items are available ingame. After a restart, the so created items are available ingame.
You will need to add a ton of metadata
(translations, correct tools, mining levels) via datapacks.
I recommend using a mod like https://modrinth.com/mod/globalpacks in addition

View File

@ -1,21 +1,70 @@
"material": "soundGroup" ~ string
one of:
intentionally_empty, wood, gravel, grass, lily_pad, stone,
metal, glass, wool, sand, snow, powder_snow, ladder, anvil,
slime, honey, wet_grass, coral, bamboo, bamboo_sapling,
scaffolding, sweet_berry_bush, crop, stem, vine, nether_wart,
lantern, nether_stem, nylium, fungus, roots, shroomlight,
weeping_vines, weeping_vines_low_pitch, soul_sand, soul_soil,
basalt, wart_block, netherrack, nether_bricks, nether_sprouts,
nether_ore, bone, netherite, ancient_debris, lodestone, chain,
nether_gold_ore, gilded_blackstone, candle, amethyst_block,
amethyst_cluster, small_amethyst_bud, medium_amethyst_bud,
large_amethyst_bud, tuff, calcite, dripstone_block,
pointed_dripstone, copper, cave_vines, spore_blossom, azalea,
flowering_azalea, moss_carpet, pink_petals, moss_block, big_dripleaf,
small_dripleaf, rooted_dirt, hanging_roots, azalea_leaves,
sculk_sensor, sculk_catalyst, sculk, sculk_vein, sculk_shrieker,
glow_lichen, deepslate, deepslate_bricks, deepslate_tiles,
polished_deepslate, froglight, frogspawn, mangrove_roots,
muddy_mangrove_roots, mud, mud_bricks, packed_mud, hanging_sign,
nether_wood_hanging_sign, bamboo_wood_hanging_sign, bamboo_wood,
nether_wood, cherry_wood, cherry_sapling, cherry_leaves,
cherry_wood_hanging_sign, chiseled_bookshelf, suspicious_sand,
suspicious_gravel, decorated_pot, decorated_pot_shatter
changes how the block sounds
//controls what happens when a piston pushes this block "dropTableId" ~ string
the id of the drop table to use e.g. "minecraft:blocks/diamond_ore"
"blocksMovement" ~ boolean what loot table is used for blockdrops when broken successfully
//this sets whether water can flow away this block if "collidable" is false, otherwise subtily changes how fluids look around it
"collidable" ~ boolean "collidable" ~ boolean
//this sets whether the block has collision. if false you (and monsters) can walk throught the block. this sets whether the block has collision. if false you (and monsters) can walk throught the block.
"lightLevel" ~ int
0-15
how much light does the block produce
"explosionResistance" ~ float
0.0-3600000.0+
the resistance against explosions 6.0 is stone, 3600000.0 is bedrock, wood is usually 2.0 or 3.0
"hardness" ~ float
-1.0-50.0+
how hard it is to break the block. -1.0 is unbreakable, 50.0 is obsidian, 1.5 is stone, 2.0 cobble
"pistonBehavior" ~ string
one of:
normal, destroy, block, ignore, push_only
controls what happens when a piston pushes this block
"slipperiness" ~ float
"slowDownMultiplier" ~ float
"jumpVelocityMultiplier" ~ float
"blocksMovement" ~ boolean
this sets whether water can flow away this block if "collidable" is false, otherwise subtily changes how fluids look around it
"burnable" ~ boolean "burnable" ~ boolean
//does lava ignite the block does lava ignite the block
"burnChance" ~ int "burnChance" ~ int
//how fast the block burns down (leaves 60, wood 5, flowers 100) if 0, block will never burn down. how fast the block burns down (leaves 60, wood 5, flowers 100) if 0, block will never burn down.
"spreadChance" ~ int "spreadChance" ~ int
//how easily this block catches fire ( wood 5, leaves 30, flowers 60) if null, block can only be ignited by lava if burnable. how easily this block catches fire ( wood 5, leaves 30, flowers 60) if null, block can only be ignited by lava if burnable.
"breakByHand" ~ boolean "requiresTool" ~ boolean
//this sets whether the block drops when brocken without tool. this sets whether the block drops when broken without tool.

View File

@ -1,94 +1,99 @@
plugins { plugins {
id 'fabric-loom' version '0.6-SNAPSHOT' id 'fabric-loom' version '1.2-SNAPSHOT'
id 'maven-publish' id 'maven-publish'
} }
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
archivesBaseName = project.archives_base_name
version = project.mod_version version = project.mod_version
group = project.maven_group group = project.maven_group
minecraft { base {
archivesName = project.archives_base_name
} }
repositories { repositories {
maven { url "https://maven.shedaniel.me/" } // Add repositories to retrieve artifacts from in here.
maven { url "https://maven.terraformersmc.com/releases/" } // You should only use this when depending on other mods because
// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
// for more information about repositories.
maven { url 'https://maven.siphalor.de/' }
maven { url 'https://jitpack.io' }
}
loom {
splitEnvironmentSourceSets()
mods {
"modid" {
sourceSet sourceSets.main
sourceSet sourceSets.client
}
}
} }
dependencies { dependencies {
//to change the versions see the gradle.properties file // To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}" minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
modApi("me.shedaniel.cloth:cloth-config-fabric:4.11.18") { // Fabric API. This is technically optional, but you probably want it anyway.
exclude(group: "net.fabricmc.fabric-api") modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
}
modApi("com.terraformersmc:modmenu:1.16.8") // Uncomment the following line to enable the deprecated Fabric API modules.
//modCompile "me.sargunvohra.mcmods:autoconfig1u:2.0" // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time.
//include "me.sargunvohra.mcmods:autoconfig1u:2.0"
//modApi "me.shedaniel.cloth:config-2:2.13.1" include(modApi(platform("de.siphalor.tweed4:tweed4-bom-$project.minecraft_major_version:$project.tweed_version")))
//include "me.shedaniel.cloth:config-2:2.13.1" // Pick any modules you want to use, e.g.:
//modImplementation "io.github.prospector:modmenu:1.10.0+build.28" include(modApi("de.siphalor.tweed4:tweed4-base-$project.minecraft_major_version"))
include(modApi("de.siphalor.tweed4:tweed4-annotated-$project.minecraft_major_version"))
include(modApi("de.siphalor.tweed4:tweed4-data-$project.minecraft_major_version"))
include(modApi("de.siphalor.tweed4:tweed4-data-hjson-$project.minecraft_major_version"))
// modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}"
} }
processResources { processResources {
inputs.property "version", project.version inputs.property "version", project.version
from(sourceSets.main.resources.srcDirs) { filesMatching("fabric.mod.json") {
include "fabric.mod.json"
expand "version": project.version expand "version": project.version
} }
from(sourceSets.main.resources.srcDirs) {
exclude "fabric.mod.json"
}
} }
// ensure that the encoding is set to UTF-8, no matter what the system default is tasks.withType(JavaCompile).configureEach {
// this fixes some edge cases with special characters not displaying correctly it.options.release = 17
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
} }
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task java {
// if it is present. // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// If you remove this task, sources will not be generated. // if it is present.
task sourcesJar(type: Jar, dependsOn: classes) { // If you remove this line, sources will not be generated.
classifier = "sources" withSourcesJar()
from sourceSets.main.allSource
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
} }
jar { jar {
from "LICENSE" from("LICENSE") {
rename { "${it}_${project.archivesBaseName}"}
}
} }
// configure the maven publication // configure the maven publication
publishing { publishing {
publications { publications {
mavenJava(MavenPublication) { mavenJava(MavenPublication) {
// add all the jars that should be included when publishing to maven from components.java
artifact(jar) {
builtBy remapJar
}
artifact("${project.buildDir.absolutePath}/libs/${archivesBaseName}-${project.version}.jar"){
builtBy remapJar
}
artifact(sourcesJar) {
builtBy remapSourcesJar
}
} }
} }
// select the repositories you want to publish to // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories { repositories {
// uncomment to publish to the local maven // Add repositories to publish to here.
// mavenLocal() // Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
} }
} }

View File

@ -1,14 +1,17 @@
org.gradle.jvmargs = -Xmx1G org.gradle.jvmargs = -Xmx1G
#Fabric properties #Fabric properties
minecraft_version = 1.16.5 minecraft_version=1.20.1
yarn_mappings = 1.16.5+build.6 minecraft_major_version=1.20
loader_version = 0.11.3 yarn_mappings=1.20.1+build.9
loader_version=0.14.21
#Fabric api
fabric_version=0.84.0+1.20.1
#Mod properties #Mod properties
mod_version = 0.9.0 mod_version = 0.9.0
maven_group = quimufu.simple_creator maven_group = quimufu.simple_creator
archives_base_name = simple_creator archives_base_name = simple_creator
#Dependencies tweed_version=1.3.0+mc1.20-pre1
fabric_api_version = 0.32.5+1.16

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -1,462 +0,0 @@
Some materials have certain effects, apart from their properties.
They have effect on how noteblocks sound when the block is below:
material -> soundtype
---------------------
stone -> basedrum
sand -> snare
glass -> hat
wood -> bass
others -> harp
The "water" material should cause crashes (or at least errors in connection with the frostwalker enchantment. (untested)
Some materials prevent the block being broken by water, even if the other conditions are met:
portal
structure_void
underwater_plant
seagrass
The "ice" material negates the stronger downward flow next to solid blocks. i.e. for waterfalls: block ~ air
Some materials are broken faster by sword. This can also be achieved via tag "leaves".
plant
replaceable_plant
unused_plant
pumpkin
Some materials let the block when mined with an axe be broken faster:
wood
plant
replaceable_plant
bamboo
Some materials let the block when mined with an Pickaxe be broken faster and drop loot:
metal
anvil
stone
All materials with their settings:
"air"
pistonBehavior: "normal"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: true
solid: false
blocksLight: false
"structure_void"
pistonBehavior: "normal"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: true
solid: false
blocksLight: false
"portal"
pistonBehavior: "block"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: false
blocksLight: false
"carpet"
pistonBehavior: "normal"
blocksMovement: false
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: false
blocksLight: false
"plant"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: false
blocksLight: false
"underwater_plant"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: false
blocksLight: false
"replaceable_plant"
pistonBehavior: "destroy"
blocksMovement: false
burnable: true
breakByHand: true
liquid: false
replaceable: true
solid: false
blocksLight: false
"seagrass"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: true
solid: false
blocksLight: false
"water"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: true
replaceable: true
solid: false
blocksLight: false
"bubble_column"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: true
replaceable: true
solid: false
blocksLight: false
"lava"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: true
replaceable: true
solid: false
blocksLight: false
"snow"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: false
liquid: false
replaceable: true
solid: false
blocksLight: false
"fire"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: true
solid: false
blocksLight: false
"part"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: false
blocksLight: false
"cobweb"
pistonBehavior: "destroy"
blocksMovement: false
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: false
"redstone_lamp"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"clay"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"earth"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"organic"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"packed_ice"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"sand"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"sponge"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"shulker_box"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"wood"
pistonBehavior: "normal"
blocksMovement: true
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"bamboo_sapling"
pistonBehavior: "destroy"
blocksMovement: false
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"bamboo"
pistonBehavior: "destroy"
blocksMovement: true
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"wool"
pistonBehavior: "normal"
blocksMovement: true
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"tnt"
pistonBehavior: "normal"
blocksMovement: true
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: false
"leaves"
pistonBehavior: "destroy"
blocksMovement: true
burnable: true
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: false
"glass"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: false
"ice"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: false
"cactus"
pistonBehavior: "destroy"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: false
"stone"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: true
"metal"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: true
"snow_block"
pistonBehavior: "normal"
blocksMovement: true
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: true
"anvil"
pistonBehavior: "block"
blocksMovement: true
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: true
"barrier"
pistonBehavior: "block"
blocksMovement: true
burnable: false
breakByHand: false
liquid: false
replaceable: false
solid: true
blocksLight: true
"piston"
pistonBehavior: "block"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"unused_plant"
pistonBehavior: "destroy"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"pumpkin"
pistonBehavior: "destroy"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"egg"
pistonBehavior: "destroy"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"cake"
pistonBehavior: "destroy"
blocksMovement: true
burnable: false
breakByHand: true
liquid: false
replaceable: false
solid: true
blocksLight: true
"pistonBehavior":
normal,
destroy,
block,
ignore,
push_only

View File

@ -4,19 +4,29 @@ import com.google.common.collect.Maps;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.fabricmc.fabric.api.registry.FlammableBlockRegistry;
import net.fabricmc.fabric.mixin.object.builder.AbstractBlockSettingsAccessor; import net.minecraft.block.AbstractBlock;
import net.minecraft.block.*; import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.MapColor;
import net.minecraft.block.enums.Instrument;
import net.minecraft.block.piston.PistonBehavior; import net.minecraft.block.piston.PistonBehavior;
import net.minecraft.entity.EntityType;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.sound.BlockSoundGroup; import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper; import net.minecraft.util.JsonHelper;
import net.minecraft.util.Pair; import net.minecraft.util.Pair;
import net.minecraft.util.registry.Registry; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import java.util.Map; import java.util.Map;
@ -36,8 +46,8 @@ public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block,
@Override @Override
protected void register(Identifier id, Pair<Block, Item> thing) { protected void register(Identifier id, Pair<Block, Item> thing) {
Registry.register(Registry.BLOCK, id, thing.getLeft()); Registry.register(Registries.BLOCK, id, thing.getLeft());
Registry.register(Registry.ITEM, id, thing.getRight()); Registry.register(Registries.ITEM, id, thing.getRight());
} }
@Override @Override
@ -49,219 +59,338 @@ public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block,
@Override @Override
protected Pair<Block, Item> deserialize(Pair<Identifier, JsonObject> e) { protected Pair<Block, Item> deserialize(Pair<Identifier, JsonObject> e) {
JsonObject jo = e.getRight(); JsonObject jo = e.getRight();
Material material;
if(JsonHelper.hasString(jo, "material")){
String materialString = JsonHelper.getString(jo, "material");
material = getMaterial(materialString);
} else if (JsonHelper.getObject(jo,"material", null)!=null){
// get material information
JsonObject jmo = JsonHelper.getObject(jo, "material");
MaterialSettingsPojo mspj = GSON.fromJson(jmo, MaterialSettingsPojo.class);
//build material
material = getSettings(mspj);
} else {
material = Material.SOIL;
}
// get block information // get block information
BlockSettingsPojo bspj = GSON.fromJson(jo, BlockSettingsPojo.class); BlockSettingsPojo bspj = GSON.fromJson(jo, BlockSettingsPojo.class);
// move block information in Block.Settings (!!hacky!!) // move block information in Block.Settings (!!hacky!!)
Block.Settings bs = getSettings(material, bspj); Block.Settings bs = getSettings(bspj);
// parse item group // parse item group
String group = JsonHelper.getString(jo, "itemGroup", "misc"); String group = JsonHelper.getString(jo, "itemGroup", "misc");
ItemGroup g = ItemResourceLoader.findGroup(group); RegistryKey<ItemGroup> g = ItemResourceLoader.findGroup(group);
//create block and corresponding item //create block and corresponding item
Block resB = new Block(bs); Block resB = new Block(bs);
Item resI = new BlockItem(resB, new Item.Settings().group(g)); Item resI = new BlockItem(resB, new FabricItemSettings());
ItemGroupEvents.modifyEntriesEvent(g).register(content -> content.add(resI));
int burnChance = JsonHelper.getInt(jo,"burnChance", -1); int burnChance = JsonHelper.getInt(jo, "burnChance", -1);
int spreadChance = JsonHelper.getInt(jo,"spreadChance", -1); int spreadChance = JsonHelper.getInt(jo, "spreadChance", -1);
if(burnChance!=-1 && spreadChance!=-1){ if (burnChance != -1 && spreadChance != -1) {
FlammableBlockRegistry.getDefaultInstance().add(resB, spreadChance, burnChance); FlammableBlockRegistry.getDefaultInstance().add(resB, spreadChance, burnChance);
} }
return new Pair<>(resB, resI); return new Pair<>(resB, resI);
} }
private Material getSettings(MaterialSettingsPojo mspj) { private Block.Settings getSettings(BlockSettingsPojo bspj) {
return new Material( FabricBlockSettings fabricBlockSettings = FabricBlockSettings.create();
getMaterialColor(mspj.materialColor),
mspj.liquid,
mspj.solid,
mspj.blocksMovement,
mspj.blocksLight,
mspj.breakByHand,
mspj.burnable,
getPistonBehavior(mspj.pistonBehavior));
fabricBlockSettings
.collidable(bspj.collidable)
.slipperiness(bspj.slipperiness)
.velocityMultiplier(bspj.slowDownMultiplier)
.jumpVelocityMultiplier(bspj.jumpVelocityMultiplier)
.sounds(getSoundGroup(bspj.soundGroup))
.drops(getDropTableId(bspj.dropTableId))
.mapColor(getMapColor(bspj.mapColor))
.allowsSpawning(bspj.allowsSpawning ? BlockResourceLoader::always : BlockResourceLoader::never)
.solidBlock(bspj.solidBlock ? BlockResourceLoader::always : BlockResourceLoader::never)
.suffocates(bspj.suffocates ? BlockResourceLoader::always : BlockResourceLoader::never)
.blockVision(bspj.blockVision ? BlockResourceLoader::always : BlockResourceLoader::never)
.postProcess(bspj.postProcess ? BlockResourceLoader::always : BlockResourceLoader::never)
.emissiveLighting(bspj.emissiveLighting ? BlockResourceLoader::always : BlockResourceLoader::never)
.hardness(bspj.hardness)
.resistance(bspj.explosionResistance)
.offset(getOffset(bspj.modelOffset))
.pistonBehavior(getPistonBehavior(bspj.pistonBehavior))
.instrument(getInstrument(bspj.instrument))
.luminance(bspj.lightLevel);
if (bspj.burnable) {
fabricBlockSettings.burnable();
}
//not supported for now
//fabricBlockSettings.liquid()
if (bspj.solidBlock) {
fabricBlockSettings.solid();
} else {
fabricBlockSettings.notSolid();
}
if (bspj.replaceable) {
fabricBlockSettings.replaceable();
}
//not supported for now
//fabricBlockSettings.air()
if (bspj.noBlockBreakParticles) {
fabricBlockSettings.noBlockBreakParticles();
}
if (bspj.requiresTool) {
fabricBlockSettings.requiresTool();
}
if (bspj.breaksInstantly) {
fabricBlockSettings.breakInstantly();
}
if (!bspj.opaque) {
fabricBlockSettings.nonOpaque();
}
return fabricBlockSettings;
}
private Instrument getInstrument(String instrument) {
switch (instrument.toUpperCase()) {
case "HARP":
return Instrument.HARP;
case "BASEDRUM":
return Instrument.BASEDRUM;
case "SNARE":
return Instrument.SNARE;
case "HAT":
return Instrument.HAT;
case "BASS":
return Instrument.BASS;
case "FLUTE":
return Instrument.FLUTE;
case "BELL":
return Instrument.BELL;
case "GUITAR":
return Instrument.GUITAR;
case "CHIME":
return Instrument.CHIME;
case "XYLOPHONE":
return Instrument.XYLOPHONE;
case "IRON_XYLOPHONE":
return Instrument.IRON_XYLOPHONE;
case "COW_BELL":
return Instrument.COW_BELL;
case "DIDGERIDOO":
return Instrument.DIDGERIDOO;
case "BIT":
return Instrument.BIT;
case "BANJO":
return Instrument.BANJO;
case "PLING":
return Instrument.PLING;
case "ZOMBIE":
return Instrument.ZOMBIE;
case "SKELETON":
return Instrument.SKELETON;
case "CREEPER":
return Instrument.CREEPER;
case "DRAGON":
return Instrument.DRAGON;
case "WITHER_SKELETON":
return Instrument.WITHER_SKELETON;
case "PIGLIN":
return Instrument.PIGLIN;
case "CUSTOM_HEAD":
return Instrument.CUSTOM_HEAD;
default:
log(Level.WARN, "Instrument " + instrument + " not found, using harp");
return Instrument.HARP;
}
}
private AbstractBlock.OffsetType getOffset(String modelOffset) {
switch (modelOffset.toUpperCase()) {
case "NONE":
return AbstractBlock.OffsetType.NONE;
case "XZ":
return AbstractBlock.OffsetType.XZ;
case "XYZ":
return AbstractBlock.OffsetType.XYZ;
default:
log(Level.WARN, "ModelOffset " + modelOffset + " not found, using none");
return AbstractBlock.OffsetType.NONE;
}
}
private static boolean always(BlockState blockState, BlockView blockView, BlockPos blockPos) {
return true;
}
private static boolean never(BlockState blockState, BlockView blockView, BlockPos blockPos) {
return false;
}
/**
* A shortcut to always return {@code false} in a typed context predicate with an
* {@link EntityType}, used like {@code settings.allowSpawning(Blocks::never)}.
*/
private static Boolean never(BlockState state, BlockView world, BlockPos pos, EntityType<?> type) {
return false;
}
/**
* A shortcut to always return {@code true} in a typed context predicate with an
* {@link EntityType}, used like {@code settings.allowSpawning(Blocks::always)}.
*/
private static Boolean always(BlockState state, BlockView world, BlockPos pos, EntityType<?> type) {
return true;
} }
private PistonBehavior getPistonBehavior(String pistonBehavior) { private PistonBehavior getPistonBehavior(String pistonBehavior) {
switch (pistonBehavior.toUpperCase()) { switch (pistonBehavior.toUpperCase()) {
case "NORMAL": case "NORMAL" -> {
return PistonBehavior.NORMAL; return PistonBehavior.NORMAL;
case "DESTROY": }
case "DESTROY" -> {
return PistonBehavior.DESTROY; return PistonBehavior.DESTROY;
case "BLOCK": }
case "BLOCK" -> {
return PistonBehavior.BLOCK; return PistonBehavior.BLOCK;
case "IGNORE": }
case "IGNORE" -> {
return PistonBehavior.IGNORE; return PistonBehavior.IGNORE;
case "PUSH_ONLY": }
case "PUSH_ONLY" -> {
return PistonBehavior.PUSH_ONLY; return PistonBehavior.PUSH_ONLY;
default: }
default -> {
log(Level.WARN, "Piston Behavior " + pistonBehavior + " not found, using normal"); log(Level.WARN, "Piston Behavior " + pistonBehavior + " not found, using normal");
return PistonBehavior.NORMAL; return PistonBehavior.NORMAL;
}
} }
} }
private MaterialColor getMaterialColor(String color) {
private MapColor getMapColor(String color) {
switch (color.toUpperCase()) { switch (color.toUpperCase()) {
case "AIR":
case "CLEAR": case "CLEAR":
return MaterialColor.CLEAR; return MapColor.CLEAR;
case "GRASS": case "PALE_GREEN":
return MaterialColor.GRASS; return MapColor.PALE_GREEN;
case "SAND": case "PALE_YELLOW":
return MaterialColor.SAND; return MapColor.PALE_YELLOW;
case "WEB": case "WHITE_GRAY":
return MaterialColor.WEB; return MapColor.WHITE_GRAY;
case "LAVA": case "BRIGHT_RED":
return MaterialColor.LAVA; return MapColor.BRIGHT_RED;
case "ICE": case "PALE_PURPLE":
return MaterialColor.ICE; return MapColor.PALE_PURPLE;
case "IRON": case "IRON_GRAY":
return MaterialColor.IRON; return MapColor.IRON_GRAY;
case "FOLIAGE": case "DARK_GREEN":
return MaterialColor.FOLIAGE; return MapColor.DARK_GREEN;
case "WHITE": case "WHITE":
return MaterialColor.WHITE; return MapColor.WHITE;
case "CLAY": case "LIGHT_BLUE_GRAY":
return MaterialColor.CLAY; return MapColor.LIGHT_BLUE_GRAY;
case "DIRT": case "DIRT_BROWN":
return MaterialColor.DIRT; return MapColor.DIRT_BROWN;
case "STONE": case "STONE_GRAY":
return MaterialColor.STONE; return MapColor.STONE_GRAY;
case "WATER": case "WATER_BLUE":
return MaterialColor.WATER; return MapColor.WATER_BLUE;
case "WOOD": case "OAK_TAN":
return MaterialColor.WOOD; return MapColor.OAK_TAN;
case "QUARTZ": case "OFF_WHITE":
return MaterialColor.QUARTZ; return MapColor.OFF_WHITE;
case "ORANGE": case "ORANGE":
return MaterialColor.ORANGE; return MapColor.ORANGE;
case "MAGENTA": case "MAGENTA":
return MaterialColor.MAGENTA; return MapColor.MAGENTA;
case "LIGHT_BLUE": case "LIGHT_BLUE":
return MaterialColor.LIGHT_BLUE; return MapColor.LIGHT_BLUE;
case "YELLOW": case "YELLOW":
return MaterialColor.YELLOW; return MapColor.YELLOW;
case "LIME": case "LIME":
return MaterialColor.LIME; return MapColor.LIME;
case "PINK": case "PINK":
return MaterialColor.PINK; return MapColor.PINK;
case "GRAY": case "GRAY":
return MaterialColor.GRAY; return MapColor.GRAY;
case "LIGHT_GRAY": case "LIGHT_GRAY":
return MaterialColor.LIGHT_GRAY; return MapColor.LIGHT_GRAY;
case "CYAN": case "CYAN":
return MaterialColor.CYAN; return MapColor.CYAN;
case "PURPLE": case "PURPLE":
return MaterialColor.PURPLE; return MapColor.PURPLE;
case "BLUE": case "BLUE":
return MaterialColor.BLUE; return MapColor.BLUE;
case "BROWN": case "BROWN":
return MaterialColor.BROWN; return MapColor.BROWN;
case "GREEN": case "GREEN":
return MaterialColor.GREEN; return MapColor.GREEN;
case "RED": case "RED":
return MaterialColor.RED; return MapColor.RED;
case "BLACK": case "BLACK":
return MaterialColor.BLACK; return MapColor.BLACK;
case "GOLD": case "GOLD":
return MaterialColor.GOLD; return MapColor.GOLD;
case "DIAMOND": case "DIAMOND_BLUE":
return MaterialColor.DIAMOND; return MapColor.DIAMOND_BLUE;
case "LAPIS": case "LAPIS_BLUE":
return MaterialColor.LAPIS; return MapColor.LAPIS_BLUE;
case "EMERALD": case "EMERALD_GREEN":
return MaterialColor.EMERALD; return MapColor.EMERALD_GREEN;
case "SPRUCE": case "SPRUCE_BROWN":
return MaterialColor.SPRUCE; return MapColor.SPRUCE_BROWN;
case "NETHER": case "DARK_RED":
return MaterialColor.NETHER; return MapColor.DARK_RED;
case "WHITE_TERRACOTTA": case "TERRACOTTA_WHITE":
return MaterialColor.WHITE_TERRACOTTA; return MapColor.TERRACOTTA_WHITE;
case "ORANGE_TERRACOTTA": case "TERRACOTTA_ORANGE":
return MaterialColor.ORANGE_TERRACOTTA; return MapColor.TERRACOTTA_ORANGE;
case "MAGENTA_TERRACOTTA": case "TERRACOTTA_MAGENTA":
return MaterialColor.MAGENTA_TERRACOTTA; return MapColor.TERRACOTTA_MAGENTA;
case "LIGHT_BLUE_TERRACOTTA": case "TERRACOTTA_LIGHT_BLUE":
return MaterialColor.LIGHT_BLUE_TERRACOTTA; return MapColor.TERRACOTTA_LIGHT_BLUE;
case "YELLOW_TERRACOTTA": case "TERRACOTTA_YELLOW":
return MaterialColor.YELLOW_TERRACOTTA; return MapColor.TERRACOTTA_YELLOW;
case "LIME_TERRACOTTA": case "TERRACOTTA_LIME":
return MaterialColor.LIME_TERRACOTTA; return MapColor.TERRACOTTA_LIME;
case "PINK_TERRACOTTA": case "TERRACOTTA_PINK":
return MaterialColor.PINK_TERRACOTTA; return MapColor.TERRACOTTA_PINK;
case "GRAY_TERRACOTTA": case "TERRACOTTA_GRAY":
return MaterialColor.GRAY_TERRACOTTA; return MapColor.TERRACOTTA_GRAY;
case "LIGHT_GRAY_TERRACOTTA": case "TERRACOTTA_LIGHT_GRAY":
return MaterialColor.LIGHT_GRAY_TERRACOTTA; return MapColor.TERRACOTTA_LIGHT_GRAY;
case "CYAN_TERRACOTTA": case "TERRACOTTA_CYAN":
return MaterialColor.CYAN_TERRACOTTA; return MapColor.TERRACOTTA_CYAN;
case "PURPLE_TERRACOTTA": case "TERRACOTTA_PURPLE":
return MaterialColor.PURPLE_TERRACOTTA; return MapColor.TERRACOTTA_PURPLE;
case "BLUE_TERRACOTTA": case "TERRACOTTA_BLUE":
return MaterialColor.BLUE_TERRACOTTA; return MapColor.TERRACOTTA_BLUE;
case "BROWN_TERRACOTTA": case "TERRACOTTA_BROWN":
return MaterialColor.BROWN_TERRACOTTA; return MapColor.TERRACOTTA_BROWN;
case "GREEN_TERRACOTTA": case "TERRACOTTA_GREEN":
return MaterialColor.GREEN_TERRACOTTA; return MapColor.TERRACOTTA_GREEN;
case "RED_TERRACOTTA": case "TERRACOTTA_RED":
return MaterialColor.RED_TERRACOTTA; return MapColor.TERRACOTTA_RED;
case "BLACK_TERRACOTTA": case "TERRACOTTA_BLACK":
return MaterialColor.BLACK_TERRACOTTA; return MapColor.TERRACOTTA_BLACK;
case "CRIMSON_NYLIUM": case "DULL_RED":
return MaterialColor.field_25702; return MapColor.DULL_RED;
case "CRIMSON_WOOD": case "DULL_PINK":
return MaterialColor.field_25703; return MapColor.DULL_PINK;
case "CRIMSON_HYPHAE": case "DARK_CRIMSON":
return MaterialColor.field_25704; return MapColor.DARK_CRIMSON;
case "WARPED_NYLIUM": case "TEAL":
return MaterialColor.field_25705; return MapColor.TEAL;
case "WARPED_WOOD": case "DARK_AQUA":
return MaterialColor.field_25706; return MapColor.DARK_AQUA;
case "WARPED_HYPHAE": case "DARK_DULL_PINK":
return MaterialColor.field_25707; return MapColor.DARK_DULL_PINK;
case "WARPED_WART_BLOCK": case "BRIGHT_TEAL":
return MaterialColor.field_25708; return MapColor.BRIGHT_TEAL;
case "DEEPSLATE_GRAY":
return MapColor.DEEPSLATE_GRAY;
case "RAW_IRON_PINK":
return MapColor.RAW_IRON_PINK;
case "LICHEN_GREEN":
return MapColor.LICHEN_GREEN;
default: default:
log(Level.WARN, "MapColor " + color + " not found, using pink"); log(Level.WARN, "MapColor " + color + " not found, using pink");
return MaterialColor.PINK; return MapColor.PINK;
} }
} }
private Block.Settings getSettings(Material material, BlockSettingsPojo bspj) {
FabricBlockSettings fabricBlockSettings = FabricBlockSettings.of(material, material.getColor());
AbstractBlockSettingsAccessor bs = (AbstractBlockSettingsAccessor) fabricBlockSettings;
bs.setMaterial(material);
bs.setMaterialColorFactory(ignored -> material.getColor());
bs.setCollidable(bspj.collidable);
fabricBlockSettings.sounds(getSoundGroup(bspj.soundGroup));
bs.setLuminanceFunction(ignored -> bspj.lightLevel);
bs.setResistance(bspj.explosionResistance);
bs.setHardness(bspj.hardness);
fabricBlockSettings.slipperiness(bspj.slipperiness);
fabricBlockSettings.velocityMultiplier(bspj.slowDownMultiplier);
fabricBlockSettings.jumpVelocityMultiplier(bspj.jumpVelocityMultiplier);
bs.setLootTableId(getDropTableId(bspj.dropTableId));
bs.setOpaque(bspj.opaque);
return fabricBlockSettings;
}
private Identifier getDropTableId(String s) { private Identifier getDropTableId(String s) {
if (s == null) if (s == null)
return null; return null;
@ -275,6 +404,8 @@ public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block,
private BlockSoundGroup getSoundGroup(String s) { private BlockSoundGroup getSoundGroup(String s) {
switch (s.toUpperCase()) { switch (s.toUpperCase()) {
case "INTENTIONALLY_EMPTY":
return BlockSoundGroup.INTENTIONALLY_EMPTY;
case "WOOD": case "WOOD":
return BlockSoundGroup.WOOD; return BlockSoundGroup.WOOD;
case "GRAVEL": case "GRAVEL":
@ -295,6 +426,8 @@ public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block,
return BlockSoundGroup.SAND; return BlockSoundGroup.SAND;
case "SNOW": case "SNOW":
return BlockSoundGroup.SNOW; return BlockSoundGroup.SNOW;
case "POWDER_SNOW":
return BlockSoundGroup.POWDER_SNOW;
case "LADDER": case "LADDER":
return BlockSoundGroup.LADDER; return BlockSoundGroup.LADDER;
case "ANVIL": case "ANVIL":
@ -369,117 +502,119 @@ public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block,
return BlockSoundGroup.NETHER_GOLD_ORE; return BlockSoundGroup.NETHER_GOLD_ORE;
case "GILDED_BLACKSTONE": case "GILDED_BLACKSTONE":
return BlockSoundGroup.GILDED_BLACKSTONE; return BlockSoundGroup.GILDED_BLACKSTONE;
case "CANDLE":
return BlockSoundGroup.CANDLE;
case "AMETHYST_BLOCK":
return BlockSoundGroup.AMETHYST_BLOCK;
case "AMETHYST_CLUSTER":
return BlockSoundGroup.AMETHYST_CLUSTER;
case "SMALL_AMETHYST_BUD":
return BlockSoundGroup.SMALL_AMETHYST_BUD;
case "MEDIUM_AMETHYST_BUD":
return BlockSoundGroup.MEDIUM_AMETHYST_BUD;
case "LARGE_AMETHYST_BUD":
return BlockSoundGroup.LARGE_AMETHYST_BUD;
case "TUFF":
return BlockSoundGroup.TUFF;
case "CALCITE":
return BlockSoundGroup.CALCITE;
case "DRIPSTONE_BLOCK":
return BlockSoundGroup.DRIPSTONE_BLOCK;
case "POINTED_DRIPSTONE":
return BlockSoundGroup.POINTED_DRIPSTONE;
case "COPPER":
return BlockSoundGroup.COPPER;
case "CAVE_VINES":
return BlockSoundGroup.CAVE_VINES;
case "SPORE_BLOSSOM":
return BlockSoundGroup.SPORE_BLOSSOM;
case "AZALEA":
return BlockSoundGroup.AZALEA;
case "FLOWERING_AZALEA":
return BlockSoundGroup.FLOWERING_AZALEA;
case "MOSS_CARPET":
return BlockSoundGroup.MOSS_CARPET;
case "PINK_PETALS":
return BlockSoundGroup.PINK_PETALS;
case "MOSS_BLOCK":
return BlockSoundGroup.MOSS_BLOCK;
case "BIG_DRIPLEAF":
return BlockSoundGroup.BIG_DRIPLEAF;
case "SMALL_DRIPLEAF":
return BlockSoundGroup.SMALL_DRIPLEAF;
case "ROOTED_DIRT":
return BlockSoundGroup.ROOTED_DIRT;
case "HANGING_ROOTS":
return BlockSoundGroup.HANGING_ROOTS;
case "AZALEA_LEAVES":
return BlockSoundGroup.AZALEA_LEAVES;
case "SCULK_SENSOR":
return BlockSoundGroup.SCULK_SENSOR;
case "SCULK_CATALYST":
return BlockSoundGroup.SCULK_CATALYST;
case "SCULK":
return BlockSoundGroup.SCULK;
case "SCULK_VEIN":
return BlockSoundGroup.SCULK_VEIN;
case "SCULK_SHRIEKER":
return BlockSoundGroup.SCULK_SHRIEKER;
case "GLOW_LICHEN":
return BlockSoundGroup.GLOW_LICHEN;
case "DEEPSLATE":
return BlockSoundGroup.DEEPSLATE;
case "DEEPSLATE_BRICKS":
return BlockSoundGroup.DEEPSLATE_BRICKS;
case "DEEPSLATE_TILES":
return BlockSoundGroup.DEEPSLATE_TILES;
case "POLISHED_DEEPSLATE":
return BlockSoundGroup.POLISHED_DEEPSLATE;
case "FROGLIGHT":
return BlockSoundGroup.FROGLIGHT;
case "FROGSPAWN":
return BlockSoundGroup.FROGSPAWN;
case "MANGROVE_ROOTS":
return BlockSoundGroup.MANGROVE_ROOTS;
case "MUDDY_MANGROVE_ROOTS":
return BlockSoundGroup.MUDDY_MANGROVE_ROOTS;
case "MUD":
return BlockSoundGroup.MUD;
case "MUD_BRICKS":
return BlockSoundGroup.MUD_BRICKS;
case "PACKED_MUD":
return BlockSoundGroup.PACKED_MUD;
case "HANGING_SIGN":
return BlockSoundGroup.HANGING_SIGN;
case "NETHER_WOOD_HANGING_SIGN":
return BlockSoundGroup.NETHER_WOOD_HANGING_SIGN;
case "BAMBOO_WOOD_HANGING_SIGN":
return BlockSoundGroup.BAMBOO_WOOD_HANGING_SIGN;
case "BAMBOO_WOOD":
return BlockSoundGroup.BAMBOO_WOOD;
case "NETHER_WOOD":
return BlockSoundGroup.NETHER_WOOD;
case "CHERRY_WOOD":
return BlockSoundGroup.CHERRY_WOOD;
case "CHERRY_SAPLING":
return BlockSoundGroup.CHERRY_SAPLING;
case "CHERRY_LEAVES":
return BlockSoundGroup.CHERRY_LEAVES;
case "CHERRY_WOOD_HANGING_SIGN":
return BlockSoundGroup.CHERRY_WOOD_HANGING_SIGN;
case "CHISELED_BOOKSHELF":
return BlockSoundGroup.CHISELED_BOOKSHELF;
case "SUSPICIOUS_SAND":
return BlockSoundGroup.SUSPICIOUS_SAND;
case "SUSPICIOUS_GRAVEL":
return BlockSoundGroup.SUSPICIOUS_GRAVEL;
case "DECORATED_POT":
return BlockSoundGroup.DECORATED_POT;
case "DECORATED_POT_SHATTER":
return BlockSoundGroup.DECORATED_POT_SHATTER;
default: default:
log(Level.WARN, "Sound group " + s + " not found, using stone"); log(Level.WARN, "Sound group " + s + " not found, using stone");
return BlockSoundGroup.STONE; return BlockSoundGroup.STONE;
} }
} }
private Material getMaterial(String s) {
switch (s.toUpperCase()) {
case "AIR":
return Material.AIR;
case "STRUCTURE_VOID":
return Material.STRUCTURE_VOID;
case "PORTAL":
return Material.PORTAL;
case "CARPET":
return Material.CARPET;
case "PLANT":
return Material.PLANT;
case "UNDERWATER_PLANT":
return Material.UNDERWATER_PLANT;
case "REPLACEABLE_PLANT":
return Material.REPLACEABLE_PLANT;
case "NETHER_SHOOTS":
return Material.NETHER_SHOOTS;
case "REPLACEABLE_UNDERWATER_PLANT":
case "SEAGRASS":
return Material.REPLACEABLE_UNDERWATER_PLANT;
case "WATER":
return Material.WATER;
case "BUBBLE_COLUMN":
return Material.BUBBLE_COLUMN;
case "LAVA":
return Material.LAVA;
case "SNOW_LAYER":
case "SNOW":
return Material.SNOW_LAYER;
case "FIRE":
return Material.FIRE;
case "SUPPORTED":
case "PART":
return Material.SUPPORTED;
case "COBWEB":
return Material.COBWEB;
case "REDSTONE_LAMP":
return Material.REDSTONE_LAMP;
case "ORGANIC_PRODUCT":
case "CLAY":
return Material.ORGANIC_PRODUCT;
case "SOIL":
case "EARTH":
return Material.SOIL;
case "SOLID_ORGANIC":
case "ORGANIC":
return Material.SOLID_ORGANIC;
case "DENSE_ICE":
case "PACKED_ICE":
return Material.DENSE_ICE;
case "AGGREGATE":
case "SAND":
return Material.AGGREGATE;
case "SPONGE":
return Material.SPONGE;
case "SHULKER_BOX":
return Material.SHULKER_BOX;
case "WOOD":
return Material.WOOD;
case "NETHER_WOOD":
return Material.NETHER_WOOD;
case "BAMBOO_SAPLING":
return Material.BAMBOO_SAPLING;
case "BAMBOO":
return Material.BAMBOO;
case "WOOL":
return Material.WOOL;
case "TNT":
return Material.TNT;
case "LEAVES":
return Material.LEAVES;
case "GLASS":
return Material.GLASS;
case "ICE":
return Material.ICE;
case "CACTUS":
return Material.CACTUS;
case "STONE":
return Material.STONE;
case "METAL":
return Material.METAL;
case "SNOW_BLOCK":
return Material.SNOW_BLOCK;
case "REPAIR_STATION":
case "ANVIL":
return Material.REPAIR_STATION;
case "BARRIER":
return Material.BARRIER;
case "PISTON":
return Material.PISTON;
case "UNUSED_PLANT":
return Material.UNUSED_PLANT;
case "GOURD":
case "PUMPKIN":
return Material.GOURD;
case "EGG":
return Material.EGG;
case "CAKE":
return Material.CAKE;
default:
log(Level.WARN, "Material " + s + " not found, using stone");
return Material.STONE;
}
}
} }

View File

@ -11,5 +11,19 @@ public class BlockSettingsPojo {
public float slowDownMultiplier = 1.0F; public float slowDownMultiplier = 1.0F;
public float jumpVelocityMultiplier = 1.0F; public float jumpVelocityMultiplier = 1.0F;
public boolean opaque = true; public boolean opaque = true;
public boolean allowsSpawning = true;
public boolean solidBlock = true;
public boolean suffocates = true;
public boolean blockVision = true;
public boolean postProcess = false;
public boolean emissiveLighting = false;
public String modelOffset = "none";
public String pistonBehavior = "normal";
public String instrument = "harp";
public boolean burnable = false;
public boolean replaceable = false;
public boolean noBlockBreakParticles = false;
public boolean requiresTool = false;
public boolean breaksInstantly = false;
String mapColor = "stone"; String mapColor = "stone";
} }

View File

@ -1,33 +1,24 @@
package quimufu.simple_creator; package quimufu.simple_creator;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import me.shedaniel.autoconfig.AutoConfig;
import net.fabricmc.fabric.impl.resource.loader.ModResourcePackCreator;
import net.minecraft.resource.*;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import net.minecraft.util.Pair; import net.minecraft.util.Pair;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import java.io.*; import java.io.*;
import java.nio.charset.StandardCharsets; import java.nio.file.Files;
import java.util.*; import java.nio.file.Paths;
import java.util.stream.Collectors; import java.util.ArrayList;
import static net.minecraft.resource.ResourcePackSource.method_29486;
import static quimufu.simple_creator.SimpleCreatorMod.log; import static quimufu.simple_creator.SimpleCreatorMod.log;
public abstract class GenericManualResourceLoader<T> { public abstract class GenericManualResourceLoader<T> {
private Gson GSON; private final Gson gson;
private String dataType; private final String dataType;
private SimpleCreatorConfig config;
GenericManualResourceLoader(Gson gson, String dt) { GenericManualResourceLoader(Gson gson, String dt) {
GSON = gson; this.gson = gson;
dataType = dt; dataType = dt;
} }
@ -51,73 +42,91 @@ public abstract class GenericManualResourceLoader<T> {
protected abstract void save(Identifier id, T item); protected abstract void save(Identifier id, T item);
public void load() { public void load() {
config = AutoConfig.getConfigHolder(SimpleCreatorConfig.class).getConfig();
ResourcePackManager resourcePackManager;
if (!config.enableTestThings) {
resourcePackManager =
new ResourcePackManager(ResourcePackProfile::new,
new VanillaDataPackProvider(),
new FileResourcePackProvider(new File("./datapacks"), method_29486("pack.source.global")));
} else {
resourcePackManager =
new ResourcePackManager(ResourcePackProfile::new,
new VanillaDataPackProvider(),
new FileResourcePackProvider(new File("./datapacks"), method_29486("pack.source.global")),
new ModResourcePackCreator(ResourceType.SERVER_DATA));
}
resourcePackManager.scanPacks();
List<ResourcePackProfile> ep = Lists.newArrayList(resourcePackManager.getEnabledProfiles());
for (ResourcePackProfile rpp : resourcePackManager.getProfiles()) {
if (!ep.contains(rpp)) {
rpp.getInitialPosition().insert(ep, rpp, resourcePackProfile -> resourcePackProfile, false);
}
}
resourcePackManager.setEnabledProfiles(ep.stream().map(ResourcePackProfile::getName).collect(Collectors.toList()));
if (true) {
createFromResource("simple_creator/blocks/test_block.json");
createFromResource("simple_creator/items/test_item.json");
}
File location = new File("./simplyCreated");
if (!location.exists() && !location.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + location);
}
if (!location.isDirectory()) {
throw new IllegalStateException("Not a dir: " + location);
}
File[] modIds = location.listFiles();
ArrayList<Pair<Identifier, JsonObject>> itemJsonList = new ArrayList<>(); ArrayList<Pair<Identifier, JsonObject>> itemJsonList = new ArrayList<>();
HashMap<Identifier, JsonObject> itemJsonMap = Maps.newHashMap(); if(modIds == null){
for (ResourcePackProfile rpp : resourcePackManager.getEnabledProfiles()) { log(Level.INFO, "No files found at " + location + " quitting!");
ResourcePack rp = rpp.createResourcePack(); return;
log(Level.INFO, "Loading ResourcePack " + rp.getName()); }
for (String ns : rp.getNamespaces(ResourceType.SERVER_DATA)) { for (File mod : modIds) {
log(Level.INFO, "Loading namespace " + ns); if (!mod.isDirectory()) {
Collection<Identifier> resources = rp.findResources(ResourceType.SERVER_DATA, ns, dataType, 5, s -> s.endsWith(".json")); continue;
for (Identifier id : resources) { }
if (config.extendedLogging) String modId = mod.getName();
log(Level.INFO, "found: " + id.toString() + " in Pack: " + rp.getName());
Identifier idNice = new Identifier(id.getNamespace(), getName(id)); File entryDir = new File(mod + "/" + dataType);
try { if (entryDir.isDirectory()) {
InputStream is = rp.open(ResourceType.SERVER_DATA, id); File[] entries = entryDir.listFiles();
Reader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); if(entries == null){
JsonObject jo = JsonHelper.deserialize(GSON, r, JsonObject.class); log(Level.INFO, "No files found at " + entryDir + " skipping!");
if (jo != null) continue;
if (jo.entrySet().isEmpty()) { }
itemJsonMap.remove(idNice);
if (config.extendedLogging) for (File entryJson : entries) {
log(Level.INFO, "deleting " + idNice + " because of an empty override in " + rp.getName()); String blockJsonName = entryJson.getName();
} else { if(!blockJsonName.endsWith(".json")){
itemJsonMap.put(idNice, jo); log(Level.INFO, "Non json found at " + entryJson + " ignoring!");
if (config.extendedLogging) continue;
log(Level.INFO, "adding " + idNice + " from " + rp.getName()); }
String entryName = blockJsonName.substring(0,blockJsonName.length()-5);
Identifier identifier = new Identifier(modId, entryName);
try (Reader reader = new FileReader(entryJson)) {
JsonObject jsonObject = gson.fromJson(reader, JsonObject.class);
itemJsonList.add(new Pair<>(identifier, jsonObject));
} catch (IOException e) {
log(Level.INFO, "Could not parse " + entryJson + " ignoring!");
e.printStackTrace();
log(Level.INFO, e.getMessage());
}
}
}
}
loadItems(itemJsonList);
}
private static void createFromResource(String path) {
try (InputStream blocks = ClassLoader.getSystemClassLoader().getResourceAsStream("data/" + path)) {
File file = new File("./simplyCreated/" + path);
if (!file.exists() && blocks != null) {
File parent = file.getParentFile();
if (parent != null && !parent.exists() && !parent.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent);
}
if (!file.createNewFile()) {
throw new IllegalStateException("Couldn't create file: " + file);
}
try (FileOutputStream out = new FileOutputStream(file)) {
//copy stream
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = blocks.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
} }
} catch (IOException e) { } catch (IOException e) {
log(Level.ERROR, "error loading " + id + " " + e.getMessage()); throw new RuntimeException(e);
} catch (JsonParseException e) {
log(Level.ERROR, "error parsing json for " + id + " " + e.getMessage());
} }
} }
}
}
for (Map.Entry<Identifier, JsonObject> e : itemJsonMap.entrySet()) {
itemJsonList.add(new Pair<>(e.getKey(), e.getValue()));
}
loadItems(itemJsonList);
}
private String getName(Identifier id) {
String path = id.getPath();
int startLength = dataType.length() + 1;
int endLength = ".json".length();
return path.substring(startLength, path.length() - endLength);
}
} }

View File

@ -2,20 +2,26 @@ package quimufu.simple_creator;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.gson.*; import com.google.gson.*;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.item.FoodComponent; import net.minecraft.item.FoodComponent;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemGroups;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper; import net.minecraft.util.JsonHelper;
import net.minecraft.util.Pair; import net.minecraft.util.Pair;
import net.minecraft.util.Rarity; import net.minecraft.util.Rarity;
import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import static quimufu.simple_creator.SimpleCreatorMod.log; import static quimufu.simple_creator.SimpleCreatorMod.log;
@ -30,13 +36,13 @@ public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
@Override @Override
protected void register(Identifier id, Item thing) { protected void register(Identifier id, Item thing) {
Registry.register(Registry.ITEM, id, thing); Registry.register(Registries.ITEM, id, thing);
} }
public Item deserialize(Pair<Identifier, JsonObject> e) { public Item deserialize(Pair<Identifier, JsonObject> e) {
JsonObject jo = e.getRight(); JsonObject jo = e.getRight();
String group = JsonHelper.getString(jo, "group", "misc"); String group = JsonHelper.getString(jo, "group", "misc");
ItemGroup g = findGroup(group); RegistryKey<ItemGroup> g = findGroup(group);
int durability = JsonHelper.getInt(jo, "durability", 0); int durability = JsonHelper.getInt(jo, "durability", 0);
byte stackSize = JsonHelper.getByte(jo, "stackSize", (byte) 1); byte stackSize = JsonHelper.getByte(jo, "stackSize", (byte) 1);
boolean isFood = JsonHelper.hasElement(jo, "food"); boolean isFood = JsonHelper.hasElement(jo, "food");
@ -44,7 +50,6 @@ public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
Item.Settings settings = new Item.Settings(); Item.Settings settings = new Item.Settings();
settings.group(g);
if (isFood) { if (isFood) {
if (durability != 0) { if (durability != 0) {
log(Level.WARN, "durability does not work with food"); log(Level.WARN, "durability does not work with food");
@ -65,7 +70,12 @@ public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
} }
} }
settings.rarity(findRarity(rarity)); settings.rarity(findRarity(rarity));
return new Item(settings);
Item item = new Item(settings);
ItemGroupEvents.modifyEntriesEvent(g).register(content -> content.add(item));
return item;
} }
@Override @Override
@ -104,7 +114,7 @@ public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
String effect = JsonHelper.getString(jo, "effect"); String effect = JsonHelper.getString(jo, "effect");
Identifier ei = Identifier.tryParse(effect); Identifier ei = Identifier.tryParse(effect);
if (ei != null) { if (ei != null) {
StatusEffect se = Registry.STATUS_EFFECT.get(ei); StatusEffect se = Registries.STATUS_EFFECT.get(ei);
if (se != null) { if (se != null) {
type = se; type = se;
} else { } else {
@ -134,15 +144,21 @@ public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
return Rarity.COMMON; return Rarity.COMMON;
} }
public static ItemGroup findGroup(String filter) { public static RegistryKey<ItemGroup> findGroup(String filter) {
for (ItemGroup g : ItemGroup.GROUPS) { Identifier identifier = Identifier.tryParse(filter);
if (g.getName().equalsIgnoreCase(filter)) { ItemGroup itemGroup = Registries.ITEM_GROUP.get(identifier);
return g; Optional<RegistryKey<ItemGroup>> optionalRegistryKey = Registries.ITEM_GROUP.getKey(itemGroup);
if (optionalRegistryKey.isPresent()) {
return optionalRegistryKey.get();
} }
} log(Level.WARN, "Item Group " + filter + " not found, using minecraft:building_blocks");
log(Level.WARN, "Item Group " + filter + " not found, using misc");
log(Level.INFO, "Valid groups:" + Arrays.stream(ItemGroup.GROUPS).map(ItemGroup::getName)); log(Level.INFO, "Valid groups:" + Registries.ITEM_GROUP.getKeys()
return ItemGroup.MISC; .stream()
.map(RegistryKey::getValue)
.map(Identifier::toString)
.collect(Collectors.joining(",")));
return ItemGroups.BUILDING_BLOCKS;
} }

View File

@ -1,15 +0,0 @@
package quimufu.simple_creator;
import net.minecraft.block.MaterialColor;
import net.minecraft.block.piston.PistonBehavior;
public class MaterialSettingsPojo {
String materialColor = "PINK";
String pistonBehavior = "normal";
boolean blocksMovement = true;
boolean burnable = false;
boolean breakByHand = true;
boolean liquid = false;
boolean solid = true;
boolean blocksLight = true;
}

View File

@ -1,10 +1,19 @@
package quimufu.simple_creator; package quimufu.simple_creator;
import me.shedaniel.autoconfig.ConfigData; import com.google.common.base.CaseFormat;
import me.shedaniel.autoconfig.annotation.Config; import de.siphalor.tweed4.annotated.AConfigEntry;
import de.siphalor.tweed4.annotated.ATweedConfig;
import de.siphalor.tweed4.config.ConfigEnvironment;
import de.siphalor.tweed4.config.ConfigScope;
@Config(name = "simple_creator")
public class SimpleCreatorConfig implements ConfigData { @ATweedConfig(serializer = "tweed4:hjson", scope = ConfigScope.GAME, environment = ConfigEnvironment.UNIVERSAL, tailors = {"tweed4:lang_json_descriptions", "tweed4:coat", "tweed4:json_schema"}, casing = CaseFormat.LOWER_HYPHEN)
public boolean enableTestThings = false; //@ClothData(modid = "tweed4_testmod")
public boolean extendedLogging = false; public class SimpleCreatorConfig {
@AConfigEntry(name = "enableTestThings", comment = "Enables included test Blocks and Items")
public static boolean enableTestThings = false;
public static boolean extendedLogging = false;
} }

View File

@ -1,16 +1,10 @@
package quimufu.simple_creator; package quimufu.simple_creator;
import me.shedaniel.autoconfig.AutoConfig;
import me.shedaniel.autoconfig.serializer.GsonConfigSerializer;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
//import net.minecraft.block.Material;
//import java.lang.reflect.Field;
public class SimpleCreatorMod implements ModInitializer { public class SimpleCreatorMod implements ModInitializer {
public static Logger LOGGER = LogManager.getLogger(); public static Logger LOGGER = LogManager.getLogger();
@ -23,28 +17,6 @@ public class SimpleCreatorMod implements ModInitializer {
@Override @Override
public void onInitialize() { public void onInitialize() {
log(Level.INFO, "Initializing"); log(Level.INFO, "Initializing");
AutoConfig.register(SimpleCreatorConfig.class, GsonConfigSerializer::new);
// for(Material m : Material.class.getEnumConstants()){
// log(Level.INFO, String.valueOf(m.getColor().color));
// }
// for (Field f : Material.class.getDeclaredFields()) {
// log(Level.INFO, f.getName());
// try {
// Material m = ((Material) f.get(Material.class));
// log(Level.INFO, "pistonBehavior: " + m.getPistonBehavior().name());
// log(Level.INFO, "blocksMovement: " + m.blocksMovement());
// log(Level.INFO, "burnable: " + m.isBurnable());
// log(Level.INFO, "breakByHand: " + m.canBreakByHand());
// log(Level.INFO, "liquid: " + m.isLiquid());
// log(Level.INFO, "replaceable: " + m.isReplaceable());
// log(Level.INFO, "solid: " + m.isSolid());
// log(Level.INFO, "blocksLight: " + m.blocksLight());
// log(Level.INFO, "");
// log(Level.INFO, "");
//
// } catch (IllegalAccessException ignored) {
// }
// }
irl.load(); irl.load();
brl.load(); brl.load();
} }

View File

@ -1,21 +0,0 @@
package quimufu.simple_creator;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import me.shedaniel.autoconfig.AutoConfig;
import net.minecraft.client.gui.screen.Screen;
public class SimpleCreatorModMenuIntegration implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {
return this::getScreen;
}
private Screen getScreen(Screen parent) {
return AutoConfig.getConfigScreen(SimpleCreatorConfig.class, parent).get();
}
}

View File

@ -18,8 +18,8 @@
], ],
"client": [], "client": [],
"server": [], "server": [],
"modmenu": [ "tweed4:config": [
"quimufu.simple_creator.SimpleCreatorModMenuIntegration" "quimufu.simple_creator.SimpleCreatorConfig"
] ]
}, },
"mixins": [], "mixins": [],