From 1876805803351f974d425c168009ad6c063bed20 Mon Sep 17 00:00:00 2001 From: feldenr <135638674+feldenr@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:24:12 +0100 Subject: [PATCH] Fix armor textures and implement new armor material system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created ShardDiamondArmorMaterial class with proper getName() returning "custom_ore_gen:shard_diamond" - Updated all armor items to use the new material instance - Added new armor textures from new_armor folder - Fixed armor texture loading by using correct modid:name format in getName() - Added CLAUDE.md for project documentation - Added armor crafting recipes πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- CLAUDE.md | 140 ++++++++++++++++++ .../item/ShardDiamondArmorMaterial.java | 56 +++++++ .../item/SharddiamondbootsItem.java | 41 +---- .../item/SharddiamondchestplateItem.java | 41 +---- .../item/SharddiamondhelmetItem.java | 41 +---- .../item/SharddiamondleggingsItem.java | 41 +---- .../textures/item/sharddiamondboots.png | Bin 167 -> 264 bytes .../textures/item/sharddiamondchestplate.png | Bin 166 -> 323 bytes .../textures/item/sharddiamondhelmet.png | Bin 146 -> 270 bytes .../textures/item/sharddiamondleggings.png | Bin 160 -> 274 bytes .../models/armor/shard_diamond_layer_1.png | Bin 1650 -> 1022 bytes .../models/armor/shard_diamond_layer_2.png | Bin 869 -> 552 bytes 12 files changed, 200 insertions(+), 160 deletions(-) create mode 100644 CLAUDE.md create mode 100644 src/main/java/net/mcreator/customoregen/item/ShardDiamondArmorMaterial.java diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..0c4cf3113 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,140 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Custom Ore Gem is a Minecraft Forge 1.20.1 mod (mod ID: `custom_ore_gen`) that modifies ore distribution and adds Diamond Shard-tier tools and armor. This is an **MCreator project** - code in `src/main/java` is partially regenerated on each build. + +**Key**: This mod is designed to work with KubeJS and is not meant to be used standalone. + +## Build Commands + +```bash +# Build the mod (generates .jar in build/libs/) +./gradlew build + +# Run client for testing +./gradlew runClient + +# Run server for testing +./gradlew runServer + +# Clean build artifacts +./gradlew clean +``` + +The built JAR is named `custom_ore_gen-{version}.jar` and appears in `build/libs/`. + +## Architecture + +### MCreator Workflow + +This project uses MCreator. Important files contain regeneration markers: + +```java +// Start of user code block [name] +// End of user code block [name] +``` + +**Always preserve code between these markers** when editing. The file header notes which files are regenerated (e.g., `CustomOreGenModItems.java`). + +### Package Structure + +``` +net.mcreator.customoregen/ +β”œβ”€β”€ CustomOreGenMod.java # Main mod class, registers event bus +β”œβ”€β”€ OresCommand.java # /ores command implementation +β”œβ”€β”€ block/ # Ore block classes (16 blocks) +β”œβ”€β”€ item/ # Items (Diamond Shard, tools, armor, Paxel, OreBiomeFinder) +β”œβ”€β”€ config/ # Forge configuration system (ModConfigs.java) +β”œβ”€β”€ procedures/ # Game logic (ConfigurableOreDropsProcedure, OreexperienceProcedure) +└── init/ + β”œβ”€β”€ CustomOreGenModBlocks.java # Block registry (deferred register) + β”œβ”€β”€ CustomOreGenModItems.java # Item registry (REGENERATED) + └── CustomOreGenModTabs.java # Creative tabs registry +``` + +### Ore Generation System + +The mod uses Forge biome modifiers to distribute ores based on biome temperature tags. The architecture: + +1. **Biome Tags** (`src/main/resources/data/custom_ore_gen/tags/worldgen/biome/`): + - `cold_biomes.json` - Cold biomes (lapis, concentrated diamond) + - `hot_biomes.json` - Hot biomes (pure gold, copper, redstone) + - `mountain_biomes.json` - Mountain biomes (high emerald) + - `rare_biomes.json` - Rare biomes (lower emerald) + - `tempered_biomes.json` - Temperate biomes (iron, concentrated coal) + +2. **Biome Modifiers** (`src/main/resources/data/custom_ore_gen/forge/biome_modifier/`): + - Each ore has a JSON file linking it to biome tags + - Special case: `deepslatesharddiamondore_biome_modifier.json` uses `forge:any` for all biomes + +3. **Worldgen Features** (`src/main/resources/data/custom_ore_gen/worldgen/`): + - `configured_feature/` - Defines ore vein size and height range + - `placed_feature/` - Places the feature in the world + +### Diamond Shard Progression Tier + +Diamond Shards are an intermediate tier between Iron and Diamond: + +- **Items**: Diamond Shard (`diamondshard`) - craft 9 shards into 1 diamond +- **Tools**: Pickaxe, Shovel, Axe (200 durability), Paxel (1000 durability, combines all three) +- **Armor**: Helmet (3), Chestplate (7), Leggings (5), Boots (2) - Total 17 protection, 1060 durability +- **Repair**: All Diamond Shard equipment uses Diamond Shards + +### Configuration System + +Located in `src/main/java/net/mcreator/customoregen/config/`: + +- `ModConfigs.java` - Forge configuration with 4 sections: `ore_generation`, `tool_stats`, `drops`, `features` +- Generated config file: `config/custom_ore_gen-common.toml` (created on first run) + +**Note**: As documented in `CONFIG_INTEGRATION_GUIDE.md`, the configuration system is partially implemented. Tool stats read from config, but ore drops require MCreator procedure integration to fully use config values. + +### Ore Biome Finder + +The `OreBiomeFinderItem` (`item/OreBiomeFinderItem.java`) and `/ores` command (`OresCommand.java`) detect which mod tags apply to the current biome and list findable ores. This works by checking if the biome is in any of the custom biome tags. + +## Adding a New Ore + +To add a new ore type (requires MCreator for full integration): + +1. **Create the block** in MCreator +2. **Add loot table** at `src/main/resources/data/custom_ore_gen/loot_tables/blocks/{orename}.json` +3. **Add configured_feature** JSON in `worldgen/configured_feature/` +4. **Add placed_feature** JSON in `worldgen/placed_feature/` +5. **Create biome_modifier** JSON linking to a biome tag (or create a new tag in `tags/worldgen/biome/`) +6. **Register** in `CustomOreGenModBlocks.java` + +## Biomes O' Plenty Integration + +The mod includes BOP biome support through additional biome tags. When adding BOP biomes, add them to the appropriate category tag JSON files in `tags/worldgen/biome/`. + +## User Code Sections + +When editing MCreator-generated files, only modify code between: +```java +// Start of user code block [section_name] +// End of user code block [section_name] +``` + +For example, in `CustomOreGenModItems.java`: +```java +// Start of user code block custom items +// End of user code block custom items +``` + +## Testing + +After making changes: +1. Run `./gradlew build` to verify compilation +2. Run `./gradlew runClient` to test in-game +3. Check logs in `run/logs/` for errors + +## Version Info + +- Minecraft: 1.20.1 +- Forge: 47.3.0 +- Java: 17 +- Current mod version: 2.0.8 (defined in `build.gradle`) diff --git a/src/main/java/net/mcreator/customoregen/item/ShardDiamondArmorMaterial.java b/src/main/java/net/mcreator/customoregen/item/ShardDiamondArmorMaterial.java new file mode 100644 index 000000000..ec2e8c605 --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/item/ShardDiamondArmorMaterial.java @@ -0,0 +1,56 @@ +package net.mcreator.customoregen.item; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; +import net.mcreator.customoregen.init.CustomOreGenModItems; +import net.mcreator.customoregen.CustomOreGenMod; + +public class ShardDiamondArmorMaterial implements ArmorMaterial { + public static final ShardDiamondArmorMaterial INSTANCE = new ShardDiamondArmorMaterial(); + + private static final int[] DURABILITY_PER_SLOT = new int[]{250, 300, 280, 230}; + private static final int[] PROTECTION_PER_SLOT = new int[]{3, 7, 5, 2}; + + @Override + public int getDurabilityForType(ArmorItem.Type type) { + return DURABILITY_PER_SLOT[type.getSlot().getIndex()]; + } + + @Override + public int getDefenseForType(ArmorItem.Type type) { + return PROTECTION_PER_SLOT[type.getSlot().getIndex()]; + } + + @Override + public int getEnchantmentValue() { + return 14; + } + + @Override + public SoundEvent getEquipSound() { + return SoundEvents.ARMOR_EQUIP_DIAMOND; + } + + @Override + public Ingredient getRepairIngredient() { + return Ingredient.of(CustomOreGenModItems.DIAMONDSHARD.get()); + } + + @Override + public String getName() { + return CustomOreGenMod.MODID + ":shard_diamond"; + } + + @Override + public float getToughness() { + return 1.0f; + } + + @Override + public float getKnockbackResistance() { + return 0.0f; + } +} diff --git a/src/main/java/net/mcreator/customoregen/item/SharddiamondbootsItem.java b/src/main/java/net/mcreator/customoregen/item/SharddiamondbootsItem.java index 393b5705c..1caccbb4a 100644 --- a/src/main/java/net/mcreator/customoregen/item/SharddiamondbootsItem.java +++ b/src/main/java/net/mcreator/customoregen/item/SharddiamondbootsItem.java @@ -1,49 +1,10 @@ package net.mcreator.customoregen.item; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Item; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; - -import net.mcreator.customoregen.init.CustomOreGenModItems; public class SharddiamondbootsItem extends ArmorItem { public SharddiamondbootsItem() { - super(new ArmorMaterial() { - public int getDurabilityForType(ArmorItem.Type type) { - return 230; // Bottes - } - - public int getDefenseForType(ArmorItem.Type type) { - return 2; // Protection - } - - public int getEnchantmentValue() { - return 14; - } - - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_DIAMOND; - } - - public Ingredient getRepairIngredient() { - return Ingredient.of(new ItemStack(CustomOreGenModItems.DIAMONDSHARD.get())); - } - - public String getName() { - return "shard_diamond"; - } - - public float getToughness() { - return 1.0f; - } - - public float getKnockbackResistance() { - return 0.0f; - } - }, ArmorItem.Type.BOOTS, new Item.Properties()); + super(ShardDiamondArmorMaterial.INSTANCE, ArmorItem.Type.BOOTS, new Item.Properties()); } } diff --git a/src/main/java/net/mcreator/customoregen/item/SharddiamondchestplateItem.java b/src/main/java/net/mcreator/customoregen/item/SharddiamondchestplateItem.java index 457a38c69..9a1119d63 100644 --- a/src/main/java/net/mcreator/customoregen/item/SharddiamondchestplateItem.java +++ b/src/main/java/net/mcreator/customoregen/item/SharddiamondchestplateItem.java @@ -1,49 +1,10 @@ package net.mcreator.customoregen.item; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Item; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; - -import net.mcreator.customoregen.init.CustomOreGenModItems; public class SharddiamondchestplateItem extends ArmorItem { public SharddiamondchestplateItem() { - super(new ArmorMaterial() { - public int getDurabilityForType(ArmorItem.Type type) { - return 300; // Plastron - } - - public int getDefenseForType(ArmorItem.Type type) { - return 7; // Protection - } - - public int getEnchantmentValue() { - return 14; - } - - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_DIAMOND; - } - - public Ingredient getRepairIngredient() { - return Ingredient.of(new ItemStack(CustomOreGenModItems.DIAMONDSHARD.get())); - } - - public String getName() { - return "shard_diamond"; - } - - public float getToughness() { - return 1.0f; - } - - public float getKnockbackResistance() { - return 0.0f; - } - }, ArmorItem.Type.CHESTPLATE, new Item.Properties()); + super(ShardDiamondArmorMaterial.INSTANCE, ArmorItem.Type.CHESTPLATE, new Item.Properties()); } } diff --git a/src/main/java/net/mcreator/customoregen/item/SharddiamondhelmetItem.java b/src/main/java/net/mcreator/customoregen/item/SharddiamondhelmetItem.java index 034ce5f24..211c70a49 100644 --- a/src/main/java/net/mcreator/customoregen/item/SharddiamondhelmetItem.java +++ b/src/main/java/net/mcreator/customoregen/item/SharddiamondhelmetItem.java @@ -1,49 +1,10 @@ package net.mcreator.customoregen.item; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Item; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; - -import net.mcreator.customoregen.init.CustomOreGenModItems; public class SharddiamondhelmetItem extends ArmorItem { public SharddiamondhelmetItem() { - super(new ArmorMaterial() { - public int getDurabilityForType(ArmorItem.Type type) { - return 250; // Casque - } - - public int getDefenseForType(ArmorItem.Type type) { - return 3; // Protection - } - - public int getEnchantmentValue() { - return 14; - } - - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_DIAMOND; - } - - public Ingredient getRepairIngredient() { - return Ingredient.of(new ItemStack(CustomOreGenModItems.DIAMONDSHARD.get())); - } - - public String getName() { - return "shard_diamond"; - } - - public float getToughness() { - return 1.0f; - } - - public float getKnockbackResistance() { - return 0.0f; - } - }, ArmorItem.Type.HELMET, new Item.Properties()); + super(ShardDiamondArmorMaterial.INSTANCE, ArmorItem.Type.HELMET, new Item.Properties()); } } diff --git a/src/main/java/net/mcreator/customoregen/item/SharddiamondleggingsItem.java b/src/main/java/net/mcreator/customoregen/item/SharddiamondleggingsItem.java index c6281edc9..f8a627065 100644 --- a/src/main/java/net/mcreator/customoregen/item/SharddiamondleggingsItem.java +++ b/src/main/java/net/mcreator/customoregen/item/SharddiamondleggingsItem.java @@ -1,49 +1,10 @@ package net.mcreator.customoregen.item; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Item; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; - -import net.mcreator.customoregen.init.CustomOreGenModItems; public class SharddiamondleggingsItem extends ArmorItem { public SharddiamondleggingsItem() { - super(new ArmorMaterial() { - public int getDurabilityForType(ArmorItem.Type type) { - return 280; // JambiΓ¨res - } - - public int getDefenseForType(ArmorItem.Type type) { - return 5; // Protection - } - - public int getEnchantmentValue() { - return 14; - } - - public SoundEvent getEquipSound() { - return SoundEvents.ARMOR_EQUIP_DIAMOND; - } - - public Ingredient getRepairIngredient() { - return Ingredient.of(new ItemStack(CustomOreGenModItems.DIAMONDSHARD.get())); - } - - public String getName() { - return "shard_diamond"; - } - - public float getToughness() { - return 1.0f; - } - - public float getKnockbackResistance() { - return 0.0f; - } - }, ArmorItem.Type.LEGGINGS, new Item.Properties()); + super(ShardDiamondArmorMaterial.INSTANCE, ArmorItem.Type.LEGGINGS, new Item.Properties()); } } diff --git a/src/main/resources/assets/custom_ore_gen/textures/item/sharddiamondboots.png b/src/main/resources/assets/custom_ore_gen/textures/item/sharddiamondboots.png index 7b0c2c941f069ea80372fdd0916cadbb2c79c9ff..0e0918720828e61080555953f78a2aea7d9f834e 100644 GIT binary patch delta 236 zcmV;%ft*BSX z!!W65W@PI^f$0`(2bN+X)%Xrs@G^KdIL(^C7{SZP*)~W diff --git a/src/main/resources/assets/custom_ore_gen/textures/item/sharddiamondchestplate.png b/src/main/resources/assets/custom_ore_gen/textures/item/sharddiamondchestplate.png index 15cf585b904672771455749b8aa0f3f0b497fe7c..4c6f02131bb22d2317129c756d81c71efb34fff3 100644 GIT binary patch delta 296 zcmV+@0oVSf0mA~2B!BoxL_t(|oTQSk3c^qn#=njE1|pb-!6Fz1SL`bW!K{5R;R_fA zMBnp;j`U73ULzcV;1dIvo_{{pGo;M0*;0!IgKz^> z>d1t>+AH9ak*}CXA@I0r5Zxmbk**rt6-;e<(Ui} z+~U0@;?ldA_oQ_iI|yHVC;|`hN2KA2NFk@ zLs3A;0Gx)P8-Q#Gx*SmkO#5{LjL{9nX#lbzxHRI`3@6*T#h&}lmkPx0~mU1#l@euqg4qY z^Fkaj8fW9d3Gij8-qAG!u{rZ{4hRpJxanSR0Iaqb^xdf{y=#Hae3rmHisz3Yg;bV6 zBI8bMlJ!T1|Lh#V<^W_SlO800KjV%zYvcD-13>lataViAD|LbZ`F82o&&Mqos-u6Q siGBb80RR7qD?;V~000I_L_t&o0AGwh>eV8*Bme*a07*qoM6N<$f>OwC<h zyxnamZtL&UQ^)kC<9ScCUL}qRI|778WK-`@`3QE$^rB;LNN*zIPlR~6NV50Y{6M1# zUssd5LyTGRU~aDyn4=pS%>j8C_@K(V1KdBCXAQvj!54FRmG9&u2F@n7x?^XJ&BjUj wf?_i(^PdTyla$h(ko&CwoJQSb3QSmF0h}7>^kmuQu4=TqaS-c0fcq zc@eL}HJ)OlNHzuSBdUFj1)BIshe;;_Jv?NX8&oD5Dt&ubG=5T2Ast;S2GQ1G`X;=y_l6uf!XTg8+5 zPv}uSs5kZMwIJd_+Jm4M6?&`m;Gq#LrL|RBi4X`1+9Y1$e*5<8n>=@uO|#8z@8WY$fPt#PR@SdkS0f6jGGIK@N2uU))*`I?TnRdIEi)d)>WX^QPTL z_#SZUiplgk)_=>tJ!`L zw?}-6Cjf;)37j}>uZQthoiYiYhcAsVcdnUk61@Xx@ShzuEjnnJ*$vz2lt*RBoYGHJf}U-ux8Y;xyujy$FII`x6z5)u;sU=x0qR#Zm8F` z&VLJ)Wwb>BEuiM7LI`~((Tm1wh*{Rp+yRiZNHeSI>*S{*Xi-fA5R`&*{&)E`AO0XX z{&dLfB>WISN#dsQQXYSC!@N%GYZ_p@k%n*(!nJG^Kl#%5;l)1^!!Z|<&Z=V}3Je++ zDFru?A9Pr(A*>FF{V9#-hf(ny)=X8GdSWv&`zJyW2IZ<4SmdI2p0`}ESs23m*B8y^ z$Upxv{Gr&mpIa);Yf+m>bHdEI2NeJs`WjyW{{{R30|Nr>U-g5u|00v1!K~w_( XJx3W)Mw%Ec00000NkvXXu0mjfq@wDq delta 1634 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 delta 847 zcmV-V1F-z41my;hBYy)dNklg- zP@FmU2+$R!q2yE>^7n6pW@Yl+BS2eVLg?~1_{BxQFJ3eI2?$)KLtu&?QPvb_a*fch zHX|h60AFp8kgzZ&3?b$ixo22s0Tn`T2u?F#Ubw&V3DOp(qWR?+)IB&Mfl>iG9}S}G z`y}WG47}t0IDgvSjtNO5i0eDQO(HBSLHPtQqm9o`i}6LGVJ3$q6!kg`G1Bd!$Od!B-kP=ZyiEZzDfB6 z=vSp&lEZ0;7+o7q(2C9dLB|b-W&_6g&QV%mqGgWHaIN=#|2Viweu$gqHG||vxB>ohjvE&;rsug?-lrFMf^>eo2*=gl z83JjTETPV?SHwTI-#>=>$3s#w{GY*V&XEAF=YN{kH|M0g?D}#UjnCYuzHpMC{QB3z#@ z$w)QZup-VGERo!9hsfDe!Y4k3hc_ZTZpm;R7w&y%33A_h(Qd&a*Y Z;3o-*Szxd}%#i>9002ovPDHLkV1f%lkx2jm