diff --git a/.gitignore b/.gitignore index 8820965e3..a2a1ccf21 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,11 @@ hs_err_pid* .gradle build run +.run .DS_Store temp/ -.cache \ No newline at end of file +.cache +secrets.properties +/libs/touhou_little_maid_spell-1.2.2.jar diff --git a/build.gradle b/build.gradle index 1ccad4f69..84335d87f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import net.darkhax.curseforgegradle.TaskPublishCurseForge + buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } @@ -12,6 +14,9 @@ buildscript { plugins { id 'net.minecraftforge.gradle' version '[6.0,6.2)' + id 'net.darkhax.curseforgegradle' version '[1.1.24,1.2)' + id "at.stnwtr.gradle-secrets-plugin" version "1.0.1" + id "com.modrinth.minotaur" version "2.+" } apply plugin: 'maven-publish' @@ -116,7 +121,7 @@ tasks.withType(JavaCompile).configureEach { } if (lljij.toBoolean()) { - + jarJar.enable() reobf { jarJar {} } @@ -166,6 +171,13 @@ repositories { name 'tterrag maven' url 'https://maven.tterrag.com/' } + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + content { + includeGroup "maven.modrinth" + } + } maven { url 'https://www.cursemaven.com' content { @@ -175,6 +187,15 @@ repositories { maven { url = "https://maven.theillusivec4.top/" } + + maven { url "https://maven.shadowsoffire.dev/releases" } + maven { + url 'https://maven.iafenvoy.com/releases/' + content { + includeGroup "com.iafenvoy" + } + } + maven { url = "https://maven.createmod.net" } } dependencies { @@ -184,11 +205,11 @@ dependencies { runtimeOnly fg.deobf("dev.xkmc.l2modularblock:l2modularblock:1.1.0") implementation fg.deobf("dev.xkmc.l2screentracker:l2screentracker:0.1.4") - implementation fg.deobf("dev.xkmc.l2tabs:l2tabs:0.3.2") + implementation fg.deobf("dev.xkmc.l2tabs:l2tabs:0.3.3") - implementation fg.deobf(jarJar("dev.xkmc.l2itemselector:l2itemselector:0.1.8")) { + implementation fg.deobf(jarJar("dev.xkmc.l2itemselector:l2itemselector:0.2.1")) { transitive = false - jarJar.ranged(it, "[0.1.8,)") + jarJar.ranged(it, "[0.2.1,)") } implementation fg.deobf(jarJar("dev.xkmc.l2damagetracker:l2damagetracker:0.3.7")) { @@ -196,18 +217,29 @@ dependencies { jarJar.ranged(it, "[0.3.7,)") } - runtimeOnly fg.deobf("dev.xkmc.l2backpack:l2backpack:2.4.19-slim") - implementation fg.deobf('dev.xkmc.l2complements:l2complements:2.4.35-slim') - implementation fg.deobf("dev.xkmc.l2hostility:l2hostility:2.4.20-slim") + implementation fg.deobf(jarJar("dev.xkmc.mob_weapon_api:mob_weapon_api:0.2.22")) { + transitive = false + jarJar.ranged(it, "[0.2.22,)") + } + + implementation fg.deobf(jarJar("dev.xkmc.cataclysm_mux:cataclysm_mux:0.0.6")) { + transitive = false + jarJar.ranged(it, "[0.0.6,)") + } + + implementation fg.deobf("dev.xkmc.l2backpack:l2backpack:2.5.7-slim") + implementation fg.deobf('dev.xkmc.l2complements:l2complements:2.6.1-slim') + implementation fg.deobf("dev.xkmc.l2hostility:l2hostility:2.5.3-slim") + implementation fg.deobf("dev.xkmc.golemdungeons:golemdungeons:1.0.2-slim") implementation fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}") implementation fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") runtimeOnly fg.deobf("dev.xkmc.l2artifacts:l2artifacts:2.4.21-slim") - runtimeOnly fg.deobf("dev.xkmc.l2archery:l2archery:2.4.13") - runtimeOnly fg.deobf("dev.xkmc.l2weaponry:l2weaponry:2.4.28") + implementation fg.deobf("dev.xkmc.l2archery:l2archery:2.5.0") + implementation fg.deobf("dev.xkmc.l2weaponry:l2weaponry:2.5.0") - implementation fg.deobf('zip.local.blazegear:blazegear:1.3.6') + implementation fg.deobf('zip.local.blazegear:blazegear:1.4.2') runtimeOnly fg.deobf("curse.maven:attributefix-280510:4588114") runtimeOnly fg.deobf("curse.maven:bookshelf-228525:4581675") @@ -215,27 +247,119 @@ dependencies { //runtimeOnly fg.deobf('curse.maven:appleskin-248787:4440123') - implementation fg.deobf("curse.maven:create-enchantment-industry-688768:4764843") - implementation fg.deobf("curse.maven:create-328085:4762216") - implementation fg.deobf("curse.maven:the-twilight-forest-227639:4635921") - implementation fg.deobf("curse.maven:touhou-little-maid-355044:5320184") + implementation fg.deobf("curse.maven:create-enchantment-industry-688768:6652836") + implementation fg.deobf("curse.maven:create-328085:7178761") + compileOnly(fg.deobf("net.createmod.ponder:Ponder-Forge-1.20.1:1.0.91")) + compileOnly(fg.deobf("dev.engine-room.flywheel:flywheel-forge-api-1.20.1:1.0.5")) + + implementation fg.deobf("curse.maven:the-twilight-forest-227639:5468648") + implementation fg.deobf('curse.maven:touhou-little-maid-355044:6657436-sources-6657441') runtimeOnly fg.deobf("curse.maven:caelus-308989:4581481") runtimeOnly fg.deobf("curse.maven:elytra-slot-317716:4598379") implementation fg.deobf("curse.maven:jade-324717:4654448") - implementation fg.deobf("curse.maven:lionfish-api-1001614:5274401") - implementation fg.deobf("curse.maven:lendercataclysm-551586:5299092") - implementation fg.deobf("curse.maven:citadel-331936:4848887") - implementation fg.deobf("curse.maven:alexs-caves-924854:4852042") - - runtimeOnly fg.deobf("curse.maven:patchouli-306770:4966125") + implementation fg.deobf("curse.maven:lionfish-api-1001614:5922047") + implementation fg.deobf("curse.maven:lendercataclysm-551586:7934870") + implementation fg.deobf("curse.maven:citadel-331936:5633260") + implementation fg.deobf("curse.maven:alexs-caves-924854:5848216") + implementation fg.deobf("curse.maven:ice-and-fire-dragons-264231:5633453") + implementation fg.deobf("curse.maven:goety-586095:6362347") + + implementation fg.deobf("curse.maven:patchouli-306770:4966125") implementation fg.deobf("vazkii.botania:Botania:1.20.1-443-FORGE") - runtimeOnly fg.deobf("curse.maven:geckolib-388172:4711657") + runtimeOnly fg.deobf("curse.maven:geckolib-388172:6333474") runtimeOnly fg.deobf("curse.maven:playeranimator-658587:4587214") - implementation fg.deobf("curse.maven:irons-spells-n-spellbooks-855414:4693050") - implementation fg.deobf("curse.maven:ars-nouveau-401955:4751471") + compileOnly fg.deobf("curse.maven:irons-spells-n-spellbooks-855414:6488484") + compileOnly fg.deobf("curse.maven:ars-nouveau-401955:4751471") + implementation fg.deobf("curse.maven:mantle-74924:6105891") + implementation fg.deobf("curse.maven:tinkers-construct-74072:6111032") + //implementation fg.deobf("curse.maven:mutil-351914:4824501") + //implementation fg.deobf("curse.maven:tetra-289712:6096160") + + compileOnly fg.deobf("curse.maven:ewewukeks-musket-mod-354562:5675968") + runtimeOnly fg.deobf("curse.maven:retro-damage-indicators-1003431:5268035") + + compileOnly fg.deobf("curse.maven:architectury-api-419699:5137938") + compileOnly fg.deobf("curse.maven:uranus-1010827:6914449") + compileOnly fg.deobf("curse.maven:jupiter-1072905:7592838") + compileOnly fg.deobf("curse.maven:iceandfire-ce-1040076:7545797") + + implementation fg.deobf("curse.maven:mowzies-mobs-250498:6224182") + implementation fg.deobf("curse.maven:ato-405593:5348605") + implementation fg.deobf("curse.maven:allthemodium-364466:6389531") + + compileOnly fg.deobf("maven.modrinth:goety-revelation:2.1.5") + implementation fg.deobf("curse.maven:legendary-monsters-944035:6776766") + implementation fg.deobf("curse.maven:composite-material-982540:6310307") + //compileOnly fg.deobf("local.zip:RevelationFix:1.20.1") + runtimeOnly fg.deobf("curse.maven:spark-361579:4738952") + + implementation fg.deobf("dev.shadowsoffire:Placebo:${minecraft_version}-${placebo_version}") + implementation fg.deobf("dev.shadowsoffire:ApothicAttributes:${minecraft_version}-${attributeslib_version}") + implementation fg.deobf("dev.shadowsoffire:Apotheosis:${minecraft_version}-${apotheosis_version}") + +} +tasks.register('publishCurseForge', TaskPublishCurseForge) { + apiToken = secrets.get("curseforge_token") + def mainFile = upload(project.curseforge_project, new File("./build/libs/${modid}-${ll_version}.jar")) + mainFile.changelog = new File('./changelog.txt').text.split("\n\n\n")[0] + mainFile.addEnvironment("Client", "Server") + mainFile.addGameVersion("1.20.1") + mainFile.addModLoader("Forge","NeoForge") + mainFile.addRequirement("l2library") + mainFile.addOptional( + "blaze-gear", + "botania", + "create", + "jei", + "l2-archery", + "l2-backpack", + "l2-complements", + "l2hostility", + "l2weaponry", + "lendercataclysm", + "patchouli", + "the-twilight-forest", + "alexs-caves", + "touhou-little-maid", + "tinkers-construct", + "ewewukeks-musket-mod", + "goety", + "mowzies-mobs", + "allthemodium", + "legendary-monsters", + "composite-material" + ) + mainFile.releaseType = "release" + disableVersionDetection() } +modrinth { + token = secrets.get("modrinth_token") + projectId = project.modrinth_project + versionName = "Modular Golems ${project.ll_version}" + versionNumber = project.ll_version + versionType = "release" + uploadFile = new File("./build/libs/${modid}-${ll_version}.jar") + gameVersions = ["1.20.1"] + loaders = ["forge", "neoforge"] + changelog = new File('./changelog.txt').text.split("\n\n")[0] + dependencies { + required.project "l2library" + optional.project "botania" + optional.project "create" + optional.project "jei" + optional.project "l2archery" + optional.project "l2backpack" + optional.project "l2-complements" + optional.project "l2hostility" + optional.project "l2weaponry" + optional.project "l_enders-cataclysm" + optional.project "patchouli" + optional.project "touhou-little-maid" + optional.project "alexs-caves" + } +} \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index c1481f7b2..a7294b0b1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,168 +1,605 @@ -- 2.4.35 - - Add botania golems - - Nerf steeleaf attack - -- 2.4.34 - - Allow humanoid golem to use TouhouLittleMaid skins - - when range mode humanoid golem has empty/bow/arrow/shield in offhand, golem will not switch to melee mode - -- 2.4.33 - - entity interact bypass tag - - strict interact config - - allow attribute page to be opened for dog golem - - Fix equipment page description for non-humanoid - - Fix Twilight Forest damage modifier - - Allow humanoid golem to use custom texture skins using player head or piglin head - - Fix compat with newest Cataclysm (requires Cataclysm 1.99+) - -- 2.4.32 - - Fix create fuel feeding - - Allow golems to use fuels from dimensional backpack on them or their captain - -- 2.4.31 - - Damage cap modifier fix - - Change create material stats, add new modifiers - - Create material recipe using sequenced assembly only - - Create generic material recipe switched from heated mixing to sequenced assembly - - Allow deployer to put equipments and curios onto golems - -- 2.4.30 - - Fix Patchouli Book for cataclysm - - Add patrol patchouli entries - -- 2.4.29 - - Add patrol mode - - Fix humanoid golem player skin renderer not rendering outer layer - - Mobs killed by golem with pickup upgrade will have drops spawned at the golem position - - Add Leviathan, Ender Guardian, Netherite Monstrosity, and Ancient Remnant upgrade - - Add Damage Cap modifier to Cataclysm materials - - Ignis attack modifier can apply blazing brand up to 5 layers only - - Fix selection conflict with backpack - -- 2.4.28 - - Add Cataclysm compat - - Make cyclic damage detection default off - - Fix player immune upgrade to be only immune to owner and applies - -- 2.4.27 - - Fix humanoid golems use player skin by default - -- 2.4.26 - - Add player skin support for golems - - Add config option to not make hostile mobs automatically hostile to golems - - Touhou Little Maid compat: command wand can edit their curio - -- 2.4.25 - - Fix enchantment damage bonus not working on Large Golem Weapons - - Fix large golem weapon cannot be enchanted in enchanting table - - Fix compatibility with newest L2Library attribute tab - -- 2.4.24 - - Fix the bug that golem with corrupted data cannot be placed - - Prevent future golem data corruption - -- 2.4.23 - - Fix command wand attack config - - Add upgrade slot config - - Fix damage calculation - - Greatly improved golem swimming speed with Swim upgrade - - Allow golems to jump in water - - When mounted, shift in water means sink down - - Fix not able to attack player actively - -- 2.4.22 - - fix compatibility with REI - - add captain and squad mode - - add free wander mode - - make talented upgrade cheaper - -- 2.4.21 - - fix riding flickering - - target filter action show in message - - fix datapack target filter removing - - trim name on datapack target filter - - target reset time changed from 5 sec to 3 sec - - fix wand scrolling - -- 2.4.20 - - fix filter tab - -- 2.4.19 - - texture fix - -- 2.4.18 - - Add hostility compat - - Add target cards and target filter tab - - Add metalgolem weapons - - Now metalgolem will also tick equipments - - Curios support slot modifiers - -- 2.4.17 - - Omnipotent Wand - - Curios support for backpack - - Add secondary weapon slot and arrow slot - - Add weapon switch delay of 10 ticks - - Disable weapon switch when editing weapons - -- 2.4.16 - - Add metal golem armors - - Fix rendering of decorative layers on golems with size upgrade - - Make golem give up target after 5 seconds not approaching - - Make player not picking up items when dead - - Add CEI compat - - Add Attribute tab - - Add config cards: - - configure default golem mode when summoned - - configure summon location: old position or current location - - limit wand targets - - configure lock interaction - - pickup upgrade item filter - -- 2.4.15 - - Fix non-owner being able to change humanoid equipment - - Add Create deployer automation for upgrades - - Golem now will only access chest within <2 blocks, and only access them in standing mode - -- 2.4.14 - - Golems will attack enemies touching it first - - Fix shield block sound - - Now humanoid can open doors - - Fix grindstone remove upgrade - -- 2.4.13 - - Fix advancement logspam - - Add config for distances starting to go back (default 10 for following, 20 for wandering) - - Add config for distances golem would be forced to teleport back (default 30) - - Humanoid can now ride horse - - Now humanoid golem riding dog golem will control dog golem - - Add dog golem ridden speed factor to config - - Golems ridden or riding other living entities as controller can also teleport to player - - Golems summoned in creative will also consume stack - -- 2.4.12 - - Fix golem not following player under water with swim upgrade - - Increase golem speed under water - - Fix golem always trying to float up even when player is deep under water - - Now pickup upgrade will not destroy item when owner is present - - Humanoid and dog golem are no longer knock back resistant - - Add knockback resistance to materials - - Fix custom Goals not added to golems when reloading world - - Increase command wand target range - - Improve command wand message when ordering entities to attack others - -- 2.4.11 - - Fix golem not teleport to player when having an attack target - - Fix dog chasing target even when in sit position, when commanded by wand - - Fix dog riding one another - - Fix golems being able to be picked up by other players under some circumstances - - Allow command wand to target far away entities - -- 2.4.10 - - Add BlazeGear compat - - Fix golem weapon switching - - Fix golem teleport when having swim upgrade - -- 2.4.9 - - add mount upgrade and size upgrade - - add dispenser behavior for golems - - make wand activation range configurable \ No newline at end of file +2.7.1 +- fix shield breaker tag +- golems with mob skin use mob sounds as well +- Add new dog golem armor render api for addons + +2.7.0 +- Fix crash with some optimization mods +- Add new golem armor render api for addons + +2.6.45 +- Cursium Golem Armor +- Apocalyptium Golem Armor and Sword +- golem skin rework +- texture / model update + +2.6.44 +- Command wand now use wheels for golem mode switch +- Fix golem going in circles when speed is too high +- Dog golems and humanoid golem can now use their jump skills when ridden/riding +- Dog golem ridden by player can activate jump skill when instructed +- humanoid stop charging weapon after killing target + +2.6.43 +- Switch Retrieve wand click and shift-click actions +- Metal golem will switch to melee weapon when approached while holding bow / sonic cannon +- Fix metal golem not displaying shoulder items in item form +- Make golem spear also break shield +- Fix equipment menu slot rendering +- Fix dog golem not attacking while ridden +- Fix dog golem reacting slowly after being hurt +- Dog golem now has the same target as rider if ridden by golem +- Make bell modifier less noisy +- When dog is attacked, golem rider will revenge +- Fix golem keep retreating when riding while having a jump attack +- Fix golem still following player when in free wander mode +- Fix crash with golem sound + +2.6.42 +- Support newest version of Cataclysm +- Fix dog golem ca be commanded to sit down by non-owner + +2.6.41 +- Hostile golem no longer destroy items +- Reduce voice volume for humanoid and dog golem +- Add voice volume config for player golem and hostile golem + +2.6.40 +- Fix golem curios screen not closing after golem death +- Change golem beacon rendering +- Change dog / humanoid golem hurt / death sound + + +2.6.39 +- Buff Goety Apostle upgrades +- Fix the issue of golem rendering death animation after fixing dead gelems + +2.6.38 +- Disintegrating golem returns shoulder weapons now +- Fix golem not using some weapons that fit 2 categories at once + +2.6.37 +- Add health to golem status display +- Fix golem weapon switch between staff and swords + +2.6.36 +- Fix Etherite modifier +- Sort stat display +- Abbreviate overlay modifier display when there are more than 8 + +2.6.34 +- Limit shoulder weapon horizontal angle to 15 degrees +- Fix shoulder weapon not attacking mobs above and below +- Fix flame thrower not rotating +- backup / arrow / shoulder slots respect vanishing curse now + +2.6.33 +- Golem axe breaks shields now + +2.6.32 +- Add Flame Thrower shoulder weapon +- Fix golem riding offset with maid skins +- Fix mobs attacking invisible golem when golem is placed into disassembly table +- Improve golem equipment display & overlay +- Golem no longer affected by root magic from ISS + +2.6.31 +- Add config for Beacon Cannon Damage +- Add Sonic Cannon +- Add Mechanic Repair Arm as Shoulder Equipment for repairing metal golem + +2.6.30 +- Fix disassembly menu dupe +- Fix multi-target attacking skills and bows attacking entities not as a valid target +- Fix pickup upgrade not teleporting exp orbs when mob haven't hit golem once +- Make endgame armors not destroyable with fire, explosion, or cactus +- Allow metal golem to use backup hand and arrow slot +- Add beacon cannon + +2.6.29 +- Metal Golem Bows +- Fix equipment screen golem preview +- Golem properly rotates now when standing still + + +2.6.28 +- Golem heals in ender/dimensional backpacks in L2Backpack +- Casting / Recycle recipes for windspirit boots +- Deployer apply dog armor for dog golems +- Improve ironwood armor models + +2.6.27 +- Fix golems with jump attack not approaching target +- Fix reflective trait descriptions + +2.6.26 +- Fix upgrade screen crash when inserting upgrade without golem + +2.6.25 +- Fix golem dungeon weapon modifiers not applied + +2.6.24 +- Nerf Thorn Modifier + +2.6.23 +- Fix dog golem equipment preview +- Fix golem attribute not reset after taking down upgrade +- Fix dog armor translation + +2.6.22 +- Add dog golem armor +- buff dog golem +- fix dog golem moving while sitting down + +2.6.21 +- Add Twilight Forest Golem Armor and Weapons +- Buff diamond golem boots + +2.6.20 +- Add Golem Workbench +- Add Apotheosis reforge support for Large Golem Equipments +- Nerf Ignitium golem skills +- Ignis explosions no longer destroy items + + +2.6.19 +- Ignis Armor +- Flame Strike ability +- Buff Ignitium and Witherite golem attack stats +- Improve Ignitium golem abilities + +2.6.18 +- Fix ethernium upgrade icon +- Update L2C weapon compat +- Fix crossbow double charging +- Make many ranged attack skill also usable in melee +- Balance Maledictus / Netherite Monstrosity jump attack and Could golem attack damage +- New formula: dmg = atk + min(atk, factor * maxHP) + max(0, sqrt(factor * maxHP / atk) - 1) * atk * 2 + +2.6.17 +- Add CompositeMaterial compat golem +- Make large golem able to use eternium weapons from L2Weaponry +- Fix abnormal tinker crossbow damage +- Fix cataclysm golem rendering bug + +2.6.16 +- Dispell modifier follows dispell trait in L2H +- Add more curios slots +- Make metal golem knockback less dramatic + +2.6.15 +- improve metal golem knockback formula +- fix golem pause after killing one target +- golem will prioritize near enemies more +- fix meat shredder not being used properly +- fix other mods healing golem in client incorrectly +- improve some translations + +2.6.14 +- When player flies away from golem, golem will be teleported to player and gain slow falling effects for 3 seconds. +- Golem switch attack target immediately when attacked by entities within melee range +- Golem will try to keep distance from attack target in melee mode at maximum melee range +- Golem will try to convert to ranged attack mode and stay away from target if it's in melee mode and has ranged weapon available +- Command wand overrides golem targeting system +- Summon and Retrieval wand can summon from / retrieve into ender backpack and dimensional backpack +- Fix summon wand not consuming golem with no bars when player is in creative +- Fix meltdown modifier incorrectly revives golem when golem is killed + +2.6.13 +- add config for wand to bypass config card lock +- Fix Create deployer not consuming equipments when deploying on golem +- Buff Hepatizon Golem, Sandstorm Modifier, Deployer Upgrade + + +2.6.11 +- Fix compatibility with Create 6.0.7 + +2.6.10 +- Now part substitution cannot bypass upgrade slot limit +- Cataclysm death beam ability can reach higher vertical angle now +- Fix dog equipment menu crash + +2.6.9 +- Add Beacon Boots +- Update PTBR translation + +2.6.8 +- fix refmap + +2.6.7 +- Add Ancient Metal Golem +- Add diamond and netherite golem boots +- Allow large golem to ride max size dog golem +- Create deployer will not cause golem to get entity data when adding equipments +- Twilight Forest Giant items will not scale with golem + +2.6.6 +- Golem no longer stuck in wall if placed on wall +- Allow consumables to be put in metal golem off hand for integration modifiers +- Humanoid no longer held up shields when having no attack targets +- Adjust height of humanoid and dog golems +- Disable golem death message on hostile golems +- Golem size upgrade affect jump height and step height as well +- Adjust riding offset + +2.6.5 +- Fix Golem Sweep on non-enemies +- Optimize slicing axe loot modifier to remove errors in log message + + +2.6.4 +- Fix add slot smithing with golems using constructs +- Update Cataclysm required version + +2.6.3 +- Add Ender Guardian and Scylla golem +- Add Scylla weapon and coral spear compat +- Fix add slot ingredient test +- Catch up to new Cataclysm code, fix modifiers +- Gate some patchouli book contents behind advancements + +2.6.2 +- Golems will try to target different enemies when fighting together + +2.6.1 +- Make golem parts immune to lightning, fire, explosion +- Add hostile wand, allowing to make golems hostile, and click mob to make hostile golems attacking them + + +2.5.27 +- Dog Golem with Ride upgrade no longer take damage from hostile mobs not targeting it +- Make player immune upgrade, talented upgrade, cauldron upgrade cheaper +- Port diamond and netherite add slot template back to 1.20.1 +- Limit path record card nodes to be within 16 blocks +- Shift right click to clear path record cards +- Now target filter card have higher priority than entity interaction +- Fix golem config keep showing "Loading" when player did not open the config card before + +2.5.26 +- Add Golem Slicing Axe +- Use standalone models for Dog golems +- Update PTBR translation + +2.5.25 +- Add Monstrosity Golem Armor (thanks T7H1 for modeling) +- Improve Maid behaviors +- Be compatible with newest Legendary Monsters (finally) + +2.5.24 +- Add Harbinger Golem Armor (thanks T7H1 for modeling) +- Maids can repair golems they own +- Fix Maid enemy search range in golem summoner mode +- Fix crash with newest Legendary Monsters (again) +- Fix Teleport Modifier on old golems +- Use standalone models for Humanoid golems + +2.5.23 +- Now Maids from TLM can summon and collect golems in combat +- Fix crash with newest Legendary Monsters + +2.5.22 +- Bosses now can disable golem shields for 10 seconds on blockable attack +- Add Soul Collection upgrade +- Improve some textures + + +2.5.21 +- Add Cloud Golem for Legendary Monsters +- Fix tag error +- Add config for golem removal message + +2.5.20 +- Chaotic Golem and Miraculous Golem for L2Hostility + +2.5.19 +- Incompatible items will be thrown out instead of crashing +- TF Trophies no longer hide the head of all golems +- Tweak golem facade crafting + +2.5.18 +- Add Molten Metal golem for Legendary Monsters +- Add patchouli flag to allow books to be loaded with Create 0.5 +- Add advancement gating for patchouli contents + + +2.5.17 +- Fix Goety Revelation upgrades + +2.5.16 +- Add Cardboard golems for Create +- Fix humanoid skin renderer double scaling +- Fix curios render rotation with skin renderer +- Buff Apocalyptium golem + +2.5.15 +- Apocalyptium golem and 4 upgrades for Goety Revelation + + +2.5.14 +- Add 2 more Goety upgrades +- Make it not crash when curios is not present +- Alter Apostle Ascension upgrade recipes when Goety Relevation is present + +2.5.13 +- Fix crash with mowzie's mobs + +2.5.12 +- Buff Dog Golem +- Add Wroughtnaut golem for Mowzie's Mobs +- Add 3 ATM golems +- Fix Cursium attack modifier log spam +- Fix melee special weapons triggering magnetic golem's range attack mode +- Golem recycle upgrade and death tracker will react properly when golem is forcefully removed + +2.5.11 +- Fix Crash when golem hold multishot crossbow +- Add 4 Goety upgrades +- Typo fix + +2.5.10 +- Fix soul repair modifier +- Fix BlazeGear golem not craftable + +2.5.9 +- Fix Twilight Forest Trophies hide humanoid golem head +- Allow curios to be rendered on humanoid golems +- Add Goety Golems + + +2.5.8 +- Add Ice and Fire Dragonsteel Golems + +2.5.7 +- Add golem facade +- Add golem tracker screen +- Add golem substitution recipes +- Allow large golems to use some weapons from Cataclysm +- Fix patrolling golems not attacking + +2.5.6 +- Fix crash when Cataclysm or Tinkers Construct is installed but not L2Complements + +2.5.5 +- Add Cursium golems for Cataclysm integration +- Add Amethyst Bronze, Cobalt, Manyullyn, Hepatizon golems for TConstruct integration +- Fix golem template position in TConstruct casting basin +- Allow dog golem to be captain as well +- Fix compatibility with retro damage indicator +- Add Casting recipe for upgrades and golem armor, being cheaper than crafting recipe + +2.5.4 +- Now unstackable burnable items without container would not be consumed by Create abilities + + +2.5.3 +- Fix golem would not stop sing Meat Shredder and Winterstorm wand +- Fix humanoid golem not dropping arrow and backup hand slot on death + +2.5.2 +- Support Twilight Scepter and Lifedrain Scepter from Twilight Forest +- Support Infernal Forge, Void Forge, Gauntlet of Maelstrom, Ancient Spear, Soul Render from Cataclysm +- Support Potato Cannon from Create (for Create 0.5.x only) + +2.5.1 +- Support wither assault weapon, void assault weapon, meat shredder, laser gatling from Cataclysm +- Smarter weapon switch between ranged and melee weapons +- Add ru_ru and pt_br localization + +2.5.0 +- Add tinker casting recipes for golems +- Support bows / crossbows from tinker +- Support bows from Cataclysm, Twilight Forest +- Support special weapons from L2Complements +- Support full bow feature from L2Archery + + +2.4.48 +- Fix startup client crash with some other mods + +2.4.47 +- Attribute golem kills to player + +2.4.43 +- Fix TLM GeckoLib integration +- Add Path config rendering + +2.4.42 +- Fix fire aspect not working on metal golem weapons +- Refactor golem rendering code +- Reset golem attack target after placed down +- Add Alex's Caves compat materials +- Fix create deploy recipe not consuming armor +- Allow config card to be applied with create deploy recipe +- (Default off) Add client option to fix all shield blocking pose so that they render correctly on humanoid golems + +2.4.41 +- Fix compat with Cataclysm 2.10 + +2.4.40 +- Add config to allow golems to enter portal +- Address crash with sons of sins +- Uuid filters now have higher priority + +2.4.39 +- Fix crash when editing maid curios + +2.4.38 +- Fix golem patrol when riding something +- Increase golem shooting range +- Add config for editing curios for other ownable mobs + +2.4.37 +- Fix healing desync when golem healing is prevented +- Fix config card crash when Curios is not installed + +2.4.36 +- Allow Patrol Path in curios slot + +2.4.35 +- Add botania golems +- Nerf steeleaf attack + +2.4.34 +- Allow humanoid golem to use TouhouLittleMaid skins +- when range mode humanoid golem has empty/bow/arrow/shield in offhand, golem will not switch to melee mode + +2.4.33 +- entity interact bypass tag +- strict interact config +- allow attribute page to be opened for dog golem +- Fix equipment page description for non-humanoid +- Fix Twilight Forest damage modifier +- Allow humanoid golem to use custom texture skins using player head or piglin head +- Fix compat with newest Cataclysm (requires Cataclysm 1.99+) + +2.4.32 +- Fix create fuel feeding +- Allow golems to use fuels from dimensional backpack on them or their captain + +2.4.31 +- Damage cap modifier fix +- Change create material stats, add new modifiers +- Create material recipe using sequenced assembly only +- Create generic material recipe switched from heated mixing to sequenced assembly +- Allow deployer to put equipments and curios onto golems + +2.4.30 +- Fix Patchouli Book for cataclysm +- Add patrol patchouli entries + +2.4.29 +- Add patrol mode +- Fix humanoid golem player skin renderer not rendering outer layer +- Mobs killed by golem with pickup upgrade will have drops spawned at the golem position +- Add Leviathan, Ender Guardian, Netherite Monstrosity, and Ancient Remnant upgrade +- Add Damage Cap modifier to Cataclysm materials +- Ignis attack modifier can apply blazing brand up to 5 layers only +- Fix selection conflict with backpack + +2.4.28 +- Add Cataclysm compat +- Make cyclic damage detection default off +- Fix player immune upgrade to be only immune to owner and applies + +2.4.27 +- Fix humanoid golems use player skin by default + +2.4.26 +- Add player skin support for golems +- Add config option to not make hostile mobs automatically hostile to golems +- Touhou Little Maid compat: command wand can edit their curio + +2.4.25 +- Fix enchantment damage bonus not working on Large Golem Weapons +- Fix large golem weapon cannot be enchanted in enchanting table +- Fix compatibility with newest L2Library attribute tab + +2.4.24 +- Fix the bug that golem with corrupted data cannot be placed +- Prevent future golem data corruption + +2.4.23 +- Fix command wand attack config +- Add upgrade slot config +- Fix damage calculation +- Greatly improved golem swimming speed with Swim upgrade +- Allow golems to jump in water +- When mounted, shift in water means sink down +- Fix not able to attack player actively + +2.4.22 +- fix compatibility with REI +- add captain and squad mode +- add free wander mode +- make talented upgrade cheaper + +2.4.21 +- fix riding flickering +- target filter action show in message +- fix datapack target filter removing +- trim name on datapack target filter +- target reset time changed from 5 sec to 3 sec +- fix wand scrolling + +2.4.20 +- fix filter tab + +2.4.19 +- texture fix + +2.4.18 +- Add hostility compat +- Add target cards and target filter tab +- Add metalgolem weapons +- Now metalgolem will also tick equipments +- Curios support slot modifiers + +2.4.17 +- Omnipotent Wand +- Curios support for backpack +- Add secondary weapon slot and arrow slot +- Add weapon switch delay of 10 ticks +- Disable weapon switch when editing weapons + +2.4.16 +- Add metal golem armors +- Fix rendering of decorative layers on golems with size upgrade +- Make golem give up target after 5 seconds not approaching +- Make player not picking up items when dead +- Add CEI compat +- Add Attribute tab +- Add config cards: + - configure default golem mode when summoned + - configure summon location: old position or current location + - limit wand targets + - configure lock interaction + - pickup upgrade item filter + +2.4.15 +- Fix non-owner being able to change humanoid equipment +- Add Create deployer automation for upgrades +- Golem now will only access chest within <2 blocks, and only access them in standing mode + +2.4.14 +- Golems will attack enemies touching it first +- Fix shield block sound +- Now humanoid can open doors +- Fix grindstone remove upgrade + +2.4.13 +- Fix advancement logspam +- Add config for distances starting to go back (default 10 for following, 20 for wandering) +- Add config for distances golem would be forced to teleport back (default 30) +- Humanoid can now ride horse +- Now humanoid golem riding dog golem will control dog golem +- Add dog golem ridden speed factor to config +- Golems ridden or riding other living entities as controller can also teleport to player +- Golems summoned in creative will also consume stack + +2.4.12 +- Fix golem not following player under water with swim upgrade +- Increase golem speed under water +- Fix golem always trying to float up even when player is deep under water +- Now pickup upgrade will not destroy item when owner is present +- Humanoid and dog golem are no longer knock back resistant +- Add knockback resistance to materials +- Fix custom Goals not added to golems when reloading world +- Increase command wand target range +- Improve command wand message when ordering entities to attack others + +2.4.11 +- Fix golem not teleport to player when having an attack target +- Fix dog chasing target even when in sit position, when commanded by wand +- Fix dog riding one another +- Fix golems being able to be picked up by other players under some circumstances +- Allow command wand to target far away entities + +2.4.10 +- Add BlazeGear compat +- Fix golem weapon switching +- Fix golem teleport when having swim upgrade + +2.4.9 +- add mount upgrade and size upgrade +- add dispenser behavior for golems +- make wand activation range configurable \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a28c0cc66..702d0642b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,17 +5,23 @@ mixingradle_version = 0.7-SNAPSHOT mixin_version = 0.8.5 minecraft_version = 1.20.1 -forge_version = 47.1.3 +forge_version = 47.4.10 mixin_extras_version = 0.2.0-beta.8 registrate_version = MC1.20-1.3.11 jei_minecraft_version = 1.20.1-forge -jei_version = 15.2.0.23 -curios_version = 5.4.5+1.20.1 +jei_version = 15.20.0.129 +curios_version = 5.9.1+1.20.1 modid = modulargolems -ll_version = 2.4.35 +ll_version = 2.7.1 lljij = true rootMod = false -l2library_version = 2.4.25 -patchouli_version = 1.20.1-80-FORGE-SNAPSHOT \ No newline at end of file +l2library_version = 2.5.3 +patchouli_version = 1.20.1-80-FORGE-SNAPSHOT +attributeslib_version=1.3.7 +apotheosis_version=7.4.8 +placebo_version=8.6.3 + +curseforge_project = 690937 +modrinth_project = gtGDlsAD \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d3f..2617362fd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/libs/blazegear-1.3.6.jar b/libs/blazegear-1.3.6.jar deleted file mode 100644 index 6e57c878c..000000000 Binary files a/libs/blazegear-1.3.6.jar and /dev/null differ diff --git a/libs/blazegear-1.4.2.jar b/libs/blazegear-1.4.2.jar new file mode 100644 index 000000000..d4b76b0f2 Binary files /dev/null and b/libs/blazegear-1.4.2.jar differ diff --git a/libs/cataclysm_mux-0.0.6.jar b/libs/cataclysm_mux-0.0.6.jar new file mode 100644 index 000000000..ba679d8f6 Binary files /dev/null and b/libs/cataclysm_mux-0.0.6.jar differ diff --git a/libs/golemdungeons-1.0.2-slim.jar b/libs/golemdungeons-1.0.2-slim.jar new file mode 100644 index 000000000..d5d514e97 Binary files /dev/null and b/libs/golemdungeons-1.0.2-slim.jar differ diff --git a/libs/iceandfire-1.0-1.20.1-forge.jar b/libs/iceandfire-1.0-1.20.1-forge.jar new file mode 100644 index 000000000..702d9e371 Binary files /dev/null and b/libs/iceandfire-1.0-1.20.1-forge.jar differ diff --git a/libs/l2archery-2.4.13.jar b/libs/l2archery-2.5.0.jar similarity index 60% rename from libs/l2archery-2.4.13.jar rename to libs/l2archery-2.5.0.jar index 1173e4415..2f34347ba 100644 Binary files a/libs/l2archery-2.4.13.jar and b/libs/l2archery-2.5.0.jar differ diff --git a/libs/l2backpack-2.4.19-slim.jar b/libs/l2backpack-2.4.19-slim.jar deleted file mode 100644 index ab9c35f9b..000000000 Binary files a/libs/l2backpack-2.4.19-slim.jar and /dev/null differ diff --git a/libs/l2backpack-2.5.7-slim.jar b/libs/l2backpack-2.5.7-slim.jar new file mode 100644 index 000000000..ea2d38bfe Binary files /dev/null and b/libs/l2backpack-2.5.7-slim.jar differ diff --git a/libs/l2complements-2.4.35-slim.jar b/libs/l2complements-2.4.35-slim.jar deleted file mode 100644 index a24caae86..000000000 Binary files a/libs/l2complements-2.4.35-slim.jar and /dev/null differ diff --git a/libs/l2complements-2.6.1-slim.jar b/libs/l2complements-2.6.1-slim.jar new file mode 100644 index 000000000..de3600dc1 Binary files /dev/null and b/libs/l2complements-2.6.1-slim.jar differ diff --git a/libs/l2hostility-2.4.20-slim.jar b/libs/l2hostility-2.4.20-slim.jar deleted file mode 100644 index 20ffb2af1..000000000 Binary files a/libs/l2hostility-2.4.20-slim.jar and /dev/null differ diff --git a/libs/l2hostility-2.5.3-slim.jar b/libs/l2hostility-2.5.3-slim.jar new file mode 100644 index 000000000..201718ea2 Binary files /dev/null and b/libs/l2hostility-2.5.3-slim.jar differ diff --git a/libs/l2itemselector-0.1.8.jar b/libs/l2itemselector-0.1.8.jar deleted file mode 100644 index a2d03406a..000000000 Binary files a/libs/l2itemselector-0.1.8.jar and /dev/null differ diff --git a/libs/l2itemselector-0.2.1-sources.jar b/libs/l2itemselector-0.2.1-sources.jar new file mode 100644 index 000000000..fe68e3f0f Binary files /dev/null and b/libs/l2itemselector-0.2.1-sources.jar differ diff --git a/libs/l2itemselector-0.2.1.jar b/libs/l2itemselector-0.2.1.jar new file mode 100644 index 000000000..75f40111b Binary files /dev/null and b/libs/l2itemselector-0.2.1.jar differ diff --git a/libs/l2library-2.4.25-slim.jar b/libs/l2library-2.5.3-slim.jar similarity index 73% rename from libs/l2library-2.4.25-slim.jar rename to libs/l2library-2.5.3-slim.jar index 0e326c9a9..09e0fb0b9 100644 Binary files a/libs/l2library-2.4.25-slim.jar and b/libs/l2library-2.5.3-slim.jar differ diff --git a/libs/l2tabs-0.3.2.jar b/libs/l2tabs-0.3.3.jar similarity index 72% rename from libs/l2tabs-0.3.2.jar rename to libs/l2tabs-0.3.3.jar index 0a92bed52..69a67eddf 100644 Binary files a/libs/l2tabs-0.3.2.jar and b/libs/l2tabs-0.3.3.jar differ diff --git a/libs/l2weaponry-2.4.28.jar b/libs/l2weaponry-2.4.28.jar deleted file mode 100644 index 8dee63d9b..000000000 Binary files a/libs/l2weaponry-2.4.28.jar and /dev/null differ diff --git a/libs/l2weaponry-2.5.0.jar b/libs/l2weaponry-2.5.0.jar new file mode 100644 index 000000000..a88313ad5 Binary files /dev/null and b/libs/l2weaponry-2.5.0.jar differ diff --git a/libs/mob_weapon_api-0.2.22-slim.jar b/libs/mob_weapon_api-0.2.22-slim.jar new file mode 100644 index 000000000..fe6d48f15 Binary files /dev/null and b/libs/mob_weapon_api-0.2.22-slim.jar differ diff --git a/libs/mob_weapon_api-0.2.22.jar b/libs/mob_weapon_api-0.2.22.jar new file mode 100644 index 000000000..2355331cf Binary files /dev/null and b/libs/mob_weapon_api-0.2.22.jar differ diff --git a/src/generated/resources/assets/modulargolems/blockstates/golem_workbench.json b/src/generated/resources/assets/modulargolems/blockstates/golem_workbench.json new file mode 100644 index 000000000..875ee1ff4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/blockstates/golem_workbench.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "modulargolems:block/golem_workbench" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/lang/en_ud.json b/src/generated/resources/assets/modulargolems/lang/en_ud.json index 396ade884..93c9b2292 100644 --- a/src/generated/resources/assets/modulargolems/lang/en_ud.json +++ b/src/generated/resources/assets/modulargolems/lang/en_ud.json @@ -49,37 +49,83 @@ "advancements.modulargolems.advancements.golems.thunder.title": "poᴚ buıuʇɥbıꞀ buıʞןɐM", "advancements.modulargolems.advancements.golems.upgrade.description": "ǝpɐɹbdn uɐ uıɐʇqO", "advancements.modulargolems.advancements.golems.upgrade.title": "ɯǝןo⅁ ɹnoʎ ǝpɐɹbd∩", + "attribute.name.dynamic_reduction": "ǝɯı⟘ uoıʇɔnpǝᴚ ɔıɯɐuʎᗡ", "attribute.name.golem_jump": "ɥʇbuǝɹʇS dɯnſ ɯǝןo⅁", "attribute.name.golem_regen": "uǝbǝᴚ ɯǝןo⅁", "attribute.name.golem_size": "ǝzıS ɯǝןo⅁", "attribute.name.golem_sweep": "ǝbuɐᴚ dǝǝʍS", + "block.modulargolems.golem_workbench": "ɥɔuǝqʞɹoM ɯǝןo⅁", + "config.jade.plugin_modulargolems.maid_model": "uıʞS pıɐW", + "config.jade.plugin_modulargolems.player_skin": "uıʞS ǝןıℲ/ɹǝʎɐןԀ", + "curios.identifier.golem_route": "ɥʇɐԀ ןoɹʇɐԀ ɯǝןo⅁", "curios.identifier.golem_skin": "uıʞS ɯǝןo⅁ pıouɐɯnH", + "effect.modulargolems.atomic_boost": "ʇsooᗺ ɔıɯoʇⱯ", + "effect.modulargolems.atomic_boost.description": "pǝǝds ʇuǝɯǝʌoɯ puɐ ǝbɐɯɐp ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", + "effect.modulargolems.hepatizon_effect": "ʇɔǝɟɟƎ uozıʇɐdǝH", + "effect.modulargolems.hepatizon_effect.description": "ǝbɐɯɐp ssǝן sǝʞɐʇ ɯǝןo⅁", + "effect.modulargolems.maledictus_rage": "ǝbɐᴚ snʇɔıpǝןɐW", + "effect.modulargolems.maledictus_rage.description": "ǝbɐɯɐp ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", + "effect.modulargolems.manyullyn_effect": "ʇɔǝɟɟƎ uʎןןnʎuɐW", + "effect.modulargolems.manyullyn_effect.description": "ǝbɐɯɐp ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", "effect.modulargolems.mechanical_force": "ǝɔɹoℲ ןɐɔıuɐɥɔǝW", "effect.modulargolems.mechanical_force.description": "ǝbɐɯɐp ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", "effect.modulargolems.mechanical_mobility": "ʎʇıןıqoW ןɐɔıuɐɥɔǝW", "effect.modulargolems.mechanical_mobility.description": "pǝǝds ʇuǝɯǝʌoɯ ɯǝןob ǝsɐǝɹɔuI", + "entity.modulargolems.beacon_laser": "ɹǝsɐꞀ uoɔɐǝᗺ", "entity.modulargolems.dog_golem": "ɯǝןo⅁ boᗡ", "entity.modulargolems.humanoid_golem": "ɯǝןo⅁ pıouɐɯnH", "entity.modulargolems.metal_golem": "ɯǝןo⅁ ןɐʇǝW", + "golem_material.alexscaves.candy": "ʎpuɐƆ", + "golem_material.alexscaves.magnetic": "ɔıʇǝubɐW", + "golem_material.alexscaves.nuclear": "ɹɐǝןɔnN", + "golem_material.allthemodium.allthemodium": "ɯnıpoɯǝɥʇןןⱯ", + "golem_material.allthemodium.unobtainium": "ɯnıuıɐʇqou∩", + "golem_material.allthemodium.vibranium": "ɯnıuɐɹqıΛ", "golem_material.blazegear.brimsteel": "ןǝǝʇsɯıɹᗺ", "golem_material.botania.elementium": "ɯnıʇuǝɯǝןƎ", "golem_material.botania.manasteel": "ןǝǝʇsɐuɐW", "golem_material.botania.terrasteel": "ןǝǝʇsɐɹɹǝ⟘", + "golem_material.cataclysm.ancient_metal": "ןɐʇǝW ʇuǝıɔuⱯ", + "golem_material.cataclysm.cursium": "ɯnısɹnƆ", + "golem_material.cataclysm.ender_guardian": "uɐıpɹɐn⅁ ɹǝpuƎ", "golem_material.cataclysm.ignitium": "ɯnıʇıubI", + "golem_material.cataclysm.storm": "ɯɹoʇS", "golem_material.cataclysm.witherite": "ǝʇıɹǝɥʇıM", + "golem_material.composite_material.allay_steel": "ןǝǝʇS ʎɐןןⱯ", + "golem_material.composite_material.dungeon_steel": "ןǝǝʇS uoǝbunᗡ", + "golem_material.composite_material.etherite": "ǝʇıɹǝɥʇƎ", + "golem_material.composite_material.obsidian_steel": "ןǝǝʇS uɐıpısqO", + "golem_material.composite_material.primitive": "ǝʌıʇıɯıɹԀ", "golem_material.create.andesite_alloy": "ʎoןןⱯ ǝʇısǝpuⱯ", "golem_material.create.brass": "ssɐɹᗺ", + "golem_material.create.cardboard": "pɹɐoqpɹɐƆ", "golem_material.create.railway": "ʎɐʍןıɐᴚ", "golem_material.create.zinc": "ɔuıZ", + "golem_material.goety.cursed_metal": "ןɐʇǝW pǝsɹnƆ", + "golem_material.goety.dark_metal": "ןɐʇǝW ʞɹɐᗡ", + "golem_material.goety_revelation.apocalyptium": "ɯnıʇdʎןɐɔodⱯ", + "golem_material.iceandfire.fire_dragonsteel": "ןǝǝʇsuobɐɹᗡ ǝɹıℲ", + "golem_material.iceandfire.ice_dragonsteel": "ןǝǝʇsuobɐɹᗡ ǝɔI", + "golem_material.iceandfire.lightning_dragonsteel": "ןǝǝʇsuobɐɹᗡ buıuʇɥbıꞀ", "golem_material.l2complements.eternium": "ɯnıuɹǝʇƎ", "golem_material.l2complements.poseidite": "ǝʇıpıǝsoԀ", "golem_material.l2complements.shulkerate": "ǝʇɐɹǝʞןnɥS", "golem_material.l2complements.totemic_gold": "pןo⅁ ɔıɯǝʇo⟘", + "golem_material.l2hostility.chaotic": "ɔıʇoɐɥƆ", + "golem_material.l2hostility.miraculous": "snoןnɔɐɹıW", + "golem_material.legendary_monsters.cloud": "pnoןƆ", + "golem_material.legendary_monsters.molten_metal": "ןɐʇǝW uǝʇןoW", "golem_material.modulargolems.copper": "ɹǝddoƆ", "golem_material.modulargolems.gold": "pןo⅁", "golem_material.modulargolems.iron": "uoɹI", "golem_material.modulargolems.netherite": "ǝʇıɹǝɥʇǝN", "golem_material.modulargolems.sculk": "ʞןnɔS", + "golem_material.mowziesmobs.wroughtnaut": "ʇnɐuʇɥbnoɹM", + "golem_material.tconstruct.amethyst_bronze": "ǝzuoɹᗺ ʇsʎɥʇǝɯⱯ", + "golem_material.tconstruct.cobalt": "ʇןɐqoƆ", + "golem_material.tconstruct.hepatizon": "uozıʇɐdǝH", + "golem_material.tconstruct.manyullyn": "uʎןןnʎuɐW", + "golem_material.tconstruct.rose_gold": "pןo⅁ ǝsoᴚ", "golem_material.twilightforest.fiery": "ʎɹǝıℲ", "golem_material.twilightforest.ironwood": "pooʍuoɹI", "golem_material.twilightforest.knightmetal": "ןɐʇǝɯʇɥbıuʞ", @@ -97,22 +143,36 @@ "golem_type.modulargolems.humanoid_golem": "ɯǝןo⅁ pıouɐɯnH", "golem_type.modulargolems.metal_golem": "ɯǝןo⅁ ןɐʇǝW", "item.modulargolems.ancient_remnant_sandstorm": "ǝpɐɹbd∩ ʇuɐuɯǝᴚ ʇuǝıɔuⱯ", + "item.modulargolems.apocalyptium_boots": "sʇooᗺ ɯnıʇdʎןɐɔodⱯ", + "item.modulargolems.apocalyptium_chestplate": "ǝʇɐןdʇsǝɥƆ ɯnıʇdʎןɐɔodⱯ", + "item.modulargolems.apocalyptium_helmet": "ʇǝɯןǝH ɯnıʇdʎןɐɔodⱯ", + "item.modulargolems.apocalyptium_shinguard": "pɹɐnbuıɥS ɯnıʇdʎןɐɔodⱯ", + "item.modulargolems.apostle": "ǝpɐɹbd∩ uoısuǝɔsⱯ ǝןʇsodⱯ", "item.modulargolems.attack_high": "Λ ǝpɐɹbd∩ ʞɔɐʇʇⱯ", + "item.modulargolems.azure_cube": "ǝqnƆ ǝɹnzⱯ", + "item.modulargolems.barbaric_vanguard_boots": "sʇooᗺ pɹɐnbuɐΛ ɔıɹɐqɹɐᗺ", "item.modulargolems.barbaric_vanguard_chestplate": "ǝʇɐןdʇsǝɥƆ pɹɐnbuɐΛ ɔıɹɐqɹɐᗺ", "item.modulargolems.barbaric_vanguard_helmet": "ʇǝɯןǝH pɹɐnbuɐΛ ɔıɹɐqɹɐᗺ", "item.modulargolems.barbaric_vanguard_shinguard": "pɹɐnbuıɥS pɹɐnbuɐΛ ɔıɹɐqɹɐᗺ", + "item.modulargolems.beacon_boots": "sʇooᗺ uoɔɐǝᗺ", + "item.modulargolems.beacon_cannon": "uouuɐƆ uoɔɐǝᗺ", "item.modulargolems.bell": "ǝpɐɹbd∩ ןןǝᗺ", "item.modulargolems.black_config_card": "pɹɐƆ bıɟuoƆ ʞɔɐןᗺ", "item.modulargolems.blue_config_card": "pɹɐƆ bıɟuoƆ ǝnןᗺ", "item.modulargolems.brown_config_card": "pɹɐƆ bıɟuoƆ uʍoɹᗺ", + "item.modulargolems.candy_construct": "ʇɔnɹʇsuoƆ ʎpuɐƆ", + "item.modulargolems.candy_mixture": "ǝɹnʇxıW ʎpuɐƆ", "item.modulargolems.carminite": "ǝpɐɹbd∩ ǝʇıuıɯɹɐƆ", "item.modulargolems.cauldron": "uoɹpןnɐƆ :ǝpɐɹbd∩ ɐʇǝW", "item.modulargolems.cleanse": "ǝsuɐǝןƆ :ǝpɐɹbd∩ uoıʇoԀ", + "item.modulargolems.cloud_cube": "ǝqnƆ pnoןƆ", "item.modulargolems.coating": "ǝpɐɹbd∩ ɔuıZ", "item.modulargolems.command_wand": "puɐM puɐɯɯoƆ", "item.modulargolems.curse": "ǝsɹnƆ :ǝpɐɹbd∩ uoıʇoԀ", "item.modulargolems.cyan_config_card": "pɹɐƆ bıɟuoƆ uɐʎƆ", "item.modulargolems.diamond": "ǝpɐɹbd∩ puoɯɐıᗡ", + "item.modulargolems.diamond_dog_golem_armor": "ɹoɯɹⱯ ɯǝןo⅁ boᗡ puoɯɐıᗡ", + "item.modulargolems.diamond_expansion_template": "ǝʇɐןdɯǝ⟘ uoısuɐdxƎ puoɯɐıᗡ", "item.modulargolems.diamond_golem_axe": "ǝxⱯ ɯǝןo⅁ puoɯɐıᗡ", "item.modulargolems.diamond_golem_spear": "ɹɐǝdS ɯǝןo⅁ puoɯɐıᗡ", "item.modulargolems.diamond_golem_sword": "pɹoʍS ɯǝןo⅁ puoɯɐıᗡ", @@ -120,24 +180,43 @@ "item.modulargolems.dog_golem_holder": "ɹǝpןoH ɯǝןo⅁ boᗡ", "item.modulargolems.dog_golem_legs": "sbǝꞀ ɯǝןo⅁ boᗡ", "item.modulargolems.dummy_furnace": "ǝɔɐuɹnℲ ʎɯɯnᗡ", + "item.modulargolems.dummy_iron_consumer": "ɹǝɯnsuoƆ uoɹI ʎɯɯnᗡ", + "item.modulargolems.dummy_uranium_consumer": "ɹǝɯnsuoƆ ɯnıuɐɹ∩ ʎɯɯnᗡ", "item.modulargolems.emerald": "ǝpɐɹbd∩ pןɐɹǝɯƎ", "item.modulargolems.empty_upgrade": "ǝpɐɹbd∩ ʎʇdɯƎ", "item.modulargolems.enchanted_gold": "ǝpɐɹbd∩ ǝןddⱯ uǝpןo⅁ pǝʇuɐɥɔuƎ", "item.modulargolems.ender_guardian_void_rune": "ǝpɐɹbd∩ uɐıpɹɐn⅁ ɹǝpuƎ", "item.modulargolems.ender_sight": "ǝpɐɹbd∩ ʇɥbıS ɹǝpuƎ", + "item.modulargolems.etherite": "ǝpɐɹbd∩ buıʇɐןԀ ǝʇıɹǝɥʇƎ", "item.modulargolems.fiery": "ǝpɐɹbd∩ ʎɹǝıℲ", + "item.modulargolems.fiery_boots": "sʇooᗺ ʎɹǝıℲ", + "item.modulargolems.fiery_chestplate": "ǝʇɐןdʇsǝɥƆ ʎɹǝıℲ", + "item.modulargolems.fiery_golem_axe": "ǝxⱯ ɯǝןo⅁ ʎɹǝıℲ", + "item.modulargolems.fiery_golem_spear": "ɹɐǝdS ɯǝןo⅁ ʎɹǝıℲ", + "item.modulargolems.fiery_golem_sword": "pɹoʍS ɯǝןo⅁ ʎɹǝıℲ", + "item.modulargolems.fiery_helmet": "ʇǝɯןǝH ʎɹǝıℲ", + "item.modulargolems.fiery_shinguard": "pɹɐnbuıɥS ʎɹǝıℲ", + "item.modulargolems.fire_blast": "ʇsɐןᗺ ǝɹıℲ :ǝpɐɹbd∩ ǝןʇsodⱯ", "item.modulargolems.fire_immune": "ǝpɐɹbd∩ ǝunɯɯI ǝɹıℲ", + "item.modulargolems.fire_tornado": "opɐuɹo⟘ ǝɹıℲ :ǝpɐɹbd∩ ǝןʇsodⱯ", + "item.modulargolems.flame_thrower": "ɹǝʍoɹɥ⟘ ǝɯɐןℲ", "item.modulargolems.float": "ǝpɐɹbd∩ ʇɐoןℲ", "item.modulargolems.force_field": "ǝpɐɹbd∩ ɹoɯɹⱯ ɹǝɥʇıM", "item.modulargolems.freezing": "buızǝǝɹℲ :ǝpɐɹbd∩ uoıʇoԀ", "item.modulargolems.gold": "ǝpɐɹbd∩ ǝןddⱯ uǝpןo⅁", - "item.modulargolems.golem_beacon_level_1": "Ɩ ןǝʌǝꞀ uoɔɐǝᗺ ɯǝןo⅁", - "item.modulargolems.golem_beacon_level_2": "ᄅ ןǝʌǝꞀ uoɔɐǝᗺ ɯǝןo⅁", - "item.modulargolems.golem_beacon_level_3": "Ɛ ןǝʌǝꞀ uoɔɐǝᗺ ɯǝןo⅁", - "item.modulargolems.golem_beacon_level_4": "ㄣ ןǝʌǝꞀ uoɔɐǝᗺ ɯǝןo⅁", - "item.modulargolems.golem_beacon_level_5": "ϛ ןǝʌǝꞀ uoɔɐǝᗺ ɯǝןo⅁", + "item.modulargolems.gold_dog_golem_armor": "ɹoɯɹⱯ ɯǝןo⅁ boᗡ pןo⅁", + "item.modulargolems.golem_facade": "ǝpɐɔɐℲ ɯǝןo⅁", + "item.modulargolems.golem_slicing_axe": "ǝxⱯ buıɔıןS ɯǝןo⅁", "item.modulargolems.gray_config_card": "pɹɐƆ bıɟuoƆ ʎɐɹ⅁", "item.modulargolems.green_config_card": "pɹɐƆ bıɟuoƆ uǝǝɹ⅁", + "item.modulargolems.harbinger_chestplate": "ǝʇɐןdʇsǝɥƆ ɹǝbuıqɹɐH", + "item.modulargolems.harbinger_helmet": "ʇǝɯןǝH ɹǝbuıqɹɐH", + "item.modulargolems.harbinger_shinguard": "pɹɐnbuıɥS ɹǝbuıqɹɐH", + "item.modulargolems.harbinger_upgrade_template": "ǝʇɐןdɯǝ⟘ ǝpɐɹbd∩ ɹǝbuıqɹɐH", + "item.modulargolems.hell_blast": "ʇsɐןᗺ ןןǝH :ǝpɐɹbd∩ ǝןʇsodⱯ", + "item.modulargolems.hell_bolt": "ʇןoᗺ ןןǝH :ǝpɐɹbd∩ ǝןʇsodⱯ", + "item.modulargolems.hell_cloud": "pnoןƆ ןןǝH :ǝpɐɹbd∩ ǝןʇsodⱯ", + "item.modulargolems.hostile_wand": "puɐM ǝןıʇsoH", "item.modulargolems.hostility_core": "ǝɹoƆ ʎʇıןıʇsoH", "item.modulargolems.hostility_potion": "uoıʇoԀ :ǝpɐɹbd∩ ʎʇıןıʇsoH", "item.modulargolems.hostility_protection": "uoıʇɔǝʇoɹԀ :ǝpɐɹbd∩ ʎʇıןıʇsoH", @@ -149,6 +228,9 @@ "item.modulargolems.humanoid_golem_body": "ʎpoᗺ ɯǝןo⅁ pıouɐɯnH", "item.modulargolems.humanoid_golem_holder": "ɹǝpןoH ɯǝןo⅁ pıouɐɯnH", "item.modulargolems.humanoid_golem_legs": "sbǝꞀ ɯǝןo⅁ pıouɐɯnH", + "item.modulargolems.ignis_chestplate": "ǝʇɐןdʇsǝɥƆ ɯǝןo⅁ ɯnıʇıubI", + "item.modulargolems.ignis_helmet": "ʇǝɯןǝH ɯǝןo⅁ ɯnıʇıubI", + "item.modulargolems.ignis_shinguard": "pɹɐnbuıɥS ɯǝןo⅁ ɯnıʇıubI", "item.modulargolems.incarcerate": "uoıʇɐɹǝɔɹɐɔuI :ǝpɐɹbd∩ uoıʇoԀ", "item.modulargolems.incomplete_dog_golem_body": "ʎpoᗺ ɯǝןo⅁ boᗡ ǝʇǝןdɯoɔuI", "item.modulargolems.incomplete_dog_golem_legs": "sbǝꞀ ɯǝןo⅁ boᗡ ǝʇǝןdɯoɔuI", @@ -158,28 +240,62 @@ "item.modulargolems.incomplete_metal_golem_arm": "ɯɹⱯ ɯǝןo⅁ ןɐʇǝW ǝʇǝןdɯoɔuI", "item.modulargolems.incomplete_metal_golem_body": "ʎpoᗺ ɯǝןo⅁ ןɐʇǝW ǝʇǝןdɯoɔuI", "item.modulargolems.incomplete_metal_golem_legs": "sbǝꞀ ɯǝןo⅁ ןɐʇǝW ǝʇǝןdɯoɔuI", + "item.modulargolems.iron_dog_golem_armor": "ɹoɯɹⱯ ɯǝןo⅁ boᗡ uoɹI", "item.modulargolems.iron_golem_axe": "ǝxⱯ ɯǝןo⅁ uoɹI", "item.modulargolems.iron_golem_spear": "ɹɐǝdS ɯǝןo⅁ uoɹI", "item.modulargolems.iron_golem_sword": "pɹoʍS ɯǝןo⅁ uoɹI", + "item.modulargolems.iron_mecha_bow": "ʍoᗺ ɐɥɔǝW uoɹI", "item.modulargolems.ironwood": "ǝpɐɹbd∩ pooʍuoɹI", + "item.modulargolems.ironwood_boots": "sʇooᗺ pooʍuoɹI", + "item.modulargolems.ironwood_chestplate": "ǝʇɐןdʇsǝɥƆ pooʍuoɹI", + "item.modulargolems.ironwood_golem_axe": "ǝxⱯ ɯǝןo⅁ pooʍuoɹI", + "item.modulargolems.ironwood_golem_spear": "ɹɐǝdS ɯǝןo⅁ pooʍuoɹI", + "item.modulargolems.ironwood_golem_sword": "pɹoʍS ɯǝןo⅁ pooʍuoɹI", + "item.modulargolems.ironwood_helmet": "ʇǝɯןǝH pooʍuoɹI", + "item.modulargolems.ironwood_shinguard": "pɹɐnbuıɥS pooʍuoɹI", "item.modulargolems.knightmetal": "ǝpɐɹbd∩ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_boots": "sʇooᗺ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_chestplate": "ǝʇɐןdʇsǝɥƆ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_golem_axe": "ǝxⱯ ɯǝןo⅁ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_golem_spear": "ɹɐǝdS ɯǝןo⅁ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_golem_sword": "pɹoʍS ɯǝןo⅁ ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_helmet": "ʇǝɯןǝH ןɐʇǝɯʇɥbıuʞ", + "item.modulargolems.knightmetal_shinguard": "pɹɐnbuıɥS ןɐʇǝɯʇɥbıuʞ", "item.modulargolems.leviathan_blast_portal": "ǝpɐɹbd∩ uɐɥʇɐıʌǝꞀ", "item.modulargolems.light_blue_config_card": "pɹɐƆ bıɟuoƆ ǝnןᗺ ʇɥbıꞀ", "item.modulargolems.light_gray_config_card": "pɹɐƆ bıɟuoƆ ʎɐɹ⅁ ʇɥbıꞀ", "item.modulargolems.lime_config_card": "pɹɐƆ bıɟuoƆ ǝɯıꞀ", "item.modulargolems.magenta_config_card": "pɹɐƆ bıɟuoƆ ɐʇuǝbɐW", + "item.modulargolems.magnetic_alloy": "ʎoןןⱯ ɔıʇǝubɐW", + "item.modulargolems.magnetic_construct": "ʇɔnɹʇsuoƆ ɔıʇǝubɐW", + "item.modulargolems.maledictus_chestplate": "ǝʇɐןdʇsǝɥƆ ɯǝןo⅁ ɯnısɹnƆ", + "item.modulargolems.maledictus_helmet": "ʇǝɯןǝH ɯǝןo⅁ ɯnısɹnƆ", + "item.modulargolems.maledictus_shinguard": "pɹɐnbuıɥS ɯǝןo⅁ ɯnısɹnƆ", + "item.modulargolems.mechanical_arm": "ɯɹⱯ ɹıɐdǝᴚ ɔıuɐɥɔǝW", "item.modulargolems.metal_golem_arm": "ɯɹⱯ ɯǝןo⅁ ןɐʇǝW", "item.modulargolems.metal_golem_body": "ʎpoᗺ ɯǝןo⅁ ןɐʇǝW", "item.modulargolems.metal_golem_holder": "ɹǝpןoH ɯǝןo⅁ ןɐʇǝW", "item.modulargolems.metal_golem_legs": "sbǝꞀ ɯǝןo⅁ ןɐʇǝW", "item.modulargolems.metal_golem_template": "ǝʇɐןdɯǝ⟘ ɯǝןo⅁ ןɐʇǝW", + "item.modulargolems.monstrosity_chestplate": "ǝʇɐןdʇsǝɥƆ ʎʇısoɹʇsuoW", + "item.modulargolems.monstrosity_helmet": "ʇǝɯןǝH ʎʇısoɹʇsuoW", + "item.modulargolems.monstrosity_shinguard": "pɹɐnbuıɥS ʎʇısoɹʇsuoW", + "item.modulargolems.monstrosity_upgrade_template": "ǝʇɐןdɯǝ⟘ ǝpɐɹbd∩ ʎʇısoɹʇsuoW", "item.modulargolems.mount_upgrade": "ǝpɐɹbd∩ ʇunoW", "item.modulargolems.naga": "ǝpɐɹbd∩ ɐbɐN", + "item.modulargolems.naga_boots": "sʇooᗺ ɐbɐN", + "item.modulargolems.naga_chestplate": "ǝʇɐןdʇsǝɥƆ ɐbɐN", + "item.modulargolems.naga_helmet": "ʇǝɯןǝH ɐbɐN", + "item.modulargolems.naga_shinguard": "pɹɐnbuıɥS ɐbɐN", "item.modulargolems.netherite": "ǝpɐɹbd∩ ǝʇıɹǝɥʇǝN", + "item.modulargolems.netherite_dog_golem_armor": "ɹoɯɹⱯ ɯǝןo⅁ boᗡ ǝʇıɹǝɥʇǝN", + "item.modulargolems.netherite_expansion_template": "ǝʇɐןdɯǝ⟘ uoısuɐdxƎ ǝʇıɹǝɥʇǝN", "item.modulargolems.netherite_golem_axe": "ǝxⱯ ɯǝןo⅁ ǝʇıɹǝɥʇǝN", "item.modulargolems.netherite_golem_spear": "ɹɐǝdS ɯǝןo⅁ ǝʇıɹǝɥʇǝN", "item.modulargolems.netherite_golem_sword": "pɹoʍS ɯǝןo⅁ ǝʇıɹǝɥʇǝN", + "item.modulargolems.netherite_mecha_bow": "ʍoᗺ ɐɥɔǝW ǝʇıɹǝɥʇǝN", "item.modulargolems.netherite_monstrosity_earthquake": "ǝpɐɹbd∩ ʎʇısoɹʇsuoW ǝʇıɹǝɥʇǝN", + "item.modulargolems.nuclear_construct": "ʇɔnɹʇsuoƆ ɹɐǝןɔnN", "item.modulargolems.omnipotent_wand_command": "puɐɯɯoƆ :puɐM ʇuǝʇodıuɯO", "item.modulargolems.omnipotent_wand_retrieval": "ןɐʌǝıɹʇǝᴚ :puɐM ʇuǝʇodıuɯO", "item.modulargolems.omnipotent_wand_rider": "ɹǝpıᴚ :puɐM ʇuǝʇodıuɯO", @@ -202,14 +318,22 @@ "item.modulargolems.roman_guard_chestplate": "ǝʇɐןdʇsǝɥƆ pɹɐn⅁ uɐɯoᴚ", "item.modulargolems.roman_guard_helmet": "ʇǝɯןǝH pɹɐn⅁ uɐɯoᴚ", "item.modulargolems.roman_guard_shinguard": "pɹɐnbuıɥS pɹɐn⅁ uɐɯoᴚ", + "item.modulargolems.scylla_lightning_upgrade": "ǝpɐɹbd∩ ɐןןʎɔS", "item.modulargolems.size_upgrade": "ǝpɐɹbd∩ ǝzıS", "item.modulargolems.slow": "ssǝuʍoןS :ǝpɐɹbd∩ uoıʇoԀ", + "item.modulargolems.sonic_cannon": "uouuɐƆ ɔıuoS", + "item.modulargolems.soul_collection": "ǝpɐɹbd∩ uoıʇɔǝןןoƆ ןnoS", "item.modulargolems.soul_flame": "ǝɯɐןℲ ןnoS :ǝpɐɹbd∩ uoıʇoԀ", "item.modulargolems.speed": "ǝpɐɹbd∩ pǝǝdS", "item.modulargolems.speed_high": "Λ ǝpɐɹbd∩ pǝǝdS", "item.modulargolems.sponge": "ǝpɐɹbd∩ ǝbuodS", "item.modulargolems.squad_wand": "puɐM pɐnbS", "item.modulargolems.steeleaf": "ǝpɐɹbd∩ ɟɐǝןǝǝʇS", + "item.modulargolems.steeleaf_golem_axe": "ǝxⱯ ɯǝןo⅁ ɟɐǝןǝǝʇS", + "item.modulargolems.steeleaf_golem_spear": "ɹɐǝdS ɯǝןo⅁ ɟɐǝןǝǝʇS", + "item.modulargolems.steeleaf_golem_sword": "pɹoʍS ɯǝןo⅁ ɟɐǝןǝǝʇS", + "item.modulargolems.stellar_apocalypse": "ǝsdʎןɐɔodⱯ ɹɐןןǝʇS", + "item.modulargolems.storm_construct": "ʇɔnɹʇsuoƆ ɯɹoʇS", "item.modulargolems.summon_wand": "puɐM uoɯɯnS", "item.modulargolems.swim": "ǝpɐɹbd∩ ɯıʍS", "item.modulargolems.talented": "pǝʇuǝןɐ⟘ :ǝpɐɹbd∩ ɐʇǝW", @@ -218,18 +342,46 @@ "item.modulargolems.target_filter_type": "ǝdʎ⟘ ʎʇıʇuƎ :ɹǝʇןıℲ ʇǝbɹɐ⟘", "item.modulargolems.target_filter_uuid": "ᗡI∩∩ ʎʇıʇuƎ :ɹǝʇןıℲ ʇǝbɹɐ⟘", "item.modulargolems.teleport": "ǝpɐɹbd∩ ʇɹodǝןǝ⟘", + "item.modulargolems.the_abhorrent": "ʇuǝɹɹoɥqⱯ ǝɥ⟘ :ǝןʇı⟘ ǝןʇsodⱯ", + "item.modulargolems.the_atrocious": "snoıɔoɹʇⱯ ǝɥ⟘ :ǝןʇı⟘ ǝןʇsodⱯ", + "item.modulargolems.the_profane": "ǝuɐɟoɹԀ ǝɥ⟘ :ǝןʇı⟘ ǝןʇsodⱯ", + "item.modulargolems.the_terrible": "ǝןqıɹɹǝ⟘ ǝɥ⟘ :ǝןʇı⟘ ǝןʇsodⱯ", "item.modulargolems.thunder_immune": "ǝpɐɹbd∩ ǝunɯɯI ɹǝpunɥ⟘", + "item.modulargolems.thunderstorm": "ǝpɐɹbd∩ ɯɹoʇsɹǝpunɥ⟘", + "item.modulargolems.void_construct": "ʇɔnɹʇsuoƆ pıoΛ", + "item.modulargolems.void_cube": "ǝqnƆ pıoΛ", "item.modulargolems.weak": "ssǝuʞɐǝM :ǝpɐɹbd∩ uoıʇoԀ", "item.modulargolems.white_config_card": "pɹɐƆ bıɟuoƆ ǝʇıɥM", + "item.modulargolems.wind_spirit_boots": "sʇooᗺ ʇıɹıdS puıM", "item.modulargolems.wind_spirit_chestplate": "ǝʇɐןdʇsǝɥƆ ʇıɹıdS puıM", "item.modulargolems.wind_spirit_helmet": "ʇǝɯןǝH ʇıɹıdS puıM", "item.modulargolems.wind_spirit_shinguard": "pɹɐnbuıɥS ʇıɹıdS puıM", "item.modulargolems.wither": "ɹǝɥʇıM :ǝpɐɹbd∩ uoıʇoԀ", + "item.modulargolems.wroughtnaut": "ǝpɐɹbd∩ buıɯɯɐןS ʇnɐuʇɥbnoɹM", + "item.modulargolems.wroughtnaut_ingot": "ʇobuI ʇnɐuʇɥbnoɹM", "item.modulargolems.yellow_config_card": "pɹɐƆ bıɟuoƆ ʍoןןǝʎ", - "itemGroup.l2library.golems": "sɯǝןo⅁ ɹɐןnpoW", + "itemGroup.l2library.golem_items": "sɯǝʇI - sɯǝןo⅁ ɹɐןnpoW", + "itemGroup.l2library.golem_upgrades": "sǝpɐɹbd∩ - sɯǝןo⅁ ɹɐןnpoW", + "itemGroup.l2library.golems": "sʇɹɐԀ & sɯǝןo⅁ - sɯǝןo⅁ ɹɐןnpoW", + "modifier.modulargolems.add_slot": "ʇoןS ppⱯ", + "modifier.modulargolems.add_slot.desc": "ʇoןs ǝpɐɹbdn ɯǝןob %s ppⱯ", + "modifier.modulargolems.add_slot_diamond": "uoısuɐdxƎ puoɯɐıᗡ", + "modifier.modulargolems.add_slot_diamond.desc": "˙ɯǝןob ɹǝd ǝɔuo ʎןuO ˙ʇoןs ǝpɐɹbdn Ɩ ppⱯ", + "modifier.modulargolems.add_slot_netherite": "uoısuɐdxƎ ǝʇıɹǝɥʇǝN", + "modifier.modulargolems.add_slot_netherite.desc": "˙ɯǝןob ɹǝd ǝɔuo ʎןuO ˙ʇoןs ǝpɐɹbdn Ɩ ppⱯ", + "modifier.modulargolems.ancient_anchor": "ɹoɥɔuⱯ ʇuǝıɔuⱯ", + "modifier.modulargolems.ancient_anchor.desc": "sʇǝbɹɐʇ unʇs puɐ 'sǝʌɐʍʞɔoɥs ǝsnɐɔ 'ʞɔɐʇʇɐ ןןɐɟ ןɐǝᗡ", + "modifier.modulargolems.ancient_remnant_reformation": "uoıʇɐɯɹoɟǝᴚ ʇuɐuɯǝᴚ ʇuǝıɔuⱯ", + "modifier.modulargolems.ancient_remnant_reformation.desc": "˙ʇobuı ɥʇıʍ pǝɹoʇsǝɹ ǝq uoıʇdɯnsuoƆ ˙ɥʇןɐǝɥ xɐɯ ɟo ʇsoɔ ǝɥʇ ʇɐ ɟןǝsʇı ɹıɐdǝɹ oʇ ןɐıɹǝʇɐɯ ʎpoq sǝɯnsuoƆ :ǝbɹoɟǝᴚ", "modifier.modulargolems.ancient_remnant_sandstorm": "ɯɹoʇspuɐS ʇuɐuɯǝᴚ ʇuǝıɔuⱯ", - "modifier.modulargolems.ancient_remnant_sandstorm.desc": "uoıʇısod ʇǝbɹɐʇ ʇɐ ɯɹoʇspuɐs uoɯɯns 'ʎɐʍɐɹɐɟ sı ʇǝbɹɐʇ uǝɥM", + "modifier.modulargolems.ancient_remnant_sandstorm.desc": "ʇɹǝsǝᗡ ɟo ǝsɹnƆ ɥʇıʍ pǝʇɔıןɟuı ʇǝbɹɐʇ oʇ ǝbɐɯɐp ǝsɐǝɹɔuI ˙sʇǝbɹɐʇ ǝןdıʇןnɯ sʞɔɐʇʇⱯ ˙uoıʇısod ʇǝbɹɐʇ ʇɐ ɯɹoʇspuɐs uoɯɯnS", + "modifier.modulargolems.apostle": "ǝןʇsodⱯ", + "modifier.modulargolems.apostle.desc": "ʇoןs ǝɯnsuoɔ ʇou ןןıʍ sǝpɐɹbd∩ ǝןʇsodⱯ", + "modifier.modulargolems.armor_penetration": "uoıʇɐɹʇǝuǝԀ ɹoɯɹⱯ", + "modifier.modulargolems.armor_penetration.desc": "spןǝıɥs puɐ ɹoɯɹɐ ssɐdʎq oʇ ǝɔuɐɥɔ %s%% sɐɥ ʞɔɐʇʇⱯ", "modifier.modulargolems.armor_up": "d∩ ɹoɯɹⱯ", + "modifier.modulargolems.atomic_fueling": "buıןǝnℲ ɔıɯoʇⱯ", + "modifier.modulargolems.atomic_fueling.desc": "˙ʇɔǝɟɟǝ pǝʇɐıpɐɹɹı oʇ ǝunɯɯı ɯǝןob sǝʞɐW ˙spuoɔǝs %s ɹoɟ %s ʎq pǝǝds puɐ ʞɔɐʇʇɐ ʇsooq puɐ 'ԀH %s ןɐǝɥ oʇ ]%s[ ǝɯnsuoƆ", "modifier.modulargolems.bell": "ןןǝᗺ", "modifier.modulargolems.bell.desc": "˙dn ɯǝɥʇ ʇɥbıן puɐ sǝıɯǝuǝ ןןɐ buıʇɔɐɹʇʇɐ 'ןןǝq sʇı buıɹ ןןıʍ ʇı 'ʞɔɐʇʇɐ oʇ sʇuɐʍ ɯǝןob ǝɥʇ uǝɥM", "modifier.modulargolems.blazing": "buızɐןᗺ", @@ -239,6 +391,8 @@ "modifier.modulargolems.cauldron": "uoɹpןnɐƆ", "modifier.modulargolems.cauldron.desc": "˙sʇoןs ǝpɐɹbdn ǝɯnsuoɔ ɹǝbuoן ou ןןıʍ sǝpɐɹbdn uoıʇod pǝʇɐǝdǝᴚ", "modifier.modulargolems.cleanse": "ǝsuɐǝןƆ :ǝpɐɹbd∩ uoıʇoԀ", + "modifier.modulargolems.cloud_forming": "buıɯɹoℲ pnoןƆ", + "modifier.modulargolems.cloud_forming.desc": "ɥʇןɐǝɥ ɹǝɥbıɥ ɥʇıʍ sʇǝbɹɐʇ oʇ ǝbɐɯɐp ǝɹoɯ ןɐǝᗡ", "modifier.modulargolems.coating": "buıʇɐoƆ", "modifier.modulargolems.coating.desc": "%s ʎq uǝʞɐʇ ǝbɐɯɐp ǝɔnpǝᴚ", "modifier.modulargolems.conduit": "ʇınpuoƆ", @@ -247,48 +401,95 @@ "modifier.modulargolems.damage_cap": "dɐƆ ǝbɐɯɐᗡ", "modifier.modulargolems.damage_cap.desc": "˙ɥʇןɐǝɥ xɐɯ ɟo %s%% uıɥʇıʍ pǝʇıɯıן ǝɹɐ uǝʞɐʇ ǝbɐɯɐᗡ", "modifier.modulargolems.damage_up": "d∩ ǝbɐɯɐᗡ", + "modifier.modulargolems.dungeon_absorption": "uoıʇdɹosqⱯ uoǝbunᗡ", + "modifier.modulargolems.dungeon_absorption.desc": "ʇןɐǝp ǝbɐɯɐp ɟo %s%% ɹoɟ ןɐǝɥ sʞɔɐʇʇɐ ʇɔǝɹıᗡ", + "modifier.modulargolems.dungeon_link": "ʞuıꞀ uoǝbunᗡ", + "modifier.modulargolems.dungeon_link.desc": "ɹǝʎɐןd ǝɥʇ oʇ ʇunoɯɐ ǝɥʇ ɟo %s%% ǝɹoʇsǝɹ osןɐ sʇɔǝɟɟǝ buıןɐǝɥ ɹıɐdǝɹ-uoN", + "modifier.modulargolems.dynamic_reduction": "uoıʇɔnpǝᴚ ɔıɯɐuʎᗡ", + "modifier.modulargolems.dynamic_reduction.desc": "ǝɯıʇ ɟo poıɹǝd ɹǝd ɥʇןɐǝɥ xɐɯ %0ᄅ ɟo ǝbɐɯɐp ǝʞɐʇ ʎןuo uɐɔ ɯǝןo⅁", "modifier.modulargolems.emerald": "pןɐɹǝɯƎ", "modifier.modulargolems.emerald.desc": "sɹǝbɐןןı oʇ ǝbɐɯɐp ǝɹoɯ %s%% ןɐǝᗡ", "modifier.modulargolems.ender_guardian_void_rune": "ǝunᴚ pıoΛ uɐıpɹɐn⅁ ɹǝpuƎ", - "modifier.modulargolems.ender_guardian_void_rune.desc": "ʇǝbɹɐʇ pɹɐʍoʇ ǝunɹ pıoʌ uoɯɯnS", + "modifier.modulargolems.ender_guardian_void_rune.desc": "sʇǝbɹɐʇ ǝןdıʇןnɯ pɹɐʍoʇ ǝunɹ pıoʌ puɐ xǝʇɹoʌ uoɯɯnS", "modifier.modulargolems.ender_sight": "ʇɥbıS ɹǝpuƎ", "modifier.modulargolems.ender_sight.desc": "˙sbuıןıǝɔ puɐ ןןɐʍ ɥbnoɹɥʇ ǝǝs uɐɔ ɯǝןo⅁", + "modifier.modulargolems.etherite_plating": "buıʇɐןԀ ǝʇıɹǝɥʇƎ", + "modifier.modulargolems.etherite_plating.desc1": ":pǝpıʌoɹd ǝɹɐ sʇɔǝɟɟǝ buıʍoןןoɟ ǝɥʇ 'ןǝʌǝן ǝɥʇ oʇ buıpɹoɔɔⱯ", + "modifier.modulargolems.etherite_plating.desc2": "ǝbɐɯɐp ǝןıʇɔǝظoɹd oʇ ǝunɯɯI -", + "modifier.modulargolems.etherite_plating.desc3": "sɟɟnqǝp ןɐuoıʇuǝʌuoɔ oʇ ǝunɯɯI -", + "modifier.modulargolems.etherite_plating.desc4": "ǝbɐɯɐp ןɐʇuǝɯuoɹıʌuǝ oʇ ǝunɯɯI -", + "modifier.modulargolems.etherite_plating.desc5": "ɹıɐdǝɹ-ɟןǝs ɔıpoıɹǝԀ -", "modifier.modulargolems.explosion_resistant": "ʇuɐʇsısǝᴚ uoısoןdxƎ", "modifier.modulargolems.explosion_resistant.desc": "˙sʞɔoןq ʞɐǝɹq ʇou ןןıʍ puɐ 'ןɐuıbıɹo ɟo %s%% oʇ pǝɔnpǝɹ uǝʞɐʇ ǝbɐɯɐp uoısoןdxƎ", + "modifier.modulargolems.fallen_attack": "ʞɔɐʇʇⱯ uǝןןɐℲ", "modifier.modulargolems.fiery": "ʎɹǝıℲ", - "modifier.modulargolems.fiery.desc": "ǝɹıɟ oʇ ǝunɯɯı ʇou sqoɯ oʇ ǝbɐɯɐp ǝɹıɟ %s%% ןɐǝᗡ", + "modifier.modulargolems.fiery.desc": "ǝɹıɟ oʇ ǝunɯɯı ʇou sqoɯ oʇ ǝbɐɯɐp %s%%+ ןɐǝᗡ", + "modifier.modulargolems.fire_blast": "ʇsɐןᗺ ǝɹıℲ", + "modifier.modulargolems.fire_blast.desc": "ʇuoɹɟ ǝɥʇ uı dɐɹ⟘ ʇsɐןᗺ ǝɹıℲ uoɯɯnS", + "modifier.modulargolems.fire_dragonsteel_attack": "ʞɔɐʇʇⱯ ןǝǝʇsuobɐɹᗡ ǝɹıℲ", + "modifier.modulargolems.fire_dragonsteel_attack.desc": "ʇǝbɹɐʇ ʞɔɐqʞɔouʞ puɐ ǝʇıubI", "modifier.modulargolems.fire_immune": "ǝunɯɯI ǝɹıℲ", "modifier.modulargolems.fire_immune.desc": "˙ɐʌɐꞀ uı sʇɐoןℲ ˙ǝbɐɯɐp ǝɹıɟ oʇ ǝunɯɯI", + "modifier.modulargolems.fire_tornado": "opɐuɹo⟘ ǝɹıℲ", + "modifier.modulargolems.fire_tornado.desc": "uoıʇısod ʇǝbɹɐʇ pɹɐʍoʇ dɐɹ⟘ opɐuɹo⟘ ǝɹıℲ uoɯɯnS", "modifier.modulargolems.float": "ʇɐoןℲ", "modifier.modulargolems.float.desc": "buıʞuıs ɟo pɐǝʇsuı ɐʌɐן puɐ ɹǝʇɐʍ uı sʇɐoןɟ ɯǝןo⅁", + "modifier.modulargolems.free_movement": "ʇuǝɯǝʌoW ǝǝɹℲ", + "modifier.modulargolems.free_movement.desc": "ןǝɯɐɹɐɔ ɹo sʞɔoןq ʎq ʞɔnʇs ǝq ʇou ןןıʍ ɯǝןo⅁", "modifier.modulargolems.freezing": "buızǝǝɹℲ :ǝpɐɹbd∩ uoıʇoԀ", "modifier.modulargolems.freezing.desc": "˙ǝbɐɯɐp buızǝǝɹɟ oʇ ǝunɯɯI ˙sʇɔǝɟɟǝ ʇuǝɯʇuɐɥɔuǝ uɹoɥ⟘ ǝɔI puɐ ǝpɐןᗺ ǝɔI ʇǝ⅁", + "modifier.modulargolems.gum_shooter": "ɹǝʇooɥS ɯn⅁", + "modifier.modulargolems.gum_shooter.desc": "ǝbɐɯɐp %s buıןɐǝp sʇǝbɹɐʇ ʇɐ sןןɐqɯnb ʇooɥS", "modifier.modulargolems.harbinger_death_beam": "ɯɐǝᗺ ɥʇɐǝᗡ ɹǝbuıqɹɐH", "modifier.modulargolems.harbinger_death_beam.desc": "˙ʇǝbɹɐʇ pɹɐʍoʇ ɯɐǝᗺ ɥʇɐǝᗡ ʇooɥs 'ʎɐʍɐɹɐɟ sı ʇǝbɹɐʇ uǝɥM", "modifier.modulargolems.harbinger_missile": "ǝןıssıW ɹǝbuıqɹɐH", "modifier.modulargolems.harbinger_missile.desc": "˙ʇǝbɹɐʇ pɹɐʍoʇ ǝןıssıW buıɯoH ʇooɥs 'ʎɐʍɐɹɐɟ sı ʇǝbɹɐʇ uǝɥM", + "modifier.modulargolems.haunted": "pǝʇunɐH", + "modifier.modulargolems.haunted.desc": "pǝɹoɯɹɐ sı ʇǝbɹɐʇ pǝןןıʞ uǝɥʍ uoɯɯns oʇ ǝɔuɐɥɔ ɹǝɥbıH ˙sǝıɯǝuǝ buıןןıʞ uǝɥʍ ʇuɐʌɹǝs ɹoɯɹɐ pǝʇunɐɥ uoɯɯns ʇɥbıW", + "modifier.modulargolems.hell_blast": "ʇsɐןᗺ ןןǝH", + "modifier.modulargolems.hell_blast.desc": "sʇǝbɹɐʇ pɹɐʍoʇ ʇsɐןq ןןǝH ʇooɥS", + "modifier.modulargolems.hell_bolt": "ʇןoᗺ ןןǝH", + "modifier.modulargolems.hell_bolt.desc": "sʇǝbɹɐʇ pɹɐʍoʇ ʇןoq ןןǝH ʇooɥS", + "modifier.modulargolems.hell_cloud": "pnoןƆ ןןǝH", + "modifier.modulargolems.hell_cloud.desc": "uoıʇısod ʇǝbɹɐʇ uo pnoןɔ ןןǝH uoɯɯnS", + "modifier.modulargolems.hepatizon_defense": "ǝsuǝɟǝᗡ uozıʇɐdǝH", + "modifier.modulargolems.hepatizon_defense.desc": "ǝbɐɯɐp buıʞɐʇ ɹǝʇɟɐ ʎןıɹɐɹodɯǝʇ ǝbɐɯɐp ssǝן sǝʞɐʇ ɯǝןo⅁", + "modifier.modulargolems.hostility_adaptive": "ǝʌıʇdɐpⱯ :ɹǝıɟıpoW ʎʇıןıʇsoH", "modifier.modulargolems.hostility_core": "ǝɹoƆ ʎʇıןıʇsoH", "modifier.modulargolems.hostility_core.desc": "sʇoןs ǝpɐɹbdn ǝɯnsuoɔ ʇ,uop sǝpɐɹbdn ʎʇıןıʇsoɥ ɹǝɥʇo ןןⱯ", + "modifier.modulargolems.hostility_dispell": "ןןǝdsıᗡ :ɹǝıɟıpoW ʎʇıןıʇsoH", "modifier.modulargolems.hostility_potion": "suoıʇoԀ :ǝpɐɹbd∩ ʎʇıןıʇsoH", "modifier.modulargolems.hostility_potion.desc": "ʇoןs ǝpɐɹbdn ǝɯnsuoɔ ʇ,uop sǝpɐɹbdn uoıʇod ɟo puıʞ ɥɔɐǝ ɟo ןǝʌǝן ʇsɹıℲ", - "modifier.modulargolems.hostility_protection": "uoıʇɔǝʇoɹԀ :ǝpɐɹbd∩ ʎʇıןıʇsoH", - "modifier.modulargolems.hostility_reflect": "ǝʌıʇɔǝןɟǝᴚ :ǝpɐɹbd∩ ʎʇıןıʇsoH", - "modifier.modulargolems.hostility_regen": "uoıʇɐɹǝuǝbǝᴚ :ǝpɐɹbd∩ ʎʇıןıʇsoH", - "modifier.modulargolems.hostility_speed": "ʎpǝǝdS :ǝpɐɹbd∩ ʎʇıןıʇsoH", - "modifier.modulargolems.hostility_tank": "ʎʞuɐ⟘ :ǝpɐɹbd∩ ʎʇıןıʇsoH", - "modifier.modulargolems.ignis_attack": "ʞɔɐʇʇⱯ sıubI", + "modifier.modulargolems.hostility_protection": "uoıʇɔǝʇoɹԀ :ɹǝıɟıpoW ʎʇıןıʇsoH", + "modifier.modulargolems.hostility_reflect": "ǝʌıʇɔǝןɟǝᴚ :ɹǝıɟıpoW ʎʇıןıʇsoH", + "modifier.modulargolems.hostility_regen": "uoıʇɐɹǝuǝbǝᴚ :ɹǝıɟıpoW ʎʇıןıʇsoH", + "modifier.modulargolems.hostility_speed": "ʎpǝǝdS :ɹǝıɟıpoW ʎʇıןıʇsoH", + "modifier.modulargolems.hostility_tank": "ʎʞuɐ⟘ :ɹǝıɟıpoW ʎʇıןıʇsoH", + "modifier.modulargolems.ice_dragonsteel_armor": "ɹoɯɹⱯ ןǝǝʇsuobɐɹᗡ ǝɔI", + "modifier.modulargolems.ice_dragonsteel_armor.desc": "pǝʞɔɐʇʇɐ uǝɥʍ ɹǝʞɔɐʇʇɐ ʞɔɐqʞɔouʞ puɐ 'ʍoןs 'ǝzǝǝɹℲ", + "modifier.modulargolems.ice_dragonsteel_attack": "ʞɔɐʇʇⱯ ןǝǝʇsuobɐɹᗡ ǝɔI", + "modifier.modulargolems.ice_dragonsteel_attack.desc": "ʇǝbɹɐʇ ʞɔɐqʞɔouʞ puɐ 'ʍoןs 'ǝzǝǝɹℲ", + "modifier.modulargolems.ignis_attack": "puɐɹᗺ buızɐןᗺ", "modifier.modulargolems.ignis_attack.desc": "˙ɹoɯɹɐ sǝssɐdʎq ǝbɐɯɐp ʇɔǝɹıp 'ɟןɐɥ uɐɥʇ ɹǝʍoן sı ɥʇןɐǝɥ uǝɥM ˙ʇǝbɹɐʇ ʇıɥ uǝɥʍ ɥʇןɐǝɥ ǝʇɐɹǝuǝbǝɹ puɐ ʇɔǝɟɟǝ ǝpuɐɹᗺ buızɐןᗺ ʞɔɐʇS", "modifier.modulargolems.ignis_fireball": "ןןɐqǝɹıℲ sıubI", "modifier.modulargolems.ignis_fireball.desc": "˙ʇǝbɹɐʇ pɹɐʍoʇ sןןɐqǝɹıɟ sıubI ʇooɥs 'ʎɐʍɐɹɐɟ sı ʇǝbɹɐʇ uǝɥM", + "modifier.modulargolems.ignis_jump": "ǝʞıɹʇS ǝɯɐןℲ", + "modifier.modulargolems.ignis_jump.desc": "˙sʇǝbɹɐʇ ʎqɹɐǝu ןןɐ uo ǝʞıɹʇs ǝɯɐןɟ ɯɹoɟɹǝd 'buıpuɐן uO ˙ʇǝbɹɐʇ pɹɐʍoʇ dɯnſ", "modifier.modulargolems.immunity": "ʎʇıunɯɯI", "modifier.modulargolems.immunity.desc": "˙ɯǝןob ǝןqɐɹǝuןnʌuı ʞɔɐʇʇɐ ʇ,uoʍ sqoW ˙ǝbɐɯɐp pıoʌ ʇdǝɔxǝ 'ǝbɐɯɐp ןןɐ oʇ ǝunɯɯI", "modifier.modulargolems.incarcerate": "uoıʇɐɹǝɔɹɐɔuI :ǝpɐɹbd∩ uoıʇoԀ", "modifier.modulargolems.leviathan_blast_portal": "ןɐʇɹoԀ ʇsɐןᗺ uɐɥʇɐıʌǝꞀ", - "modifier.modulargolems.leviathan_blast_portal.desc": "uoıʇısod ʇǝbɹɐʇ ʇɐ ןɐʇɹod ʇsɐןq ǝʇɐǝɹɔ 'ʎɐʍɐɹɐɟ sı ʇǝbɹɐʇ uǝɥM", + "modifier.modulargolems.leviathan_blast_portal.desc": "sʇǝbɹɐʇ ǝןdıʇןnɯ sʞɔɐʇʇⱯ ˙uoıʇısod ʇǝbɹɐʇ ʇɐ ןɐʇɹod ʇsɐןq ǝʇɐǝɹɔƆ", + "modifier.modulargolems.lightning_dragonsteel_attack": "ʞɔɐʇʇⱯ ןǝǝʇsuobɐɹᗡ buıuʇɥbıꞀ", + "modifier.modulargolems.lightning_dragonsteel_attack.desc": "ʇǝbɹɐʇ ʞɔɐʇʇɐ oʇ ʇןoq buıuʇɥbıן uoɯɯnS", "modifier.modulargolems.magic_immune": "ǝunɯɯI ɔıbɐW", "modifier.modulargolems.magic_immune.desc": "ǝbɐɯɐp ɔıbɐɯ oʇ ǝunɯɯI", "modifier.modulargolems.magic_resistant": "ʇuɐʇsısǝᴚ ɔıbɐW", "modifier.modulargolems.magic_resistant.desc": "ןɐuıbıɹo ɟo %s%% oʇ pǝɔnpǝɹ uǝʞɐʇ ǝbɐɯɐp ɔıbɐW", + "modifier.modulargolems.maledictus_attack": "ʞɔɐʇʇⱯ snʇɔıpǝןɐW", + "modifier.modulargolems.maledictus_attack.desc": "sɹǝʎɐן %s oʇ dn 'ǝbɐɯɐp buıןɐǝp ɹǝʇɟɐ ɹǝʇunoɔ ǝbɐɹ ʞɔɐʇS ˙ɹoɯɹɐ ssɐdʎq ǝbɐɯɐp ǝǝןǝɯ ɯǝןo⅁", + "modifier.modulargolems.maledictus_earthquake": "ʞɔɐʇʇⱯ dɯnſ pɹǝqןɐH ɯoʇuɐɥԀ", + "modifier.modulargolems.maledictus_earthquake.desc": "spɹǝqןɐɥ ɯoʇuɐɥd buıuoɯɯns 'buıpuɐן uo ǝbɐɯɐp ɐǝɹɐ ǝsnɐɔ puɐ dɯnſ", "modifier.modulargolems.mana_boosting": "buıʇsooᗺ ɐuɐW", "modifier.modulargolems.mana_boosting.desc": "ɐuɐɯ %s buıʇsoɔ ǝbɐɯɐp ɐɹʇxǝ %s%% ןɐǝᗡ", "modifier.modulargolems.mana_burst": "ʇsɹnᗺ ɐuɐW", @@ -297,6 +498,10 @@ "modifier.modulargolems.mana_mending.desc": "ʎɔuǝıɔıɟɟǝ dɥ/ɐuɐɯ %s ɐ ʇɐ uoıʇɐɹǝuǝbǝɹ %s ʇǝ⅁", "modifier.modulargolems.mana_production": "uoıʇɔnpoɹԀ ɐuɐW", "modifier.modulargolems.mana_production.desc": "puoɔǝs ɹǝd ɐuɐɯ %s ǝʇɐɹǝuǝ⅁", + "modifier.modulargolems.manyullyn_attack": "ʞɔɐʇʇⱯ uʎןןnʎuɐW", + "modifier.modulargolems.manyullyn_attack.desc": "ǝbɐɯɐp buıʇɔıןɟuı ɹǝʇɟɐ ʎןıɹɐɹodɯǝʇ ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", + "modifier.modulargolems.manyullyn_defense": "ǝsuǝɟǝᗡ uʎןןnʎuɐW", + "modifier.modulargolems.manyullyn_defense.desc": "ǝbɐɯɐp buıʞɐʇ ɹǝʇɟɐ ʎןıɹɐɹodɯǝʇ ʞɔɐʇʇɐ ɯǝןob ǝsɐǝɹɔuI", "modifier.modulargolems.mechanical_engine": "ǝuıbuƎ ןɐɔıuɐɥɔǝW", "modifier.modulargolems.mechanical_engine.desc": "˙dn ɯǝןob ǝɥʇ ɹǝʍod oʇ sןǝnɟ sǝɯnsuoƆ", "modifier.modulargolems.mechanical_force": "ǝɔɹoℲ ןɐɔıuɐɥɔǝW", @@ -305,7 +510,9 @@ "modifier.modulargolems.mechanical_mobility.desc": "%s%% ʎq pǝǝds ǝsɐǝɹɔuı 'sןǝnɟ buıuɹnq uǝɥM", "modifier.modulargolems.naga": "ɐbɐN", "modifier.modulargolems.netherite_monstrosity_earthquake": "ǝʞɐnbɥʇɹɐƎ ʎʇısoɹʇsuoW ǝʇıɹǝɥʇǝN", - "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "puɐן uo ǝʞɐnbɥʇɹɐǝ ǝsnɐɔ puɐ dɯnſ", + "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "buıpuɐן uo ǝʞɐnbɥʇɹɐǝ ǝsnɐɔ puɐ dɯnſ", + "modifier.modulargolems.obsidian": "uɐıpısqO", + "modifier.modulargolems.obsidian.desc": "%s ʎq uǝʞɐʇ ǝbɐɯɐp ןɐuıɟ sǝɔnpǝᴚ", "modifier.modulargolems.pickup": "dnʞɔıԀ", "modifier.modulargolems.pickup.desc": "ɯǝɥʇ ǝɹoʇs oʇ ǝɹǝɥʍou puıɟ ʇı ɟı sɯǝʇı ʎoɹʇsǝp ʎɐɯ ɯǝןob ǝɥ⟘ ˙uoıʇɐʇuǝɯnɔop ןןnɟ ɹoɟ ıןnoɥɔʇɐԀ ǝǝS ˙noʎ oʇ ɯǝɥʇ ǝʌıb puɐ sʞɔoןq %s uıɥʇıʍ sǝɔuǝıɹǝdxǝ puɐ sɯǝʇı dnʞɔıd ןןıʍ sɯǝןo⅁", "modifier.modulargolems.pickup_mending": "buıpuǝW :ʇuǝɯbnⱯ dnʞɔıԀ", @@ -318,23 +525,47 @@ "modifier.modulargolems.pixie_counterattack.desc": "˙pǝʞɔɐʇʇɐ uǝɥʍ ǝɔuɐɥɔ %s%% ɐ ɥʇıʍ ǝıxıd ɐ uoɯɯnS", "modifier.modulargolems.player_immune": "ǝunɯɯI ɹǝʎɐןԀ", "modifier.modulargolems.player_immune.desc": "˙ǝɹıɟ ʎןpuǝıɹɟ oʇ ǝunɯɯI", + "modifier.modulargolems.polarize": "ǝzıɹɐןoԀ", + "modifier.modulargolems.polarize.desc": "˙ʎןʇuɐʇsuoɔ ǝbɐɯɐp ןɐɔıɹʇɔǝןǝ %s ןɐǝp 'ǝpoɯ buıpuɐʇs/pǝbuɐɹ uı ʎɐʍɐ sǝıɯǝuǝ ɥsnd puɐ ǝpoɯ ǝǝןǝɯ uı sǝıɯǝuǝ ןןnԀ", "modifier.modulargolems.poseidite": "ǝʇıpıǝsoԀ", "modifier.modulargolems.poseidite.desc": "sqoɯ pǝsɐq ɹǝʇɐʍ ɹo ɹǝʇɐʍ oʇ ǝʌıʇısuǝs sqoɯ oʇ ǝbɐɯɐp ǝɹoɯ %s%% ןɐǝᗡ", + "modifier.modulargolems.primitive_blast": "ʇsɐןᗺ ǝʌıʇıɯıɹԀ", + "modifier.modulargolems.primitive_blast.desc": "ɥʇןɐǝɥ xɐɯ ɟo %s ʎq ǝbɐɯɐp sǝsɐǝɹɔuI", + "modifier.modulargolems.primitive_curse": "ǝsɹnƆ ǝʌıʇıɯıɹԀ", + "modifier.modulargolems.primitive_curse.desc": "%1$s%% ʎq uǝʞɐʇ ǝbɐɯɐp puɐ %2$s ʎq sʇoןs ǝpɐɹbdn sǝɔnpǝᴚ", "modifier.modulargolems.projectile_reject": "ʇɔǝظǝᴚ ǝןıʇɔǝظoɹԀ", "modifier.modulargolems.projectile_reject.desc": "˙ǝbɐɯɐp ǝןıʇɔǝظoɹd ou sǝʞɐ⟘ ˙sǝןıʇɔǝظoɹd ʇɔǝןɟǝᗡ", "modifier.modulargolems.push": "ɥsnԀ", + "modifier.modulargolems.radiation": "uoıʇɐıpɐᴚ", + "modifier.modulargolems.radiation.desc": "˙ןǝʌǝן uoıʇɐıpɐɹ ɹǝd %s ʎq ǝsɐǝɹɔuı ʇǝbɹɐʇ pǝʇɐıpɐɹ oʇ ǝbɐɯɐᗡ ˙sʇǝbɹɐʇ ʞɔɐʇʇɐ oʇ %s ʇɔıןɟuI", "modifier.modulargolems.recycle": "ǝןɔʎɔǝᴚ", "modifier.modulargolems.recycle.desc": "˙ʇuǝsǝɹd sı ɹǝʎɐןd sı ʎɹoʇuǝʌuı oʇ uɹnʇǝɹ ןןıʍ ɹǝpןoH ˙pǝןןıʞ uǝɥʍ ɥʇןɐǝɥ 0 ɟo ɹǝpןoɥ ɯǝןob doɹᗡ", + "modifier.modulargolems.reformation": "uoıʇɐɯɹoɟǝᴚ", + "modifier.modulargolems.reformation.desc": "uoıʇdɹosqɐ %s ʇsoɯ ʇɐ pןoɥ ʎɐɯ ɯǝןo⅁ ˙%s ןɐǝɥ puɐ uoıʇdɹosqɐ %s uıɐb oʇ ʇobuı uoɹı ǝɯnsuoƆ", "modifier.modulargolems.regeneration_up": "d∩ uoıʇɐɹǝuǝbǝᴚ", + "modifier.modulargolems.resonant_attack": "ʞɔɐʇʇⱯ ʇuɐuosǝᴚ", + "modifier.modulargolems.resonant_attack.desc": "˙sʞɔoןq %1$s uıɥʇıʍ ǝdʎʇ ǝɯɐs ɟo sʇǝbɹɐʇ ɹǝɥʇo ןןɐ oʇ ǝbɐɯɐp ɔıbɐɯ %2$s%% ןɐuoıʇıppɐ sןɐǝp ǝbɐɯɐp ɯǝןo⅁", + "modifier.modulargolems.resonant_heal": "ןɐǝH ʇuɐuosǝᴚ", + "modifier.modulargolems.resonant_heal.desc": "˙ןǝʌǝן ʇıɐɹʇ s,ʇǝbɹɐʇ ɹǝd ԀH %1$s%% ɹoɟ sǝןıʇ %2$s uıɥʇıʍ ʇıɐɹʇ ǝɯɐs ǝɥʇ ɥʇıʍ sǝıןןɐ sןɐǝɥ ʎdɐɹǝɥ⟘ ɹıɐdǝɹ-uoN", "modifier.modulargolems.ridding_speed_up": "ǝpɐɹbd∩ ʇunoW", - "modifier.modulargolems.ridding_speed_up.desc": "˙ʞɔɐʇʇɐ ɹoɟ pǝʇǝbɹɐʇ ǝq ʇou ןןıʍ puɐ 'ʞɔɐʇʇɐ ʇou ןןıʍ ɯǝןo⅁", + "modifier.modulargolems.ridding_speed_up.desc": "ʇı buıʇǝbɹɐʇ ʇou sı ʇɐɥʇ sqoɯ ʎq pǝɯɹɐɥ ǝq ʇou ןןıM ˙ʞɔɐʇʇɐ ɹoɟ pǝʇǝbɹɐʇ ǝq ʇou ןןıʍ puɐ 'ʞɔɐʇʇɐ ʇou ןןıʍ ɯǝןo⅁", + "modifier.modulargolems.scylla_lightning": "buıuʇɥbıꞀ ɐןןʎɔS", + "modifier.modulargolems.scylla_lightning.desc": "sʇǝbɹɐʇ ǝןdıʇןnɯ ʇɐ ɹɐǝds buıuʇɥbıן ʇooɥS", + "modifier.modulargolems.scylla_wave": "ǝʌɐM ɐןןʎɔS", + "modifier.modulargolems.scylla_wave.desc": "ʎɐʍɐ sɹǝʞɔɐʇʇɐ ɥsnd oʇ sǝʌɐʍ uoɯɯns 'pǝʞɔɐʇʇɐ uǝɥM", "modifier.modulargolems.size_up": "d∩ ǝzıS", "modifier.modulargolems.slow": "ssǝuʍoןS :ǝpɐɹbd∩ uoıʇoԀ", "modifier.modulargolems.sonic_boom": "ɯooᗺ ɔıuoS", "modifier.modulargolems.sonic_boom.desc": "˙sʇǝbɹɐʇ ǝןdıʇןnɯ ʇıɥ uɐɔ ɯooᗺ ɔıuoS uǝɥʇ 'ʞɔɐʇʇɐ ɐǝɹɐ ɯɹoɟɹǝd uɐɔ ɯǝןob ǝɥʇ ɟI ˙ʞɔɐʇʇⱯ ɯooᗺ ɔıuoS ǝsn uɐɔ ɯǝןo⅁", + "modifier.modulargolems.soul_collection": "uoıʇɔǝןןoƆ ןnoS", + "modifier.modulargolems.soul_collection.desc": "ɹǝuʍo oʇ ʇı ǝʌıb puɐ pǝןןıʞ sǝıʇıʇuǝ ɯoɹɟ ןnos ʇɔǝןןoƆ", "modifier.modulargolems.soul_flame": "ǝɯɐןℲ ןnoS :ǝpɐɹbd∩ uoıʇoԀ", "modifier.modulargolems.soul_flame.desc": "˙ǝbɐɯɐp ǝɯɐןɟ ןnos oʇ ǝunɯɯI ˙sʇɔǝɟɟǝ ʇuǝɯʇuɐɥɔuǝ uɹoɥ⟘ ǝɯɐןℲ ןnoS puɐ ǝpɐןᗺ ǝɯɐןℲ ןnoS ʇǝ⅁", + "modifier.modulargolems.soul_repair": "ɹıɐdǝᴚ ןnoS", + "modifier.modulargolems.soul_repair.desc": "ʍoן sı ɥʇןɐǝɥ uǝɥʍ ʎbɹǝuǝ ןnos ɥʇıʍ ɯǝןob ןɐǝɥ osןⱯ ˙ʎbɹǝuǝ ןnos s,ɹǝʎɐןd ɥʇıʍ sʇuǝɯdınbǝ ɯǝןob ɹıɐdǝᴚ", "modifier.modulargolems.speed_up": "d∩ pǝǝdS", + "modifier.modulargolems.sticky_caramel": "ןǝɯɐɹɐƆ ʎʞɔıʇS", + "modifier.modulargolems.sticky_caramel.desc": "sʇǝbɹɐʇ ʞɔɐʇʇɐ uo ןǝɯɐɹɐɔ uǝʇןoɯ ʇnԀ", "modifier.modulargolems.swim": "ɯıʍS", "modifier.modulargolems.swim.desc": "ɯıʍs uɐɔ ɯǝןo⅁", "modifier.modulargolems.talented": "pǝʇuǝןɐ⟘", @@ -345,15 +576,29 @@ "modifier.modulargolems.tf_damage.desc": "ʇsǝɹoɟ ʇɥbıןıʍʇ uı ǝbɐɯɐp ɐɹʇxǝ %s%% ןɐǝᗡ", "modifier.modulargolems.tf_healing": "snuoᗺ buıןɐǝH Ⅎ⟘", "modifier.modulargolems.tf_healing.desc": "ʇsǝɹoɟ ʇɥbıןıʍʇ uı ǝɹoɯ %s%% sǝɯoɔǝq buıןɐǝH", + "modifier.modulargolems.the_abhorrent": "ʇuǝɹɹoɥqⱯ ǝɥ⟘", + "modifier.modulargolems.the_abhorrent.desc": "ʇıɥ uo sǝɯɐɹɟ ʎʇıןıqɐɹǝuןnʌuı ʇǝbɹɐʇ ǝɔnpǝᴚ", + "modifier.modulargolems.the_atrocious": "snoıɔoɹʇⱯ ǝɥ⟘", + "modifier.modulargolems.the_atrocious.desc": "uʍopןooɔ ןןıʞs ɹǝıɟıpoɯ ǝןʇsodⱯ ǝɔnpǝᴚ", + "modifier.modulargolems.the_profane": "ǝuɐɟoɹԀ ǝɥ⟘", + "modifier.modulargolems.the_profane.desc": "ʇıɥ uo ʇǝbɹɐʇ ɯoɹɟ sʇɔǝɟɟǝ ǝʌıʇısod ɯopuɐɹ %s ǝʌoɯǝɹ ɯǝןo⅁", + "modifier.modulargolems.the_risen": "uǝsıᴚ ǝɥ⟘", + "modifier.modulargolems.the_risen.desc": "ɥʇןɐǝɥ ou sɐɥ ʇı uǝɥʍ ןɐǝɥ ןןıʇs uɐɔ ɯǝʇı ɹǝpןoɥ ɯǝןo⅁ ˙ɥʇɐǝp uo ɥʇןɐǝɥ 0 ɥʇıʍ ɯǝʇı ɹǝpןoɥ sdoɹp ɯǝןo⅁", + "modifier.modulargolems.the_terrible": "ǝןqıɹɹǝ⟘ ǝɥ⟘", + "modifier.modulargolems.the_terrible.desc": "sʇǝbɹɐʇ %s ʇsoɯ ʇɐ pɹɐʍoʇ ɥɔɐǝ sʍoɹɹɐ %s sʇooɥS ˙ɹǝʇsɐɟ ʍoq sʍɐɹp ɯǝןo⅁", "modifier.modulargolems.thorn": "uɹoɥ⟘", "modifier.modulargolems.thorn.desc": "ǝbɐɯɐp %s%% ʇɔǝןɟǝᴚ", "modifier.modulargolems.thunder_immune": "ǝunɯɯI ɹǝpunɥ⟘", "modifier.modulargolems.thunder_immune.desc": "˙ɥʇןɐǝɥ %s ןɐǝɥ puɐ 'spuoɔǝs 0Ɩ ɹoɟ ǝɔuɐʇsısǝɹ ǝɹıɟ uıɐb 'ʞɔnɹʇs uǝɥM ˙buıuʇɥbıꞀ ʇɔɐɹʇʇⱯ ˙ǝbɐɯɐp ʇןoq buıuʇɥbıן oʇ ǝunɯɯI", + "modifier.modulargolems.thunderstorm": "ɯɹoʇsɹǝpunɥ⟘", + "modifier.modulargolems.thunderstorm.desc": "˙ɯǝןob ǝɥʇ punoɹɐ sʇsɹnq ɔıɹʇɔǝןǝ uoɯɯns 'pǝʞɔɐʇʇɐ uǝɥM ˙sʇǝbɹɐʇ ǝןdıʇןnɯ ʞɔɐʇʇɐ oʇ ɯɹoʇsɹǝpunɥʇ uoɯɯnS", "modifier.modulargolems.totemic_gold": "pןo⅁ ɔıɯǝʇo⟘", "modifier.modulargolems.totemic_gold.desc": "sqoɯ pɐǝpun oʇ ǝbɐɯɐp ǝɹoɯ %s%% ןɐǝᗡ", "modifier.modulargolems.toughness_up": "d∩ ssǝuɥbno⟘", "modifier.modulargolems.weak": "ssǝuʞɐǝM :ǝpɐɹbd∩ uoıʇoԀ", "modifier.modulargolems.wither": "ɹǝɥʇıM :ǝpɐɹbd∩ uoıʇoԀ", + "modifier.modulargolems.wroughtnaut": "buıɯɯɐןS ʇnɐuʇɥbnoɹM", + "modifier.modulargolems.wroughtnaut.desc": "ǝʌɐʍʞɔoɥs ǝʇɐǝɹɔ puɐ ʞɔɐʇʇɐ buıןןɐɟ ɯɹoɟɹǝԀ", "modulargolems.config.blacklist": "˙ʇsıןǝʇıɥʍ oʇ ɥɔʇıʍs oʇ ʞɔıןƆ ˙ʇsıןʞɔɐןq buıs∩", "modulargolems.config.friendly": "ʇsıꞀ ʎןpuǝıɹℲ", "modulargolems.config.hostile": "ʇsıꞀ ǝןıʇsoH", @@ -372,6 +617,10 @@ "modulargolems.config.reset": "ʇǝsǝᴚ", "modulargolems.config.set": "bıɟuoɔ ʇǝs oʇ ʇɹǝsuI", "modulargolems.config.whitelist": "˙ʇsıןʞɔɐןq oʇ ɥɔʇıʍs oʇ ʞɔıןƆ ˙ʇsıןǝʇıɥʍ buıs∩", + "modulargolems.gui.player_skin": "ǝɹnʇxǝ⟘ uıʞS/ɹǝʎɐןԀ", + "modulargolems.gui.player_skin.cancel": "ןǝɔuɐƆ", + "modulargolems.gui.player_skin.confirm": "ɯɹıɟuoƆ", + "modulargolems.gui.player_skin.hint": "ɥʇɐd ǝɹnʇxǝʇ ʞɔɐd ǝɔɹnosǝɹ ɹo ǝɯɐu ɹǝʎɐןd ɹǝʇuƎ", "modulargolems.msg.add_target": "ɹǝʇןıɟ oʇ %s ppⱯ", "modulargolems.msg.botania_mana": "%s/%s :ɐuɐW", "modulargolems.msg.botania_no_ring": "pǝddınbƎ ɐuɐW ɟo puɐᗺ oN", @@ -387,30 +636,82 @@ "modulargolems.slot.backup_desc": "˙ǝɹǝɥ suodɐǝʍ ʎɹɐpuoɔǝs ǝɔɐןԀ", "modulargolems.slot.backup_info": "˙sǝıɯǝuǝ oʇ ǝɔuɐʇsıp uo buıpuǝdǝp ɯǝɥʇ uǝǝʍʇǝq ɥɔʇıʍs uɐɔ ɯǝןob ɹnoʎ 'ʇoןs dnʞɔɐq uı ǝuo puɐ puɐɥ uıɐɯ uı ǝuo 'pɹoʍs puɐ ʍoq ǝʌɐɥ noʎ ɟI", "modulargolems.slot.main": "ʇoןS puɐH uıɐW", - "modulargolems.slot.main_desc": "˙buıɥʇʎuɐ sʇdǝɔɔⱯ ˙ǝɹǝɥ suodɐǝʍ ǝɔɐןԀ", + "modulargolems.slot.main_desc": "˙buıɥʇʎuɐ sʇdǝɔɔⱯ ˙ǝɹǝɥ uodɐǝʍ ǝɔɐןԀ", + "modulargolems.slot.main_desc_metal": "˙ǝɹǝɥ uodɐǝʍ ɯǝןob ןɐʇǝɯ ǝɔɐןԀ", "modulargolems.slot.off": "ʇoןS puɐH ɟɟO", + "modulargolems.slot.shoulder": "ʇoןS ʇuǝɯdınbƎ ɹǝpןnoɥS", "modulargolems.tab.attribute": "sǝʇnqıɹʇʇⱯ ɯǝןo⅁", + "modulargolems.tab.disintegrate": "ǝןqɯǝssɐsıᗡ & ǝʇnʇıʇsqnS", "modulargolems.tab.equipment": "sʇuǝɯdınbƎ ɯǝןo⅁", "modulargolems.tab.path": "bıɟuoƆ ɥʇɐԀ ןoɹʇɐԀ", "modulargolems.tab.pickup": "bıɟuoƆ ɹǝʇןıℲ dnʞɔıԀ", "modulargolems.tab.target": "bıɟuoƆ ɹǝʇןıℲ ʇǝbɹɐ⟘", "modulargolems.tab.toggle": "bıɟuoƆ ןɐɹǝuǝ⅁", + "modulargolems.tab.tracker_alive": "pןɹoM uı sɯǝןo⅁", + "modulargolems.tab.tracker_dead": "pɹoɔǝᴚ ɥʇɐǝᗡ ɯǝןo⅁", + "modulargolems.tab.tracker_retrieve": "ʎɹoʇuǝʌuI oʇ pǝuɹnʇǝᴚ", + "modulargolems.tab.upgrades": "sǝpɐɹbd∩ ɯǝןo⅁", + "modulargolems.tooltip.beacon_boots": "˙sǝıןןɐ ʎqɹɐǝu ןןɐ oʇ %s '%s ʎןddɐ puɐ ןɐǝH", + "modulargolems.tooltip.beacon_cannon": "ǝbɐɯɐp ɔıbɐɯ ʇɔıןɟuı oʇ ɯɐǝq uoɔɐǝq sʇooɥS", + "modulargolems.tooltip.bow_pierce": "sʇǝbɹɐʇ %s sǝɔɹǝıd ʍoɹɹⱯ", + "modulargolems.tooltip.bow_stiffness": "%s :ssǝuɟɟıʇS ʍoᗺ", + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "ǝbɐɯɐᗡ ɹǝsɐꞀ ɥʇɐǝᗡ %s+", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "ǝbɐɯɐᗡ ǝןıssıW buıɯoH %s+", + "modulargolems.tooltip.cataclysm.ignis_armor_fireball": "ǝbɐɯɐᗡ ןןɐqǝɹıℲ %s+", + "modulargolems.tooltip.cataclysm.ignis_armor_soul": "ɯɹoℲ ןnoS ʇuǝuɐɯɹǝԀ", + "modulargolems.tooltip.cataclysm.ignis_armor_strike": "ǝbɐɯɐᗡ ǝʞıɹʇS ǝɯɐןℲ %s+", + "modulargolems.tooltip.cataclysm.maledictus_bypass_cd": "sǝɯɐɹɟ ǝןqɐɹǝuןnʌuı ʎɯǝuǝ ssɐdʎq ןןıʍ ʞɔɐʇʇⱯ dɯnſ ɯoɹɟ pǝuʍɐds pɹǝqןɐH ɯoʇuɐɥԀ", + "modulargolems.tooltip.cataclysm.maledictus_fast_skill": "˙uʍopןooɔ ʞɔɐʇʇⱯ dɯnſ pɹǝqןɐH ɯoʇuɐɥԀ sǝʌןɐH", + "modulargolems.tooltip.cataclysm.maledictus_revive": "spuoɔǝs %s ɟo uʍop ןooɔ ɥʇıʍ 'ʇıɥ ןɐʇɐɟ uo ԀH %s%% ʇɐ ɯǝןo⅁ ǝʌıʌǝᴚ", + "modulargolems.tooltip.cataclysm.maledictus_revive_actual_cd": "˙spuoɔǝs %s :uʍopןooƆ ןɐnʇɔⱯ", + "modulargolems.tooltip.cataclysm.maledictus_revive_cd": "˙%s%% ʎq ԀH pǝʌıʌǝɹ ǝsɐǝɹɔuı puɐ spuoɔǝs %s ʎq uʍopןooɔ ǝɔnpǝɹ ʇɹɐd ɹo ɹoɯɹɐ ɯnısɹnɔ ɹǝɥʇo ɟo ǝɔǝıd ɥɔɐƎ ", + "modulargolems.tooltip.cataclysm.maledictus_revive_in_cd": "˙buıuıɐɯǝɹ spuoɔǝs %s :uʍopןooƆ uO", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "ǝbɐɯɐᗡ ǝʞɐnbɥʇɹɐƎ ʎʇısoɹʇsuoW %s+", + "modulargolems.tooltip.craft_material": "ןɐıɹǝʇɐɯ buıʇɟɐɹɔ ɯǝןo⅁", + "modulargolems.tooltip.diff_stat": ":ɟɟıᗡ ɹǝıɟıpoW/ʇɐʇS", + "modulargolems.tooltip.disintegrate": "ɯǝןo⅁ ǝɥʇ ǝןqɯǝssɐsıᗡ", + "modulargolems.tooltip.fix_first": "¡ʎןqɯǝssɐsıp ǝɹoɟǝq ɯǝןob ǝɥʇ xıℲ", + "modulargolems.tooltip.flamethrower": ":uoıʇıunɯɯɐ ǝןqɐןıɐʌɐ uo buıpuǝdǝp ʞɔɐʇʇɐ ɟo sɯɹoɟ Ɛ sɐH", + "modulargolems.tooltip.flamethrower_firecharge": "˙uoısoןdxǝ sǝsnɐɔ ʇɐɥʇ ǝbɹɐɥɔ ǝɹıɟ sʇooɥS -", + "modulargolems.tooltip.flamethrower_flame": "˙ʇuǝɯʇuɐɥɔuǝ ʎʇıuıɟuI sʇɹoddnS ˙sǝɯɐןɟ ǝzɐןq 9Ɩ ʇooɥs oʇ ɹǝpʍod ǝzɐןq sǝɯnsuoƆ -", + "modulargolems.tooltip.flamethrower_tnt": "˙ʇǝbɹɐʇ pɹɐʍoʇ ⟘N⟘ sǝɥɔunɐꞀ -", "modulargolems.tooltip.follow": "ʍoןןoℲ", "modulargolems.tooltip.following": "noʎ ʍoןןoɟ ןןıʍ ɯǝןo⅁", "modulargolems.tooltip.golem_equipment": "%s uo ǝʌıʇɔǝɟɟǝ ʎןuO", "modulargolems.tooltip.guard": "ɹǝpuɐM", "modulargolems.tooltip.guarding": ")%s '%s '%s( punoɹɐ ɹǝpuɐʍ ןןıʍ ɯǝןo⅁", "modulargolems.tooltip.health": "%s/%s :ɥʇןɐǝH", + "modulargolems.tooltip.maid_skin_button": ")ʇǝsǝɹ oʇ ʞɔıןɔ-ʇɥbıᴚ( pıɐW :uıʞs ǝbuɐɥƆ", + "modulargolems.tooltip.mechanical_arm": "˙ɹǝıɟıpoɯ ǝuıbuƎ ןɐɔıuɐɥɔǝW ʎq pǝɹǝʍod ǝq uɐƆ ˙ʎןןɐɔıʇɐɯoʇnɐ sןɐıɹǝʇɐɯ ɥʇıʍ ɯǝןob sɹıɐdǝᴚ", + "modulargolems.tooltip.meltdown": "%s :uʍopʇןǝW", "modulargolems.tooltip.modifier": "sǝpɐɹbdn %s ɯoɹɟ sɹǝıɟıpoɯ %s ןɐʇo⟘", + "modulargolems.tooltip.multi_shot": "ǝɔuo ʇɐ sʇǝbɹɐʇ %s sʇooɥS", + "modulargolems.tooltip.no_slot": "ʇoןs ʇuǝıɔıɟɟnsuı uı ʇןnsǝɹ ןןıʍ ǝpɐɹbdn sıɥʇ buıʌoɯǝᴚ", "modulargolems.tooltip.patrol": "ןoɹʇɐԀ", "modulargolems.tooltip.patrolling": "ʎɐʍ pǝʇɐubısǝp ɐ uı ןoɹʇɐd ןןıʍ ɯǝןo⅁", + "modulargolems.tooltip.player_skin_button": ")ʇǝsǝɹ oʇ ʞɔıןɔ-ʇɥbıᴚ( ǝɹnʇxǝ⟘/ɹǝʎɐןԀ :uıʞs ǝbuɐɥƆ", "modulargolems.tooltip.potion_attack": "˙pǝʞɔɐʇʇɐ ɹo buıʞɔɐʇʇɐ sǝıɯǝuǝ oʇ %s ʇɔıןɟuI", "modulargolems.tooltip.potion_defense": "˙%s uıɐb ɯǝןo⅁", + "modulargolems.tooltip.remove_template": "ǝɹǝɥ pǝʌoɯǝɹ ǝq ʇouuɐɔ ǝʇɐןdɯǝ⟘ ǝpɐɹbd∩", + "modulargolems.tooltip.repair_material": "ןɐıɹǝʇɐɯ ɹıɐdǝɹ ɯǝןo⅁", + "modulargolems.tooltip.return_items": ":ʎןqɯǝssɐsıp uo sɯǝʇı buıʍoןןoɟ ǝɥʇ suɹnʇǝᴚ", + "modulargolems.tooltip.return_many": "ʎןqɯǝssɐsıp uo sɯǝʇı %s suɹnʇǝᴚ", + "modulargolems.tooltip.revelation.dash": "ʞɔɐʇʇɐ ɥsɐp ɯɹoɟɹǝd oʇ ʇǝbɹɐʇ ʇsuıɐbɐ ǝbɹɐɥɔ uɐɔ ɯǝןo⅁", + "modulargolems.tooltip.revelation.soul_boost": "ʎɔuǝıɔıɟɟƎ ɹıɐdǝᴚ ןnoS %s%%+", + "modulargolems.tooltip.revelation.soul_reap": "ǝbɐɯɐp buıןɐǝp uo ןnos uıɐ⅁ ˙ǝbɐɯɐp ǝnɹʇ ןɐǝᗡ", + "modulargolems.tooltip.shield_break": "ɹǝʞɐǝɹᗺ pןǝıɥS", "modulargolems.tooltip.shift": "sןıɐʇǝp ɹǝıɟıpoɯ ʍoɥs oʇ ⟘ℲIHS ssǝɹԀ", + "modulargolems.tooltip.shoulder_weapon": "sɹǝpןnoɥS ɯǝןo⅁ ןɐʇǝW uo sʇunoW", + "modulargolems.tooltip.slicing_enemy": "ʇɹɐd ɯǝןob ןɐʇǝɯ ɯopuɐɹ ǝuo doɹp 'ǝxɐ sıɥʇ ɥʇıʍ sǝıɯǝuǝ uıɐʇɹǝɔ ןןıʞ ɯǝןob ןɐʇǝɯ uǝɥM", + "modulargolems.tooltip.slicing_golem": "doɹp oʇ ǝɔuɐɥɔ %s sɐɥ ǝpɐɹbdn ɥɔɐǝ puɐ sʇɹɐd ןןɐ doɹp 'ǝxɐ sıɥʇ ɥʇıʍ sɹǝʎɐןd ɹǝɥʇo ɟo sɯǝןob ןןıʞ ɯǝןob ןɐʇǝɯ uǝɥM", "modulargolems.tooltip.slot": "%s :ʇoןS ǝpɐɹbd∩ buıuıɐɯǝᴚ", + "modulargolems.tooltip.sonic_cannon": "ǝbɐɯɐp oɥɔǝ ssʎqɐ ʇɔıןɟuı oʇ sɯooq ɔıuos Ɛ sʇooɥS", + "modulargolems.tooltip.sonic_cannon_resonance": "ןɐıɹǝʇɐɯ ɯǝןob ʞןnɔS ɥʇıʍ pǝɹıɐd uǝɥʍ ɹǝbuoɹʇS", "modulargolems.tooltip.squad": "pɐnbS", "modulargolems.tooltip.stand": "puɐʇS", "modulargolems.tooltip.standing": ")%s '%s '%s( ʇɐ ʎɐʇs ןןıʍ ɯǝןo⅁", + "modulargolems.tooltip.sub_ingot": ":sǝɹınbǝᴚ ˙ןɐıɹǝʇɐɯ ʎpoq Ɩ sʇsoɔ ǝʇɐןdɯǝʇ uoısuɐdxǝ ɥɔɐǝ 'ʇuǝɯǝɔɐןdǝɹ ʎpoq uO", + "modulargolems.tooltip.sub_slot": "ʇuǝɯǝɔɐןdǝɹ ʇɹɐd uo ʇoןs ʇuǝıɔıɟɟnsuI", "modulargolems.tooltip.target.default": "˙ɹǝdǝǝɹɔ ʇdǝɔxǝ sǝıɯǝuǝ ןןɐ :sʇǝbɹɐʇ ǝןıʇsoɥ ɯǝןo⅁ uoɹI ʇןnɐɟǝᗡ", "modulargolems.tooltip.target.name": "ʇsıן ǝɥʇ oʇ bɐʇ ǝdʎʇ ʎʇıʇuǝ ɹo ǝdʎʇ ʎʇıʇuǝ sɐ ǝɯɐu ǝɥʇ ppɐ oʇ ʞɔıןɔ ʇɥbıɹ puɐ ɯǝʇı ǝɥʇ ǝɯɐuǝᴚ", "modulargolems.tooltip.target.remove": "ʇsıן ǝɥʇ ɯoɹɟ ʎɹʇuǝ ʇsɐן ǝʌoɯǝɹ oʇ ʞɔıןɔ ʇɥbıɹ ʞɐǝuS", @@ -422,18 +723,35 @@ "modulargolems.tooltip.team_up": "uıɐʇdɐɔ ɹıǝɥʇ ʍoןןoɟ ןןıʍ ɯǝןo⅁", "modulargolems.tooltip.wander": "ɹǝpuɐM", "modulargolems.tooltip.wandering": "ʎןǝǝɹɟ ǝʌoɯ ןןıʍ ɯǝןo⅁", + "modulargolems.tracker.alive": "ǝʌıןⱯ", + "modulargolems.tracker.dead": "pɐǝᗡ", + "modulargolems.tracker.dim": "%s :uoısuǝɯıᗡ", + "modulargolems.tracker.dimensional": "ʞɔɐdʞɔɐᗺ ןɐuoısuǝɯıᗡ o⟘", + "modulargolems.tracker.ender": "ʞɔɐdʞɔɐᗺ ɹǝpuƎ o⟘", + "modulargolems.tracker.inventory": "ʎɹoʇuǝʌuI o⟘", + "modulargolems.tracker.killed": "%s ʎq pǝןןıʞ", + "modulargolems.tracker.pos": ")%s'%s'%s( :uoıʇısoԀ", + "modulargolems.tracker.present": "pǝpɐoꞀ", + "modulargolems.tracker.recycle_dead": ")ǝpɐɹbdn ǝןɔʎɔǝɹ ɥʇıʍ( pɐǝᗡ", + "modulargolems.tracker.recycle_killed": ")ǝpɐɹbdn ǝןɔʎɔǝɹ ɥʇıʍ( %s ʎq pǝןןıʞ", + "modulargolems.tracker.retrieved": "pǝʌǝıɹʇǝᴚ", + "modulargolems.tracker.retrieved_other": "%s ʎq pǝʌǝıɹʇǝᴚ", + "modulargolems.tracker.time": "pǝpɐoןu∩", "modulargolems.wand.add_node": "ɥʇɐd oʇ ǝpou pǝppⱯ", + "modulargolems.wand.clear_node": "ɥʇɐd ɯoɹɟ sǝpou ןןɐ pǝʌoɯǝᴚ", "modulargolems.wand.command_right": "˙ʇı ʞɔɐʇʇɐ oʇ sɯǝןob ʎqɹɐǝu puɐɯɯoɔ oʇ ʎʇıʇuǝ ʇǝbɹɐ⟘ ˙sǝpoɯ ɥɔʇıʍs oʇ ɯǝןob ɐ ʇǝbɹɐ⟘", "modulargolems.wand.command_shift": "˙sʇɐʇs ʍǝıʌ puɐ ʎɹoʇuǝʌuı ǝɹnbıɟuoɔ oʇ ɯǝןob ʞɔıןƆ", "modulargolems.wand.config": "˙bıɟuoɔ sıɥʇ buıʌɐɥ sɯǝןob ʇǝbɹɐʇ ʎןuo pןnoʍ spuɐʍ 'puɐɥɟɟo uı uǝɥM ˙ǝʌoɯǝɹ oʇ uıɐbɐ ʞɔıןɔ ʇɥbıᴚ ˙bıɟuoɔ ʇǝs oʇ ɯǝןob ʞɔıןɔ ʇɥbıᴚ", "modulargolems.wand.config_init": "bıɟuoɔ ǝzıןɐıʇıuı oʇ ʞɔıןɔ ʇɥbıᴚ", "modulargolems.wand.config_other": "ʇı ʇıpǝ ʇouuɐɔ noʎ ˙pɹɐɔ ɹnoʎ ʇoN", + "modulargolems.wand.err_dim": "uoısuǝɯıp ssoɹɔɐ sǝpou ppɐ ʇouuɐɔ noʎ", + "modulargolems.wand.err_dist": "ʇɹɐdɐ sʞɔoןq 9Ɩ uɐɥʇ ǝɹoɯ sǝpou ppɐ ʇouuɐɔ noʎ", "modulargolems.wand.mode": "%s :ǝpoW ʇuǝɹɹnƆ", "modulargolems.wand.node_count": "sǝpou %s sɐɥ ɥʇɐԀ", - "modulargolems.wand.path_record": "˙ǝןɔʎɔ ɐ sɯɹoɟ ɥʇɐԀ ˙ǝʌoɯǝɹ oʇ uıɐbɐ ʞɔıןɔ ʇɥbıɹ 'ɥʇɐd oʇ ppɐ oʇ ʞɔoןq ʞɔıןɔ ʇɥbıᴚ", + "modulargolems.wand.path_record": "˙ǝןɔʎɔ ɐ sɯɹoɟ ɥʇɐԀ ˙ɹɐǝןɔ oʇ ʞɔıןɔ ʇɥbıɹ ʇɟıɥS ˙ǝʌoɯǝɹ oʇ uıɐbɐ ʞɔıןɔ ʇɥbıɹ 'ɥʇɐd oʇ ppɐ oʇ ʞɔoןq ʞɔıןɔ ʇɥbıᴚ", "modulargolems.wand.remove_node": "ɥʇɐd ɯoɹɟ ǝpou pǝʌoɯǝᴚ", - "modulargolems.wand.retrieve_right": "˙sɯǝןob buıpunoɹɹns ɹnoʎ ןןɐ ǝʌǝıɹʇǝᴚ", - "modulargolems.wand.retrieve_shift": "˙ʇı ǝʌǝıɹʇǝɹ oʇ ɯǝןob ʎɐʍɐɹɐɟ ɐ ʇǝbɹɐ⟘", + "modulargolems.wand.retrieve_right": "˙ʇı ǝʌǝıɹʇǝɹ oʇ ɯǝןob ʎɐʍɐɹɐɟ ɐ ʇǝbɹɐ⟘", + "modulargolems.wand.retrieve_shift": "˙sɯǝןob buıpunoɹɹns ɹnoʎ ןןɐ ǝʌǝıɹʇǝᴚ", "modulargolems.wand.rider": "˙ʇunoɯsıp oʇ buıɥʇʎuɐ ʞɔıןɔ ʇɥbıɹ 'pǝʇunoɯ uǝɥM ˙buıpıɹ sı ɹǝuʍo sʇı uǝɥʍ ǝpıɹ uɐɔ noʎ 'ɯǝןob ɹnoʎ ʇou s,ʇı ɟI ˙ʇı uo ǝpıɹ oʇ ɯǝןob bop ɹnoʎ ʇǝbɹɐ⟘", "modulargolems.wand.right_click": ":ʞɔıןɔ ʇɥbıɹ uO", "modulargolems.wand.shift_click": ":ʞɔıןɔ ʇɥbıɹ ʞɐǝus uO", @@ -442,5 +760,18 @@ "modulargolems.wand.summon_shift": "˙ʎɹoʇuǝʌuı ɹnoʎ ɯoɹɟ sɯǝןob ןןɐ uoɯɯnS", "modulargolems.wand.switch": "sǝpoɯ uǝǝʍʇǝq ɥɔʇıʍs oʇ ʎǝʞ ʍoɹɹɐ uʍop/dn ǝsn ɹo ןןoɹɔS", "patchouli.modulargolems.landing": "poɯ ǝpɐɹbdn puɐ ʎןqɯǝssɐ ɯǝןob ǝʞıן-ɹǝʞuı⟘ oʇ ǝɯoɔןǝM", - "patchouli.modulargolems.title": "ǝpın⅁ ɯǝןo⅁ ɹɐןnpoW" + "patchouli.modulargolems.title": "ǝpın⅁ ɯǝןo⅁ ɹɐןnpoW", + "potion.potency.10": "IX", + "potion.potency.11": "IIX", + "potion.potency.5": "IΛ", + "potion.potency.6": "IIΛ", + "potion.potency.7": "IIIΛ", + "potion.potency.8": "XI", + "potion.potency.9": "X", + "task.modulargolems.summon_golems": "ɹǝuoɯɯnS ɯǝןo⅁", + "task.modulargolems.summon_golems.condition.has_golem_wand": "puɐM ʇuǝʇodıuɯO pןoH", + "task.modulargolems.summon_golems.desc": "sqoɯ ǝןıʇsoɥ buıpunoɹɹns ʞɔɐʇʇɐ oʇ sɯǝןob uoɯɯns ןןıʍ pıɐW", + "top.modulargolems.file_skin": "%s :uıʞS ǝןıℲ", + "top.modulargolems.maid_model": "%s :uıʞS pıɐW", + "top.modulargolems.player_skin": "%s :uıʞS ɹǝʎɐןԀ" } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/lang/en_us.json b/src/generated/resources/assets/modulargolems/lang/en_us.json index 19b818732..4aa6217a2 100644 --- a/src/generated/resources/assets/modulargolems/lang/en_us.json +++ b/src/generated/resources/assets/modulargolems/lang/en_us.json @@ -49,37 +49,83 @@ "advancements.modulargolems.advancements.golems.thunder.title": "Walking Lightning Rod", "advancements.modulargolems.advancements.golems.upgrade.description": "Obtain an upgrade", "advancements.modulargolems.advancements.golems.upgrade.title": "Upgrade Your Golem", + "attribute.name.dynamic_reduction": "Dynamic Reduction Time", "attribute.name.golem_jump": "Golem Jump Strength", "attribute.name.golem_regen": "Golem Regen", "attribute.name.golem_size": "Golem Size", "attribute.name.golem_sweep": "Sweep Range", + "block.modulargolems.golem_workbench": "Golem Workbench", + "config.jade.plugin_modulargolems.maid_model": "Maid Skin", + "config.jade.plugin_modulargolems.player_skin": "Player/File Skin", + "curios.identifier.golem_route": "Golem Patrol Path", "curios.identifier.golem_skin": "Humanoid Golem Skin", + "effect.modulargolems.atomic_boost": "Atomic Boost", + "effect.modulargolems.atomic_boost.description": "Increase golem attack damage and movement speed", + "effect.modulargolems.hepatizon_effect": "Hepatizon Effect", + "effect.modulargolems.hepatizon_effect.description": "Golem takes less damage", + "effect.modulargolems.maledictus_rage": "Maledictus Rage", + "effect.modulargolems.maledictus_rage.description": "Increase golem attack damage", + "effect.modulargolems.manyullyn_effect": "Manyullyn Effect", + "effect.modulargolems.manyullyn_effect.description": "Increase golem attack damage", "effect.modulargolems.mechanical_force": "Mechanical Force", "effect.modulargolems.mechanical_force.description": "Increase golem attack damage", "effect.modulargolems.mechanical_mobility": "Mechanical Mobility", "effect.modulargolems.mechanical_mobility.description": "Increase golem movement speed", + "entity.modulargolems.beacon_laser": "Beacon Laser", "entity.modulargolems.dog_golem": "Dog Golem", "entity.modulargolems.humanoid_golem": "Humanoid Golem", "entity.modulargolems.metal_golem": "Metal Golem", + "golem_material.alexscaves.candy": "Candy", + "golem_material.alexscaves.magnetic": "Magnetic", + "golem_material.alexscaves.nuclear": "Nuclear", + "golem_material.allthemodium.allthemodium": "Allthemodium", + "golem_material.allthemodium.unobtainium": "Unobtainium", + "golem_material.allthemodium.vibranium": "Vibranium", "golem_material.blazegear.brimsteel": "Brimsteel", "golem_material.botania.elementium": "Elementium", "golem_material.botania.manasteel": "Manasteel", "golem_material.botania.terrasteel": "Terrasteel", + "golem_material.cataclysm.ancient_metal": "Ancient Metal", + "golem_material.cataclysm.cursium": "Cursium", + "golem_material.cataclysm.ender_guardian": "Ender Guardian", "golem_material.cataclysm.ignitium": "Ignitium", + "golem_material.cataclysm.storm": "Storm", "golem_material.cataclysm.witherite": "Witherite", + "golem_material.composite_material.allay_steel": "Allay Steel", + "golem_material.composite_material.dungeon_steel": "Dungeon Steel", + "golem_material.composite_material.etherite": "Etherite", + "golem_material.composite_material.obsidian_steel": "Obsidian Steel", + "golem_material.composite_material.primitive": "Primitive", "golem_material.create.andesite_alloy": "Andesite Alloy", "golem_material.create.brass": "Brass", + "golem_material.create.cardboard": "Cardboard", "golem_material.create.railway": "Railway", "golem_material.create.zinc": "Zinc", + "golem_material.goety.cursed_metal": "Cursed Metal", + "golem_material.goety.dark_metal": "Dark Metal", + "golem_material.goety_revelation.apocalyptium": "Apocalyptium", + "golem_material.iceandfire.fire_dragonsteel": "Fire Dragonsteel", + "golem_material.iceandfire.ice_dragonsteel": "Ice Dragonsteel", + "golem_material.iceandfire.lightning_dragonsteel": "Lightning Dragonsteel", "golem_material.l2complements.eternium": "Eternium", "golem_material.l2complements.poseidite": "Poseidite", "golem_material.l2complements.shulkerate": "Shulkerate", "golem_material.l2complements.totemic_gold": "Totemic Gold", + "golem_material.l2hostility.chaotic": "Chaotic", + "golem_material.l2hostility.miraculous": "Miraculous", + "golem_material.legendary_monsters.cloud": "Cloud", + "golem_material.legendary_monsters.molten_metal": "Molten Metal", "golem_material.modulargolems.copper": "Copper", "golem_material.modulargolems.gold": "Gold", "golem_material.modulargolems.iron": "Iron", "golem_material.modulargolems.netherite": "Netherite", "golem_material.modulargolems.sculk": "Sculk", + "golem_material.mowziesmobs.wroughtnaut": "Wroughtnaut", + "golem_material.tconstruct.amethyst_bronze": "Amethyst Bronze", + "golem_material.tconstruct.cobalt": "Cobalt", + "golem_material.tconstruct.hepatizon": "Hepatizon", + "golem_material.tconstruct.manyullyn": "Manyullyn", + "golem_material.tconstruct.rose_gold": "Rose Gold", "golem_material.twilightforest.fiery": "Fiery", "golem_material.twilightforest.ironwood": "Ironwood", "golem_material.twilightforest.knightmetal": "Knightmetal", @@ -97,22 +143,36 @@ "golem_type.modulargolems.humanoid_golem": "Humanoid Golem", "golem_type.modulargolems.metal_golem": "Metal Golem", "item.modulargolems.ancient_remnant_sandstorm": "Ancient Remnant Upgrade", + "item.modulargolems.apocalyptium_boots": "Apocalyptium Boots", + "item.modulargolems.apocalyptium_chestplate": "Apocalyptium Chestplate", + "item.modulargolems.apocalyptium_helmet": "Apocalyptium Helmet", + "item.modulargolems.apocalyptium_shinguard": "Apocalyptium Shinguard", + "item.modulargolems.apostle": "Apostle Ascension Upgrade", "item.modulargolems.attack_high": "Attack Upgrade V", + "item.modulargolems.azure_cube": "Azure Cube", + "item.modulargolems.barbaric_vanguard_boots": "Barbaric Vanguard Boots", "item.modulargolems.barbaric_vanguard_chestplate": "Barbaric Vanguard Chestplate", "item.modulargolems.barbaric_vanguard_helmet": "Barbaric Vanguard Helmet", "item.modulargolems.barbaric_vanguard_shinguard": "Barbaric Vanguard Shinguard", + "item.modulargolems.beacon_boots": "Beacon Boots", + "item.modulargolems.beacon_cannon": "Beacon Cannon", "item.modulargolems.bell": "Bell Upgrade", "item.modulargolems.black_config_card": "Black Config Card", "item.modulargolems.blue_config_card": "Blue Config Card", "item.modulargolems.brown_config_card": "Brown Config Card", + "item.modulargolems.candy_construct": "Candy Construct", + "item.modulargolems.candy_mixture": "Candy Mixture", "item.modulargolems.carminite": "Carminite Upgrade", "item.modulargolems.cauldron": "Meta Upgrade: Cauldron", "item.modulargolems.cleanse": "Potion Upgrade: Cleanse", + "item.modulargolems.cloud_cube": "Cloud Cube", "item.modulargolems.coating": "Zinc Upgrade", "item.modulargolems.command_wand": "Command Wand", "item.modulargolems.curse": "Potion Upgrade: Curse", "item.modulargolems.cyan_config_card": "Cyan Config Card", "item.modulargolems.diamond": "Diamond Upgrade", + "item.modulargolems.diamond_dog_golem_armor": "Diamond Dog Golem Armor", + "item.modulargolems.diamond_expansion_template": "Diamond Expansion Template", "item.modulargolems.diamond_golem_axe": "Diamond Golem Axe", "item.modulargolems.diamond_golem_spear": "Diamond Golem Spear", "item.modulargolems.diamond_golem_sword": "Diamond Golem Sword", @@ -120,24 +180,43 @@ "item.modulargolems.dog_golem_holder": "Dog Golem Holder", "item.modulargolems.dog_golem_legs": "Dog Golem Legs", "item.modulargolems.dummy_furnace": "Dummy Furnace", + "item.modulargolems.dummy_iron_consumer": "Dummy Iron Consumer", + "item.modulargolems.dummy_uranium_consumer": "Dummy Uranium Consumer", "item.modulargolems.emerald": "Emerald Upgrade", "item.modulargolems.empty_upgrade": "Empty Upgrade", "item.modulargolems.enchanted_gold": "Enchanted Golden Apple Upgrade", "item.modulargolems.ender_guardian_void_rune": "Ender Guardian Upgrade", "item.modulargolems.ender_sight": "Ender Sight Upgrade", + "item.modulargolems.etherite": "Etherite Plating Upgrade", "item.modulargolems.fiery": "Fiery Upgrade", + "item.modulargolems.fiery_boots": "Fiery Boots", + "item.modulargolems.fiery_chestplate": "Fiery Chestplate", + "item.modulargolems.fiery_golem_axe": "Fiery Golem Axe", + "item.modulargolems.fiery_golem_spear": "Fiery Golem Spear", + "item.modulargolems.fiery_golem_sword": "Fiery Golem Sword", + "item.modulargolems.fiery_helmet": "Fiery Helmet", + "item.modulargolems.fiery_shinguard": "Fiery Shinguard", + "item.modulargolems.fire_blast": "Apostle Upgrade: Fire Blast", "item.modulargolems.fire_immune": "Fire Immune Upgrade", + "item.modulargolems.fire_tornado": "Apostle Upgrade: Fire Tornado", + "item.modulargolems.flame_thrower": "Flame Thrower", "item.modulargolems.float": "Float Upgrade", "item.modulargolems.force_field": "Wither Armor Upgrade", "item.modulargolems.freezing": "Potion Upgrade: Freezing", "item.modulargolems.gold": "Golden Apple Upgrade", - "item.modulargolems.golem_beacon_level_1": "Golem Beacon Level 1", - "item.modulargolems.golem_beacon_level_2": "Golem Beacon Level 2", - "item.modulargolems.golem_beacon_level_3": "Golem Beacon Level 3", - "item.modulargolems.golem_beacon_level_4": "Golem Beacon Level 4", - "item.modulargolems.golem_beacon_level_5": "Golem Beacon Level 5", + "item.modulargolems.gold_dog_golem_armor": "Gold Dog Golem Armor", + "item.modulargolems.golem_facade": "Golem Facade", + "item.modulargolems.golem_slicing_axe": "Golem Slicing Axe", "item.modulargolems.gray_config_card": "Gray Config Card", "item.modulargolems.green_config_card": "Green Config Card", + "item.modulargolems.harbinger_chestplate": "Harbinger Chestplate", + "item.modulargolems.harbinger_helmet": "Harbinger Helmet", + "item.modulargolems.harbinger_shinguard": "Harbinger Shinguard", + "item.modulargolems.harbinger_upgrade_template": "Harbinger Upgrade Template", + "item.modulargolems.hell_blast": "Apostle Upgrade: Hell Blast", + "item.modulargolems.hell_bolt": "Apostle Upgrade: Hell Bolt", + "item.modulargolems.hell_cloud": "Apostle Upgrade: Hell Cloud", + "item.modulargolems.hostile_wand": "Hostile Wand", "item.modulargolems.hostility_core": "Hostility Core", "item.modulargolems.hostility_potion": "Hostility Upgrade: Potion", "item.modulargolems.hostility_protection": "Hostility Upgrade: Protection", @@ -149,6 +228,9 @@ "item.modulargolems.humanoid_golem_body": "Humanoid Golem Body", "item.modulargolems.humanoid_golem_holder": "Humanoid Golem Holder", "item.modulargolems.humanoid_golem_legs": "Humanoid Golem Legs", + "item.modulargolems.ignis_chestplate": "Ignitium Golem Chestplate", + "item.modulargolems.ignis_helmet": "Ignitium Golem Helmet", + "item.modulargolems.ignis_shinguard": "Ignitium Golem Shinguard", "item.modulargolems.incarcerate": "Potion Upgrade: Incarceration", "item.modulargolems.incomplete_dog_golem_body": "Incomplete Dog Golem Body", "item.modulargolems.incomplete_dog_golem_legs": "Incomplete Dog Golem Legs", @@ -158,28 +240,62 @@ "item.modulargolems.incomplete_metal_golem_arm": "Incomplete Metal Golem Arm", "item.modulargolems.incomplete_metal_golem_body": "Incomplete Metal Golem Body", "item.modulargolems.incomplete_metal_golem_legs": "Incomplete Metal Golem Legs", + "item.modulargolems.iron_dog_golem_armor": "Iron Dog Golem Armor", "item.modulargolems.iron_golem_axe": "Iron Golem Axe", "item.modulargolems.iron_golem_spear": "Iron Golem Spear", "item.modulargolems.iron_golem_sword": "Iron Golem Sword", + "item.modulargolems.iron_mecha_bow": "Iron Mecha Bow", "item.modulargolems.ironwood": "Ironwood Upgrade", + "item.modulargolems.ironwood_boots": "Ironwood Boots", + "item.modulargolems.ironwood_chestplate": "Ironwood Chestplate", + "item.modulargolems.ironwood_golem_axe": "Ironwood Golem Axe", + "item.modulargolems.ironwood_golem_spear": "Ironwood Golem Spear", + "item.modulargolems.ironwood_golem_sword": "Ironwood Golem Sword", + "item.modulargolems.ironwood_helmet": "Ironwood Helmet", + "item.modulargolems.ironwood_shinguard": "Ironwood Shinguard", "item.modulargolems.knightmetal": "Knightmetal Upgrade", + "item.modulargolems.knightmetal_boots": "Knightmetal Boots", + "item.modulargolems.knightmetal_chestplate": "Knightmetal Chestplate", + "item.modulargolems.knightmetal_golem_axe": "Knightmetal Golem Axe", + "item.modulargolems.knightmetal_golem_spear": "Knightmetal Golem Spear", + "item.modulargolems.knightmetal_golem_sword": "Knightmetal Golem Sword", + "item.modulargolems.knightmetal_helmet": "Knightmetal Helmet", + "item.modulargolems.knightmetal_shinguard": "Knightmetal Shinguard", "item.modulargolems.leviathan_blast_portal": "Leviathan Upgrade", "item.modulargolems.light_blue_config_card": "Light Blue Config Card", "item.modulargolems.light_gray_config_card": "Light Gray Config Card", "item.modulargolems.lime_config_card": "Lime Config Card", "item.modulargolems.magenta_config_card": "Magenta Config Card", + "item.modulargolems.magnetic_alloy": "Magnetic Alloy", + "item.modulargolems.magnetic_construct": "Magnetic Construct", + "item.modulargolems.maledictus_chestplate": "Cursium Golem Chestplate", + "item.modulargolems.maledictus_helmet": "Cursium Golem Helmet", + "item.modulargolems.maledictus_shinguard": "Cursium Golem Shinguard", + "item.modulargolems.mechanical_arm": "Mechanic Repair Arm", "item.modulargolems.metal_golem_arm": "Metal Golem Arm", "item.modulargolems.metal_golem_body": "Metal Golem Body", "item.modulargolems.metal_golem_holder": "Metal Golem Holder", "item.modulargolems.metal_golem_legs": "Metal Golem Legs", "item.modulargolems.metal_golem_template": "Metal Golem Template", + "item.modulargolems.monstrosity_chestplate": "Monstrosity Chestplate", + "item.modulargolems.monstrosity_helmet": "Monstrosity Helmet", + "item.modulargolems.monstrosity_shinguard": "Monstrosity Shinguard", + "item.modulargolems.monstrosity_upgrade_template": "Monstrosity Upgrade Template", "item.modulargolems.mount_upgrade": "Mount Upgrade", "item.modulargolems.naga": "Naga Upgrade", + "item.modulargolems.naga_boots": "Naga Boots", + "item.modulargolems.naga_chestplate": "Naga Chestplate", + "item.modulargolems.naga_helmet": "Naga Helmet", + "item.modulargolems.naga_shinguard": "Naga Shinguard", "item.modulargolems.netherite": "Netherite Upgrade", + "item.modulargolems.netherite_dog_golem_armor": "Netherite Dog Golem Armor", + "item.modulargolems.netherite_expansion_template": "Netherite Expansion Template", "item.modulargolems.netherite_golem_axe": "Netherite Golem Axe", "item.modulargolems.netherite_golem_spear": "Netherite Golem Spear", "item.modulargolems.netherite_golem_sword": "Netherite Golem Sword", + "item.modulargolems.netherite_mecha_bow": "Netherite Mecha Bow", "item.modulargolems.netherite_monstrosity_earthquake": "Netherite Monstrosity Upgrade", + "item.modulargolems.nuclear_construct": "Nuclear Construct", "item.modulargolems.omnipotent_wand_command": "Omnipotent Wand: Command", "item.modulargolems.omnipotent_wand_retrieval": "Omnipotent Wand: Retrieval", "item.modulargolems.omnipotent_wand_rider": "Omnipotent Wand: Rider", @@ -202,14 +318,22 @@ "item.modulargolems.roman_guard_chestplate": "Roman Guard Chestplate", "item.modulargolems.roman_guard_helmet": "Roman Guard Helmet", "item.modulargolems.roman_guard_shinguard": "Roman Guard Shinguard", + "item.modulargolems.scylla_lightning_upgrade": "Scylla Upgrade", "item.modulargolems.size_upgrade": "Size Upgrade", "item.modulargolems.slow": "Potion Upgrade: Slowness", + "item.modulargolems.sonic_cannon": "Sonic Cannon", + "item.modulargolems.soul_collection": "Soul Collection Upgrade", "item.modulargolems.soul_flame": "Potion Upgrade: Soul Flame", "item.modulargolems.speed": "Speed Upgrade", "item.modulargolems.speed_high": "Speed Upgrade V", "item.modulargolems.sponge": "Sponge Upgrade", "item.modulargolems.squad_wand": "Squad Wand", "item.modulargolems.steeleaf": "Steeleaf Upgrade", + "item.modulargolems.steeleaf_golem_axe": "Steeleaf Golem Axe", + "item.modulargolems.steeleaf_golem_spear": "Steeleaf Golem Spear", + "item.modulargolems.steeleaf_golem_sword": "Steeleaf Golem Sword", + "item.modulargolems.stellar_apocalypse": "Stellar Apocalypse", + "item.modulargolems.storm_construct": "Storm Construct", "item.modulargolems.summon_wand": "Summon Wand", "item.modulargolems.swim": "Swim Upgrade", "item.modulargolems.talented": "Meta Upgrade: Talented", @@ -218,18 +342,46 @@ "item.modulargolems.target_filter_type": "Target Filter: Entity Type", "item.modulargolems.target_filter_uuid": "Target Filter: Entity UUID", "item.modulargolems.teleport": "Teleport Upgrade", + "item.modulargolems.the_abhorrent": "Apostle Title: The Abhorrent", + "item.modulargolems.the_atrocious": "Apostle Title: The Atrocious", + "item.modulargolems.the_profane": "Apostle Title: The Profane", + "item.modulargolems.the_terrible": "Apostle Title: The Terrible", "item.modulargolems.thunder_immune": "Thunder Immune Upgrade", + "item.modulargolems.thunderstorm": "Thunderstorm Upgrade", + "item.modulargolems.void_construct": "Void Construct", + "item.modulargolems.void_cube": "Void Cube", "item.modulargolems.weak": "Potion Upgrade: Weakness", "item.modulargolems.white_config_card": "White Config Card", + "item.modulargolems.wind_spirit_boots": "Wind Spirit Boots", "item.modulargolems.wind_spirit_chestplate": "Wind Spirit Chestplate", "item.modulargolems.wind_spirit_helmet": "Wind Spirit Helmet", "item.modulargolems.wind_spirit_shinguard": "Wind Spirit Shinguard", "item.modulargolems.wither": "Potion Upgrade: Wither", + "item.modulargolems.wroughtnaut": "Wroughtnaut Slamming Upgrade", + "item.modulargolems.wroughtnaut_ingot": "Wroughtnaut Ingot", "item.modulargolems.yellow_config_card": "Yellow Config Card", - "itemGroup.l2library.golems": "Modular Golems", + "itemGroup.l2library.golem_items": "Modular Golems - Items", + "itemGroup.l2library.golem_upgrades": "Modular Golems - Upgrades", + "itemGroup.l2library.golems": "Modular Golems - Golems & Parts", + "modifier.modulargolems.add_slot": "Add Slot", + "modifier.modulargolems.add_slot.desc": "Add %s golem upgrade slot", + "modifier.modulargolems.add_slot_diamond": "Diamond Expansion", + "modifier.modulargolems.add_slot_diamond.desc": "Add 1 upgrade slot. Only once per golem.", + "modifier.modulargolems.add_slot_netherite": "Netherite Expansion", + "modifier.modulargolems.add_slot_netherite.desc": "Add 1 upgrade slot. Only once per golem.", + "modifier.modulargolems.ancient_anchor": "Ancient Anchor", + "modifier.modulargolems.ancient_anchor.desc": "Deal fall attack, cause shockwaves, and stun targets", + "modifier.modulargolems.ancient_remnant_reformation": "Ancient Remnant Reformation", + "modifier.modulargolems.ancient_remnant_reformation.desc": "Reforge: Consumes body material to repair itself at the cost of max health. Consumption be restored with ingot.", "modifier.modulargolems.ancient_remnant_sandstorm": "Ancient Remnant Sandstorm", - "modifier.modulargolems.ancient_remnant_sandstorm.desc": "When target is faraway, summon sandstorm at target position", + "modifier.modulargolems.ancient_remnant_sandstorm.desc": "Summon sandstorm at target position. Attacks multiple targets. Increase damage to target inflicted with Curse of Desert", + "modifier.modulargolems.apostle": "Apostle", + "modifier.modulargolems.apostle.desc": "Apostle Upgrades will not consume slot", + "modifier.modulargolems.armor_penetration": "Armor Penetration", + "modifier.modulargolems.armor_penetration.desc": "Attack has %s%% chance to bypass armor and shields", "modifier.modulargolems.armor_up": "Armor Up", + "modifier.modulargolems.atomic_fueling": "Atomic Fueling", + "modifier.modulargolems.atomic_fueling.desc": "Consume [%s] to heal %s HP, and boost attack and speed by %s for %s seconds. Makes golem immune to irradiated effect.", "modifier.modulargolems.bell": "Bell", "modifier.modulargolems.bell.desc": "When the golem wants to attack, it will ring its bell, attracting all enemies and light them up.", "modifier.modulargolems.blazing": "Blazing", @@ -239,6 +391,8 @@ "modifier.modulargolems.cauldron": "Cauldron", "modifier.modulargolems.cauldron.desc": "Repeated potion upgrades will no longer consume upgrade slots.", "modifier.modulargolems.cleanse": "Potion Upgrade: Cleanse", + "modifier.modulargolems.cloud_forming": "Cloud Forming", + "modifier.modulargolems.cloud_forming.desc": "Deal more damage to targets with higher health", "modifier.modulargolems.coating": "Coating", "modifier.modulargolems.coating.desc": "Reduce damage taken by %s", "modifier.modulargolems.conduit": "Conduit", @@ -247,48 +401,95 @@ "modifier.modulargolems.damage_cap": "Damage Cap", "modifier.modulargolems.damage_cap.desc": "Damage taken are limited within %s%% of max health.", "modifier.modulargolems.damage_up": "Damage Up", + "modifier.modulargolems.dungeon_absorption": "Dungeon Absorption", + "modifier.modulargolems.dungeon_absorption.desc": "Direct attacks heal for %s%% of damage dealt", + "modifier.modulargolems.dungeon_link": "Dungeon Link", + "modifier.modulargolems.dungeon_link.desc": "Non-repair healing effects also restore %s%% of the amount to the player", + "modifier.modulargolems.dynamic_reduction": "Dynamic Reduction", + "modifier.modulargolems.dynamic_reduction.desc": "Golem can only take damage of 20% max health per period of time", "modifier.modulargolems.emerald": "Emerald", "modifier.modulargolems.emerald.desc": "Deal %s%% more damage to illagers", "modifier.modulargolems.ender_guardian_void_rune": "Ender Guardian Void Rune", - "modifier.modulargolems.ender_guardian_void_rune.desc": "Summon void rune toward target", + "modifier.modulargolems.ender_guardian_void_rune.desc": "Summon vortex and void rune toward multiple targets", "modifier.modulargolems.ender_sight": "Ender Sight", "modifier.modulargolems.ender_sight.desc": "Golem can see through wall and ceilings.", + "modifier.modulargolems.etherite_plating": "Etherite Plating", + "modifier.modulargolems.etherite_plating.desc1": "According to the level, the following effects are provided:", + "modifier.modulargolems.etherite_plating.desc2": "- Immune to projectile damage", + "modifier.modulargolems.etherite_plating.desc3": "- Immune to conventional debuffs", + "modifier.modulargolems.etherite_plating.desc4": "- Immune to environmental damage", + "modifier.modulargolems.etherite_plating.desc5": "- Periodic self-repair", "modifier.modulargolems.explosion_resistant": "Explosion Resistant", "modifier.modulargolems.explosion_resistant.desc": "Explosion damage taken reduced to %s%% of original, and will not break blocks.", + "modifier.modulargolems.fallen_attack": "Fallen Attack", "modifier.modulargolems.fiery": "Fiery", - "modifier.modulargolems.fiery.desc": "Deal %s%% fire damage to mobs not immune to fire", + "modifier.modulargolems.fiery.desc": "Deal +%s%% damage to mobs not immune to fire", + "modifier.modulargolems.fire_blast": "Fire Blast", + "modifier.modulargolems.fire_blast.desc": "Summon Fire Blast Trap in the front", + "modifier.modulargolems.fire_dragonsteel_attack": "Fire Dragonsteel Attack", + "modifier.modulargolems.fire_dragonsteel_attack.desc": "Ignite and knockback target", "modifier.modulargolems.fire_immune": "Fire Immune", "modifier.modulargolems.fire_immune.desc": "Immune to fire damage. Floats in Lava.", + "modifier.modulargolems.fire_tornado": "Fire Tornado", + "modifier.modulargolems.fire_tornado.desc": "Summon Fire Tornado Trap toward target position", "modifier.modulargolems.float": "Float", "modifier.modulargolems.float.desc": "Golem floats in water and lava instead of sinking", + "modifier.modulargolems.free_movement": "Free Movement", + "modifier.modulargolems.free_movement.desc": "Golem will not be stuck by blocks or caramel", "modifier.modulargolems.freezing": "Potion Upgrade: Freezing", "modifier.modulargolems.freezing.desc": "Get Ice Blade and Ice Thorn enchantment effects. Immune to freezing damage.", + "modifier.modulargolems.gum_shooter": "Gum Shooter", + "modifier.modulargolems.gum_shooter.desc": "Shoot gumballs at targets dealing %s damage", "modifier.modulargolems.harbinger_death_beam": "Harbinger Death Beam", "modifier.modulargolems.harbinger_death_beam.desc": "When target is faraway, shoot Death Beam toward target.", "modifier.modulargolems.harbinger_missile": "Harbinger Missile", "modifier.modulargolems.harbinger_missile.desc": "When target is faraway, shoot Homing Missile toward target.", + "modifier.modulargolems.haunted": "Haunted", + "modifier.modulargolems.haunted.desc": "Might summon haunted armor servant when killing enemies. Higher chance to summon when killed target is armored", + "modifier.modulargolems.hell_blast": "Hell Blast", + "modifier.modulargolems.hell_blast.desc": "Shoot Hell blast toward targets", + "modifier.modulargolems.hell_bolt": "Hell Bolt", + "modifier.modulargolems.hell_bolt.desc": "Shoot Hell bolt toward targets", + "modifier.modulargolems.hell_cloud": "Hell Cloud", + "modifier.modulargolems.hell_cloud.desc": "Summon Hell cloud on target position", + "modifier.modulargolems.hepatizon_defense": "Hepatizon Defense", + "modifier.modulargolems.hepatizon_defense.desc": "Golem takes less damage temporarily after taking damage", + "modifier.modulargolems.hostility_adaptive": "Hostility Modifier: Adaptive", "modifier.modulargolems.hostility_core": "Hostility Core", "modifier.modulargolems.hostility_core.desc": "All other hostility upgrades don't consume upgrade slots", + "modifier.modulargolems.hostility_dispell": "Hostility Modifier: Dispell", "modifier.modulargolems.hostility_potion": "Hostility Upgrade: Potions", "modifier.modulargolems.hostility_potion.desc": "First level of each kind of potion upgrades don't consume upgrade slot", - "modifier.modulargolems.hostility_protection": "Hostility Upgrade: Protection", - "modifier.modulargolems.hostility_reflect": "Hostility Upgrade: Reflective", - "modifier.modulargolems.hostility_regen": "Hostility Upgrade: Regeneration", - "modifier.modulargolems.hostility_speed": "Hostility Upgrade: Speedy", - "modifier.modulargolems.hostility_tank": "Hostility Upgrade: Tanky", - "modifier.modulargolems.ignis_attack": "Ignis Attack", + "modifier.modulargolems.hostility_protection": "Hostility Modifier: Protection", + "modifier.modulargolems.hostility_reflect": "Hostility Modifier: Reflective", + "modifier.modulargolems.hostility_regen": "Hostility Modifier: Regeneration", + "modifier.modulargolems.hostility_speed": "Hostility Modifier: Speedy", + "modifier.modulargolems.hostility_tank": "Hostility Modifier: Tanky", + "modifier.modulargolems.ice_dragonsteel_armor": "Ice Dragonsteel Armor", + "modifier.modulargolems.ice_dragonsteel_armor.desc": "Freeze, slow, and knockback attacker when attacked", + "modifier.modulargolems.ice_dragonsteel_attack": "Ice Dragonsteel Attack", + "modifier.modulargolems.ice_dragonsteel_attack.desc": "Freeze, slow, and knockback target", + "modifier.modulargolems.ignis_attack": "Blazing Brand", "modifier.modulargolems.ignis_attack.desc": "Stack Blazing Brande effect and regenerate health when hit target. When health is lower than half, direct damage bypasses armor.", "modifier.modulargolems.ignis_fireball": "Ignis Fireball", "modifier.modulargolems.ignis_fireball.desc": "When target is faraway, shoot Ignis fireballs toward target.", + "modifier.modulargolems.ignis_jump": "Flame Strike", + "modifier.modulargolems.ignis_jump.desc": "Jump toward target. On landing, perform flame strike on all nearby targets.", "modifier.modulargolems.immunity": "Immunity", "modifier.modulargolems.immunity.desc": "Immune to all damage, except void damage. Mobs won't attack invulnerable golem.", "modifier.modulargolems.incarcerate": "Potion Upgrade: Incarceration", "modifier.modulargolems.leviathan_blast_portal": "Leviathan Blast Portal", - "modifier.modulargolems.leviathan_blast_portal.desc": "When target is faraway, create blast portal at target position", + "modifier.modulargolems.leviathan_blast_portal.desc": "Ccreate blast portal at target position. Attacks multiple targets", + "modifier.modulargolems.lightning_dragonsteel_attack": "Lightning Dragonsteel Attack", + "modifier.modulargolems.lightning_dragonsteel_attack.desc": "Summon lightning bolt to attack target", "modifier.modulargolems.magic_immune": "Magic Immune", "modifier.modulargolems.magic_immune.desc": "Immune to magic damage", "modifier.modulargolems.magic_resistant": "Magic Resistant", "modifier.modulargolems.magic_resistant.desc": "Magic damage taken reduced to %s%% of original", + "modifier.modulargolems.maledictus_attack": "Maledictus Attack", + "modifier.modulargolems.maledictus_attack.desc": "Golem melee damage bypass armor. Stack rage counter after dealing damage, up to %s layers", + "modifier.modulargolems.maledictus_earthquake": "Phantom Halberd Jump Attack", + "modifier.modulargolems.maledictus_earthquake.desc": "Jump and cause area damage on landing, summoning phantom halberds", "modifier.modulargolems.mana_boosting": "Mana Boosting", "modifier.modulargolems.mana_boosting.desc": "Deal %s%% extra damage costing %s mana", "modifier.modulargolems.mana_burst": "Mana Burst", @@ -297,6 +498,10 @@ "modifier.modulargolems.mana_mending.desc": "Get %s regeneration at a %s mana/hp efficiency", "modifier.modulargolems.mana_production": "Mana Production", "modifier.modulargolems.mana_production.desc": "Generate %s mana per second", + "modifier.modulargolems.manyullyn_attack": "Manyullyn Attack", + "modifier.modulargolems.manyullyn_attack.desc": "Increase golem attack temporarily after inflicting damage", + "modifier.modulargolems.manyullyn_defense": "Manyullyn Defense", + "modifier.modulargolems.manyullyn_defense.desc": "Increase golem attack temporarily after taking damage", "modifier.modulargolems.mechanical_engine": "Mechanical Engine", "modifier.modulargolems.mechanical_engine.desc": "Consumes fuels to power the golem up.", "modifier.modulargolems.mechanical_force": "Mechanical Force", @@ -305,7 +510,9 @@ "modifier.modulargolems.mechanical_mobility.desc": "When burning fuels, increase speed by %s%%", "modifier.modulargolems.naga": "Naga", "modifier.modulargolems.netherite_monstrosity_earthquake": "Netherite Monstrosity Earthquake", - "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "Jump and cause earthquake on land", + "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "Jump and cause earthquake on landing", + "modifier.modulargolems.obsidian": "Obsidian", + "modifier.modulargolems.obsidian.desc": "Reduces final damage taken by %s", "modifier.modulargolems.pickup": "Pickup", "modifier.modulargolems.pickup.desc": "Golems will pickup items and experiences within %s blocks and give them to you. See Patchouli for full documentation. The golem may destroy items if it find nowhere to store them", "modifier.modulargolems.pickup_mending": "Pickup Augment: Mending", @@ -318,23 +525,47 @@ "modifier.modulargolems.pixie_counterattack.desc": "Summon a pixie with a %s%% chance when attacked.", "modifier.modulargolems.player_immune": "Player Immune", "modifier.modulargolems.player_immune.desc": "Immune to friendly fire.", + "modifier.modulargolems.polarize": "Polarize", + "modifier.modulargolems.polarize.desc": "Pull enemies in melee mode and push enemies away in ranged/standing mode, deal %s electrical damage constantly.", "modifier.modulargolems.poseidite": "Poseidite", "modifier.modulargolems.poseidite.desc": "Deal %s%% more damage to mobs sensitive to water or water based mobs", + "modifier.modulargolems.primitive_blast": "Primitive Blast", + "modifier.modulargolems.primitive_blast.desc": "Increases damage by %s of max health", + "modifier.modulargolems.primitive_curse": "Primitive Curse", + "modifier.modulargolems.primitive_curse.desc": "Reduces upgrade slots by %2$s and damage taken by %1$s%%", "modifier.modulargolems.projectile_reject": "Projectile Reject", "modifier.modulargolems.projectile_reject.desc": "Deflect projectiles. Takes no projectile damage.", "modifier.modulargolems.push": "Push", + "modifier.modulargolems.radiation": "Radiation", + "modifier.modulargolems.radiation.desc": "Inflict %s to attack targets. Damage to radiated target increase by %s per radiation level.", "modifier.modulargolems.recycle": "Recycle", "modifier.modulargolems.recycle.desc": "Drop golem holder of 0 health when killed. Holder will return to inventory is player is present.", + "modifier.modulargolems.reformation": "Reformation", + "modifier.modulargolems.reformation.desc": "Consume iron ingot to gain %s absorption and heal %s. Golem may hold at most %s absorption", "modifier.modulargolems.regeneration_up": "Regeneration Up", + "modifier.modulargolems.resonant_attack": "Resonant Attack", + "modifier.modulargolems.resonant_attack.desc": "Golem damage deals additional %2$s%% magic damage to all other targets of same type within %1$s blocks.", + "modifier.modulargolems.resonant_heal": "Resonant Heal", + "modifier.modulargolems.resonant_heal.desc": "Non-repair Therapy heals allies with the same trait within %2$s tiles for %1$s%% HP per target's trait level.", "modifier.modulargolems.ridding_speed_up": "Mount Upgrade", - "modifier.modulargolems.ridding_speed_up.desc": "Golem will not attack, and will not be targeted for attack.", + "modifier.modulargolems.ridding_speed_up.desc": "Golem will not attack, and will not be targeted for attack. Will not be harmed by mobs that is not targeting it", + "modifier.modulargolems.scylla_lightning": "Scylla Lightning", + "modifier.modulargolems.scylla_lightning.desc": "Shoot lightning spear at multiple targets", + "modifier.modulargolems.scylla_wave": "Scylla Wave", + "modifier.modulargolems.scylla_wave.desc": "When attacked, summon waves to push attackers away", "modifier.modulargolems.size_up": "Size Up", "modifier.modulargolems.slow": "Potion Upgrade: Slowness", "modifier.modulargolems.sonic_boom": "Sonic Boom", "modifier.modulargolems.sonic_boom.desc": "Golem can use Sonic Boom Attack. If the golem can perform area attack, then Sonic Boom can hit multiple targets.", + "modifier.modulargolems.soul_collection": "Soul Collection", + "modifier.modulargolems.soul_collection.desc": "Collect soul from entities killed and give it to owner", "modifier.modulargolems.soul_flame": "Potion Upgrade: Soul Flame", "modifier.modulargolems.soul_flame.desc": "Get Soul Flame Blade and Soul Flame Thorn enchantment effects. Immune to soul flame damage.", + "modifier.modulargolems.soul_repair": "Soul Repair", + "modifier.modulargolems.soul_repair.desc": "Repair golem equipments with player's soul energy. Also heal golem with soul energy when health is low", "modifier.modulargolems.speed_up": "Speed Up", + "modifier.modulargolems.sticky_caramel": "Sticky Caramel", + "modifier.modulargolems.sticky_caramel.desc": "Put molten caramel on attack targets", "modifier.modulargolems.swim": "Swim", "modifier.modulargolems.swim.desc": "Golem can swim", "modifier.modulargolems.talented": "Talented", @@ -345,15 +576,29 @@ "modifier.modulargolems.tf_damage.desc": "Deal %s%% extra damage in twilight forest", "modifier.modulargolems.tf_healing": "TF Healing Bonus", "modifier.modulargolems.tf_healing.desc": "Healing becomes %s%% more in twilight forest", + "modifier.modulargolems.the_abhorrent": "The Abhorrent", + "modifier.modulargolems.the_abhorrent.desc": "Reduce target invulnerability frames on hit", + "modifier.modulargolems.the_atrocious": "The Atrocious", + "modifier.modulargolems.the_atrocious.desc": "Reduce Apostle modifier skill cooldown", + "modifier.modulargolems.the_profane": "The Profane", + "modifier.modulargolems.the_profane.desc": "Golem remove %s random positive effects from target on hit", + "modifier.modulargolems.the_risen": "The Risen", + "modifier.modulargolems.the_risen.desc": "Golem drops holder item with 0 health on death. Golem holder item can still heal when it has no health", + "modifier.modulargolems.the_terrible": "The Terrible", + "modifier.modulargolems.the_terrible.desc": "Golem draws bow faster. Shoots %s arrows each toward at most %s targets", "modifier.modulargolems.thorn": "Thorn", "modifier.modulargolems.thorn.desc": "Reflect %s%% damage", "modifier.modulargolems.thunder_immune": "Thunder Immune", "modifier.modulargolems.thunder_immune.desc": "Immune to lightning bolt damage. Attract Lightning. When struck, gain fire resistance for 10 seconds, and heal %s health.", + "modifier.modulargolems.thunderstorm": "Thunderstorm", + "modifier.modulargolems.thunderstorm.desc": "Summon thunderstorm to attack multiple targets. When attacked, summon electric bursts around the golem.", "modifier.modulargolems.totemic_gold": "Totemic Gold", "modifier.modulargolems.totemic_gold.desc": "Deal %s%% more damage to undead mobs", "modifier.modulargolems.toughness_up": "Toughness Up", "modifier.modulargolems.weak": "Potion Upgrade: Weakness", "modifier.modulargolems.wither": "Potion Upgrade: Wither", + "modifier.modulargolems.wroughtnaut": "Wroughtnaut Slamming", + "modifier.modulargolems.wroughtnaut.desc": "Perform falling attack and create shockwave", "modulargolems.config.blacklist": "Using blacklist. Click to switch to whitelist.", "modulargolems.config.friendly": "Friendly List", "modulargolems.config.hostile": "Hostile List", @@ -372,6 +617,10 @@ "modulargolems.config.reset": "Reset", "modulargolems.config.set": "Insert to set config", "modulargolems.config.whitelist": "Using whitelist. Click to switch to blacklist.", + "modulargolems.gui.player_skin": "Player/Skin Texture", + "modulargolems.gui.player_skin.cancel": "Cancel", + "modulargolems.gui.player_skin.confirm": "Confirm", + "modulargolems.gui.player_skin.hint": "Enter player name or resource pack texture path", "modulargolems.msg.add_target": "Add %s to filter", "modulargolems.msg.botania_mana": "Mana: %s/%s", "modulargolems.msg.botania_no_ring": "No Band of Mana Equipped", @@ -387,30 +636,82 @@ "modulargolems.slot.backup_desc": "Place secondary weapons here.", "modulargolems.slot.backup_info": "If you have bow and sword, one in main hand and one in backup slot, your golem can switch between them depending on distance to enemies.", "modulargolems.slot.main": "Main Hand Slot", - "modulargolems.slot.main_desc": "Place weapons here. Accepts anything.", + "modulargolems.slot.main_desc": "Place weapon here. Accepts anything.", + "modulargolems.slot.main_desc_metal": "Place metal golem weapon here.", "modulargolems.slot.off": "Off Hand Slot", + "modulargolems.slot.shoulder": "Shoulder Equipment Slot", "modulargolems.tab.attribute": "Golem Attributes", + "modulargolems.tab.disintegrate": "Substitute & Disassemble", "modulargolems.tab.equipment": "Golem Equipments", "modulargolems.tab.path": "Patrol Path Config", "modulargolems.tab.pickup": "Pickup Filter Config", "modulargolems.tab.target": "Target Filter Config", "modulargolems.tab.toggle": "General Config", + "modulargolems.tab.tracker_alive": "Golems in World", + "modulargolems.tab.tracker_dead": "Golem Death Record", + "modulargolems.tab.tracker_retrieve": "Returned to Inventory", + "modulargolems.tab.upgrades": "Golem Upgrades", + "modulargolems.tooltip.beacon_boots": "Heal and apply %s, %s to all nearby allies.", + "modulargolems.tooltip.beacon_cannon": "Shoots beacon beam to inflict magic damage", + "modulargolems.tooltip.bow_pierce": "Arrow pierces %s targets", + "modulargolems.tooltip.bow_stiffness": "Bow Stiffness: %s", + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "+%s Death Laser Damage", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "+%s Homing Missile Damage", + "modulargolems.tooltip.cataclysm.ignis_armor_fireball": "+%s Fireball Damage", + "modulargolems.tooltip.cataclysm.ignis_armor_soul": "Permanent Soul Form", + "modulargolems.tooltip.cataclysm.ignis_armor_strike": "+%s Flame Strike Damage", + "modulargolems.tooltip.cataclysm.maledictus_bypass_cd": "Phantom Halberd spawned from Jump Attack will bypass enemy invulnerable frames", + "modulargolems.tooltip.cataclysm.maledictus_fast_skill": "Halves Phantom Halberd Jump Attack cooldown.", + "modulargolems.tooltip.cataclysm.maledictus_revive": "Revive Golem at %s%% HP on fatal hit, with cool down of %s seconds", + "modulargolems.tooltip.cataclysm.maledictus_revive_actual_cd": "Actual Cooldown: %s seconds.", + "modulargolems.tooltip.cataclysm.maledictus_revive_cd": " Each piece of other cursium armor or part reduce cooldown by %s seconds and increase revived HP by %s%%.", + "modulargolems.tooltip.cataclysm.maledictus_revive_in_cd": "On Cooldown: %s seconds remaining.", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "+%s Monstrosity Earthquake Damage", + "modulargolems.tooltip.craft_material": "Golem crafting material", + "modulargolems.tooltip.diff_stat": "Stat/Modifier Diff:", + "modulargolems.tooltip.disintegrate": "Disassemble the Golem", + "modulargolems.tooltip.fix_first": "Fix the golem before disassembly!", + "modulargolems.tooltip.flamethrower": "Has 3 forms of attack depending on available ammunition:", + "modulargolems.tooltip.flamethrower_firecharge": "- Shoots fire charge that causes explosion.", + "modulargolems.tooltip.flamethrower_flame": "- Consumes blaze powder to shoot 16 blaze flames. Supports Infinity enchantment.", + "modulargolems.tooltip.flamethrower_tnt": "- Launches TNT toward target.", "modulargolems.tooltip.follow": "Follow", "modulargolems.tooltip.following": "Golem will follow you", "modulargolems.tooltip.golem_equipment": "Only effective on %s", "modulargolems.tooltip.guard": "Wander", "modulargolems.tooltip.guarding": "Golem will wander around (%s, %s, %s)", "modulargolems.tooltip.health": "Health: %s/%s", + "modulargolems.tooltip.maid_skin_button": "Change skin: Maid (Right-click to reset)", + "modulargolems.tooltip.mechanical_arm": "Repairs golem with materials automatically. Can be powered by Mechanical Engine modifier.", + "modulargolems.tooltip.meltdown": "Meltdown: %s", "modulargolems.tooltip.modifier": "Total %s modifiers from %s upgrades", + "modulargolems.tooltip.multi_shot": "Shoots %s targets at once", + "modulargolems.tooltip.no_slot": "Removing this upgrade will result in insufficient slot", "modulargolems.tooltip.patrol": "Patrol", "modulargolems.tooltip.patrolling": "Golem will patrol in a designated way", + "modulargolems.tooltip.player_skin_button": "Change skin: Player/Texture (Right-click to reset)", "modulargolems.tooltip.potion_attack": "Inflict %s to enemies attacking or attacked.", "modulargolems.tooltip.potion_defense": "Golem gain %s.", + "modulargolems.tooltip.remove_template": "Upgrade Template cannot be removed here", + "modulargolems.tooltip.repair_material": "Golem repair material", + "modulargolems.tooltip.return_items": "Returns the following items on disassembly:", + "modulargolems.tooltip.return_many": "Returns %s items on disassembly", + "modulargolems.tooltip.revelation.dash": "Golem can charge against target to perform dash attack", + "modulargolems.tooltip.revelation.soul_boost": "+%s%% Soul Repair Efficiency", + "modulargolems.tooltip.revelation.soul_reap": "Deal true damage. Gain soul on dealing damage", + "modulargolems.tooltip.shield_break": "Shield Breaker", "modulargolems.tooltip.shift": "Press SHIFT to show modifier details", + "modulargolems.tooltip.shoulder_weapon": "Mounts on Metal Golem Shoulders", + "modulargolems.tooltip.slicing_enemy": "When metal golem kill certain enemies with this axe, drop one random metal golem part", + "modulargolems.tooltip.slicing_golem": "When metal golem kill golems of other players with this axe, drop all parts and each upgrade has %s chance to drop", "modulargolems.tooltip.slot": "Remaining Upgrade Slot: %s", + "modulargolems.tooltip.sonic_cannon": "Shoots 3 sonic booms to inflict abyss echo damage", + "modulargolems.tooltip.sonic_cannon_resonance": "Stronger when paired with Sculk golem material", "modulargolems.tooltip.squad": "Squad", "modulargolems.tooltip.stand": "Stand", "modulargolems.tooltip.standing": "Golem will stay at (%s, %s, %s)", + "modulargolems.tooltip.sub_ingot": "On body replacement, each expansion template costs 1 body material. Requires:", + "modulargolems.tooltip.sub_slot": "Insufficient slot on part replacement", "modulargolems.tooltip.target.default": "Default Iron Golem hostile targets: all enemies except creeper.", "modulargolems.tooltip.target.name": "Rename the item and right click to add the name as entity type or entity type tag to the list", "modulargolems.tooltip.target.remove": "Sneak right click to remove last entry from the list", @@ -422,18 +723,35 @@ "modulargolems.tooltip.team_up": "Golem will follow their captain", "modulargolems.tooltip.wander": "Wander", "modulargolems.tooltip.wandering": "Golem will move freely", + "modulargolems.tracker.alive": "Alive", + "modulargolems.tracker.dead": "Dead", + "modulargolems.tracker.dim": "Dimension: %s", + "modulargolems.tracker.dimensional": "To Dimensional Backpack", + "modulargolems.tracker.ender": "To Ender Backpack", + "modulargolems.tracker.inventory": "To Inventory", + "modulargolems.tracker.killed": "Killed by %s", + "modulargolems.tracker.pos": "Position: (%s,%s,%s)", + "modulargolems.tracker.present": "Loaded", + "modulargolems.tracker.recycle_dead": "Dead (with recycle upgrade)", + "modulargolems.tracker.recycle_killed": "Killed by %s (with recycle upgrade)", + "modulargolems.tracker.retrieved": "Retrieved", + "modulargolems.tracker.retrieved_other": "Retrieved by %s", + "modulargolems.tracker.time": "Unloaded", "modulargolems.wand.add_node": "Added node to path", + "modulargolems.wand.clear_node": "Removed all nodes from path", "modulargolems.wand.command_right": "Target a golem to switch modes. Target entity to command nearby golems to attack it.", "modulargolems.wand.command_shift": "Click golem to configure inventory and view stats.", "modulargolems.wand.config": "Right click golem to set config. Right click again to remove. When in offhand, wands would only target golems having this config.", "modulargolems.wand.config_init": "Right click to initialize config", "modulargolems.wand.config_other": "Not your card. You cannot edit it", + "modulargolems.wand.err_dim": "You cannot add nodes across dimension", + "modulargolems.wand.err_dist": "You cannot add nodes more than 16 blocks apart", "modulargolems.wand.mode": "Current Mode: %s", "modulargolems.wand.node_count": "Path has %s nodes", - "modulargolems.wand.path_record": "Right click block to add to path, right click again to remove. Path forms a cycle.", + "modulargolems.wand.path_record": "Right click block to add to path, right click again to remove. Shift right click to clear. Path forms a cycle.", "modulargolems.wand.remove_node": "Removed node from path", - "modulargolems.wand.retrieve_right": "Retrieve all your surrounding golems.", - "modulargolems.wand.retrieve_shift": "Target a faraway golem to retrieve it.", + "modulargolems.wand.retrieve_right": "Target a faraway golem to retrieve it.", + "modulargolems.wand.retrieve_shift": "Retrieve all your surrounding golems.", "modulargolems.wand.rider": "Target your dog golem to ride on it. If it's not your golem, you can ride when its owner is riding. When mounted, right click anything to dismount.", "modulargolems.wand.right_click": "On right click:", "modulargolems.wand.shift_click": "On sneak right click:", @@ -442,5 +760,18 @@ "modulargolems.wand.summon_shift": "Summon all golems from your inventory.", "modulargolems.wand.switch": "Scroll or use up/down arrow key to switch between modes", "patchouli.modulargolems.landing": "Welcome to Tinker-like golem assembly and upgrade mod", - "patchouli.modulargolems.title": "Modular Golem Guide" + "patchouli.modulargolems.title": "Modular Golem Guide", + "potion.potency.10": "XI", + "potion.potency.11": "XII", + "potion.potency.5": "VI", + "potion.potency.6": "VII", + "potion.potency.7": "VIII", + "potion.potency.8": "IX", + "potion.potency.9": "X", + "task.modulargolems.summon_golems": "Golem Summoner", + "task.modulargolems.summon_golems.condition.has_golem_wand": "Hold Omnipotent Wand", + "task.modulargolems.summon_golems.desc": "Maid will summon golems to attack surrounding hostile mobs", + "top.modulargolems.file_skin": "File Skin: %s", + "top.modulargolems.maid_model": "Maid Skin: %s", + "top.modulargolems.player_skin": "Player Skin: %s" } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/block/golem_workbench.json b/src/generated/resources/assets/modulargolems/models/block/golem_workbench.json new file mode 100644 index 000000000..90e25bad7 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/block/golem_workbench.json @@ -0,0 +1,9 @@ +{ + "parent": "modulargolems:custom/table", + "textures": { + "bottom": "modulargolems:block/table_bottom", + "middle": "modulargolems:block/table_middle", + "particle": "modulargolems:block/table_particle", + "top": "modulargolems:block/table_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apocalyptium_boots.json b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_boots.json new file mode 100644 index 000000000..7fb12ec9d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/equipments/apocalyptium_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apocalyptium_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_chestplate.json new file mode 100644 index 000000000..a51adbef7 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/equipments/apocalyptium_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apocalyptium_helmet.json b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_helmet.json new file mode 100644 index 000000000..0b912208e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/equipments/apocalyptium_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apocalyptium_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_shinguard.json new file mode 100644 index 000000000..2f10e8ff4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apocalyptium_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/equipments/apocalyptium_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apostle.json b/src/generated/resources/assets/modulargolems/models/item/apostle.json new file mode 100644 index 000000000..b33c3c3e0 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apostle.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/apostle_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/apostle_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/apostle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apostle_blue.json b/src/generated/resources/assets/modulargolems/models/item/apostle_blue.json new file mode 100644 index 000000000..1de6617da --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apostle_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/apostle", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/apostle_purple.json b/src/generated/resources/assets/modulargolems/models/item/apostle_purple.json new file mode 100644 index 000000000..2ea5e2f6f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/apostle_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/apostle", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/azure_cube.json b/src/generated/resources/assets/modulargolems/models/item/azure_cube.json new file mode 100644 index 000000000..947ac8e4d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/azure_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/azure_cube" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/barbaric_vanguard_boots.json b/src/generated/resources/assets/modulargolems/models/item/barbaric_vanguard_boots.json new file mode 100644 index 000000000..51090c46f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/barbaric_vanguard_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/barbaric_vanguard_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/beacon_boots.json b/src/generated/resources/assets/modulargolems/models/item/beacon_boots.json new file mode 100644 index 000000000..66a659afb --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/beacon_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/beacon_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/beacon_cannon.json b/src/generated/resources/assets/modulargolems/models/item/beacon_cannon.json new file mode 100644 index 000000000..b82d1df58 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/beacon_cannon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/beacon_cannon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/candy_construct.json b/src/generated/resources/assets/modulargolems/models/item/candy_construct.json new file mode 100644 index 000000000..d4c9751d0 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/candy_construct.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "alexscaves:item/candy_construct" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/candy_mixture.json b/src/generated/resources/assets/modulargolems/models/item/candy_mixture.json new file mode 100644 index 000000000..5f7e4e448 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/candy_mixture.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "alexscaves:item/candy_mixture" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/cloud_cube.json b/src/generated/resources/assets/modulargolems/models/item/cloud_cube.json new file mode 100644 index 000000000..ad07bfc1d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/cloud_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "legendary_monsters:item/cloud_cube" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/diamond_dog_golem_armor.json b/src/generated/resources/assets/modulargolems/models/item/diamond_dog_golem_armor.json new file mode 100644 index 000000000..b91d0ff78 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/diamond_dog_golem_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/dog_armor/diamond_collar", + "layer1": "modulargolems:item/dog_armor/diamond_wolf_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/diamond_expansion_template.json b/src/generated/resources/assets/modulargolems/models/item/diamond_expansion_template.json new file mode 100644 index 000000000..447445a59 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/diamond_expansion_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/diamond_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_axe.json index 53388be68..dfdcf0940 100644 --- a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_axe.json +++ b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_axe.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/battle_axe", - "textures": { - "layer0": "modulargolems:item/equipments/diamond_golem_axe" + "base": { + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_axe" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_axe_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_spear.json index 6c0bf18ec..c3b92a59e 100644 --- a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_spear.json +++ b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_spear.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/long_weapon", - "textures": { - "layer0": "modulargolems:item/equipments/diamond_golem_spear" + "base": { + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_spear" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_spear_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_sword.json index cf16c0e86..3246da735 100644 --- a/src/generated/resources/assets/modulargolems/models/item/diamond_golem_sword.json +++ b/src/generated/resources/assets/modulargolems/models/item/diamond_golem_sword.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/sword", - "textures": { - "layer0": "modulargolems:item/equipments/diamond_golem_sword" + "base": { + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_sword" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/diamond_golem_sword_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/dummy_iron_consumer.json b/src/generated/resources/assets/modulargolems/models/item/dummy_iron_consumer.json new file mode 100644 index 000000000..a3522aa12 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/dummy_iron_consumer.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/air" +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/dummy_uranium_consumer.json b/src/generated/resources/assets/modulargolems/models/item/dummy_uranium_consumer.json new file mode 100644 index 000000000..a3522aa12 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/dummy_uranium_consumer.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/air" +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/etherite.json b/src/generated/resources/assets/modulargolems/models/item/etherite.json new file mode 100644 index 000000000..e6083d0c8 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/etherite.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/etherite_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/etherite_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "composite_material:item/upgrades/etherite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/etherite_blue.json b/src/generated/resources/assets/modulargolems/models/item/etherite_blue.json new file mode 100644 index 000000000..1e5da2f6b --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/etherite_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "composite_material:item/upgrades/etherite", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/etherite_purple.json b/src/generated/resources/assets/modulargolems/models/item/etherite_purple.json new file mode 100644 index 000000000..6ee689529 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/etherite_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "composite_material:item/upgrades/etherite", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_boots.json b/src/generated/resources/assets/modulargolems/models/item/fiery_boots.json new file mode 100644 index 000000000..637feea2e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_boots.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/fiery_chestplate.json new file mode 100644 index 000000000..d9d116001 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_chestplate.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_axe.json new file mode 100644 index 000000000..b7852f89b --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_axe.json @@ -0,0 +1,17 @@ +{ + "parent": "modulargolems:item/battle_axe", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_golem_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_spear.json new file mode 100644 index 000000000..1e62b8133 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_spear.json @@ -0,0 +1,17 @@ +{ + "parent": "modulargolems:item/long_weapon", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_golem_spear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_sword.json new file mode 100644 index 000000000..065d5240d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_golem_sword.json @@ -0,0 +1,17 @@ +{ + "parent": "modulargolems:item/sword", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_golem_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_helmet.json b/src/generated/resources/assets/modulargolems/models/item/fiery_helmet.json new file mode 100644 index 000000000..1ceaff70a --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_helmet.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fiery_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/fiery_shinguard.json new file mode 100644 index 000000000..94629f502 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fiery_shinguard.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": {}, + "render_types_fast": {}, + "textures": { + "layer0": "twilightforest:item/equipments/fiery_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_blast.json b/src/generated/resources/assets/modulargolems/models/item/fire_blast.json new file mode 100644 index 000000000..70b0d2700 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_blast.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/fire_blast_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/fire_blast_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/fire_blast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_blast_blue.json b/src/generated/resources/assets/modulargolems/models/item/fire_blast_blue.json new file mode 100644 index 000000000..08033687c --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_blast_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/fire_blast", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_blast_purple.json b/src/generated/resources/assets/modulargolems/models/item/fire_blast_purple.json new file mode 100644 index 000000000..29dbfdfdc --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_blast_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/fire_blast", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_tornado.json b/src/generated/resources/assets/modulargolems/models/item/fire_tornado.json new file mode 100644 index 000000000..a70303453 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_tornado.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/fire_tornado_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/fire_tornado_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/fire_tornado" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_tornado_blue.json b/src/generated/resources/assets/modulargolems/models/item/fire_tornado_blue.json new file mode 100644 index 000000000..7bb5f192e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_tornado_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/fire_tornado", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/fire_tornado_purple.json b/src/generated/resources/assets/modulargolems/models/item/fire_tornado_purple.json new file mode 100644 index 000000000..f8b56e19f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/fire_tornado_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/fire_tornado", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/flame_thrower.json b/src/generated/resources/assets/modulargolems/models/item/flame_thrower.json new file mode 100644 index 000000000..2f656e151 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/flame_thrower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/flame_thrower" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/gold_dog_golem_armor.json b/src/generated/resources/assets/modulargolems/models/item/gold_dog_golem_armor.json new file mode 100644 index 000000000..741c9e6d4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/gold_dog_golem_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/dog_armor/gold_collar", + "layer1": "modulargolems:item/dog_armor/gold_wolf_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_1.json b/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_1.json deleted file mode 100644 index d3dd3bdd1..000000000 --- a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "modulargolems:item/equipments/golem_beacon_level_1" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_2.json b/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_2.json deleted file mode 100644 index b95650a73..000000000 --- a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "modulargolems:item/equipments/golem_beacon_level_2" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_3.json b/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_3.json deleted file mode 100644 index 0b3b7ec3a..000000000 --- a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "modulargolems:item/equipments/golem_beacon_level_3" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_4.json b/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_4.json deleted file mode 100644 index 30150c037..000000000 --- a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "modulargolems:item/equipments/golem_beacon_level_4" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_5.json b/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_5.json deleted file mode 100644 index 2056a0f71..000000000 --- a/src/generated/resources/assets/modulargolems/models/item/golem_beacon_level_5.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "modulargolems:item/equipments/golem_beacon_level_5" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_facade.json b/src/generated/resources/assets/modulargolems/models/item/golem_facade.json new file mode 100644 index 000000000..cd961d461 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/golem_facade.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:builtin/entity", + "gui_light": "front", + "textures": { + "particle": "minecraft:block/clay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_slicing_axe.json b/src/generated/resources/assets/modulargolems/models/item/golem_slicing_axe.json new file mode 100644 index 000000000..737e05011 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/golem_slicing_axe.json @@ -0,0 +1,18 @@ +{ + "base": { + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "modulargolems:item/equipments/golem_slicing_axe" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/golem_slicing_axe_icon" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/golem_workbench.json b/src/generated/resources/assets/modulargolems/models/item/golem_workbench.json new file mode 100644 index 000000000..def8516e5 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/golem_workbench.json @@ -0,0 +1,3 @@ +{ + "parent": "modulargolems:block/golem_workbench" +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/harbinger_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/harbinger_chestplate.json new file mode 100644 index 000000000..7eef9b870 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/harbinger_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/harbinger_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/harbinger_helmet.json b/src/generated/resources/assets/modulargolems/models/item/harbinger_helmet.json new file mode 100644 index 000000000..f57f82fe5 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/harbinger_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/harbinger_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/harbinger_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/harbinger_shinguard.json new file mode 100644 index 000000000..c39840b48 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/harbinger_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/harbinger_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/harbinger_upgrade_template.json b/src/generated/resources/assets/modulargolems/models/item/harbinger_upgrade_template.json new file mode 100644 index 000000000..af21741e0 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/harbinger_upgrade_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/harbinger_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_blast.json b/src/generated/resources/assets/modulargolems/models/item/hell_blast.json new file mode 100644 index 000000000..08fc2fa3c --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_blast.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/hell_blast_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/hell_blast_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/hell_blast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_blast_blue.json b/src/generated/resources/assets/modulargolems/models/item/hell_blast_blue.json new file mode 100644 index 000000000..3bff466f4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_blast_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_blast", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_blast_purple.json b/src/generated/resources/assets/modulargolems/models/item/hell_blast_purple.json new file mode 100644 index 000000000..19cfbe01d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_blast_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_blast", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_bolt.json b/src/generated/resources/assets/modulargolems/models/item/hell_bolt.json new file mode 100644 index 000000000..57529ff2e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_bolt.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/hell_bolt_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/hell_bolt_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/hell_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_bolt_blue.json b/src/generated/resources/assets/modulargolems/models/item/hell_bolt_blue.json new file mode 100644 index 000000000..f68990284 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_bolt_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_bolt", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_bolt_purple.json b/src/generated/resources/assets/modulargolems/models/item/hell_bolt_purple.json new file mode 100644 index 000000000..89d3fbead --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_bolt_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_bolt", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_cloud.json b/src/generated/resources/assets/modulargolems/models/item/hell_cloud.json new file mode 100644 index 000000000..83a826249 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_cloud.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/hell_cloud_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/hell_cloud_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/hell_cloud" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_cloud_blue.json b/src/generated/resources/assets/modulargolems/models/item/hell_cloud_blue.json new file mode 100644 index 000000000..59d3cc563 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_cloud_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_cloud", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hell_cloud_purple.json b/src/generated/resources/assets/modulargolems/models/item/hell_cloud_purple.json new file mode 100644 index 000000000..1c3d01752 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hell_cloud_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/hell_cloud", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/hostile_wand.json b/src/generated/resources/assets/modulargolems/models/item/hostile_wand.json new file mode 100644 index 000000000..07f290622 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/hostile_wand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "modulargolems:item/hostile_wand" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ignis_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/ignis_chestplate.json new file mode 100644 index 000000000..4adf8d01e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ignis_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/ignis_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ignis_helmet.json b/src/generated/resources/assets/modulargolems/models/item/ignis_helmet.json new file mode 100644 index 000000000..a979b4a25 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ignis_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/ignis_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ignis_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/ignis_shinguard.json new file mode 100644 index 000000000..a5ea0ca47 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ignis_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/ignis_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/iron_dog_golem_armor.json b/src/generated/resources/assets/modulargolems/models/item/iron_dog_golem_armor.json new file mode 100644 index 000000000..1f3bf7e03 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/iron_dog_golem_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/dog_armor/iron_collar", + "layer1": "modulargolems:item/dog_armor/iron_wolf_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/iron_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/iron_golem_axe.json index da70a0aba..5d51bf4fc 100644 --- a/src/generated/resources/assets/modulargolems/models/item/iron_golem_axe.json +++ b/src/generated/resources/assets/modulargolems/models/item/iron_golem_axe.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/battle_axe", - "textures": { - "layer0": "modulargolems:item/equipments/iron_golem_axe" + "base": { + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_axe" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_axe_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/iron_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/iron_golem_spear.json index 53f92887b..ae6694114 100644 --- a/src/generated/resources/assets/modulargolems/models/item/iron_golem_spear.json +++ b/src/generated/resources/assets/modulargolems/models/item/iron_golem_spear.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/long_weapon", - "textures": { - "layer0": "modulargolems:item/equipments/iron_golem_spear" + "base": { + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_spear" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_spear_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/iron_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/iron_golem_sword.json index 379f43747..72d487fa7 100644 --- a/src/generated/resources/assets/modulargolems/models/item/iron_golem_sword.json +++ b/src/generated/resources/assets/modulargolems/models/item/iron_golem_sword.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/sword", - "textures": { - "layer0": "modulargolems:item/equipments/iron_golem_sword" + "base": { + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_sword" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/iron_golem_sword_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/iron_mecha_bow.json b/src/generated/resources/assets/modulargolems/models/item/iron_mecha_bow.json new file mode 100644 index 000000000..98201ab83 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/iron_mecha_bow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/iron_mecha_bow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_boots.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_boots.json new file mode 100644 index 000000000..4094fb393 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_chestplate.json new file mode 100644 index 000000000..24827da07 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_axe.json new file mode 100644 index 000000000..e37ddac25 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_golem_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_spear.json new file mode 100644 index 000000000..e4d6111ed --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_spear.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_golem_spear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_sword.json new file mode 100644 index 000000000..30dcae3e2 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_golem_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_golem_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_helmet.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_helmet.json new file mode 100644 index 000000000..c0df0c389 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/ironwood_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/ironwood_shinguard.json new file mode 100644 index 000000000..08be85f5d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/ironwood_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/ironwood_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_boots.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_boots.json new file mode 100644 index 000000000..4d60d9426 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_chestplate.json new file mode 100644 index 000000000..e6465481e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_axe.json new file mode 100644 index 000000000..fba5ab350 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_golem_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_spear.json new file mode 100644 index 000000000..906729165 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_spear.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_golem_spear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_sword.json new file mode 100644 index 000000000..7acb586c5 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_golem_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_golem_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_helmet.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_helmet.json new file mode 100644 index 000000000..ee6391305 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/knightmetal_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/knightmetal_shinguard.json new file mode 100644 index 000000000..330bd2362 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/knightmetal_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/knightmetal_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/magnetic_alloy.json b/src/generated/resources/assets/modulargolems/models/item/magnetic_alloy.json new file mode 100644 index 000000000..92a360d7f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/magnetic_alloy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "alexscaves:item/magnetic_alloy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/magnetic_construct.json b/src/generated/resources/assets/modulargolems/models/item/magnetic_construct.json new file mode 100644 index 000000000..d923675fc --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/magnetic_construct.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "alexscaves:item/magnetic_construct" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/maledictus_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/maledictus_chestplate.json new file mode 100644 index 000000000..d0542ec00 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/maledictus_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/maledictus_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/maledictus_helmet.json b/src/generated/resources/assets/modulargolems/models/item/maledictus_helmet.json new file mode 100644 index 000000000..ee2352beb --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/maledictus_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/maledictus_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/maledictus_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/maledictus_shinguard.json new file mode 100644 index 000000000..247875fec --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/maledictus_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/maledictus_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/mechanical_arm.json b/src/generated/resources/assets/modulargolems/models/item/mechanical_arm.json new file mode 100644 index 000000000..48cb9bd83 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/mechanical_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/equipments/mechanical_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/monstrosity_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/monstrosity_chestplate.json new file mode 100644 index 000000000..115b87408 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/monstrosity_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/monstrosity_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/monstrosity_helmet.json b/src/generated/resources/assets/modulargolems/models/item/monstrosity_helmet.json new file mode 100644 index 000000000..bd36185bb --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/monstrosity_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/monstrosity_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/monstrosity_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/monstrosity_shinguard.json new file mode 100644 index 000000000..93dc36c57 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/monstrosity_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/equipments/monstrosity_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/monstrosity_upgrade_template.json b/src/generated/resources/assets/modulargolems/models/item/monstrosity_upgrade_template.json new file mode 100644 index 000000000..8919b6970 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/monstrosity_upgrade_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/monstrosity_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/naga_boots.json b/src/generated/resources/assets/modulargolems/models/item/naga_boots.json new file mode 100644 index 000000000..61a5c5722 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/naga_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/naga_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/naga_chestplate.json b/src/generated/resources/assets/modulargolems/models/item/naga_chestplate.json new file mode 100644 index 000000000..ad4c65ea6 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/naga_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/naga_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/naga_helmet.json b/src/generated/resources/assets/modulargolems/models/item/naga_helmet.json new file mode 100644 index 000000000..5ef543e20 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/naga_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/naga_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/naga_shinguard.json b/src/generated/resources/assets/modulargolems/models/item/naga_shinguard.json new file mode 100644 index 000000000..9c1a8d1ef --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/naga_shinguard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/equipments/naga_shinguard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_dog_golem_armor.json b/src/generated/resources/assets/modulargolems/models/item/netherite_dog_golem_armor.json new file mode 100644 index 000000000..c7cea797e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_dog_golem_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/dog_armor/netherite_collar", + "layer1": "modulargolems:item/dog_armor/netherite_wolf_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_expansion_template.json b/src/generated/resources/assets/modulargolems/models/item/netherite_expansion_template.json new file mode 100644 index 000000000..b9d7bc81a --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_expansion_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/netherite_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_axe.json index 34921c936..f953ed6d2 100644 --- a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_axe.json +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_axe.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/battle_axe", - "textures": { - "layer0": "modulargolems:item/equipments/netherite_golem_axe" + "base": { + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_axe" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_axe_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_spear.json index 01c32d7e8..6b2cf9add 100644 --- a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_spear.json +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_spear.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/long_weapon", - "textures": { - "layer0": "modulargolems:item/equipments/netherite_golem_spear" + "base": { + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_spear" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_spear_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_sword.json index 03b136758..2de95917f 100644 --- a/src/generated/resources/assets/modulargolems/models/item/netherite_golem_sword.json +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_golem_sword.json @@ -1,6 +1,18 @@ { - "parent": "modulargolems:item/sword", - "textures": { - "layer0": "modulargolems:item/equipments/netherite_golem_sword" + "base": { + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_sword" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_golem_sword_icon" + } + } } } \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/netherite_mecha_bow.json b/src/generated/resources/assets/modulargolems/models/item/netherite_mecha_bow.json new file mode 100644 index 000000000..4bc079bdb --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/netherite_mecha_bow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/netherite_mecha_bow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/nuclear_construct.json b/src/generated/resources/assets/modulargolems/models/item/nuclear_construct.json new file mode 100644 index 000000000..0f962c4ae --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/nuclear_construct.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "alexscaves:item/nuclear_construct" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade.json b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade.json new file mode 100644 index 000000000..b24c7f4c3 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/scylla_lightning_upgrade_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/scylla_lightning_upgrade_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "cataclysm:item/upgrades/scylla_lightning_upgrade" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_blue.json b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_blue.json new file mode 100644 index 000000000..22c292278 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/upgrades/scylla_lightning_upgrade", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_purple.json b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_purple.json new file mode 100644 index 000000000..51a431c01 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/scylla_lightning_upgrade_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/upgrades/scylla_lightning_upgrade", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/sonic_cannon.json b/src/generated/resources/assets/modulargolems/models/item/sonic_cannon.json new file mode 100644 index 000000000..bac4ba2f7 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/sonic_cannon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/sonic_cannon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/soul_collection.json b/src/generated/resources/assets/modulargolems/models/item/soul_collection.json new file mode 100644 index 000000000..5ca359ca4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/soul_collection.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/soul_collection_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/soul_collection_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety:item/upgrades/soul_collection" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/soul_collection_blue.json b/src/generated/resources/assets/modulargolems/models/item/soul_collection_blue.json new file mode 100644 index 000000000..51c7c9dde --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/soul_collection_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/soul_collection", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/soul_collection_purple.json b/src/generated/resources/assets/modulargolems/models/item/soul_collection_purple.json new file mode 100644 index 000000000..6a058c117 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/soul_collection_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety:item/upgrades/soul_collection", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_axe.json b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_axe.json new file mode 100644 index 000000000..21dcf124e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/battle_axe", + "textures": { + "layer0": "twilightforest:item/equipments/steeleaf_golem_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_spear.json b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_spear.json new file mode 100644 index 000000000..16edf637d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_spear.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/long_weapon", + "textures": { + "layer0": "twilightforest:item/equipments/steeleaf_golem_spear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_sword.json b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_sword.json new file mode 100644 index 000000000..c7dd6d827 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/steeleaf_golem_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "modulargolems:item/sword", + "textures": { + "layer0": "twilightforest:item/equipments/steeleaf_golem_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/stellar_apocalypse.json b/src/generated/resources/assets/modulargolems/models/item/stellar_apocalypse.json new file mode 100644 index 000000000..46f0aa80c --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/stellar_apocalypse.json @@ -0,0 +1,18 @@ +{ + "base": { + "parent": "modulargolems:custom/stellar_apocalypse", + "textures": { + "tex": "goety_revelation:item/equipments/stellar_apocalypse" + } + }, + "gui_light": "front", + "loader": "forge:separate_transforms", + "perspectives": { + "gui": { + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/equipments/stellar_apocalypse_icon" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/storm_construct.json b/src/generated/resources/assets/modulargolems/models/item/storm_construct.json new file mode 100644 index 000000000..b6c0db379 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/storm_construct.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/storm_construct" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_abhorrent.json b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent.json new file mode 100644 index 000000000..ce356e287 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/the_abhorrent_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/the_abhorrent_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety_revelation:item/upgrades/the_abhorrent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_blue.json b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_blue.json new file mode 100644 index 000000000..d4f50e0d0 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_abhorrent", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_purple.json b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_purple.json new file mode 100644 index 000000000..17e1ec2b7 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_abhorrent_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_abhorrent", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_atrocious.json b/src/generated/resources/assets/modulargolems/models/item/the_atrocious.json new file mode 100644 index 000000000..04d33633d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_atrocious.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/the_atrocious_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/the_atrocious_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety_revelation:item/upgrades/the_atrocious" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_atrocious_blue.json b/src/generated/resources/assets/modulargolems/models/item/the_atrocious_blue.json new file mode 100644 index 000000000..8e82ebad7 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_atrocious_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_atrocious", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_atrocious_purple.json b/src/generated/resources/assets/modulargolems/models/item/the_atrocious_purple.json new file mode 100644 index 000000000..5720c921e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_atrocious_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_atrocious", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_profane.json b/src/generated/resources/assets/modulargolems/models/item/the_profane.json new file mode 100644 index 000000000..7b2300d05 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_profane.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/the_profane_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/the_profane_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety_revelation:item/upgrades/the_profane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_profane_blue.json b/src/generated/resources/assets/modulargolems/models/item/the_profane_blue.json new file mode 100644 index 000000000..d84c202cd --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_profane_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_profane", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_profane_purple.json b/src/generated/resources/assets/modulargolems/models/item/the_profane_purple.json new file mode 100644 index 000000000..ee4e6648e --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_profane_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_profane", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_terrible.json b/src/generated/resources/assets/modulargolems/models/item/the_terrible.json new file mode 100644 index 000000000..711cb7530 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_terrible.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/the_terrible_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/the_terrible_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "goety_revelation:item/upgrades/the_terrible" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_terrible_blue.json b/src/generated/resources/assets/modulargolems/models/item/the_terrible_blue.json new file mode 100644 index 000000000..e10324b6f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_terrible_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_terrible", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/the_terrible_purple.json b/src/generated/resources/assets/modulargolems/models/item/the_terrible_purple.json new file mode 100644 index 000000000..d9aca9c6a --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/the_terrible_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "goety_revelation:item/upgrades/the_terrible", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/thunderstorm.json b/src/generated/resources/assets/modulargolems/models/item/thunderstorm.json new file mode 100644 index 000000000..51ede6008 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/thunderstorm.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/thunderstorm_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/thunderstorm_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "legendary_monsters:item/upgrades/thunderstorm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/thunderstorm_blue.json b/src/generated/resources/assets/modulargolems/models/item/thunderstorm_blue.json new file mode 100644 index 000000000..d7468f6b4 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/thunderstorm_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "legendary_monsters:item/upgrades/thunderstorm", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/thunderstorm_purple.json b/src/generated/resources/assets/modulargolems/models/item/thunderstorm_purple.json new file mode 100644 index 000000000..08812ff9f --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/thunderstorm_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "legendary_monsters:item/upgrades/thunderstorm", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/void_construct.json b/src/generated/resources/assets/modulargolems/models/item/void_construct.json new file mode 100644 index 000000000..9d8ef0e3d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/void_construct.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/void_construct" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/void_cube.json b/src/generated/resources/assets/modulargolems/models/item/void_cube.json new file mode 100644 index 000000000..e41599372 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/void_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cataclysm:item/void_cube" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/wind_spirit_boots.json b/src/generated/resources/assets/modulargolems/models/item/wind_spirit_boots.json new file mode 100644 index 000000000..a97eac7bb --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/wind_spirit_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modulargolems:item/equipments/wind_spirit_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/wroughtnaut.json b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut.json new file mode 100644 index 000000000..111f5f8d0 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "modulargolems:item/wroughtnaut_purple", + "predicate": { + "modulargolems:blue_arrow": 0.5 + } + }, + { + "model": "modulargolems:item/wroughtnaut_blue", + "predicate": { + "modulargolems:blue_arrow": 1.0 + } + } + ], + "textures": { + "layer0": "mowziesmobs:item/upgrades/wroughtnaut" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_blue.json b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_blue.json new file mode 100644 index 000000000..3b430f02c --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_blue.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "mowziesmobs:item/upgrades/wroughtnaut", + "layer1": "modulargolems:item/blue_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_ingot.json b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_ingot.json new file mode 100644 index 000000000..d72cfaf5d --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "mowziesmobs:item/wroughtnaut_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_purple.json b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_purple.json new file mode 100644 index 000000000..decccb875 --- /dev/null +++ b/src/generated/resources/assets/modulargolems/models/item/wroughtnaut_purple.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "mowziesmobs:item/upgrades/wroughtnaut", + "layer1": "modulargolems:item/purple_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/alexscaves/modulargolems_config/materials/alexscaves.json b/src/generated/resources/data/alexscaves/modulargolems_config/materials/alexscaves.json new file mode 100644 index 000000000..a420147a8 --- /dev/null +++ b/src/generated/resources/data/alexscaves/modulargolems_config/materials/alexscaves.json @@ -0,0 +1,56 @@ +{ + "ingredients": { + "alexscaves:candy": { + "item": "modulargolems:candy_construct" + }, + "alexscaves:magnetic": { + "item": "modulargolems:magnetic_construct" + }, + "alexscaves:nuclear": { + "item": "modulargolems:nuclear_construct" + } + }, + "modifiers": { + "alexscaves:candy": { + "modulargolems:free_movement": 1, + "modulargolems:gum_shooter": 1, + "modulargolems:sticky_caramel": 1 + }, + "alexscaves:magnetic": { + "modulargolems:polarize": 1, + "modulargolems:reformation": 1 + }, + "alexscaves:nuclear": { + "modulargolems:atomic_fueling": 1, + "modulargolems:radiation": 1 + } + }, + "repairIngredients": { + "alexscaves:candy": { + "item": "modulargolems:candy_mixture" + }, + "alexscaves:magnetic": { + "item": "modulargolems:magnetic_alloy" + }, + "alexscaves:nuclear": { + "item": "modulargolems:nuclear_construct" + } + }, + "stats": { + "alexscaves:candy": { + "modulargolems:attack": 5.0, + "modulargolems:max_health": 80.0, + "modulargolems:speed": 0.3 + }, + "alexscaves:magnetic": { + "modulargolems:attack": 15.0, + "modulargolems:max_health": 200.0, + "modulargolems:weight": -0.2 + }, + "alexscaves:nuclear": { + "modulargolems:attack": 10.0, + "modulargolems:max_health": 120.0, + "modulargolems:weight": -0.4 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/allthemodium/modulargolems_config/materials/allthemodium.json b/src/generated/resources/data/allthemodium/modulargolems_config/materials/allthemodium.json new file mode 100644 index 000000000..ee08f8767 --- /dev/null +++ b/src/generated/resources/data/allthemodium/modulargolems_config/materials/allthemodium.json @@ -0,0 +1,76 @@ +{ + "ingredients": { + "allthemodium:allthemodium": { + "item": "allthemodium:allthemodium_ingot" + }, + "allthemodium:unobtainium": { + "item": "allthemodium:unobtainium_ingot" + }, + "allthemodium:vibranium": { + "item": "allthemodium:vibranium_ingot" + } + }, + "modifiers": { + "allthemodium:allthemodium": { + "modulargolems:add_slot": 1, + "modulargolems:armor_penetration": 1, + "modulargolems:fire_immune": 1, + "modulargolems:player_immune": 1, + "modulargolems:recycle": 1 + }, + "allthemodium:unobtainium": { + "modulargolems:add_slot": 3, + "modulargolems:armor_penetration": 3, + "modulargolems:explosion_resistant": 2, + "modulargolems:fire_immune": 1, + "modulargolems:magic_immune": 1, + "modulargolems:player_immune": 1, + "modulargolems:projectile_reject": 1, + "modulargolems:recycle": 1 + }, + "allthemodium:vibranium": { + "modulargolems:add_slot": 2, + "modulargolems:armor_penetration": 2, + "modulargolems:explosion_resistant": 2, + "modulargolems:fire_immune": 1, + "modulargolems:player_immune": 1, + "modulargolems:projectile_reject": 1, + "modulargolems:recycle": 1 + } + }, + "repairIngredients": { + "allthemodium:allthemodium": { + "item": "allthemodium:allthemodium_ingot" + }, + "allthemodium:unobtainium": { + "item": "allthemodium:unobtainium_ingot" + }, + "allthemodium:vibranium": { + "item": "allthemodium:vibranium_ingot" + } + }, + "stats": { + "allthemodium:allthemodium": { + "modulargolems:attack": 50.0, + "modulargolems:max_health": 500.0, + "modulargolems:regen": 5.0, + "modulargolems:sweep": 2.0, + "modulargolems:weight": 0.2 + }, + "allthemodium:unobtainium": { + "modulargolems:attack": 100.0, + "modulargolems:max_health": 1000.0, + "modulargolems:range": 1.0, + "modulargolems:regen": 10.0, + "modulargolems:sweep": 4.0, + "modulargolems:weight": 0.6 + }, + "allthemodium:vibranium": { + "modulargolems:attack": 80.0, + "modulargolems:max_health": 800.0, + "modulargolems:regen": 8.0, + "modulargolems:sweep": 3.0, + "modulargolems:weight": 0.4 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/blazegear/modulargolems_config/materials/blazegear.json b/src/generated/resources/data/blazegear/modulargolems_config/materials/blazegear.json index 12a0e05c8..a1355b65c 100644 --- a/src/generated/resources/data/blazegear/modulargolems_config/materials/blazegear.json +++ b/src/generated/resources/data/blazegear/modulargolems_config/materials/blazegear.json @@ -10,6 +10,11 @@ "modulargolems:fire_immune": 1 } }, + "repairIngredients": { + "blazegear:brimsteel": { + "item": "blazegear:brimsteel_ingot" + } + }, "stats": { "blazegear:brimsteel": { "modulargolems:attack": 15.0, diff --git a/src/generated/resources/data/botania/modulargolems_config/materials/botania.json b/src/generated/resources/data/botania/modulargolems_config/materials/botania.json index 36cd2c840..1eec20434 100644 --- a/src/generated/resources/data/botania/modulargolems_config/materials/botania.json +++ b/src/generated/resources/data/botania/modulargolems_config/materials/botania.json @@ -28,6 +28,17 @@ "modulargolems:mana_production": 1 } }, + "repairIngredients": { + "botania:elementium": { + "item": "botania:elementium_ingot" + }, + "botania:manasteel": { + "item": "botania:manasteel_ingot" + }, + "botania:terrasteel": { + "item": "botania:terrasteel_ingot" + } + }, "stats": { "botania:elementium": { "modulargolems:attack": 15.0, diff --git a/src/generated/resources/data/carryon/tags/entity_types/entity_blacklist.json b/src/generated/resources/data/carryon/tags/entity_types/entity_blacklist.json new file mode 100644 index 000000000..7334e5b5a --- /dev/null +++ b/src/generated/resources/data/carryon/tags/entity_types/entity_blacklist.json @@ -0,0 +1,7 @@ +{ + "values": [ + "modulargolems:metal_golem", + "modulargolems:humanoid_golem", + "modulargolems:dog_golem" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cataclysm/modulargolems_config/materials/cataclysm.json b/src/generated/resources/data/cataclysm/modulargolems_config/materials/cataclysm.json index 0f2c1059b..d01be3711 100644 --- a/src/generated/resources/data/cataclysm/modulargolems_config/materials/cataclysm.json +++ b/src/generated/resources/data/cataclysm/modulargolems_config/materials/cataclysm.json @@ -1,36 +1,130 @@ { "ingredients": { + "cataclysm:ancient_metal": { + "item": "cataclysm:ancient_metal_ingot" + }, + "cataclysm:cursium": { + "item": "cataclysm:cursium_ingot" + }, + "cataclysm:ender_guardian": { + "item": "modulargolems:void_construct" + }, "cataclysm:ignitium": { "item": "cataclysm:ignitium_ingot" }, + "cataclysm:storm": { + "item": "modulargolems:storm_construct" + }, "cataclysm:witherite": { "item": "cataclysm:witherite_ingot" } }, "modifiers": { + "cataclysm:ancient_metal": { + "modulargolems:ancient_remnant_reformation": 1, + "modulargolems:ancient_remnant_sandstorm": 1, + "modulargolems:damage_cap": 1, + "modulargolems:dynamic_reduction": 1, + "modulargolems:fire_immune": 1 + }, + "cataclysm:cursium": { + "modulargolems:damage_cap": 2, + "modulargolems:dynamic_reduction": 1, + "modulargolems:fire_immune": 1, + "modulargolems:maledictus_attack": 1, + "modulargolems:maledictus_earthquake": 1, + "modulargolems:recycle": 1 + }, + "cataclysm:ender_guardian": { + "modulargolems:damage_cap": 3, + "modulargolems:dynamic_reduction": 1, + "modulargolems:ender_guardian_void_rune": 2, + "modulargolems:fire_immune": 1, + "modulargolems:projectile_reject": 1 + }, "cataclysm:ignitium": { "modulargolems:damage_cap": 3, + "modulargolems:dynamic_reduction": 1, "modulargolems:fire_immune": 1, "modulargolems:ignis_attack": 1, - "modulargolems:ignis_fireball": 2 + "modulargolems:ignis_fireball": 2, + "modulargolems:ignis_jump": 1 + }, + "cataclysm:storm": { + "modulargolems:damage_cap": 2, + "modulargolems:dynamic_reduction": 1, + "modulargolems:fire_immune": 1, + "modulargolems:scylla_lightning": 1, + "modulargolems:scylla_wave": 1, + "modulargolems:swim": 1, + "modulargolems:thunder_immune": 1 }, "cataclysm:witherite": { "modulargolems:damage_cap": 2, + "modulargolems:dynamic_reduction": 1, "modulargolems:fire_immune": 1, "modulargolems:harbinger_death_beam": 1, "modulargolems:harbinger_missile": 1, "modulargolems:projectile_reject": 1 } }, - "stats": { + "repairIngredients": { + "cataclysm:ancient_metal": { + "item": "cataclysm:ancient_metal_ingot" + }, + "cataclysm:cursium": { + "item": "cataclysm:cursium_ingot" + }, + "cataclysm:ender_guardian": { + "item": "modulargolems:void_cube" + }, "cataclysm:ignitium": { + "item": "cataclysm:ignitium_ingot" + }, + "cataclysm:storm": { + "item": "modulargolems:azure_cube" + }, + "cataclysm:witherite": { + "item": "cataclysm:witherite_ingot" + } + }, + "stats": { + "cataclysm:ancient_metal": { "modulargolems:attack": 20.0, + "modulargolems:dynamic_reduction": 1.0, + "modulargolems:max_health": 288.0, + "modulargolems:sweep": 2.0 + }, + "cataclysm:cursium": { + "modulargolems:attack": 40.0, + "modulargolems:dynamic_reduction": 2.0, + "modulargolems:max_health": 390.0, + "modulargolems:regen": 2.0, + "modulargolems:sweep": 2.0 + }, + "cataclysm:ender_guardian": { + "modulargolems:attack": 20.0, + "modulargolems:dynamic_reduction": 2.0, + "modulargolems:max_health": 333.0, + "modulargolems:sweep": 2.0 + }, + "cataclysm:ignitium": { + "modulargolems:attack": 30.0, + "modulargolems:dynamic_reduction": 2.0, "modulargolems:max_health": 450.0, "modulargolems:range": 1.0, "modulargolems:sweep": 2.0 }, - "cataclysm:witherite": { + "cataclysm:storm": { "modulargolems:attack": 20.0, + "modulargolems:dynamic_reduction": 2.0, + "modulargolems:max_health": 390.0, + "modulargolems:regen": 2.0, + "modulargolems:sweep": 2.0 + }, + "cataclysm:witherite": { + "modulargolems:attack": 30.0, + "modulargolems:dynamic_reduction": 2.0, "modulargolems:max_health": 390.0, "modulargolems:regen": 2.0, "modulargolems:sweep": 2.0 diff --git a/src/generated/resources/data/composite_material/modulargolems_config/materials/composite_material.json b/src/generated/resources/data/composite_material/modulargolems_config/materials/composite_material.json new file mode 100644 index 000000000..c8ec65824 --- /dev/null +++ b/src/generated/resources/data/composite_material/modulargolems_config/materials/composite_material.json @@ -0,0 +1,92 @@ +{ + "ingredients": { + "composite_material:allay_steel": { + "item": "composite_material:allay_steel_ingot" + }, + "composite_material:dungeon_steel": { + "item": "composite_material:dungeon_steel_ingot" + }, + "composite_material:etherite": { + "item": "composite_material:etherite_ingot" + }, + "composite_material:obsidian_steel": { + "item": "composite_material:obsidian_steel_ingot" + }, + "composite_material:primitive": { + "item": "composite_material:primitive_tenacity" + } + }, + "modifiers": { + "composite_material:allay_steel": { + "modulargolems:resonant_attack": 1, + "modulargolems:resonant_heal": 1 + }, + "composite_material:dungeon_steel": { + "modulargolems:dungeon_absorption": 1, + "modulargolems:dungeon_link": 1 + }, + "composite_material:etherite": { + "modulargolems:armor_penetration": 1, + "modulargolems:etherite_plating": 1, + "modulargolems:fire_immune": 1, + "modulargolems:recycle": 1 + }, + "composite_material:obsidian_steel": { + "modulargolems:explosion_resistant": 2, + "modulargolems:fire_immune": 1, + "modulargolems:obsidian": 1 + }, + "composite_material:primitive": { + "modulargolems:damage_cap": 1, + "modulargolems:fire_immune": 1, + "modulargolems:primitive_blast": 1, + "modulargolems:primitive_curse": 1, + "modulargolems:swim": 1 + } + }, + "repairIngredients": { + "composite_material:allay_steel": { + "item": "composite_material:allay_steel_ingot" + }, + "composite_material:dungeon_steel": { + "item": "composite_material:dungeon_steel_ingot" + }, + "composite_material:etherite": { + "item": "composite_material:etherite_ingot" + }, + "composite_material:obsidian_steel": { + "item": "composite_material:obsidian_steel_ingot" + }, + "composite_material:primitive": { + "item": "composite_material:primitive_tenacity" + } + }, + "stats": { + "composite_material:allay_steel": { + "modulargolems:attack": 20.0, + "modulargolems:max_health": 240.0, + "modulargolems:regen": 2.0, + "modulargolems:weight": 0.4 + }, + "composite_material:dungeon_steel": { + "modulargolems:attack": 20.0, + "modulargolems:max_health": 200.0 + }, + "composite_material:etherite": { + "modulargolems:attack": 35.0, + "modulargolems:max_health": 500.0, + "modulargolems:regen": 4.0, + "modulargolems:sweep": 1.0, + "modulargolems:weight": 0.2 + }, + "composite_material:obsidian_steel": { + "modulargolems:attack": 15.0, + "modulargolems:max_health": 150.0 + }, + "composite_material:primitive": { + "modulargolems:attack": 5.0, + "modulargolems:max_health": 500.0, + "modulargolems:weight": -0.2 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/modulargolems_config/materials/create.json b/src/generated/resources/data/create/modulargolems_config/materials/create.json index 126782982..4ed69b91f 100644 --- a/src/generated/resources/data/create/modulargolems_config/materials/create.json +++ b/src/generated/resources/data/create/modulargolems_config/materials/create.json @@ -6,6 +6,9 @@ "create:brass": { "tag": "forge:ingots/brass" }, + "create:cardboard": { + "tag": "modulargolems:cardboard" + }, "create:railway": { "item": "create:railway_casing" }, @@ -26,6 +29,7 @@ "modulargolems:mechanical_force": 1, "modulargolems:mechanical_mobility": 1 }, + "create:cardboard": {}, "create:railway": { "modulargolems:fire_immune": 1, "modulargolems:magic_resistant": 2, @@ -37,6 +41,23 @@ "modulargolems:coating": 1 } }, + "repairIngredients": { + "create:andesite_alloy": { + "item": "create:andesite_alloy" + }, + "create:brass": { + "tag": "forge:ingots/brass" + }, + "create:cardboard": { + "tag": "modulargolems:cardboard" + }, + "create:railway": { + "item": "create:railway_casing" + }, + "create:zinc": { + "tag": "forge:ingots/zinc" + } + }, "stats": { "create:andesite_alloy": { "modulargolems:attack": 5.0, @@ -47,12 +68,19 @@ "modulargolems:knockback_resistance": 0.5, "modulargolems:max_health": 150.0 }, + "create:cardboard": { + "modulargolems:attack": 2.0, + "modulargolems:attack_knockback": 2.0, + "modulargolems:max_health": 2.0, + "modulargolems:weight": 0.4 + }, "create:railway": { "modulargolems:attack": 15.0, "modulargolems:attack_knockback": 1.0, "modulargolems:knockback_resistance": 1.0, "modulargolems:max_health": 300.0, - "modulargolems:sweep": 1.0 + "modulargolems:sweep": 1.0, + "modulargolems:weight": -0.2 }, "create:zinc": { "modulargolems:attack": 10.0, diff --git a/src/generated/resources/data/curios/tags/items/golem_route.json b/src/generated/resources/data/curios/tags/items/golem_route.json new file mode 100644 index 000000000..da87ba441 --- /dev/null +++ b/src/generated/resources/data/curios/tags/items/golem_route.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:patrol_path_recorder" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/curios/tags/items/golem_skin.json b/src/generated/resources/data/curios/tags/items/golem_skin.json index ee46b00ac..39b802fa7 100644 --- a/src/generated/resources/data/curios/tags/items/golem_skin.json +++ b/src/generated/resources/data/curios/tags/items/golem_skin.json @@ -1,5 +1,6 @@ { "values": [ + "modulargolems:golem_facade", "#modulargolems:player_skin", "minecraft:player_head", "minecraft:piglin_head", diff --git a/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json new file mode 100644 index 000000000..f0ffa6b0c --- /dev/null +++ b/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json @@ -0,0 +1,17 @@ +{ + "entries": [ + "modulargolems:slicing_axe_drop_ancient_metal", + "modulargolems:slicing_axe_drop_witherite", + "modulargolems:slicing_axe_drop_ignitium", + "modulargolems:slicing_axe_drop_cloud", + "modulargolems:slicing_axe_drop_sculk", + "modulargolems:slicing_axe_drop_iron", + "modulargolems:slicing_axe_drop_molten_metal", + "modulargolems:slicing_axe_drop_wroughtnaut", + "modulargolems:slicing_axe_drop_cursium", + "modulargolems:slicing_axe_drop_netherite", + "modulargolems:slicing_axe_drop_ender_guardian", + "modulargolems:slicing_axe_drop_storm" + ], + "replace": false +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/damage_type/is_magic.json b/src/generated/resources/data/forge/tags/damage_type/is_magic.json new file mode 100644 index 000000000..49833844d --- /dev/null +++ b/src/generated/resources/data/forge/tags/damage_type/is_magic.json @@ -0,0 +1,6 @@ +{ + "values": [ + "modulargolems:bacon_attack", + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/goety/modulargolems_config/materials/goety.json b/src/generated/resources/data/goety/modulargolems_config/materials/goety.json new file mode 100644 index 000000000..e6ec5f3e8 --- /dev/null +++ b/src/generated/resources/data/goety/modulargolems_config/materials/goety.json @@ -0,0 +1,44 @@ +{ + "ingredients": { + "goety:cursed_metal": { + "item": "goety:cursed_ingot" + }, + "goety:dark_metal": { + "item": "goety:dark_ingot" + } + }, + "modifiers": { + "goety:cursed_metal": { + "modulargolems:fallen_attack": 1, + "modulargolems:fire_immune": 1, + "modulargolems:magic_resistant": 1 + }, + "goety:dark_metal": { + "modulargolems:explosion_resistant": 2, + "modulargolems:fire_immune": 1, + "modulargolems:haunted": 2, + "modulargolems:magic_resistant": 2, + "modulargolems:soul_collection": 1, + "modulargolems:soul_repair": 1 + } + }, + "repairIngredients": { + "goety:cursed_metal": { + "item": "goety:cursed_ingot" + }, + "goety:dark_metal": { + "item": "goety:dark_ingot" + } + }, + "stats": { + "goety:cursed_metal": { + "modulargolems:attack": 15.0, + "modulargolems:max_health": 100.0 + }, + "goety:dark_metal": { + "modulargolems:attack": 20.0, + "modulargolems:max_health": 160.0, + "modulargolems:regen": 4.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/goety_revelation/modulargolems_config/materials/goety_revelation.json b/src/generated/resources/data/goety_revelation/modulargolems_config/materials/goety_revelation.json new file mode 100644 index 000000000..6cb0acec6 --- /dev/null +++ b/src/generated/resources/data/goety_revelation/modulargolems_config/materials/goety_revelation.json @@ -0,0 +1,39 @@ +{ + "ingredients": { + "goety_revelation:apocalyptium": { + "tag": "modulargolems:revelation_ingot" + } + }, + "modifiers": { + "goety_revelation:apocalyptium": { + "modulargolems:add_slot": 2, + "modulargolems:apostle": 1, + "modulargolems:dynamic_reduction": 1, + "modulargolems:explosion_resistant": 3, + "modulargolems:fire_immune": 1, + "modulargolems:magic_immune": 1, + "modulargolems:projectile_reject": 1, + "modulargolems:soul_collection": 2, + "modulargolems:soul_repair": 2, + "modulargolems:the_abhorrent": 1, + "modulargolems:the_risen": 1, + "modulargolems:the_terrible": 2 + } + }, + "repairIngredients": { + "goety_revelation:apocalyptium": { + "tag": "modulargolems:revelation_ingot" + } + }, + "stats": { + "goety_revelation:apocalyptium": { + "modulargolems:attack": 33.0, + "modulargolems:dynamic_reduction": 2.0, + "modulargolems:max_health": 666.0, + "modulargolems:range": 1.0, + "modulargolems:regen": 6.0, + "modulargolems:speed": 0.66, + "modulargolems:sweep": 3.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/iceandfire/modulargolems_config/materials/iceandfire.json b/src/generated/resources/data/iceandfire/modulargolems_config/materials/iceandfire.json new file mode 100644 index 000000000..de817ba59 --- /dev/null +++ b/src/generated/resources/data/iceandfire/modulargolems_config/materials/iceandfire.json @@ -0,0 +1,52 @@ +{ + "ingredients": { + "iceandfire:fire_dragonsteel": { + "item": "iceandfire:dragonsteel_fire_ingot" + }, + "iceandfire:ice_dragonsteel": { + "item": "iceandfire:dragonsteel_ice_ingot" + }, + "iceandfire:lightning_dragonsteel": { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + }, + "modifiers": { + "iceandfire:fire_dragonsteel": { + "modulargolems:fire_dragonsteel_attack": 1, + "modulargolems:fire_immune": 1 + }, + "iceandfire:ice_dragonsteel": { + "modulargolems:ice_dragonsteel_armor": 1, + "modulargolems:ice_dragonsteel_attack": 1 + }, + "iceandfire:lightning_dragonsteel": { + "modulargolems:lightning_dragonsteel_attack": 1, + "modulargolems:thunder_immune": 1 + } + }, + "repairIngredients": { + "iceandfire:fire_dragonsteel": { + "item": "iceandfire:dragonsteel_fire_ingot" + }, + "iceandfire:ice_dragonsteel": { + "item": "iceandfire:dragonsteel_ice_ingot" + }, + "iceandfire:lightning_dragonsteel": { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + }, + "stats": { + "iceandfire:fire_dragonsteel": { + "modulargolems:attack": 40.0, + "modulargolems:max_health": 400.0 + }, + "iceandfire:ice_dragonsteel": { + "modulargolems:attack": 40.0, + "modulargolems:max_health": 400.0 + }, + "iceandfire:lightning_dragonsteel": { + "modulargolems:attack": 40.0, + "modulargolems:max_health": 400.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/irons_spellbooks/tags/entity_types/cant_root.json b/src/generated/resources/data/irons_spellbooks/tags/entity_types/cant_root.json new file mode 100644 index 000000000..7334e5b5a --- /dev/null +++ b/src/generated/resources/data/irons_spellbooks/tags/entity_types/cant_root.json @@ -0,0 +1,7 @@ +{ + "values": [ + "modulargolems:metal_golem", + "modulargolems:humanoid_golem", + "modulargolems:dog_golem" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/l2complements/modulargolems_config/materials/l2complements.json b/src/generated/resources/data/l2complements/modulargolems_config/materials/l2complements.json index a80ff150a..21b79023a 100644 --- a/src/generated/resources/data/l2complements/modulargolems_config/materials/l2complements.json +++ b/src/generated/resources/data/l2complements/modulargolems_config/materials/l2complements.json @@ -31,6 +31,20 @@ "modulargolems:totemic_gold": 1 } }, + "repairIngredients": { + "l2complements:eternium": { + "item": "l2complements:eternium_ingot" + }, + "l2complements:poseidite": { + "item": "l2complements:poseidite_ingot" + }, + "l2complements:shulkerate": { + "item": "l2complements:shulkerate_ingot" + }, + "l2complements:totemic_gold": { + "item": "l2complements:totemic_gold_ingot" + } + }, "stats": { "l2complements:eternium": { "modulargolems:attack": 10.0, diff --git a/src/generated/resources/data/l2complements/tags/mob_effect/skill_effect.json b/src/generated/resources/data/l2complements/tags/mob_effect/skill_effect.json index 18bfab629..32cd59d9f 100644 --- a/src/generated/resources/data/l2complements/tags/mob_effect/skill_effect.json +++ b/src/generated/resources/data/l2complements/tags/mob_effect/skill_effect.json @@ -7,6 +7,22 @@ { "id": "modulargolems:mechanical_force", "required": false + }, + { + "id": "modulargolems:maledictus_rage", + "required": false + }, + { + "id": "modulargolems:atomic_boost", + "required": false + }, + { + "id": "modulargolems:manyullyn_effect", + "required": false + }, + { + "id": "modulargolems:hepatizon_effect", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/l2hostility/modulargolems_config/materials/l2hostility.json b/src/generated/resources/data/l2hostility/modulargolems_config/materials/l2hostility.json new file mode 100644 index 000000000..8d6e7e433 --- /dev/null +++ b/src/generated/resources/data/l2hostility/modulargolems_config/materials/l2hostility.json @@ -0,0 +1,48 @@ +{ + "ingredients": { + "l2hostility:chaotic": { + "item": "l2hostility:chaos_ingot" + }, + "l2hostility:miraculous": { + "item": "l2hostility:miracle_ingot" + } + }, + "modifiers": { + "l2hostility:chaotic": { + "modulargolems:add_slot": 1, + "modulargolems:armor_penetration": 1, + "modulargolems:hostility_core": 1, + "modulargolems:player_immune": 1 + }, + "l2hostility:miraculous": { + "modulargolems:add_slot": 2, + "modulargolems:armor_penetration": 2, + "modulargolems:hostility_adaptive": 1, + "modulargolems:hostility_core": 1, + "modulargolems:hostility_dispell": 1, + "modulargolems:player_immune": 1 + } + }, + "repairIngredients": { + "l2hostility:chaotic": { + "item": "l2hostility:chaos_ingot" + }, + "l2hostility:miraculous": { + "item": "l2hostility:miracle_ingot" + } + }, + "stats": { + "l2hostility:chaotic": { + "modulargolems:attack": 25.0, + "modulargolems:max_health": 400.0, + "modulargolems:regen": 5.0, + "modulargolems:sweep": 2.0 + }, + "l2hostility:miraculous": { + "modulargolems:attack": 35.0, + "modulargolems:max_health": 600.0, + "modulargolems:regen": 10.0, + "modulargolems:sweep": 3.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/l2itemselector/tags/items/selectable.json b/src/generated/resources/data/l2itemselector/tags/items/selectable.json index a64b3b31a..0f80e8a05 100644 --- a/src/generated/resources/data/l2itemselector/tags/items/selectable.json +++ b/src/generated/resources/data/l2itemselector/tags/items/selectable.json @@ -1,9 +1,5 @@ { "values": [ - "modulargolems:omnipotent_wand_command", - "modulargolems:omnipotent_wand_retrieval", - "modulargolems:omnipotent_wand_summon", - "modulargolems:omnipotent_wand_rider", - "modulargolems:omnipotent_wand_squad" + "#modulargolems:golem_omni_wand" ] } \ No newline at end of file diff --git a/src/generated/resources/data/l2screentracker/tags/items/quick_access_vanilla.json b/src/generated/resources/data/l2screentracker/tags/items/quick_access_vanilla.json new file mode 100644 index 000000000..7ef9317f7 --- /dev/null +++ b/src/generated/resources/data/l2screentracker/tags/items/quick_access_vanilla.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:golem_workbench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/legendary_monsters/modulargolems_config/materials/legendary_monsters.json b/src/generated/resources/data/legendary_monsters/modulargolems_config/materials/legendary_monsters.json new file mode 100644 index 000000000..f5779b038 --- /dev/null +++ b/src/generated/resources/data/legendary_monsters/modulargolems_config/materials/legendary_monsters.json @@ -0,0 +1,47 @@ +{ + "ingredients": { + "legendary_monsters:cloud": { + "item": "modulargolems:cloud_cube" + }, + "legendary_monsters:molten_metal": { + "item": "legendary_monsters:molten_metal_ingot" + } + }, + "modifiers": { + "legendary_monsters:cloud": { + "modulargolems:add_slot": 1, + "modulargolems:cloud_forming": 1, + "modulargolems:damage_cap": 2, + "modulargolems:fire_immune": 1, + "modulargolems:thunderstorm": 1 + }, + "legendary_monsters:molten_metal": { + "modulargolems:ancient_anchor": 1, + "modulargolems:armor_penetration": 2, + "modulargolems:fire_immune": 1, + "modulargolems:projectile_reject": 1 + } + }, + "repairIngredients": { + "legendary_monsters:cloud": { + "item": "modulargolems:cloud_cube" + }, + "legendary_monsters:molten_metal": { + "item": "legendary_monsters:molten_metal_ingot" + } + }, + "stats": { + "legendary_monsters:cloud": { + "modulargolems:attack": 40.0, + "modulargolems:attack_knockback": 1.0, + "modulargolems:max_health": 600.0, + "modulargolems:sweep": 2.0 + }, + "legendary_monsters:molten_metal": { + "modulargolems:attack": 20.0, + "modulargolems:attack_knockback": 1.0, + "modulargolems:max_health": 200.0, + "modulargolems:sweep": 2.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/combat/golem_slicing_axe.json b/src/generated/resources/data/minecraft/advancements/recipes/combat/golem_slicing_axe.json new file mode 100644 index 000000000..5c1cb9941 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancements/recipes/combat/golem_slicing_axe.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_upgrade_smithing_template": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_upgrade_smithing_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:golem_slicing_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_upgrade_smithing_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecraft:golem_slicing_axe" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_complements.json b/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_complements.json new file mode 100644 index 000000000..f4f0c6fda --- /dev/null +++ b/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_complements.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "l2complements" + } + ], + "criteria": { + "has_sonic_shooter": { + "conditions": { + "items": [ + { + "items": [ + "l2complements:sonic_shooter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:sonic_cannon_complements" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_sonic_shooter", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecraft:sonic_cannon_complements" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_dungeon.json b/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_dungeon.json new file mode 100644 index 000000000..8439b4dab --- /dev/null +++ b/src/generated/resources/data/minecraft/advancements/recipes/combat/sonic_cannon_dungeon.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "golemdungeons" + } + ], + "criteria": { + "has_sculk_golem_scythe": { + "conditions": { + "items": [ + { + "items": [ + "golemdungeons:sculk_golem_scythe" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:sonic_cannon_dungeon" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_sculk_golem_scythe", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecraft:sonic_cannon_dungeon" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipes/golem_slicing_axe.json b/src/generated/resources/data/minecraft/recipes/golem_slicing_axe.json new file mode 100644 index 000000000..7721ca7dc --- /dev/null +++ b/src/generated/resources/data/minecraft/recipes/golem_slicing_axe.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "minecraft:stonecutter" + }, + "base": { + "item": "modulargolems:diamond_golem_axe" + }, + "result": { + "item": "modulargolems:golem_slicing_axe" + }, + "template": { + "item": "minecraft:netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipes/sonic_cannon_complements.json b/src/generated/resources/data/minecraft/recipes/sonic_cannon_complements.json new file mode 100644 index 000000000..2c8f8d86a --- /dev/null +++ b/src/generated/resources/data/minecraft/recipes/sonic_cannon_complements.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "l2complements" + } + ], + "key": { + "B": { + "item": "l2complements:sonic_shooter" + }, + "D": { + "item": "l2complements:resonant_feather" + }, + "I": { + "item": "l2complements:warden_bone_shard" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "BDD", + "TII" + ], + "result": { + "item": "modulargolems:sonic_cannon" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipes/sonic_cannon_dungeon.json b/src/generated/resources/data/minecraft/recipes/sonic_cannon_dungeon.json new file mode 100644 index 000000000..3fb5eb5e3 --- /dev/null +++ b/src/generated/resources/data/minecraft/recipes/sonic_cannon_dungeon.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "golemdungeons" + } + ], + "key": { + "B": { + "item": "minecraft:sculk_catalyst" + }, + "D": { + "item": "minecraft:sculk_shrieker" + }, + "I": { + "item": "golemdungeons:sculk_golem_scythe" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "BBD", + "TII" + ], + "result": { + "item": "modulargolems:sonic_cannon" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 000000000..7ef9317f7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:golem_workbench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json new file mode 100644 index 000000000..49833844d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -0,0 +1,6 @@ +{ + "values": [ + "modulargolems:bacon_attack", + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_cooldown.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_cooldown.json new file mode 100644 index 000000000..49833844d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_cooldown.json @@ -0,0 +1,6 @@ +{ + "values": [ + "modulargolems:bacon_attack", + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json new file mode 100644 index 000000000..019347a0e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json new file mode 100644 index 000000000..019347a0e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json new file mode 100644 index 000000000..019347a0e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json @@ -0,0 +1,5 @@ +{ + "values": [ + "modulargolems:echo_attack" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_body.json new file mode 100644 index 000000000..d9ac8e80a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_legs.json new file mode 100644 index 000000000..7f9fcb4d1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..c6b498012 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_body.json new file mode 100644 index 000000000..8cfc3604e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..cd913b745 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_arm.json new file mode 100644 index 000000000..cdd948ae7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_body.json new file mode 100644 index 000000000..c333fb984 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_legs.json new file mode 100644 index 000000000..3bf72c947 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/amethyst_bronze_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/amethyst_bronze_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/amethyst_bronze_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_chestplate.json new file mode 100644 index 000000000..79371d9a5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/barbaric_vanguard_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/barbaric_vanguard_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_helmet.json new file mode 100644 index 000000000..cf8dc4870 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/barbaric_vanguard_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/barbaric_vanguard_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_shinguard.json new file mode 100644 index 000000000..679f12e79 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/barbaric_vanguard_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/barbaric_vanguard_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/barbaric_vanguard_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_body.json new file mode 100644 index 000000000..2973e57f8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_legs.json new file mode 100644 index 000000000..38b148440 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..d422840b5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_body.json new file mode 100644 index 000000000..e09a65745 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..90209dff2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_arm.json new file mode 100644 index 000000000..c2479a368 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_body.json new file mode 100644 index 000000000..fed36b4ac --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_legs.json new file mode 100644 index 000000000..dc2bf70c3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/cobalt_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/cobalt_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/cobalt_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_body.json new file mode 100644 index 000000000..8b0d6c5f5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_legs.json new file mode 100644 index 000000000..519ec2dfa --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..6380a4ce9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_body.json new file mode 100644 index 000000000..f7072c455 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..82f1d0bab --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_arm.json new file mode 100644 index 000000000..385b771df --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_body.json new file mode 100644 index 000000000..8f8dff25a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_legs.json new file mode 100644 index 000000000..e1b2b8e84 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/copper_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/copper_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/copper_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/diamond.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/diamond.json new file mode 100644 index 000000000..4ed390706 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/diamond.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/diamond" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/diamond" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/emerald.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/emerald.json new file mode 100644 index 000000000..20e98e1e6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/emerald.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/emerald" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/emerald" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold.json new file mode 100644 index 000000000..8e2af5a6d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_body.json new file mode 100644 index 000000000..9eb47fa4d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_legs.json new file mode 100644 index 000000000..957029156 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..afed365d6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_body.json new file mode 100644 index 000000000..65004baee --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..44c7920e6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_arm.json new file mode 100644 index 000000000..063d3c5a5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_body.json new file mode 100644 index 000000000..33bdb936c --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_legs.json new file mode 100644 index 000000000..e2ce575c2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/gold_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/gold_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/gold_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_body.json new file mode 100644 index 000000000..a106f7c73 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_legs.json new file mode 100644 index 000000000..1dadba52e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..1cf3ade83 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_body.json new file mode 100644 index 000000000..9bd54333f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..817387b3f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_arm.json new file mode 100644 index 000000000..8f21a5cd9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_body.json new file mode 100644 index 000000000..0c11f087d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_legs.json new file mode 100644 index 000000000..25c3792d7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/hepatizon_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/hepatizon_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/hepatizon_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_body.json new file mode 100644 index 000000000..2bdcfc9fe --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_legs.json new file mode 100644 index 000000000..68e6e536e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..dd601b147 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_body.json new file mode 100644 index 000000000..6b9bf9f12 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..083e9e50d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_arm.json new file mode 100644 index 000000000..daaa9397e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_body.json new file mode 100644 index 000000000..3d6023173 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_legs.json new file mode 100644 index 000000000..3a0d1330b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/iron_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/iron_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/iron_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_body.json new file mode 100644 index 000000000..6d2723a58 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_legs.json new file mode 100644 index 000000000..9c5915a76 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..3e1c56043 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_body.json new file mode 100644 index 000000000..a5855c02e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..a8e636d15 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_arm.json new file mode 100644 index 000000000..18a70affb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_body.json new file mode 100644 index 000000000..cd8b117a6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_legs.json new file mode 100644 index 000000000..91142b07b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/manyullyn_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/manyullyn_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/manyullyn_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite.json new file mode 100644 index 000000000..563312ef5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_body.json new file mode 100644 index 000000000..630fb6a57 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_legs.json new file mode 100644 index 000000000..aa36e8d1c --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..8b315adb4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_body.json new file mode 100644 index 000000000..191c0db53 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..3edbbeaa6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_arm.json new file mode 100644 index 000000000..d1585630e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_body.json new file mode 100644 index 000000000..e690249db --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_legs.json new file mode 100644 index 000000000..0cf65e994 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/netherite_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/netherite_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/netherite_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/quartz.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/quartz.json new file mode 100644 index 000000000..a9a138b00 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/quartz.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/quartz" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/quartz" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_chestplate.json new file mode 100644 index 000000000..04aff1453 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/roman_guard_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/roman_guard_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_helmet.json new file mode 100644 index 000000000..c9c4f257e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/roman_guard_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/roman_guard_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_shinguard.json new file mode 100644 index 000000000..46977caa2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/roman_guard_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/roman_guard_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/roman_guard_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_body.json new file mode 100644 index 000000000..f995cd066 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_legs.json new file mode 100644 index 000000000..6d54491c3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..ea069cca8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_body.json new file mode 100644 index 000000000..4cd10b93e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..aa3f32d70 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_arm.json new file mode 100644 index 000000000..42d708cb8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_body.json new file mode 100644 index 000000000..184b7f26a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_legs.json new file mode 100644 index 000000000..65fb20cb2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/rose_gold_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/rose_gold_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/rose_gold_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/thunder_immune.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/thunder_immune.json new file mode 100644 index 000000000..d39c3e322 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/thunder_immune.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/thunder_immune" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/thunder_immune" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_boots.json new file mode 100644 index 000000000..d043a6230 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/wind_spirit_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/wind_spirit_boots" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_chestplate.json new file mode 100644 index 000000000..0529c6d15 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/wind_spirit_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/wind_spirit_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_helmet.json new file mode 100644 index 000000000..b3cb00292 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/wind_spirit_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/wind_spirit_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_shinguard.json new file mode 100644 index 000000000..8b2fe4536 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/wind_spirit_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/wind_spirit_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/wind_spirit_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_body.json new file mode 100644 index 000000000..e04e0ef8a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_dog_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_dog_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_legs.json new file mode 100644 index 000000000..3ebce51bc --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_dog_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_dog_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_dog_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_dog_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..aa998540d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_arms.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_humanoid_golem_arms": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_arms" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_humanoid_golem_arms" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_arms", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_humanoid_golem_arms" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_body.json new file mode 100644 index 000000000..6f1b2192a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_humanoid_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_humanoid_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..6628a754d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_humanoid_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_humanoid_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_humanoid_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_humanoid_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_arm.json new file mode 100644 index 000000000..7d9889367 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_arm.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_metal_golem_arm": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_arm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_metal_golem_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_arm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_metal_golem_arm" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_body.json new file mode 100644 index 000000000..62e1f9e45 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_body.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_metal_golem_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_metal_golem_body" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_legs.json new file mode 100644 index 000000000..eb330d19f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/casting/casting/zinc_casting_metal_golem_legs.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "criteria": { + "has_metal_golem_legs": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_legs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:casting/zinc_casting_metal_golem_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_legs", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:casting/zinc_casting_metal_golem_legs" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_boots.json new file mode 100644 index 000000000..f43a232d3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_barbaric_vanguard_boots": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_boots" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apocalyptium_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_boots", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apocalyptium_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_chestplate.json new file mode 100644 index 000000000..700270a52 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_barbaric_vanguard_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apocalyptium_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_chestplate", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apocalyptium_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_helmet.json new file mode 100644 index 000000000..9dff9d91b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_barbaric_vanguard_helmet": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apocalyptium_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_helmet", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apocalyptium_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_shinguard.json new file mode 100644 index 000000000..79132bdeb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apocalyptium_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_barbaric_vanguard_shinguard": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_shinguard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apocalyptium_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_shinguard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apocalyptium_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_base.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_base.json new file mode 100644 index 000000000..5dacaf0eb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_base.json @@ -0,0 +1,48 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + }, + { + "type": "forge:not", + "value": { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apostle_base" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apostle_base" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_revelation.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_revelation.json new file mode 100644 index 000000000..31bbaa737 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/apostle_revelation.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:apostle_revelation" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:apostle_revelation" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/barbaric_vanguard_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/barbaric_vanguard_boots.json new file mode 100644 index 000000000..5a2004605 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/barbaric_vanguard_boots.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:diamond" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:barbaric_vanguard_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:barbaric_vanguard_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_boots.json new file mode 100644 index 000000000..bdc4600cd --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_boots.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_beacon": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:beacon" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:beacon_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_beacon", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:beacon_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_cannon.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_cannon.json new file mode 100644 index 000000000..1495ae0ae --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/beacon_cannon.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_beacon": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:beacon" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:beacon_cannon" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_beacon", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:beacon_cannon" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/diamond_dog_golem_armor.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/diamond_dog_golem_armor.json new file mode 100644 index 000000000..97198dd6a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/diamond_dog_golem_armor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:diamond" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:diamond_dog_golem_armor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:diamond_dog_golem_armor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_boots.json new file mode 100644 index 000000000..b8675f91e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_chestplate.json new file mode 100644 index 000000000..1cd777207 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_axe.json new file mode 100644 index 000000000..fad6b8fed --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_golem_axe" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_spear.json new file mode 100644 index 000000000..9aac2adc1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_golem_spear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_sword.json new file mode 100644 index 000000000..822d7580f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_golem_sword" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_helmet.json new file mode 100644 index 000000000..c08f776ce --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_shinguard.json new file mode 100644 index 000000000..c16e8b0d2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fiery_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_fiery_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fiery_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_fiery_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fiery_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_blast.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_blast.json new file mode 100644 index 000000000..d3b269a8a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_blast.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fire_blast" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_blood": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_blood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_blood", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fire_blast" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_tornado.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_tornado.json new file mode 100644 index 000000000..9ac034ebb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/fire_tornado.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:fire_tornado" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_blood": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_blood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_blood", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:fire_tornado" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/flame_thrower.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/flame_thrower.json new file mode 100644 index 000000000..c2b9231ca --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/flame_thrower.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_rod": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:blaze_rod" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:flame_thrower" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blaze_rod", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:flame_thrower" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/gold_dog_golem_armor.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/gold_dog_golem_armor.json new file mode 100644 index 000000000..be412f7da --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/gold_dog_golem_armor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gold_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:gold_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:gold_dog_golem_armor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gold_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:gold_dog_golem_armor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_chestplate.json new file mode 100644 index 000000000..83b00844d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:harbinger_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_chestplate", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:harbinger_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_helmet.json new file mode 100644 index 000000000..725408578 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_helmet": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:harbinger_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_helmet", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:harbinger_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_shinguard.json new file mode 100644 index 000000000..274eaadc2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/harbinger_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_shinguard": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_shinguard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:harbinger_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_shinguard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:harbinger_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_blast.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_blast.json new file mode 100644 index 000000000..af9890ea3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_blast.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:hell_blast" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_fabric": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_fabric" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_fabric", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:hell_blast" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_bolt.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_bolt.json new file mode 100644 index 000000000..d2ba5655f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_bolt.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:hell_bolt" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_fabric": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_fabric" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_fabric", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:hell_bolt" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_cloud.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_cloud.json new file mode 100644 index 000000000..15c273620 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/hell_cloud.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:hell_cloud" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_blood": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_blood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_blood", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:hell_cloud" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_chestplate.json new file mode 100644 index 000000000..6c3a3a504 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ignis_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_chestplate", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ignis_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_helmet.json new file mode 100644 index 000000000..863f315e4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_helmet": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ignis_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_helmet", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ignis_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_shinguard.json new file mode 100644 index 000000000..77ac5afd5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ignis_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_shinguard": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_shinguard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ignis_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_shinguard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ignis_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_dog_golem_armor.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_dog_golem_armor.json new file mode 100644 index 000000000..1605334ee --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_dog_golem_armor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_iron_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:iron_dog_golem_armor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:iron_dog_golem_armor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_mecha_bow.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_mecha_bow.json new file mode 100644 index 000000000..a0fb4ceec --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/iron_mecha_bow.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_bow": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:bow" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:iron_mecha_bow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_bow", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:iron_mecha_bow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_boots.json new file mode 100644 index 000000000..68368d9c6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_chestplate.json new file mode 100644 index 000000000..438c6999c --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_axe.json new file mode 100644 index 000000000..d78f5450f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_golem_axe" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_spear.json new file mode 100644 index 000000000..1972b4fa9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_golem_spear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_sword.json new file mode 100644 index 000000000..df086c488 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_golem_sword" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_helmet.json new file mode 100644 index 000000000..2391bb02d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_shinguard.json new file mode 100644 index 000000000..638422966 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/ironwood_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_ironwood_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ironwood_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:ironwood_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ironwood_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:ironwood_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_boots.json new file mode 100644 index 000000000..3b18595d5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_chestplate.json new file mode 100644 index 000000000..bb0583e83 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_axe.json new file mode 100644 index 000000000..6d5ed732d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_golem_axe" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_spear.json new file mode 100644 index 000000000..e950b195b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_golem_spear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_sword.json new file mode 100644 index 000000000..2ae5b1161 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_golem_sword" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_helmet.json new file mode 100644 index 000000000..2709d285b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_shinguard.json new file mode 100644 index 000000000..b123e8cc5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/knightmetal_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_knightmetal_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:knightmetal_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_knightmetal_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:knightmetal_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_chestplate.json new file mode 100644 index 000000000..b86590d5e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:maledictus_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_chestplate", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:maledictus_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_helmet.json new file mode 100644 index 000000000..408c8ef4a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_helmet": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:maledictus_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_helmet", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:maledictus_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_shinguard.json new file mode 100644 index 000000000..b68460258 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/maledictus_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_shinguard": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_shinguard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:maledictus_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_shinguard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:maledictus_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_chestplate.json new file mode 100644 index 000000000..6250690f0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:monstrosity_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_chestplate", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:monstrosity_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_helmet.json new file mode 100644 index 000000000..949ae35c2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_helmet": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:monstrosity_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_helmet", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:monstrosity_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_shinguard.json new file mode 100644 index 000000000..d2e2c7104 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/monstrosity_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_barbaric_vanguard_shinguard": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:barbaric_vanguard_shinguard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:monstrosity_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barbaric_vanguard_shinguard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:monstrosity_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_boots.json new file mode 100644 index 000000000..2e4b9a1c3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_naga_scale": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_scale" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:naga_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_naga_scale", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:naga_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_chestplate.json new file mode 100644 index 000000000..9195dd76b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_naga_scale": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_scale" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:naga_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_naga_scale", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:naga_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_helmet.json new file mode 100644 index 000000000..c58350b50 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_naga_scale": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_scale" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:naga_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_naga_scale", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:naga_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_shinguard.json new file mode 100644 index 000000000..d13763ddd --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/naga_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_naga_scale": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_scale" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:naga_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_naga_scale", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:naga_shinguard" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_dog_golem_armor.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_dog_golem_armor.json new file mode 100644 index 000000000..687b3b0c2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_dog_golem_armor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_dog_golem_armor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_dog_golem_armor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_mecha_bow.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_mecha_bow.json new file mode 100644 index 000000000..f47413960 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/netherite_mecha_bow.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_mecha_bow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_mecha_bow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/soul_collection.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/soul_collection.json new file mode 100644 index 000000000..fdd403549 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/soul_collection.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "criteria": { + "has_dark_ingot": { + "conditions": { + "items": [ + { + "items": [ + "goety:dark_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:soul_collection" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dark_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:soul_collection" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_axe.json new file mode 100644 index 000000000..1fe394cbb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_steeleaf_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:steeleaf_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:steeleaf_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_steeleaf_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:steeleaf_golem_axe" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_spear.json new file mode 100644 index 000000000..3e81c0ed9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_steeleaf_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:steeleaf_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:steeleaf_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_steeleaf_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:steeleaf_golem_spear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_sword.json new file mode 100644 index 000000000..e2ed25a30 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/steeleaf_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_steeleaf_ingot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:steeleaf_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:steeleaf_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_steeleaf_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:steeleaf_golem_sword" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/stellar_apocalypse.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/stellar_apocalypse.json new file mode 100644 index 000000000..63d825d3a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/stellar_apocalypse.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_netherite_golem_sword": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:netherite_golem_sword" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:stellar_apocalypse" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_golem_sword", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:stellar_apocalypse" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_abhorrent.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_abhorrent.json new file mode 100644 index 000000000..bd6a489b8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_abhorrent.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:the_abhorrent" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:the_abhorrent" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_atrocious.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_atrocious.json new file mode 100644 index 000000000..abfed34c6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_atrocious.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:the_atrocious" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:the_atrocious" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_profane.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_profane.json new file mode 100644 index 000000000..26d18e6f3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_profane.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:the_profane" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:the_profane" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_terrible.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_terrible.json new file mode 100644 index 000000000..46c36d4f7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/the_terrible.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:the_terrible" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_unholy_hat": { + "conditions": { + "items": [ + { + "items": [ + "goety:unholy_hat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_unholy_hat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:the_terrible" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wind_spirit_boots.json new file mode 100644 index 000000000..3c6c030a4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wind_spirit_boots.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:diamond" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:wind_spirit_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:wind_spirit_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut.json new file mode 100644 index 000000000..5b555345d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:wroughtnaut" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wroughtnaut_ingot": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:wroughtnaut_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wroughtnaut_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:wroughtnaut" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut_ingot.json b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut_ingot.json new file mode 100644 index 000000000..4e7dea3c9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/combat/wroughtnaut_ingot.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "criteria": { + "has_iron_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:wroughtnaut_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:wroughtnaut_ingot" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_dog_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_dog_golem_holder.json new file mode 100644 index 000000000..ffbc7f40d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_dog_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:diamond_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:diamond_expansion_template_dog_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:diamond_expansion_template_dog_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_humanoid_golem_holder.json new file mode 100644 index 000000000..a1abe0b7e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_humanoid_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:diamond_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:diamond_expansion_template_humanoid_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:diamond_expansion_template_humanoid_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_metal_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_metal_golem_holder.json new file mode 100644 index 000000000..d55e65fdc --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/diamond_expansion_template_metal_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:diamond_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:diamond_expansion_template_metal_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:diamond_expansion_template_metal_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/assemble_holder.json similarity index 84% rename from src/generated/resources/data/modulargolems/advancements/recipes/dog_golem_holder.json rename to src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/assemble_holder.json index 2bfe17d63..1460a7a78 100644 --- a/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem_holder.json +++ b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/assemble_holder.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "modulargolems:dog_golem_holder" + "recipe": "modulargolems:dog_golem/assemble_holder" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "modulargolems:dog_golem_holder" + "modulargolems:dog_golem/assemble_holder" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_body.json new file mode 100644 index 000000000..787a34b79 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_body.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:dog_golem/replace_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:dog_golem/replace_body" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_legs.json new file mode 100644 index 000000000..da0225767 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/dog_golem/replace_legs.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_dog_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:dog_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:dog_golem/replace_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_dog_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:dog_golem/replace_legs" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/assemble_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/assemble_holder.json new file mode 100644 index 000000000..fca0037a1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/assemble_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:humanoid_golem/assemble_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:humanoid_golem/assemble_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_arms.json similarity index 84% rename from src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem_holder.json rename to src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_arms.json index afdff7758..4e6e3b9c0 100644 --- a/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem_holder.json +++ b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_arms.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "modulargolems:humanoid_golem_holder" + "recipe": "modulargolems:humanoid_golem/replace_arms" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "modulargolems:humanoid_golem_holder" + "modulargolems:humanoid_golem/replace_arms" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_body.json b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_body.json new file mode 100644 index 000000000..d89a15e68 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_body.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:humanoid_golem/replace_body" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:humanoid_golem/replace_body" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_legs.json new file mode 100644 index 000000000..8d9efa925 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/humanoid_golem/replace_legs.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_humanoid_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:humanoid_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:humanoid_golem/replace_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_humanoid_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:humanoid_golem/replace_legs" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_chestplate.json new file mode 100644 index 000000000..bd711df82 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/barbaric_vanguard_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/barbaric_vanguard_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_helmet.json new file mode 100644 index 000000000..867c2ae87 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/barbaric_vanguard_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/barbaric_vanguard_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_shinguard.json new file mode 100644 index 000000000..36c0023d8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/barbaric_vanguard_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/barbaric_vanguard_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/barbaric_vanguard_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_axe.json new file mode 100644 index 000000000..da3ee65f2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/diamond_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/diamond_golem_axe" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_spear.json new file mode 100644 index 000000000..ed7196d8f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/diamond_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/diamond_golem_spear" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_sword.json new file mode 100644 index 000000000..db7293284 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/diamond_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/diamond_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/diamond_golem_sword" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_axe.json new file mode 100644 index 000000000..2fb38ef7e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/iron_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/iron_golem_axe" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_spear.json new file mode 100644 index 000000000..d95da16f2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/iron_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/iron_golem_spear" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_sword.json new file mode 100644 index 000000000..8f6b0428c --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/iron_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/iron_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/iron_golem_sword" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_axe.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_axe.json new file mode 100644 index 000000000..634bb0b73 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/netherite_golem_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/netherite_golem_axe" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_spear.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_spear.json new file mode 100644 index 000000000..e4815d978 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_spear.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/netherite_golem_spear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/netherite_golem_spear" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_sword.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_sword.json new file mode 100644 index 000000000..176c2970f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/netherite_golem_sword.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/netherite_golem_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/netherite_golem_sword" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_chestplate.json new file mode 100644 index 000000000..79137f4cb --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/roman_guard_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/roman_guard_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_helmet.json new file mode 100644 index 000000000..44aaa28cf --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/roman_guard_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/roman_guard_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_shinguard.json new file mode 100644 index 000000000..ac4abe47b --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/roman_guard_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/roman_guard_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/roman_guard_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_boots.json new file mode 100644 index 000000000..d6d635121 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_boots.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/wind_spirit_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/wind_spirit_boots" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_chestplate.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_chestplate.json new file mode 100644 index 000000000..ec785670f --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_chestplate.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/wind_spirit_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/wind_spirit_chestplate" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_helmet.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_helmet.json new file mode 100644 index 000000000..fd735b581 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_helmet.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/wind_spirit_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/wind_spirit_helmet" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_shinguard.json b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_shinguard.json new file mode 100644 index 000000000..b35614d32 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/melting/melting/wind_spirit_shinguard.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "criteria": { + "has_empty_upgrade": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:melting/wind_spirit_shinguard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_empty_upgrade", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:melting/wind_spirit_shinguard" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/assemble_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/assemble_holder.json new file mode 100644 index 000000000..89abfaaf4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/assemble_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:metal_golem/assemble_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:metal_golem/assemble_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_body.json similarity index 84% rename from src/generated/resources/data/modulargolems/advancements/recipes/metal_golem_holder.json rename to src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_body.json index 335ba0525..3781185bb 100644 --- a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem_holder.json +++ b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_body.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "modulargolems:metal_golem_holder" + "recipe": "modulargolems:metal_golem/replace_body" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "modulargolems:metal_golem_holder" + "modulargolems:metal_golem/replace_body" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_left_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_left_arm.json new file mode 100644 index 000000000..5191e23ae --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_left_arm.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:metal_golem/replace_left_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:metal_golem/replace_left_arm" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_legs.json b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_legs.json new file mode 100644 index 000000000..fced93f20 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_legs.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:metal_golem/replace_legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:metal_golem/replace_legs" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_right_arm.json b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_right_arm.json new file mode 100644 index 000000000..cd247c380 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/metal_golem/replace_right_arm.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_metal_golem_body": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:metal_golem_body" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:metal_golem/replace_right_arm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_metal_golem_body", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:metal_golem/replace_right_arm" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/azure_cube.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/azure_cube.json new file mode 100644 index 000000000..06992ea71 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/azure_cube.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_lacrima": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:lacrima" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:azure_cube" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lacrima", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:azure_cube" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_construct.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_construct.json new file mode 100644 index 000000000..8ff97e0e8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_construct.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "criteria": { + "has_radiant_essence": { + "conditions": { + "items": [ + { + "items": [ + "alexscaves:radiant_essence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:candy_construct" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_radiant_essence", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:candy_construct" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_mixture.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_mixture.json new file mode 100644 index 000000000..c9876fbc5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/candy_mixture.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "criteria": { + "has_caramel": { + "conditions": { + "items": [ + { + "items": [ + "alexscaves:caramel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:candy_mixture" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_caramel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:candy_mixture" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/cloud_cube.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/cloud_cube.json new file mode 100644 index 000000000..8a7f52b8a --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/cloud_cube.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "criteria": { + "has_air_rune": { + "conditions": { + "items": [ + { + "items": [ + "legendary_monsters:air_rune" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:cloud_cube" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_air_rune", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:cloud_cube" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/diamond_expansion_template.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/diamond_expansion_template.json new file mode 100644 index 000000000..296e16da5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/diamond_expansion_template.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_diamond": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:diamond" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:diamond_expansion_template" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_diamond", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:diamond_expansion_template" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/etherite.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/etherite.json new file mode 100644 index 000000000..1018735a5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/etherite.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "criteria": { + "has_etherite_ingot": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:etherite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_etherite_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:etherite" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/golem_workbench.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/golem_workbench.json new file mode 100644 index 000000000..49c0928c5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/golem_workbench.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_echo_shard": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:echo_shard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:golem_workbench" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_echo_shard", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:golem_workbench" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/harbinger_upgrade_template.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/harbinger_upgrade_template.json new file mode 100644 index 000000000..6b1d0a75d --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/harbinger_upgrade_template.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:harbinger_upgrade_template" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_witherite_ingot": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:witherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_witherite_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:harbinger_upgrade_template" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_alloy.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_alloy.json new file mode 100644 index 000000000..8decf44d3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_alloy.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "criteria": { + "has_scarlet_neodymium_ingot": { + "conditions": { + "items": [ + { + "items": [ + "alexscaves:scarlet_neodymium_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:magnetic_alloy" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_scarlet_neodymium_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:magnetic_alloy" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_construct.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_construct.json new file mode 100644 index 000000000..a30e1078e --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/magnetic_construct.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "criteria": { + "has_heart_of_iron": { + "conditions": { + "items": [ + { + "items": [ + "alexscaves:heart_of_iron" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:magnetic_construct" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_heart_of_iron", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:magnetic_construct" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/monstrosity_upgrade_template.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/monstrosity_upgrade_template.json new file mode 100644 index 000000000..0bbd7cae3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/monstrosity_upgrade_template.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_monstrous_horn": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:monstrous_horn" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:monstrosity_upgrade_template" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_monstrous_horn", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:monstrosity_upgrade_template" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/netherite_expansion_template.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/netherite_expansion_template.json new file mode 100644 index 000000000..7deebabc7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/netherite_expansion_template.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_expansion_template" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_expansion_template" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/nuclear_construct.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/nuclear_construct.json new file mode 100644 index 000000000..cf5b091e2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/nuclear_construct.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "criteria": { + "has_heart_of_iron": { + "conditions": { + "items": [ + { + "items": [ + "alexscaves:heart_of_iron" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:nuclear_construct" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_heart_of_iron", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:nuclear_construct" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_life_charm.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_life_charm.json new file mode 100644 index 000000000..276f9bf60 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_life_charm.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_charm_of_life_2": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:recycle_upgrade_from_life_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_charm_of_life_2", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:recycle_upgrade_from_life_charm" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_2.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_2.json new file mode 100644 index 000000000..0ebbfc0e7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_2.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_charm_of_keeping_2": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:recycle_upgrade_from_lock_charm_2" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_charm_of_keeping_2", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:recycle_upgrade_from_lock_charm_2" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_3.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_3.json new file mode 100644 index 000000000..178c4c660 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/recycle_upgrade_from_lock_charm_3.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "criteria": { + "has_charm_of_keeping_3": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:empty_upgrade" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:recycle_upgrade_from_lock_charm_3" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_charm_of_keeping_3", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:recycle_upgrade_from_lock_charm_3" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/scylla_lightning_upgrade.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/scylla_lightning_upgrade.json new file mode 100644 index 000000000..3e45327a4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/scylla_lightning_upgrade.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_essence_of_the_storm": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:essence_of_the_storm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:scylla_lightning_upgrade" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_essence_of_the_storm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:scylla_lightning_upgrade" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/storm_construct.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/storm_construct.json new file mode 100644 index 000000000..8c174c394 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/storm_construct.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_essence_of_the_storm": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:essence_of_the_storm" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:storm_construct" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_essence_of_the_storm", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:storm_construct" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/thunderstorm.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/thunderstorm.json new file mode 100644 index 000000000..c4ad056fc --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/thunderstorm.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "criteria": { + "has_air_rune": { + "conditions": { + "items": [ + { + "items": [ + "legendary_monsters:air_rune" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:thunderstorm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_air_rune", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:thunderstorm" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_construct.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_construct.json new file mode 100644 index 000000000..fe88550a6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_construct.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:void_construct" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_void_jaw": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:void_jaw" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_void_jaw", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:void_construct" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_cube.json b/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_cube.json new file mode 100644 index 000000000..5a31423fe --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/misc/void_cube.json @@ -0,0 +1,41 @@ +{ + "parent": "minecraft:recipes/root", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:void_cube" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_void_jaw": { + "conditions": { + "items": [ + { + "items": [ + "cataclysm:void_jaw" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_void_jaw", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:void_cube" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_dog_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_dog_golem_holder.json new file mode 100644 index 000000000..02dcae4cc --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_dog_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:netherite_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_expansion_template_dog_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_expansion_template_dog_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_humanoid_golem_holder.json new file mode 100644 index 000000000..ad5cec655 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_humanoid_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:netherite_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_expansion_template_humanoid_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_expansion_template_humanoid_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_metal_golem_holder.json b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_metal_golem_holder.json new file mode 100644 index 000000000..1e3e54de3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/advancements/recipes/netherite_expansion_template_metal_golem_holder.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_netherite_expansion_template": { + "conditions": { + "items": [ + { + "items": [ + "modulargolems:netherite_expansion_template" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "modulargolems:netherite_expansion_template_metal_golem_holder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_netherite_expansion_template", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "modulargolems:netherite_expansion_template_metal_golem_holder" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/curios/entities/golem_artifacts.json b/src/generated/resources/data/modulargolems/curios/entities/golem_artifacts.json deleted file mode 100644 index 44bcd0731..000000000 --- a/src/generated/resources/data/modulargolems/curios/entities/golem_artifacts.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "l2artifacts" - } - ], - "entities": [ - "modulargolems:metal_golem", - "modulargolems:humanoid_golem", - "modulargolems:dog_golem" - ], - "slots": [ - "artifact_head", - "artifact_necklace", - "artifact_bracelet", - "artifact_body", - "artifact_belt" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/curios/entities/golem_curios.json b/src/generated/resources/data/modulargolems/curios/entities/golem_curios.json index d88b4550e..1011822b3 100644 --- a/src/generated/resources/data/modulargolems/curios/entities/golem_curios.json +++ b/src/generated/resources/data/modulargolems/curios/entities/golem_curios.json @@ -6,10 +6,29 @@ "modulargolems:dog_golem" ], "slots": [ - "head", + "golem_route", + "golem_skin", + "curio", "back", - "ring", + "belt", + "body", + "boot", + "bracelet", "charm", - "hands" + "head", + "hands", + "necklace", + "ring", + "feet", + "halo", + "spellbook", + "heart_amulet", + "hostility_curse", + "accessory", + "artifact_head", + "artifact_necklace", + "artifact_bracelet", + "artifact_body", + "artifact_belt" ] } \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/curios/entities/golem_skin.json b/src/generated/resources/data/modulargolems/curios/entities/golem_skin.json deleted file mode 100644 index 9bf99902e..000000000 --- a/src/generated/resources/data/modulargolems/curios/entities/golem_skin.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "conditions": [], - "entities": [ - "modulargolems:humanoid_golem" - ], - "slots": [ - "golem_skin" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/curios/slots/golem_route.json b/src/generated/resources/data/modulargolems/curios/slots/golem_route.json new file mode 100644 index 000000000..89f9d5b08 --- /dev/null +++ b/src/generated/resources/data/modulargolems/curios/slots/golem_route.json @@ -0,0 +1,11 @@ +{ + "add_cosmetic": false, + "conditions": [], + "icon": "modulargolems:slot/empty_route_slot", + "operation": "SET", + "order": 1100, + "render_toggle": true, + "replace": false, + "size": 1, + "use_native_gui": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/damage_type/bacon_attack.json b/src/generated/resources/data/modulargolems/damage_type/bacon_attack.json new file mode 100644 index 000000000..dcedf3711 --- /dev/null +++ b/src/generated/resources/data/modulargolems/damage_type/bacon_attack.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "magic", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/damage_type/echo_attack.json b/src/generated/resources/data/modulargolems/damage_type/echo_attack.json new file mode 100644 index 000000000..80ac43902 --- /dev/null +++ b/src/generated/resources/data/modulargolems/damage_type/echo_attack.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "sonic_boom", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ancient_metal.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ancient_metal.json new file mode 100644 index 000000000..f3b7d1ccb --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ancient_metal.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:ancient_remnant", + "material": "cataclysm:ancient_metal" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cloud.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cloud.json new file mode 100644 index 000000000..a66067331 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cloud.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "legendary_monsters:cloud_golem", + "material": "legendary_monsters:cloud" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cursium.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cursium.json new file mode 100644 index 000000000..282af92bd --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_cursium.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:maledictus", + "material": "cataclysm:cursium" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ender_guardian.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ender_guardian.json new file mode 100644 index 000000000..a5fddcc82 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ender_guardian.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:ender_guardian", + "material": "cataclysm:ender_guardian" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ignitium.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ignitium.json new file mode 100644 index 000000000..33f62b7c6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_ignitium.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:ignis", + "material": "cataclysm:ignitium" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_iron.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_iron.json new file mode 100644 index 000000000..3f63a3824 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_iron.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "minecraft:iron_golem", + "material": "modulargolems:iron" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_molten_metal.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_molten_metal.json new file mode 100644 index 000000000..aea2aaf53 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_molten_metal.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "legendary_monsters:ancient_guardian", + "material": "legendary_monsters:molten_metal" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_netherite.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_netherite.json new file mode 100644 index 000000000..4e36922fc --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_netherite.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:netherite_monstrosity", + "material": "modulargolems:netherite" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_sculk.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_sculk.json new file mode 100644 index 000000000..e3a0d5d5d --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_sculk.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "minecraft:warden", + "material": "modulargolems:sculk" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_storm.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_storm.json new file mode 100644 index 000000000..665118461 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_storm.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:scylla", + "material": "cataclysm:storm" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_witherite.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_witherite.json new file mode 100644 index 000000000..f093c304c --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_witherite.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "cataclysm:the_harbinger", + "material": "cataclysm:witherite" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_wroughtnaut.json b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_wroughtnaut.json new file mode 100644 index 000000000..566990814 --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_modifiers/slicing_axe_drop_wroughtnaut.json @@ -0,0 +1,21 @@ +{ + "type": "modulargolems:slicing", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "direct_killer", + "predicate": { + "type": "modulargolems:metal_golem", + "equipment": { + "mainhand": { + "items": [ + "modulargolems:golem_slicing_axe" + ] + } + } + } + } + ], + "entity": "mowziesmobs:ferrous_wroughtnaut", + "material": "mowziesmobs:wroughtnaut" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/loot_tables/blocks/golem_workbench.json b/src/generated/resources/data/modulargolems/loot_tables/blocks/golem_workbench.json new file mode 100644 index 000000000..27f5855da --- /dev/null +++ b/src/generated/resources/data/modulargolems/loot_tables/blocks/golem_workbench.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "modulargolems:golem_workbench" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "modulargolems:blocks/golem_workbench" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/modulargolems_config/materials/vanilla.json b/src/generated/resources/data/modulargolems/modulargolems_config/materials/vanilla.json index d4b05786f..668e8a063 100644 --- a/src/generated/resources/data/modulargolems/modulargolems_config/materials/vanilla.json +++ b/src/generated/resources/data/modulargolems/modulargolems_config/materials/vanilla.json @@ -30,6 +30,23 @@ "modulargolems:sonic_boom": 1 } }, + "repairIngredients": { + "modulargolems:copper": { + "item": "minecraft:copper_ingot" + }, + "modulargolems:gold": { + "item": "minecraft:gold_ingot" + }, + "modulargolems:iron": { + "item": "minecraft:iron_ingot" + }, + "modulargolems:netherite": { + "item": "minecraft:netherite_ingot" + }, + "modulargolems:sculk": { + "tag": "modulargolems:sculk_materials" + } + }, "stats": { "modulargolems:copper": { "modulargolems:attack": 10.0, diff --git a/src/generated/resources/data/modulargolems/modulargolems_config/parts/default.json b/src/generated/resources/data/modulargolems/modulargolems_config/parts/default.json index 069b25c65..dbe56d1fa 100644 --- a/src/generated/resources/data/modulargolems/modulargolems_config/parts/default.json +++ b/src/generated/resources/data/modulargolems/modulargolems_config/parts/default.json @@ -60,8 +60,8 @@ "magnifiers": { "modulargolems:dog_golem": { "modulargolems:attack": 0.6, - "modulargolems:max_health": 0.2, - "modulargolems:regen": 0.2, + "modulargolems:max_health": 0.8, + "modulargolems:regen": 1.0, "modulargolems:sweep": 0.0 }, "modulargolems:humanoid_golem": { diff --git a/src/generated/resources/data/modulargolems/recipes/apocalyptium_boots.json b/src/generated/resources/data/modulargolems/recipes/apocalyptium_boots.json new file mode 100644 index 000000000..bb90f5a71 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apocalyptium_boots.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "tag": "modulargolems:revelation_ring" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_boots" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "result": { + "item": "modulargolems:apocalyptium_boots" + }, + "template": { + "tag": "modulargolems:revelation_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/apocalyptium_chestplate.json b/src/generated/resources/data/modulargolems/recipes/apocalyptium_chestplate.json new file mode 100644 index 000000000..ee598940d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apocalyptium_chestplate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "tag": "modulargolems:revelation_ring" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "result": { + "item": "modulargolems:apocalyptium_chestplate" + }, + "template": { + "tag": "modulargolems:revelation_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/apocalyptium_helmet.json b/src/generated/resources/data/modulargolems/recipes/apocalyptium_helmet.json new file mode 100644 index 000000000..10d38548a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apocalyptium_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "tag": "modulargolems:revelation_ring" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "result": { + "item": "modulargolems:apocalyptium_helmet" + }, + "template": { + "tag": "modulargolems:revelation_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/apocalyptium_shinguard.json b/src/generated/resources/data/modulargolems/recipes/apocalyptium_shinguard.json new file mode 100644 index 000000000..02c3f1017 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apocalyptium_shinguard.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "tag": "modulargolems:revelation_ring" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "result": { + "item": "modulargolems:apocalyptium_shinguard" + }, + "template": { + "tag": "modulargolems:revelation_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/apostle_base.json b/src/generated/resources/data/modulargolems/recipes/apostle_base.json new file mode 100644 index 000000000..702a7dfdd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apostle_base.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + }, + { + "type": "forge:not", + "value": { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:unholy_hat" + } + ], + "result": { + "item": "modulargolems:apostle" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/apostle_revelation.json b/src/generated/resources/data/modulargolems/recipes/apostle_revelation.json new file mode 100644 index 000000000..b20884712 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/apostle_revelation.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "key": { + "B": { + "tag": "modulargolems:revelation_doom" + }, + "F": { + "tag": "modulargolems:revelation_ring" + }, + "O": { + "item": "goety:unholy_robe" + }, + "U": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + "BFB", + "BOB", + "BUB" + ], + "result": { + "item": "modulargolems:apostle" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/azure_cube.json b/src/generated/resources/data/modulargolems/recipes/azure_cube.json new file mode 100644 index 000000000..c3840583a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/azure_cube.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "cataclysm:azure_seastone" + }, + "B": { + "item": "cataclysm:lacrima" + }, + "C": { + "item": "minecraft:sea_lantern" + } + }, + "pattern": [ + "ABA", + "BCB", + "ABA" + ], + "result": { + "count": 4, + "item": "modulargolems:azure_cube" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/barbaric_vanguard_boots.json b/src/generated/resources/data/modulargolems/recipes/barbaric_vanguard_boots.json new file mode 100644 index 000000000..cbef1cc22 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/barbaric_vanguard_boots.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:anvil" + }, + "I": { + "item": "minecraft:netherite_boots" + } + }, + "pattern": [ + "I I", + "BAB" + ], + "result": { + "item": "modulargolems:barbaric_vanguard_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/beacon_boots.json b/src/generated/resources/data/modulargolems/recipes/beacon_boots.json new file mode 100644 index 000000000..649d6034a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/beacon_boots.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "minecraft:anvil" + }, + "B": { + "item": "modulargolems:wind_spirit_boots" + }, + "S": { + "item": "minecraft:nether_star" + }, + "X": { + "item": "minecraft:beacon" + } + }, + "pattern": [ + "SXS", + "ABA", + "AAA" + ], + "result": { + "item": "modulargolems:beacon_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/beacon_cannon.json b/src/generated/resources/data/modulargolems/recipes/beacon_cannon.json new file mode 100644 index 000000000..be7db9e2b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/beacon_cannon.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:beacon" + }, + "D": { + "item": "minecraft:diamond" + }, + "I": { + "item": "minecraft:iron_ingot" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "BDD", + "TII" + ], + "result": { + "item": "modulargolems:beacon_cannon" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/candy_construct.json b/src/generated/resources/data/modulargolems/recipes/candy_construct.json new file mode 100644 index 000000000..6b2970374 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/candy_construct.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "key": { + "A": { + "item": "modulargolems:candy_mixture" + }, + "B": { + "item": "alexscaves:gumball_pile" + }, + "C": { + "item": "alexscaves:radiant_essence" + }, + "G": { + "item": "alexscaves:sugar_glass" + }, + "Z": { + "item": "alexscaves:hot_chocolate_bottle" + } + }, + "pattern": [ + "GBG", + "ZCZ", + "AAA" + ], + "result": { + "count": 3, + "item": "modulargolems:candy_construct" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/candy_mixture.json b/src/generated/resources/data/modulargolems/recipes/candy_mixture.json new file mode 100644 index 000000000..d3fd2b09d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/candy_mixture.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "key": { + "A": { + "item": "alexscaves:frosted_gingerbread_block" + }, + "B": { + "item": "alexscaves:candy_cane_block" + }, + "C": { + "item": "alexscaves:caramel" + }, + "D": { + "item": "alexscaves:licoroot" + } + }, + "pattern": [ + "BBB", + "CDC", + "AAA" + ], + "result": { + "item": "modulargolems:candy_mixture" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_body.json new file mode 100644 index 000000000..e8f015fff --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 149, + "fluid": { + "amount": 540, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_legs.json new file mode 100644 index 000000000..1782b4591 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 105, + "fluid": { + "amount": 270, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..c8f499486 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 149, + "fluid": { + "amount": 540, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_body.json new file mode 100644 index 000000000..7551b0995 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 149, + "fluid": { + "amount": 540, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..0f129c01b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 149, + "fluid": { + "amount": 540, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_arm.json new file mode 100644 index 000000000..6237770e1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 182, + "fluid": { + "amount": 810, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_body.json new file mode 100644 index 000000000..53888e666 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 182, + "fluid": { + "amount": 810, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_legs.json new file mode 100644 index 000000000..4a9764858 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/amethyst_bronze_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 182, + "fluid": { + "amount": 810, + "tag": "forge:molten_amethyst_bronze" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "tconstruct:amethyst_bronze" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_chestplate.json new file mode 100644 index 000000000..a0527f6b0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_chestplate.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:wind_spirit_chestplate" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "result": "modulargolems:barbaric_vanguard_chestplate" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_helmet.json b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_helmet.json new file mode 100644 index 000000000..22a52d014 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_helmet.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:wind_spirit_helmet" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 164, + "fluid": { + "amount": 450, + "tag": "forge:molten_netherite" + }, + "result": "modulargolems:barbaric_vanguard_helmet" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_shinguard.json new file mode 100644 index 000000000..e145b81d5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/barbaric_vanguard_shinguard.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:wind_spirit_shinguard" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 270, + "tag": "forge:molten_netherite" + }, + "result": "modulargolems:barbaric_vanguard_shinguard" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_body.json new file mode 100644 index 000000000..c9e4969d2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 159, + "fluid": { + "amount": 540, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_legs.json new file mode 100644 index 000000000..97c74536b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 112, + "fluid": { + "amount": 270, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..316ccbbdb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 159, + "fluid": { + "amount": 540, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_body.json new file mode 100644 index 000000000..086808d7e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 159, + "fluid": { + "amount": 540, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..1ff3daf13 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 159, + "fluid": { + "amount": 540, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_arm.json new file mode 100644 index 000000000..566ef0a13 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 194, + "fluid": { + "amount": 810, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_body.json new file mode 100644 index 000000000..4a25835fa --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 194, + "fluid": { + "amount": 810, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_legs.json new file mode 100644 index 000000000..2d2b22a6c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/cobalt_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 194, + "fluid": { + "amount": 810, + "tag": "forge:molten_cobalt" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "tconstruct:cobalt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_body.json new file mode 100644 index 000000000..46072baf5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 122, + "fluid": { + "amount": 540, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_legs.json new file mode 100644 index 000000000..a18b6f8ff --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 86, + "fluid": { + "amount": 270, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..eefbd6ea8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 122, + "fluid": { + "amount": 540, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_body.json new file mode 100644 index 000000000..4a4fb90f2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 122, + "fluid": { + "amount": 540, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..231cb8fed --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 122, + "fluid": { + "amount": 540, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_arm.json new file mode 100644 index 000000000..055db82b7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 150, + "fluid": { + "amount": 810, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_body.json new file mode 100644 index 000000000..f5e86dbb1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 150, + "fluid": { + "amount": 810, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_legs.json new file mode 100644 index 000000000..81dcfe569 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/copper_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 150, + "fluid": { + "amount": 810, + "tag": "forge:molten_copper" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "modulargolems:copper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/diamond.json b/src/generated/resources/data/modulargolems/recipes/casting/diamond.json new file mode 100644 index 000000000..b11d25e1b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/diamond.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 204, + "fluid": { + "amount": 600, + "tag": "tconstruct:molten_diamond" + }, + "result": "modulargolems:diamond" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/emerald.json b/src/generated/resources/data/modulargolems/recipes/casting/emerald.json new file mode 100644 index 000000000..c73d24e50 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/emerald.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 352, + "fluid": { + "amount": 2700, + "tag": "tconstruct:molten_emerald" + }, + "result": "modulargolems:emerald" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold.json b/src/generated/resources/data/modulargolems/recipes/casting/gold.json new file mode 100644 index 000000000..c9a655fa6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 296, + "fluid": { + "amount": 2430, + "tag": "forge:molten_gold" + }, + "result": "modulargolems:gold" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_body.json new file mode 100644 index 000000000..d4720ced0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 139, + "fluid": { + "amount": 540, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_legs.json new file mode 100644 index 000000000..3595bbc5b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 99, + "fluid": { + "amount": 270, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..d7feaeebb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 139, + "fluid": { + "amount": 540, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_body.json new file mode 100644 index 000000000..4abe6c629 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 139, + "fluid": { + "amount": 540, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..361eee3b5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 139, + "fluid": { + "amount": 540, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_arm.json new file mode 100644 index 000000000..d3bdcec1d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 171, + "fluid": { + "amount": 810, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_body.json new file mode 100644 index 000000000..8fe133e57 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 171, + "fluid": { + "amount": 810, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_legs.json new file mode 100644 index 000000000..8be54ac31 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/gold_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 171, + "fluid": { + "amount": 810, + "tag": "forge:molten_gold" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "modulargolems:gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_body.json new file mode 100644 index 000000000..cd2211445 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 190, + "fluid": { + "amount": 540, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_legs.json new file mode 100644 index 000000000..e72612187 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 134, + "fluid": { + "amount": 270, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..64e06215d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 190, + "fluid": { + "amount": 540, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_body.json new file mode 100644 index 000000000..f9b4706e2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 190, + "fluid": { + "amount": 540, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..af33aa12b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 190, + "fluid": { + "amount": 540, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_arm.json new file mode 100644 index 000000000..6c6bc17a5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 233, + "fluid": { + "amount": 810, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_body.json new file mode 100644 index 000000000..304b36a6e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 233, + "fluid": { + "amount": 810, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_legs.json new file mode 100644 index 000000000..00c59fcf7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/hepatizon_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 233, + "fluid": { + "amount": 810, + "tag": "forge:molten_hepatizon" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "tconstruct:hepatizon" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_body.json new file mode 100644 index 000000000..7e4cab0e7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 147, + "fluid": { + "amount": 540, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_legs.json new file mode 100644 index 000000000..14e7f9d33 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 104, + "fluid": { + "amount": 270, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..55f4524d2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 147, + "fluid": { + "amount": 540, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_body.json new file mode 100644 index 000000000..4ee9375c2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 147, + "fluid": { + "amount": 540, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..7fb7b7a54 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 147, + "fluid": { + "amount": 540, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_arm.json new file mode 100644 index 000000000..72d4fe05e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 810, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_body.json new file mode 100644 index 000000000..a3495e163 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 810, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_legs.json new file mode 100644 index 000000000..93a2612cd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/iron_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 810, + "tag": "forge:molten_iron" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "modulargolems:iron" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_body.json new file mode 100644 index 000000000..c49399bc3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 177, + "fluid": { + "amount": 540, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_legs.json new file mode 100644 index 000000000..74d0119fc --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 125, + "fluid": { + "amount": 270, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..07d3e4027 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 177, + "fluid": { + "amount": 540, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_body.json new file mode 100644 index 000000000..13f467199 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 177, + "fluid": { + "amount": 540, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..1162db1fd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 177, + "fluid": { + "amount": 540, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_arm.json new file mode 100644 index 000000000..fa5a24e33 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 216, + "fluid": { + "amount": 810, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_body.json new file mode 100644 index 000000000..af52d278f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 216, + "fluid": { + "amount": 810, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_legs.json new file mode 100644 index 000000000..a68e79754 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/manyullyn_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 216, + "fluid": { + "amount": 810, + "tag": "forge:molten_manyullyn" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "tconstruct:manyullyn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite.json new file mode 100644 index 000000000..37d9be308 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 147, + "fluid": { + "amount": 360, + "tag": "forge:molten_netherite" + }, + "result": "modulargolems:netherite" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_body.json new file mode 100644 index 000000000..dd3c4b4fa --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_legs.json new file mode 100644 index 000000000..1a1d0f18e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 270, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..31c0fc664 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_body.json new file mode 100644 index 000000000..b006bbf29 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..81924db8f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 180, + "fluid": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_arm.json new file mode 100644 index 000000000..a532a3010 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 221, + "fluid": { + "amount": 810, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_body.json new file mode 100644 index 000000000..738cc4bc5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 221, + "fluid": { + "amount": 810, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_legs.json new file mode 100644 index 000000000..9a9fb8e7c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/netherite_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "modulargolems" + } + ], + "cooling_time": 221, + "fluid": { + "amount": 810, + "tag": "forge:molten_netherite" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "modulargolems:netherite" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/quartz.json b/src/generated/resources/data/modulargolems/recipes/casting/quartz.json new file mode 100644 index 000000000..bb4d75e83 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/quartz.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 200, + "fluid": { + "amount": 1200, + "tag": "tconstruct:molten_quartz" + }, + "result": "modulargolems:quartz" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_chestplate.json new file mode 100644 index 000000000..d301a3157 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_chestplate.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:iron_chestplate" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 340, + "fluid": { + "amount": 2880, + "tag": "forge:molten_iron" + }, + "result": "modulargolems:roman_guard_chestplate" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_helmet.json b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_helmet.json new file mode 100644 index 000000000..dc5daea16 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_helmet.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:iron_helmet" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 241, + "fluid": { + "amount": 1440, + "tag": "forge:molten_iron" + }, + "result": "modulargolems:roman_guard_helmet" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_shinguard.json new file mode 100644 index 000000000..2c8af77e6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/roman_guard_shinguard.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:iron_leggings" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 199, + "fluid": { + "amount": 990, + "tag": "forge:molten_iron" + }, + "result": "modulargolems:roman_guard_shinguard" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_body.json new file mode 100644 index 000000000..c3dc5cf38 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 540, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_legs.json new file mode 100644 index 000000000..656b3942a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 90, + "fluid": { + "amount": 270, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..68c61564d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 540, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_body.json new file mode 100644 index 000000000..750857657 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 540, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..af5a2bad8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 127, + "fluid": { + "amount": 540, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_arm.json new file mode 100644 index 000000000..35760789c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 155, + "fluid": { + "amount": 810, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_body.json new file mode 100644 index 000000000..acec56085 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 155, + "fluid": { + "amount": 810, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_legs.json new file mode 100644 index 000000000..b93e9bea8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/rose_gold_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 155, + "fluid": { + "amount": 810, + "tag": "forge:molten_rose_gold" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "tconstruct:rose_gold" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/thunder_immune.json b/src/generated/resources/data/modulargolems/recipes/casting/thunder_immune.json new file mode 100644 index 000000000..9bb547908 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/thunder_immune.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "modulargolems:empty_upgrade" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 150, + "fluid": { + "amount": 810, + "tag": "forge:molten_copper" + }, + "result": "modulargolems:thunder_immune" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_boots.json new file mode 100644 index 000000000..8463e69ad --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_boots.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:diamond_boots" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 144, + "fluid": { + "amount": 300, + "tag": "tconstruct:molten_diamond" + }, + "result": "modulargolems:wind_spirit_boots" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_chestplate.json b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_chestplate.json new file mode 100644 index 000000000..fcc84352c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_chestplate.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:diamond_chestplate" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 471, + "fluid": { + "amount": 3200, + "tag": "tconstruct:molten_diamond" + }, + "result": "modulargolems:wind_spirit_chestplate" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_helmet.json b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_helmet.json new file mode 100644 index 000000000..bbfdf0c6a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_helmet.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:diamond_helmet" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 333, + "fluid": { + "amount": 1600, + "tag": "tconstruct:molten_diamond" + }, + "result": "modulargolems:wind_spirit_helmet" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_shinguard.json b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_shinguard.json new file mode 100644 index 000000000..4f5c13b5b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/wind_spirit_shinguard.json @@ -0,0 +1,19 @@ +{ + "type": "tconstruct:casting_table", + "cast": { + "item": "minecraft:diamond_leggings" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "cooling_time": 276, + "fluid": { + "amount": 1100, + "tag": "tconstruct:molten_diamond" + }, + "result": "modulargolems:wind_spirit_shinguard" +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_body.json new file mode 100644 index 000000000..f008cb285 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 115, + "fluid": { + "amount": 540, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_legs.json new file mode 100644 index 000000000..35421f596 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_dog_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:dog_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 81, + "fluid": { + "amount": 270, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_arms.json new file mode 100644 index 000000000..424755ddf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_arms.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_arms" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 115, + "fluid": { + "amount": 540, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_body.json new file mode 100644 index 000000000..026729aaa --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 115, + "fluid": { + "amount": 540, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_legs.json new file mode 100644 index 000000000..1f7370213 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_humanoid_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:humanoid_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 115, + "fluid": { + "amount": 540, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_arm.json new file mode 100644 index 000000000..cc9508781 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_arm.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_arm" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 141, + "fluid": { + "amount": 810, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_body.json new file mode 100644 index 000000000..1dd511cf7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_body.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_body" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 141, + "fluid": { + "amount": 810, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_legs.json new file mode 100644 index 000000000..ecbf90007 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/casting/zinc_casting_metal_golem_legs.json @@ -0,0 +1,28 @@ +{ + "type": "tconstruct:casting_basin", + "cast": { + "item": "modulargolems:metal_golem_legs" + }, + "cast_consumed": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + }, + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "cooling_time": 141, + "fluid": { + "amount": 810, + "tag": "forge:molten_zinc" + }, + "result": { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "create:zinc" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/cauldron.json b/src/generated/resources/data/modulargolems/recipes/cauldron.json index 0328a51e7..eac1f65b0 100644 --- a/src/generated/resources/data/modulargolems/recipes/cauldron.json +++ b/src/generated/resources/data/modulargolems/recipes/cauldron.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "A": { - "item": "minecraft:nether_star" + "item": "minecraft:blaze_powder" }, "B": { "item": "modulargolems:empty_upgrade" @@ -15,7 +15,7 @@ "item": "minecraft:cauldron" }, "E": { - "item": "minecraft:dragon_head" + "item": "minecraft:nether_star" } }, "pattern": [ diff --git a/src/generated/resources/data/modulargolems/recipes/cloud_cube.json b/src/generated/resources/data/modulargolems/recipes/cloud_cube.json new file mode 100644 index 000000000..96783e20e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/cloud_cube.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "key": { + "I": { + "item": "modulargolems:metal_golem_template" + }, + "R": { + "item": "legendary_monsters:cloud_rod" + }, + "X": [ + { + "item": "legendary_monsters:air_rune" + }, + { + "item": "legendary_monsters:atmospheric_boots" + } + ] + }, + "pattern": [ + "RIR", + "IXI", + "RIR" + ], + "result": { + "count": 9, + "item": "modulargolems:cloud_cube" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_chestplate.json new file mode 100644 index 000000000..1e20943bb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:barbaric_vanguard_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "minecraft:diamond" + }, + { + "count": 6, + "item": "minecraft:netherite_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_helmet.json new file mode 100644 index 000000000..6a09edc79 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_helmet.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:barbaric_vanguard_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "minecraft:diamond" + }, + { + "count": 5, + "item": "minecraft:netherite_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_shinguard.json new file mode 100644 index 000000000..6817571db --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/barbaric_vanguard_shinguard.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:barbaric_vanguard_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "minecraft:diamond" + }, + { + "count": 3, + "item": "minecraft:netherite_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_axe.json new file mode 100644 index 000000000..41eaf651e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_axe.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:diamond_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_spear.json new file mode 100644 index 000000000..7b9140733 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_spear.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:diamond_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_sword.json new file mode 100644 index 000000000..32eb39744 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/diamond_golem_sword.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:diamond_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_boots.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_boots.json new file mode 100644 index 000000000..49a258499 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_boots.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_boots" + } + ], + "results": [ + { + "count": 7, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_chestplate.json new file mode 100644 index 000000000..40976f341 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_axe.json new file mode 100644 index 000000000..10937d47b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_spear.json new file mode 100644 index 000000000..696bd5022 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_sword.json new file mode 100644 index 000000000..397deecb2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_helmet.json new file mode 100644 index 000000000..8db161e0b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_helmet.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/fiery_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_shinguard.json new file mode 100644 index 000000000..57d556e8b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/fiery_shinguard.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:fiery_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "twilightforest:fiery_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_axe.json new file mode 100644 index 000000000..655b86d23 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_axe.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:iron_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_spear.json new file mode 100644 index 000000000..057447a75 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_spear.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:iron_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_sword.json new file mode 100644 index 000000000..9b779699f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/iron_golem_sword.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:iron_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_boots.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_boots.json new file mode 100644 index 000000000..1a3ad9c85 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_boots.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_boots" + } + ], + "results": [ + { + "count": 7, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_chestplate.json new file mode 100644 index 000000000..da430968e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_axe.json new file mode 100644 index 000000000..b4647365c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_spear.json new file mode 100644 index 000000000..2d4510e3f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_sword.json new file mode 100644 index 000000000..098503cbf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_helmet.json new file mode 100644 index 000000000..a346f1986 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_helmet.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_shinguard.json new file mode 100644 index 000000000..3ef74f523 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/ironwood_shinguard.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:ironwood_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_boots.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_boots.json new file mode 100644 index 000000000..11dda27f5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_boots.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_boots" + } + ], + "results": [ + { + "count": 7, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_chestplate.json new file mode 100644 index 000000000..9454902ce --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_axe.json new file mode 100644 index 000000000..1d0724228 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_spear.json new file mode 100644 index 000000000..b857673f6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_sword.json new file mode 100644 index 000000000..96ad75c50 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_helmet.json new file mode 100644 index 000000000..371a1653b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_helmet.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_shinguard.json new file mode 100644 index 000000000..7644093fd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/knightmetal_shinguard.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:knightmetal_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "twilightforest:knightmetal_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/naga_boots.json b/src/generated/resources/data/modulargolems/recipes/crushing/naga_boots.json new file mode 100644 index 000000000..a7fc4c4b3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/naga_boots.json @@ -0,0 +1,27 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:naga_boots" + } + ], + "results": [ + { + "count": 3, + "item": "twilightforest:naga_scale" + }, + { + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/naga_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/naga_chestplate.json new file mode 100644 index 000000000..d90d5e550 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/naga_chestplate.json @@ -0,0 +1,27 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:naga_chestplate" + } + ], + "results": [ + { + "count": 10, + "item": "twilightforest:naga_scale" + }, + { + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/naga_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/naga_helmet.json new file mode 100644 index 000000000..c89a213d9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/naga_helmet.json @@ -0,0 +1,30 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:naga_helmet" + } + ], + "results": [ + { + "item": "twilightforest:naga_trophy" + }, + { + "count": 4, + "item": "twilightforest:naga_scale" + }, + { + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/naga_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/naga_shinguard.json new file mode 100644 index 000000000..7ec45ba1f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/naga_shinguard.json @@ -0,0 +1,28 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:naga_shinguard" + } + ], + "results": [ + { + "count": 6, + "item": "twilightforest:naga_scale" + }, + { + "count": 4, + "item": "twilightforest:ironwood_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_axe.json new file mode 100644 index 000000000..91d0063fa --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:netherite_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "minecraft:diamond" + }, + { + "count": 4, + "item": "minecraft:netherite_scrap" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_spear.json new file mode 100644 index 000000000..27c346bca --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:netherite_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "minecraft:diamond" + }, + { + "count": 4, + "item": "minecraft:netherite_scrap" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_sword.json new file mode 100644 index 000000000..fbfef26cc --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/netherite_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:netherite_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "minecraft:diamond" + }, + { + "count": 4, + "item": "minecraft:netherite_scrap" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_chestplate.json new file mode 100644 index 000000000..1fc65bef9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_chestplate.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:roman_guard_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_helmet.json new file mode 100644 index 000000000..e367abc3d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_helmet.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:roman_guard_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_shinguard.json new file mode 100644 index 000000000..de055962f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/roman_guard_shinguard.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:roman_guard_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "minecraft:iron_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_axe.json new file mode 100644 index 000000000..d3dd65ab0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:steeleaf_golem_axe" + } + ], + "results": [ + { + "count": 4, + "item": "twilightforest:steeleaf_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_spear.json new file mode 100644 index 000000000..8432a03bf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:steeleaf_golem_spear" + } + ], + "results": [ + { + "count": 3, + "item": "twilightforest:steeleaf_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_sword.json new file mode 100644 index 000000000..ace827ae0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/steeleaf_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:steeleaf_golem_sword" + } + ], + "results": [ + { + "count": 5, + "item": "twilightforest:steeleaf_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_boots.json new file mode 100644 index 000000000..70c801fe8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_boots.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:wind_spirit_boots" + } + ], + "results": [ + { + "count": 7, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_chestplate.json b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_chestplate.json new file mode 100644 index 000000000..335821543 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_chestplate.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:wind_spirit_chestplate" + } + ], + "results": [ + { + "count": 40, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_helmet.json b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_helmet.json new file mode 100644 index 000000000..ddf5d64e2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_helmet.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:wind_spirit_helmet" + } + ], + "results": [ + { + "count": 20, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_shinguard.json b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_shinguard.json new file mode 100644 index 000000000..9d4f28f8e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/crushing/wind_spirit_shinguard.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredients": [ + { + "item": "modulargolems:wind_spirit_shinguard" + } + ], + "results": [ + { + "count": 18, + "item": "minecraft:diamond" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/diamond_dog_golem_armor.json b/src/generated/resources/data/modulargolems/recipes/diamond_dog_golem_armor.json new file mode 100644 index 000000000..693886885 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/diamond_dog_golem_armor.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:leather" + }, + "I": { + "item": "minecraft:diamond" + } + }, + "pattern": [ + "I ", + "IBI", + "IAI" + ], + "result": { + "item": "modulargolems:diamond_dog_golem_armor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template.json b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template.json new file mode 100644 index 000000000..dbe339336 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "modulargolems:empty_upgrade" + }, + "B": { + "item": "minecraft:netherite_upgrade_smithing_template" + }, + "C": { + "item": "minecraft:diamond" + } + }, + "pattern": [ + "ACA", + "CBC", + "ACA" + ], + "result": { + "item": "modulargolems:diamond_expansion_template" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_dog_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_dog_golem_holder.json new file mode 100644 index 000000000..ae695510a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_dog_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:dog_golem_holder" + }, + "result": { + "item": "modulargolems:dog_golem_holder" + }, + "template": { + "item": "modulargolems:diamond_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_humanoid_golem_holder.json new file mode 100644 index 000000000..df5a4c112 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_humanoid_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:humanoid_golem_holder" + }, + "result": { + "item": "modulargolems:humanoid_golem_holder" + }, + "template": { + "item": "modulargolems:diamond_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_metal_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_metal_golem_holder.json new file mode 100644 index 000000000..1db5d2a11 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/diamond_expansion_template_metal_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:metal_golem_holder" + }, + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "template": { + "item": "modulargolems:diamond_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/dog_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/dog_golem/assemble_holder.json similarity index 100% rename from src/generated/resources/data/modulargolems/recipes/dog_golem_holder.json rename to src/generated/resources/data/modulargolems/recipes/dog_golem/assemble_holder.json diff --git a/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_body.json b/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_body.json new file mode 100644 index 000000000..ad7bd28af --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_body.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:dog_golem_holder" + }, + "P": { + "item": "modulargolems:dog_golem_body" + } + }, + "pattern": [ + "P", + "H" + ], + "result": { + "item": "modulargolems:dog_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_legs.json b/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_legs.json new file mode 100644 index 000000000..7b4c8266d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/dog_golem/replace_legs.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:dog_golem_holder" + }, + "P": { + "item": "modulargolems:dog_golem_legs" + } + }, + "pattern": [ + "H", + "P" + ], + "result": { + "item": "modulargolems:dog_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/etherite.json b/src/generated/resources/data/modulargolems/recipes/etherite.json new file mode 100644 index 000000000..20aae023e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/etherite.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "key": { + "A": { + "item": "composite_material:etherite_ingot" + }, + "B": { + "item": "modulargolems:empty_upgrade" + }, + "C": { + "item": "composite_material:perkin" + } + }, + "pattern": [ + "CAC", + "ABA", + "CAC" + ], + "result": { + "item": "modulargolems:etherite" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_boots.json b/src/generated/resources/data/modulargolems/recipes/fiery_boots.json new file mode 100644 index 000000000..07771bedf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_boots.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "tag": "twilightforest:fiery_vial" + }, + "I": { + "item": "twilightforest:fiery_boots" + } + }, + "pattern": [ + "I I", + "BAB" + ], + "result": { + "item": "modulargolems:fiery_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_chestplate.json b/src/generated/resources/data/modulargolems/recipes/fiery_chestplate.json new file mode 100644 index 000000000..77439b168 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_chestplate.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "tag": "twilightforest:fiery_vial" + }, + "I": { + "item": "twilightforest:fiery_chestplate" + } + }, + "pattern": [ + "IAI", + "III", + "BIB" + ], + "result": { + "item": "modulargolems:fiery_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/fiery_golem_axe.json new file mode 100644 index 000000000..33844b78e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_golem_axe.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:fiery_ingot" + }, + "S": { + "item": "minecraft:blaze_rod" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "IS ", + "TST" + ], + "result": { + "item": "modulargolems:fiery_golem_axe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/fiery_golem_spear.json new file mode 100644 index 000000000..f1011fdc9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_golem_spear.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:fiery_ingot" + }, + "S": { + "item": "minecraft:blaze_rod" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + " SI", + "S T" + ], + "result": { + "item": "modulargolems:fiery_golem_spear" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/fiery_golem_sword.json new file mode 100644 index 000000000..b7e005260 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_golem_sword.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:fiery_ingot" + }, + "S": { + "item": "minecraft:blaze_rod" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + "ISI", + "SIT" + ], + "result": { + "item": "modulargolems:fiery_golem_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_helmet.json b/src/generated/resources/data/modulargolems/recipes/fiery_helmet.json new file mode 100644 index 000000000..ec3f732b3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_helmet.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "tag": "twilightforest:fiery_vial" + }, + "I": { + "item": "twilightforest:fiery_helmet" + } + }, + "pattern": [ + " B ", + "III", + "IAI" + ], + "result": { + "item": "modulargolems:fiery_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fiery_shinguard.json b/src/generated/resources/data/modulargolems/recipes/fiery_shinguard.json new file mode 100644 index 000000000..ed8830a0f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fiery_shinguard.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "tag": "twilightforest:fiery_vial" + }, + "I": { + "item": "twilightforest:fiery_leggings" + } + }, + "pattern": [ + "BIB", + " A ", + "I I" + ], + "result": { + "item": "modulargolems:fiery_shinguard" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fire_blast.json b/src/generated/resources/data/modulargolems/recipes/fire_blast.json new file mode 100644 index 000000000..ac3cf93af --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fire_blast.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:unholy_blood" + }, + { + "item": "goety:fire_blast_focus" + } + ], + "result": { + "item": "modulargolems:fire_blast" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/fire_tornado.json b/src/generated/resources/data/modulargolems/recipes/fire_tornado.json new file mode 100644 index 000000000..bc102a3c9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/fire_tornado.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:unholy_blood" + }, + { + "item": "goety:cyclone_focus" + }, + { + "item": "minecraft:lava_bucket" + } + ], + "result": { + "item": "modulargolems:fire_tornado" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/flame_thrower.json b/src/generated/resources/data/modulargolems/recipes/flame_thrower.json new file mode 100644 index 000000000..bfe90a6cf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/flame_thrower.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:blast_furnace" + }, + "D": { + "item": "minecraft:blaze_rod" + }, + "I": { + "item": "minecraft:iron_ingot" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "II ", + "BDD", + "TI " + ], + "result": { + "item": "modulargolems:flame_thrower" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/gold_dog_golem_armor.json b/src/generated/resources/data/modulargolems/recipes/gold_dog_golem_armor.json new file mode 100644 index 000000000..fc6fd266f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/gold_dog_golem_armor.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:leather" + }, + "I": { + "item": "minecraft:gold_ingot" + } + }, + "pattern": [ + "I ", + "IBI", + "IAI" + ], + "result": { + "item": "modulargolems:gold_dog_golem_armor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/golem_workbench.json b/src/generated/resources/data/modulargolems/recipes/golem_workbench.json new file mode 100644 index 000000000..f89595bd5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/golem_workbench.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "minecraft:amethyst_shard" + }, + "E": { + "item": "minecraft:echo_shard" + }, + "G": { + "item": "modulargolems:golem_slicing_axe" + }, + "I": { + "item": "minecraft:anvil" + }, + "R": { + "item": "minecraft:redstone" + }, + "T": { + "item": "minecraft:smithing_table" + } + }, + "pattern": [ + "AGA", + "RTR", + "EIE" + ], + "result": { + "item": "modulargolems:golem_workbench" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/harbinger_chestplate.json b/src/generated/resources/data/modulargolems/recipes/harbinger_chestplate.json new file mode 100644 index 000000000..09caaffae --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/harbinger_chestplate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:witherite_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:harbinger_chestplate" + }, + "template": { + "item": "modulargolems:harbinger_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/harbinger_helmet.json b/src/generated/resources/data/modulargolems/recipes/harbinger_helmet.json new file mode 100644 index 000000000..5c4d9d859 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/harbinger_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:witherite_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:harbinger_helmet" + }, + "template": { + "item": "modulargolems:harbinger_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/harbinger_shinguard.json b/src/generated/resources/data/modulargolems/recipes/harbinger_shinguard.json new file mode 100644 index 000000000..75761083e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/harbinger_shinguard.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:witherite_ingot" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:harbinger_shinguard" + }, + "template": { + "item": "modulargolems:harbinger_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/harbinger_upgrade_template.json b/src/generated/resources/data/modulargolems/recipes/harbinger_upgrade_template.json new file mode 100644 index 000000000..d217e5777 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/harbinger_upgrade_template.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "minecraft:redstone_block" + }, + "B": { + "item": "minecraft:netherite_upgrade_smithing_template" + }, + "C": { + "item": "cataclysm:witherite_ingot" + }, + "S": { + "item": "minecraft:nether_star" + } + }, + "pattern": [ + "ASA", + "ABA", + "ACA" + ], + "result": { + "item": "modulargolems:harbinger_upgrade_template" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/hell_blast.json b/src/generated/resources/data/modulargolems/recipes/hell_blast.json new file mode 100644 index 000000000..37c6006e7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/hell_blast.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:lavaball_focus" + }, + { + "item": "goety:unholy_fabric" + }, + { + "item": "goety:unholy_blood" + } + ], + "result": { + "item": "modulargolems:hell_blast" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/hell_bolt.json b/src/generated/resources/data/modulargolems/recipes/hell_bolt.json new file mode 100644 index 000000000..2526b6041 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/hell_bolt.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:fireball_focus" + }, + { + "item": "goety:unholy_fabric" + }, + { + "item": "goety:unholy_blood" + } + ], + "result": { + "item": "modulargolems:hell_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/hell_cloud.json b/src/generated/resources/data/modulargolems/recipes/hell_cloud.json new file mode 100644 index 000000000..c459549f9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/hell_cloud.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "goety:unholy_blood" + }, + { + "item": "goety:hail_focus" + }, + { + "item": "minecraft:lava_bucket" + } + ], + "result": { + "item": "modulargolems:hell_cloud" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/assemble_holder.json similarity index 100% rename from src/generated/resources/data/modulargolems/recipes/humanoid_golem_holder.json rename to src/generated/resources/data/modulargolems/recipes/humanoid_golem/assemble_holder.json diff --git a/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_arms.json b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_arms.json new file mode 100644 index 000000000..20079e803 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_arms.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:humanoid_golem_holder" + }, + "P": { + "item": "modulargolems:humanoid_golem_arms" + } + }, + "pattern": [ + "H", + "P" + ], + "result": { + "item": "modulargolems:humanoid_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_body.json b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_body.json new file mode 100644 index 000000000..5ada90e55 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_body.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:humanoid_golem_holder" + }, + "P": { + "item": "modulargolems:humanoid_golem_body" + } + }, + "pattern": [ + "P", + "H" + ], + "result": { + "item": "modulargolems:humanoid_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_legs.json b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_legs.json new file mode 100644 index 000000000..07c24501a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/humanoid_golem/replace_legs.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:humanoid_golem_holder" + }, + "P": { + "item": "modulargolems:humanoid_golem_legs" + } + }, + "pattern": [ + "H", + "P" + ], + "result": { + "item": "modulargolems:humanoid_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ignis_chestplate.json b/src/generated/resources/data/modulargolems/recipes/ignis_chestplate.json new file mode 100644 index 000000000..cbef151b7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ignis_chestplate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:ignitium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:ignis_chestplate" + }, + "template": { + "item": "cataclysm:ignitium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ignis_helmet.json b/src/generated/resources/data/modulargolems/recipes/ignis_helmet.json new file mode 100644 index 000000000..6d81e5883 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ignis_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:ignitium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:ignis_helmet" + }, + "template": { + "item": "cataclysm:ignitium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ignis_shinguard.json b/src/generated/resources/data/modulargolems/recipes/ignis_shinguard.json new file mode 100644 index 000000000..ea1ab869a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ignis_shinguard.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:ignitium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:ignis_shinguard" + }, + "template": { + "item": "cataclysm:ignitium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/iron_dog_golem_armor.json b/src/generated/resources/data/modulargolems/recipes/iron_dog_golem_armor.json new file mode 100644 index 000000000..e970a0e93 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/iron_dog_golem_armor.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:leather" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "pattern": [ + "I ", + "IBI", + "IAI" + ], + "result": { + "item": "modulargolems:iron_dog_golem_armor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/iron_mecha_bow.json b/src/generated/resources/data/modulargolems/recipes/iron_mecha_bow.json new file mode 100644 index 000000000..ee295779e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/iron_mecha_bow.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "modulargolems:metal_golem_template" + }, + "C": { + "item": "minecraft:chain" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "pattern": [ + "CII", + "BCI", + "IBC" + ], + "result": { + "item": "modulargolems:iron_mecha_bow" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_boots.json b/src/generated/resources/data/modulargolems/recipes/ironwood_boots.json new file mode 100644 index 000000000..29a1e5292 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_boots.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:liveroot" + }, + "I": { + "item": "twilightforest:ironwood_boots" + } + }, + "pattern": [ + "I I", + "BAB" + ], + "result": { + "item": "modulargolems:ironwood_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_chestplate.json b/src/generated/resources/data/modulargolems/recipes/ironwood_chestplate.json new file mode 100644 index 000000000..ab01da548 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_chestplate.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:liveroot" + }, + "I": { + "item": "twilightforest:ironwood_chestplate" + } + }, + "pattern": [ + "IAI", + "III", + "BIB" + ], + "result": { + "item": "modulargolems:ironwood_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_axe.json new file mode 100644 index 000000000..b39a74618 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_axe.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:ironwood_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "IS ", + "TST" + ], + "result": { + "item": "modulargolems:ironwood_golem_axe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_spear.json new file mode 100644 index 000000000..ba4578b2e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_spear.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:ironwood_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + " SI", + "S T" + ], + "result": { + "item": "modulargolems:ironwood_golem_spear" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_sword.json new file mode 100644 index 000000000..9795d2349 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_golem_sword.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:ironwood_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + "ISI", + "SIT" + ], + "result": { + "item": "modulargolems:ironwood_golem_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_helmet.json b/src/generated/resources/data/modulargolems/recipes/ironwood_helmet.json new file mode 100644 index 000000000..7c798d408 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_helmet.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:liveroot" + }, + "I": { + "item": "twilightforest:ironwood_helmet" + } + }, + "pattern": [ + " B ", + "III", + "IAI" + ], + "result": { + "item": "modulargolems:ironwood_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/ironwood_shinguard.json b/src/generated/resources/data/modulargolems/recipes/ironwood_shinguard.json new file mode 100644 index 000000000..045fc1b8e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/ironwood_shinguard.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:liveroot" + }, + "I": { + "item": "twilightforest:ironwood_leggings" + } + }, + "pattern": [ + "BIB", + " A ", + "I I" + ], + "result": { + "item": "modulargolems:ironwood_shinguard" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_boots.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_boots.json new file mode 100644 index 000000000..89920e502 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_boots.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:armor_shard_cluster" + }, + "I": { + "item": "twilightforest:knightmetal_boots" + } + }, + "pattern": [ + "I I", + "BAB" + ], + "result": { + "item": "modulargolems:knightmetal_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_chestplate.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_chestplate.json new file mode 100644 index 000000000..c796dca02 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_chestplate.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:armor_shard_cluster" + }, + "I": { + "item": "twilightforest:knightmetal_chestplate" + } + }, + "pattern": [ + "IAI", + "III", + "BIB" + ], + "result": { + "item": "modulargolems:knightmetal_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_axe.json new file mode 100644 index 000000000..22bba2569 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_axe.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:knightmetal_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "IS ", + "TST" + ], + "result": { + "item": "modulargolems:knightmetal_golem_axe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_spear.json new file mode 100644 index 000000000..48ee00c6e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_spear.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:knightmetal_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + " SI", + "S T" + ], + "result": { + "item": "modulargolems:knightmetal_golem_spear" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_sword.json new file mode 100644 index 000000000..c0e09e837 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_golem_sword.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:knightmetal_ingot" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + "ISI", + "SIT" + ], + "result": { + "item": "modulargolems:knightmetal_golem_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_helmet.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_helmet.json new file mode 100644 index 000000000..70678e607 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_helmet.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:armor_shard_cluster" + }, + "I": { + "item": "twilightforest:knightmetal_helmet" + } + }, + "pattern": [ + " B ", + "III", + "IAI" + ], + "result": { + "item": "modulargolems:knightmetal_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/knightmetal_shinguard.json b/src/generated/resources/data/modulargolems/recipes/knightmetal_shinguard.json new file mode 100644 index 000000000..edf5c4d36 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/knightmetal_shinguard.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:armor_shard_cluster" + }, + "I": { + "item": "twilightforest:knightmetal_leggings" + } + }, + "pattern": [ + "BIB", + " A ", + "I I" + ], + "result": { + "item": "modulargolems:knightmetal_shinguard" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/magnetic_alloy.json b/src/generated/resources/data/modulargolems/recipes/magnetic_alloy.json new file mode 100644 index 000000000..7219cd729 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/magnetic_alloy.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "key": { + "A": { + "item": "alexscaves:azure_neodymium_ingot" + }, + "B": { + "item": "alexscaves:ferrouslime_ball" + }, + "C": { + "item": "alexscaves:packed_galena" + }, + "S": { + "item": "alexscaves:scarlet_neodymium_ingot" + } + }, + "pattern": [ + "SBC", + "BCB", + "CBA" + ], + "result": { + "item": "modulargolems:magnetic_alloy" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/magnetic_construct.json b/src/generated/resources/data/modulargolems/recipes/magnetic_construct.json new file mode 100644 index 000000000..899107c5b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/magnetic_construct.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "key": { + "A": { + "item": "modulargolems:magnetic_alloy" + }, + "C": { + "item": "alexscaves:heart_of_iron" + }, + "N": { + "item": "alexscaves:notor_gizmo" + }, + "T": { + "item": "alexscaves:telecore" + } + }, + "pattern": [ + "ANA", + "TCT", + "ANA" + ], + "result": { + "count": 3, + "item": "modulargolems:magnetic_construct" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/maledictus_chestplate.json b/src/generated/resources/data/modulargolems/recipes/maledictus_chestplate.json new file mode 100644 index 000000000..93d763e26 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/maledictus_chestplate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:cursium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:maledictus_chestplate" + }, + "template": { + "item": "cataclysm:cursium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/maledictus_helmet.json b/src/generated/resources/data/modulargolems/recipes/maledictus_helmet.json new file mode 100644 index 000000000..6eb8258de --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/maledictus_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:cursium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:maledictus_helmet" + }, + "template": { + "item": "cataclysm:cursium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/maledictus_shinguard.json b/src/generated/resources/data/modulargolems/recipes/maledictus_shinguard.json new file mode 100644 index 000000000..90a8080cd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/maledictus_shinguard.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:cursium_block" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:maledictus_shinguard" + }, + "template": { + "item": "cataclysm:cursium_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/mechanical_arm.json b/src/generated/resources/data/modulargolems/recipes/mechanical_arm.json new file mode 100644 index 000000000..7a5aadb35 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/mechanical_arm.json @@ -0,0 +1,36 @@ +{ + "type": "create:mechanical_crafting", + "acceptMirrored": true, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "key": { + "A": { + "item": "create:mechanical_arm" + }, + "B": { + "item": "create:brass_sheet" + }, + "C": { + "item": "create:precision_mechanism" + }, + "D": { + "item": "modulargolems:metal_golem_template" + }, + "E": { + "item": "create:gearbox" + } + }, + "pattern": [ + " A ", + "CCC", + "BEB", + "DED" + ], + "result": { + "item": "modulargolems:mechanical_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_chestplate.json new file mode 100644 index 000000000..d14539ba8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 4000, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "result": { + "amount": 540, + "tag": "forge:molten_netherite" + }, + "temperature": 1250, + "time": 74 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_helmet.json b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_helmet.json new file mode 100644 index 000000000..796489080 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_helmet.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 2000, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "result": { + "amount": 450, + "tag": "forge:molten_netherite" + }, + "temperature": 1250, + "time": 74 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_shinguard.json new file mode 100644 index 000000000..06d1fe192 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/barbaric_vanguard_shinguard.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 1800, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "result": { + "amount": 270, + "tag": "forge:molten_netherite" + }, + "temperature": 1250, + "time": 74 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_axe.json new file mode 100644 index 000000000..face64003 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_axe.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:diamond_golem_axe" + }, + "result": { + "amount": 400, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_spear.json new file mode 100644 index 000000000..7301774af --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_spear.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:diamond_golem_spear" + }, + "result": { + "amount": 300, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_sword.json new file mode 100644 index 000000000..e8a1316d6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/diamond_golem_sword.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:diamond_golem_sword" + }, + "result": { + "amount": 500, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_axe.json new file mode 100644 index 000000000..389dd559c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_axe.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:iron_golem_axe" + }, + "result": { + "amount": 360, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_spear.json new file mode 100644 index 000000000..0facc6848 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_spear.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:iron_golem_spear" + }, + "result": { + "amount": 270, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_sword.json new file mode 100644 index 000000000..d9522e4fb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/iron_golem_sword.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:iron_golem_sword" + }, + "result": { + "amount": 450, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_axe.json new file mode 100644 index 000000000..fee2da413 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_axe.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 400, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:netherite_golem_axe" + }, + "result": { + "amount": 360, + "fluid": "tconstruct:molten_debris" + }, + "temperature": 1175, + "time": 71 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_spear.json new file mode 100644 index 000000000..7d62ed3a3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_spear.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 300, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:netherite_golem_spear" + }, + "result": { + "amount": 360, + "fluid": "tconstruct:molten_debris" + }, + "temperature": 1175, + "time": 71 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_sword.json new file mode 100644 index 000000000..5e87da50a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/netherite_golem_sword.json @@ -0,0 +1,24 @@ +{ + "type": "tconstruct:melting", + "byproducts": [ + { + "amount": 500, + "fluid": "tconstruct:molten_diamond" + } + ], + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:netherite_golem_sword" + }, + "result": { + "amount": 360, + "fluid": "tconstruct:molten_debris" + }, + "temperature": 1175, + "time": 71 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_chestplate.json b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_chestplate.json new file mode 100644 index 000000000..3bbdf87df --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:roman_guard_chestplate" + }, + "result": { + "amount": 3600, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_helmet.json b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_helmet.json new file mode 100644 index 000000000..24e3aafc7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_helmet.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:roman_guard_helmet" + }, + "result": { + "amount": 1800, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_shinguard.json b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_shinguard.json new file mode 100644 index 000000000..95a668ca3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/roman_guard_shinguard.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:roman_guard_shinguard" + }, + "result": { + "amount": 1620, + "tag": "forge:molten_iron" + }, + "temperature": 800, + "time": 60 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_boots.json new file mode 100644 index 000000000..2d498b5ad --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_boots.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:wind_spirit_boots" + }, + "result": { + "amount": 700, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_chestplate.json b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_chestplate.json new file mode 100644 index 000000000..1e07b8ef4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:wind_spirit_chestplate" + }, + "result": { + "amount": 4000, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_helmet.json b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_helmet.json new file mode 100644 index 000000000..3ef6d8767 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_helmet.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:wind_spirit_helmet" + }, + "result": { + "amount": 2000, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_shinguard.json b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_shinguard.json new file mode 100644 index 000000000..caf5ba405 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/melting/wind_spirit_shinguard.json @@ -0,0 +1,18 @@ +{ + "type": "tconstruct:melting", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "tconstruct" + } + ], + "ingredient": { + "item": "modulargolems:wind_spirit_shinguard" + }, + "result": { + "amount": 1800, + "fluid": "tconstruct:molten_diamond" + }, + "temperature": 1450, + "time": 79 +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/metal_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/metal_golem/assemble_holder.json similarity index 100% rename from src/generated/resources/data/modulargolems/recipes/metal_golem_holder.json rename to src/generated/resources/data/modulargolems/recipes/metal_golem/assemble_holder.json diff --git a/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_body.json b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_body.json new file mode 100644 index 000000000..b04bc3366 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_body.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:metal_golem_holder" + }, + "P": { + "item": "modulargolems:metal_golem_body" + } + }, + "pattern": [ + "P", + "H" + ], + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_left_arm.json b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_left_arm.json new file mode 100644 index 000000000..b7c4cc228 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_left_arm.json @@ -0,0 +1,19 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:metal_golem_holder" + }, + "P": { + "item": "modulargolems:metal_golem_arm" + } + }, + "pattern": [ + "HP" + ], + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_legs.json b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_legs.json new file mode 100644 index 000000000..4e6cf1cae --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_legs.json @@ -0,0 +1,20 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:metal_golem_holder" + }, + "P": { + "item": "modulargolems:metal_golem_legs" + } + }, + "pattern": [ + "H", + "P" + ], + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_right_arm.json b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_right_arm.json new file mode 100644 index 000000000..d2538eb95 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/metal_golem/replace_right_arm.json @@ -0,0 +1,19 @@ +{ + "type": "modulargolems:golem_replace_part", + "category": "misc", + "key": { + "H": { + "item": "modulargolems:metal_golem_holder" + }, + "P": { + "item": "modulargolems:metal_golem_arm" + } + }, + "pattern": [ + "PH" + ], + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "show_notification": false +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/monstrosity_chestplate.json b/src/generated/resources/data/modulargolems/recipes/monstrosity_chestplate.json new file mode 100644 index 000000000..8ae442312 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/monstrosity_chestplate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:monstrous_horn" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_chestplate" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:monstrosity_chestplate" + }, + "template": { + "item": "modulargolems:monstrosity_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/monstrosity_helmet.json b/src/generated/resources/data/modulargolems/recipes/monstrosity_helmet.json new file mode 100644 index 000000000..f1ff658df --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/monstrosity_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:monstrous_horn" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_helmet" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:monstrosity_helmet" + }, + "template": { + "item": "modulargolems:monstrosity_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/monstrosity_shinguard.json b/src/generated/resources/data/modulargolems/recipes/monstrosity_shinguard.json new file mode 100644 index 000000000..3b4cdde20 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/monstrosity_shinguard.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "cataclysm:monstrous_horn" + }, + "base": { + "item": "modulargolems:barbaric_vanguard_shinguard" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "result": { + "item": "modulargolems:monstrosity_shinguard" + }, + "template": { + "item": "modulargolems:monstrosity_upgrade_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/monstrosity_upgrade_template.json b/src/generated/resources/data/modulargolems/recipes/monstrosity_upgrade_template.json new file mode 100644 index 000000000..58bf6e05d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/monstrosity_upgrade_template.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "minecraft:blackstone" + }, + "B": { + "item": "minecraft:netherite_upgrade_smithing_template" + }, + "C": { + "item": "cataclysm:lava_power_cell" + }, + "G": { + "item": "minecraft:gold_ingot" + } + }, + "pattern": [ + "AGA", + "ABA", + "ACA" + ], + "result": { + "item": "modulargolems:monstrosity_upgrade_template" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/naga_boots.json b/src/generated/resources/data/modulargolems/recipes/naga_boots.json new file mode 100644 index 000000000..4b5cc13bb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/naga_boots.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:naga_scale" + }, + "E": { + "item": "twilightforest:ironwood_ingot" + } + }, + "pattern": [ + "B B", + "BAB", + "E E" + ], + "result": { + "item": "modulargolems:naga_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/naga_chestplate.json b/src/generated/resources/data/modulargolems/recipes/naga_chestplate.json new file mode 100644 index 000000000..5bd86a16a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/naga_chestplate.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:naga_scale" + }, + "E": { + "item": "twilightforest:ironwood_ingot" + }, + "I": { + "item": "twilightforest:naga_chestplate" + } + }, + "pattern": [ + "EAE", + "BIB", + "BBB" + ], + "result": { + "item": "modulargolems:naga_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/naga_helmet.json b/src/generated/resources/data/modulargolems/recipes/naga_helmet.json new file mode 100644 index 000000000..f7bd801e9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/naga_helmet.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "twilightforest:naga_scale" + }, + "E": { + "item": "twilightforest:ironwood_ingot" + }, + "I": { + "item": "twilightforest:naga_trophy" + } + }, + "pattern": [ + "EBE", + "BIB", + "BAB" + ], + "result": { + "item": "modulargolems:naga_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/naga_shinguard.json b/src/generated/resources/data/modulargolems/recipes/naga_shinguard.json new file mode 100644 index 000000000..8c5ad18b6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/naga_shinguard.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "E": { + "item": "twilightforest:ironwood_ingot" + }, + "I": { + "item": "twilightforest:naga_leggings" + } + }, + "pattern": [ + "EIE", + "EAE", + "E E" + ], + "result": { + "item": "modulargolems:naga_shinguard" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_dog_golem_armor.json b/src/generated/resources/data/modulargolems/recipes/netherite_dog_golem_armor.json new file mode 100644 index 000000000..0dc5156b5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_dog_golem_armor.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "minecraft:netherite_ingot" + }, + "base": { + "item": "modulargolems:diamond_dog_golem_armor" + }, + "result": { + "item": "modulargolems:netherite_dog_golem_armor" + }, + "template": { + "item": "minecraft:netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template.json b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template.json new file mode 100644 index 000000000..14174db30 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "modulargolems:empty_upgrade" + }, + "B": { + "item": "minecraft:netherite_upgrade_smithing_template" + }, + "C": { + "item": "minecraft:netherite_ingot" + }, + "D": { + "item": "minecraft:nether_star" + } + }, + "pattern": [ + "ADA", + "CBC", + "ACA" + ], + "result": { + "item": "modulargolems:netherite_expansion_template" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_dog_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_dog_golem_holder.json new file mode 100644 index 000000000..f13f7abb5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_dog_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:dog_golem_holder" + }, + "result": { + "item": "modulargolems:dog_golem_holder" + }, + "template": { + "item": "modulargolems:netherite_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_humanoid_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_humanoid_golem_holder.json new file mode 100644 index 000000000..e424f1141 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_humanoid_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:humanoid_golem_holder" + }, + "result": { + "item": "modulargolems:humanoid_golem_holder" + }, + "template": { + "item": "modulargolems:netherite_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_metal_golem_holder.json b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_metal_golem_holder.json new file mode 100644 index 000000000..20f719d17 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_expansion_template_metal_golem_holder.json @@ -0,0 +1,15 @@ +{ + "type": "modulargolems:golem_add_slot", + "addition": { + "item": "minecraft:iron_ingot" + }, + "base": { + "item": "modulargolems:metal_golem_holder" + }, + "result": { + "item": "modulargolems:metal_golem_holder" + }, + "template": { + "item": "modulargolems:netherite_expansion_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/netherite_mecha_bow.json b/src/generated/resources/data/modulargolems/recipes/netherite_mecha_bow.json new file mode 100644 index 000000000..f65ef4d78 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/netherite_mecha_bow.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "minecraft:netherite_ingot" + }, + "base": { + "item": "modulargolems:iron_mecha_bow" + }, + "result": { + "item": "modulargolems:netherite_mecha_bow" + }, + "template": { + "item": "minecraft:netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/nuclear_construct.json b/src/generated/resources/data/modulargolems/recipes/nuclear_construct.json new file mode 100644 index 000000000..904aa7018 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/nuclear_construct.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "key": { + "A": { + "item": "alexscaves:polymer_plate" + }, + "B": { + "item": "alexscaves:charred_remnant" + }, + "C": { + "item": "alexscaves:uranium_rod" + }, + "D": { + "item": "alexscaves:fissile_core" + } + }, + "pattern": [ + "AAA", + "CDC", + "BBB" + ], + "result": { + "count": 3, + "item": "modulargolems:nuclear_construct" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/player.json b/src/generated/resources/data/modulargolems/recipes/player.json index e6c8ad918..57db02b83 100644 --- a/src/generated/resources/data/modulargolems/recipes/player.json +++ b/src/generated/resources/data/modulargolems/recipes/player.json @@ -6,7 +6,7 @@ "item": "modulargolems:empty_upgrade" }, { - "item": "minecraft:nether_star" + "item": "minecraft:shield" } ], "result": { diff --git a/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_life_charm.json b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_life_charm.json new file mode 100644 index 000000000..c4bc3b205 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_life_charm.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "A": [ + { + "item": "twilightforest:charm_of_life_1" + }, + { + "item": "twilightforest:charm_of_life_2" + } + ], + "B": { + "item": "modulargolems:empty_upgrade" + }, + "E": { + "item": "minecraft:ender_pearl" + }, + "R": { + "item": "minecraft:respawn_anchor" + } + }, + "pattern": [ + " A ", + "EBE", + " R " + ], + "result": { + "item": "modulargolems:recycle" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_2.json b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_2.json new file mode 100644 index 000000000..8c5125510 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_2.json @@ -0,0 +1,42 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "1": { + "type": "l2library:enchantment", + "enchantment": "minecraft:infinity", + "min_level": 1 + }, + "2": { + "type": "l2library:enchantment", + "enchantment": "minecraft:mending", + "min_level": 1 + }, + "3": { + "type": "l2library:enchantment", + "enchantment": "minecraft:unbreaking", + "min_level": 3 + }, + "A": { + "item": "twilightforest:charm_of_keeping_2" + }, + "B": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + " A ", + "1B2", + " 3 " + ], + "result": { + "item": "modulargolems:recycle" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_3.json b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_3.json new file mode 100644 index 000000000..64a9114c7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/recycle_upgrade_from_lock_charm_3.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "item": "twilightforest:charm_of_keeping_3" + } + ], + "result": { + "item": "modulargolems:recycle" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/scylla_lightning_upgrade.json b/src/generated/resources/data/modulargolems/recipes/scylla_lightning_upgrade.json new file mode 100644 index 000000000..083c23c37 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/scylla_lightning_upgrade.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "cataclysm:essence_of_the_storm" + }, + "B": { + "item": "cataclysm:lacrima" + }, + "C": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + "BAB", + "BCB", + "BAB" + ], + "result": { + "item": "modulargolems:scylla_lightning_upgrade" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_body.json new file mode 100644 index 000000000..1fc206e12 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..f55659006 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..e7652bf15 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..c90a13cee --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..1641a4c78 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..ddf8e6300 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_body.json new file mode 100644 index 000000000..9c0bf91b7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..8e94ba525 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allay_steel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "composite_material:allay_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "composite_material:allay_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_body.json new file mode 100644 index 000000000..e1ddeba24 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_legs.json new file mode 100644 index 000000000..dee617c9b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..fc4d491e8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..2b2bc6c78 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..5c9da78e0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_arm.json new file mode 100644 index 000000000..d7cdc3c26 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_body.json new file mode 100644 index 000000000..930a78abf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_legs.json new file mode 100644 index 000000000..c0ecfe569 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/allthemodium_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "allthemodium:allthemodium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "allthemodium:allthemodium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_body.json new file mode 100644 index 000000000..273df5e4f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_legs.json new file mode 100644 index 000000000..fd8dcd163 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..f421fa566 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..fa0037893 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..bbe0a40e6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_arm.json new file mode 100644 index 000000000..18a2d19b8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_body.json new file mode 100644 index 000000000..afdea5bff --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_legs.json new file mode 100644 index 000000000..2c9de76a8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ancient_metal_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "cataclysm:ancient_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "cataclysm:ancient_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_body.json new file mode 100644 index 000000000..88e20d603 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_legs.json new file mode 100644 index 000000000..fa2480443 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..20e61fbb1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..bcd624581 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..f398e0e9c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_arm.json new file mode 100644 index 000000000..fceae98db --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_body.json new file mode 100644 index 000000000..2472233ac --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_legs.json new file mode 100644 index 000000000..9b2338252 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/apocalyptium_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "goety_revelation:apocalyptium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "tag": "modulargolems:revelation_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_body.json new file mode 100644 index 000000000..6ffb8ae17 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_legs.json new file mode 100644 index 000000000..7ec69aaa2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..e2f0df871 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..a74fdba84 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..ce746a440 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_arm.json new file mode 100644 index 000000000..1faf56f7c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_body.json new file mode 100644 index 000000000..722886edb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_legs.json new file mode 100644 index 000000000..83617cd5b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/candy_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "alexscaves:candy" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:candy_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_body.json new file mode 100644 index 000000000..2322c17e7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_body.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_legs.json new file mode 100644 index 000000000..832f14fd6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_dog_golem_legs.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..c136248bb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_arms.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..2ffaacdca --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_body.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..fc2a4824d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_humanoid_golem_legs.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_arm.json new file mode 100644 index 000000000..a23fa1534 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_arm.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_body.json new file mode 100644 index 000000000..ef4192675 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_body.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_legs.json new file mode 100644 index 000000000..a2b189d8b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cardboard_assemble_metal_golem_legs.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "create:cardboard" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "tag": "modulargolems:cardboard" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_body.json new file mode 100644 index 000000000..b22b4b11f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_legs.json new file mode 100644 index 000000000..d6a3b94b0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..a9ec40270 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..ca00dd565 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..a6fa28575 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_arm.json new file mode 100644 index 000000000..75083fcf7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_body.json new file mode 100644 index 000000000..cff0090ad --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_legs.json new file mode 100644 index 000000000..c4a36ff24 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/chaotic_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "l2hostility:chaotic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "l2hostility:chaos_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_body.json new file mode 100644 index 000000000..4f846efb3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_legs.json new file mode 100644 index 000000000..231b60108 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..330fde280 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..cdccbfaff --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..78dd8ca06 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_arm.json new file mode 100644 index 000000000..858af78b3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_body.json new file mode 100644 index 000000000..f5990f1a2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_legs.json new file mode 100644 index 000000000..315467d1d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cloud_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:cloud" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:cloud_cube" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_body.json new file mode 100644 index 000000000..b4c4f8747 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_legs.json new file mode 100644 index 000000000..a8423a60a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..b1db4b4df --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..c67ede592 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..cd4e3dbf7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_arm.json new file mode 100644 index 000000000..16233fa29 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_body.json new file mode 100644 index 000000000..3541f0d5e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_legs.json new file mode 100644 index 000000000..a8c1cb755 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursed_metal_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "goety:cursed_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "goety:cursed_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_body.json new file mode 100644 index 000000000..06dcefe28 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_legs.json new file mode 100644 index 000000000..8b324c738 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..663427914 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..8997360e2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..2e8afec77 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_arm.json new file mode 100644 index 000000000..a53a2f094 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_body.json new file mode 100644 index 000000000..dcb75080d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_legs.json new file mode 100644 index 000000000..c33777bbf --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/cursium_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "cataclysm:cursium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "cataclysm:cursium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_body.json new file mode 100644 index 000000000..83e553e75 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_legs.json new file mode 100644 index 000000000..9c9a1d387 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..5f90a7706 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..f739b5583 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..f7f0bd572 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_arm.json new file mode 100644 index 000000000..a1b82938c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_body.json new file mode 100644 index 000000000..2163278ed --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_legs.json new file mode 100644 index 000000000..976933c61 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dark_metal_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "goety:dark_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "goety:dark_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_body.json new file mode 100644 index 000000000..e49a811bd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..d4fda6c0a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..385ae4743 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..d5aa6b4c3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..68be33b57 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..0627b8a44 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_body.json new file mode 100644 index 000000000..eed0897f5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..d7c781dda --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/dungeon_steel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "composite_material:dungeon_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "composite_material:dungeon_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_body.json new file mode 100644 index 000000000..d256b8bde --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_legs.json new file mode 100644 index 000000000..900800287 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..fe59b4111 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..c2c515f0d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..187b78ad0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_arm.json new file mode 100644 index 000000000..787d8aea3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_body.json new file mode 100644 index 000000000..87cd75535 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_legs.json new file mode 100644 index 000000000..a57fdff7b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ender_guardian_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "cataclysm:ender_guardian" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:void_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_body.json new file mode 100644 index 000000000..f34fa5a30 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_legs.json new file mode 100644 index 000000000..ac4b03b4d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..2ebcb8311 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..d6cf89524 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..3006e71f8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_arm.json new file mode 100644 index 000000000..39efa6036 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_body.json new file mode 100644 index 000000000..f4ec998ec --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_legs.json new file mode 100644 index 000000000..a951fe31c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/etherite_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "composite_material:etherite" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "composite_material:etherite_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_body.json new file mode 100644 index 000000000..0cae10c66 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..7ff275444 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..82963d753 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..87b11484b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..eb7ca29b1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..431397856 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_body.json new file mode 100644 index 000000000..60afa6992 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..80257a1cb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/fire_dragonsteel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "iceandfire:fire_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_fire_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_body.json new file mode 100644 index 000000000..37b858d3e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..7b80a4144 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..584805f00 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..bfcd43bc2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..9c2afea31 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..7b5f879e7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_body.json new file mode 100644 index 000000000..dfbd6c476 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..43d286ac5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/ice_dragonsteel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "iceandfire:ice_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_ice_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_body.json new file mode 100644 index 000000000..d14fc419d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..629421cf0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..77385933d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..906ed2cf7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..306e696c3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..fdf7e5443 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_body.json new file mode 100644 index 000000000..08970bc89 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..97c58a511 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/lightning_dragonsteel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "iceandfire" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "iceandfire:lightning_dragonsteel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "iceandfire:dragonsteel_lightning_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_body.json new file mode 100644 index 000000000..de054c2b3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_legs.json new file mode 100644 index 000000000..7037d830f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..a281768f2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..bcafcce73 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..95b268f78 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_arm.json new file mode 100644 index 000000000..d7b8eacb1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_body.json new file mode 100644 index 000000000..0b3a8e38c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_legs.json new file mode 100644 index 000000000..ada5b8e7e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/magnetic_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "alexscaves:magnetic" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:magnetic_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_body.json new file mode 100644 index 000000000..5e885f871 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_legs.json new file mode 100644 index 000000000..effe8f9eb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..04c2f3302 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..9918e4f27 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..68f27c0f9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_arm.json new file mode 100644 index 000000000..a0401c233 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_body.json new file mode 100644 index 000000000..48bc10d90 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_legs.json new file mode 100644 index 000000000..b07853cd1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/miraculous_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "l2hostility" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "l2hostility:miraculous" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "l2hostility:miracle_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_body.json new file mode 100644 index 000000000..cf01372a7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_legs.json new file mode 100644 index 000000000..6ec1c0f67 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..df9678f51 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..2bc7c3b4a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..06499860c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_arm.json new file mode 100644 index 000000000..3fc0ee14e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_body.json new file mode 100644 index 000000000..8341273f6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_legs.json new file mode 100644 index 000000000..c2936e119 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/molten_metal_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "legendary_monsters:molten_metal" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "legendary_monsters:molten_metal_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_body.json new file mode 100644 index 000000000..2e6e30364 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_legs.json new file mode 100644 index 000000000..3124ed96a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..fc4b4d1b2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..933c105f8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..f2e5bcb36 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_arm.json new file mode 100644 index 000000000..3752e1a89 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_body.json new file mode 100644 index 000000000..e32f4f037 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_legs.json new file mode 100644 index 000000000..c8aa2d3bd --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/nuclear_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "alexscaves" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "alexscaves:nuclear" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:nuclear_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_body.json new file mode 100644 index 000000000..208b01934 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_legs.json new file mode 100644 index 000000000..7f0e0f5c1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..0cf340926 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..bf7ed3012 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..2619e0c55 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_arm.json new file mode 100644 index 000000000..03e7585c0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_body.json new file mode 100644 index 000000000..3f068c248 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_legs.json new file mode 100644 index 000000000..e5c34e31c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/obsidian_steel_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "composite_material:obsidian_steel" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "composite_material:obsidian_steel_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_body.json new file mode 100644 index 000000000..61e6326f3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_legs.json new file mode 100644 index 000000000..3691e2886 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..aca1d9de2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..a5d7a5e6b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..49d441068 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_arm.json new file mode 100644 index 000000000..95a5f2f8e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_body.json new file mode 100644 index 000000000..5ff2da62a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_legs.json new file mode 100644 index 000000000..061338ae8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/primitive_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "composite_material" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "composite_material:primitive" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "composite_material:primitive_tenacity" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_body.json new file mode 100644 index 000000000..362139a2a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_legs.json new file mode 100644 index 000000000..206e6149e --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..5c7406d80 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..e70690865 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..31042781c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_arm.json new file mode 100644 index 000000000..2900a4709 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_body.json new file mode 100644 index 000000000..5113f35d9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_legs.json new file mode 100644 index 000000000..4c98b8626 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/storm_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "cataclysm:storm" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:storm_construct" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_body.json new file mode 100644 index 000000000..a32ea0b42 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_legs.json new file mode 100644 index 000000000..2e42a7afa --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..abaabe1e9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..9dce595b8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..0700727b3 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_arm.json new file mode 100644 index 000000000..908a0c14a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_body.json new file mode 100644 index 000000000..9b0e1fb02 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_legs.json new file mode 100644 index 000000000..f6002a6f4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/unobtainium_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "allthemodium:unobtainium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "allthemodium:unobtainium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_body.json new file mode 100644 index 000000000..5f6717c35 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_legs.json new file mode 100644 index 000000000..a2b3b5ac6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..86bfc743b --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..f3086d4e6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..79dd38c02 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_arm.json new file mode 100644 index 000000000..af4217026 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_body.json new file mode 100644 index 000000000..7828559e8 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_legs.json new file mode 100644 index 000000000..b551e4ec6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/vibranium_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "allthemodium" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "allthemodium:vibranium" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "allthemodium:vibranium_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_body.json new file mode 100644 index 000000000..924fa011f --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:dog_golem_body", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_legs.json new file mode 100644 index 000000000..c1bf427ed --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_dog_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:dog_golem_legs" + }, + "loops": 3, + "results": [ + { + "item": "modulargolems:dog_golem_legs", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_dog_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_dog_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_arms.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_arms.json new file mode 100644 index 000000000..49d6060d9 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_arms.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_arms" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_arms", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_arms" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_body.json new file mode 100644 index 000000000..b85cbc6a4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_body" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_body", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_legs.json new file mode 100644 index 000000000..fc2ea1d14 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_humanoid_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:humanoid_golem_legs" + }, + "loops": 6, + "results": [ + { + "item": "modulargolems:humanoid_golem_legs", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_humanoid_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_arm.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_arm.json new file mode 100644 index 000000000..b811df55d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_arm.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_arm" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_arm", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_arm" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_arm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_body.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_body.json new file mode 100644 index 000000000..bd4490397 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_body.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_body" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_body", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_body" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_body" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_legs.json b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_legs.json new file mode 100644 index 000000000..0541498c2 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/sequenced_assembly/wroughtnaut_assemble_metal_golem_legs.json @@ -0,0 +1,85 @@ +{ + "type": "create:sequenced_assembly", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "create" + }, + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredient": { + "item": "modulargolems:metal_golem_legs" + }, + "loops": 9, + "results": [ + { + "item": "modulargolems:metal_golem_legs", + "nbt": { + "golem_material": "mowziesmobs:wroughtnaut" + } + } + ], + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + }, + { + "item": "modulargolems:wroughtnaut_ingot" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + }, + { + "type": "create:pressing", + "ingredients": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ], + "results": [ + { + "item": "modulargolems:incomplete_metal_golem_legs" + } + ] + } + ], + "transitionalItem": { + "item": "modulargolems:incomplete_metal_golem_legs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/soul_collection.json b/src/generated/resources/data/modulargolems/recipes/soul_collection.json new file mode 100644 index 000000000..50e2ea70c --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/soul_collection.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety" + } + ], + "key": { + "D": { + "item": "goety:soul_emerald" + }, + "E": { + "item": "goety:ectoplasm" + }, + "F": { + "item": "goety:spirit_fabric" + }, + "I": { + "item": "goety:dark_ingot" + }, + "X": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + "EDE", + "FXF", + "IFI" + ], + "result": { + "item": "modulargolems:soul_collection" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_axe.json b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_axe.json new file mode 100644 index 000000000..3319bf54a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_axe.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:steeleaf_ingot" + }, + "S": { + "item": "twilightforest:liveroot" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "III", + "IS ", + "TST" + ], + "result": { + "item": "modulargolems:steeleaf_golem_axe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_spear.json b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_spear.json new file mode 100644 index 000000000..6619cb4f5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_spear.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:steeleaf_ingot" + }, + "S": { + "item": "twilightforest:liveroot" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + " SI", + "S T" + ], + "result": { + "item": "modulargolems:steeleaf_golem_spear" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_sword.json b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_sword.json new file mode 100644 index 000000000..08be293c7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/steeleaf_golem_sword.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "twilightforest" + } + ], + "key": { + "I": { + "item": "twilightforest:steeleaf_ingot" + }, + "S": { + "item": "twilightforest:liveroot" + }, + "T": { + "item": "modulargolems:metal_golem_template" + } + }, + "pattern": [ + "TII", + "ISI", + "SIT" + ], + "result": { + "item": "modulargolems:steeleaf_golem_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/stellar_apocalypse.json b/src/generated/resources/data/modulargolems/recipes/stellar_apocalypse.json new file mode 100644 index 000000000..307648a08 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/stellar_apocalypse.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "tag": "modulargolems:revelation_ring" + }, + "base": { + "item": "modulargolems:netherite_golem_sword" + }, + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "result": { + "item": "modulargolems:stellar_apocalypse" + }, + "template": { + "tag": "modulargolems:revelation_template" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/storm_construct.json b/src/generated/resources/data/modulargolems/recipes/storm_construct.json new file mode 100644 index 000000000..c008dcb6a --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/storm_construct.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "B": { + "item": "modulargolems:azure_cube" + }, + "C": { + "item": "cataclysm:essence_of_the_storm" + } + }, + "pattern": [ + " B ", + "BCB", + " B " + ], + "result": { + "count": 3, + "item": "modulargolems:storm_construct" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/talented.json b/src/generated/resources/data/modulargolems/recipes/talented.json index 84596c5ad..bbf7a694a 100644 --- a/src/generated/resources/data/modulargolems/recipes/talented.json +++ b/src/generated/resources/data/modulargolems/recipes/talented.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "A": { - "item": "minecraft:chorus_flower" + "item": "minecraft:diamond" }, "B": { "item": "modulargolems:empty_upgrade" diff --git a/src/generated/resources/data/modulargolems/recipes/the_abhorrent.json b/src/generated/resources/data/modulargolems/recipes/the_abhorrent.json new file mode 100644 index 000000000..e98fd17b5 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/the_abhorrent.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "key": { + "B": { + "item": "goety:unholy_blood" + }, + "F": { + "item": "goety:unholy_fabric" + }, + "O": { + "tag": "modulargolems:revelation_ingot" + }, + "U": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + "BFB", + "BOB", + "BUB" + ], + "result": { + "item": "modulargolems:the_abhorrent" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/the_atrocious.json b/src/generated/resources/data/modulargolems/recipes/the_atrocious.json new file mode 100644 index 000000000..fce97da0d --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/the_atrocious.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "key": { + "B": { + "item": "goety:unholy_blood" + }, + "F": { + "item": "goety:unholy_fabric" + }, + "O": { + "tag": "modulargolems:revelation_ingot" + }, + "U": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + "BBB", + "FOF", + "FUF" + ], + "result": { + "item": "modulargolems:the_atrocious" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/the_profane.json b/src/generated/resources/data/modulargolems/recipes/the_profane.json new file mode 100644 index 000000000..fe2168974 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/the_profane.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "key": { + "B": { + "item": "goety:unholy_blood" + }, + "F": { + "item": "goety:unholy_fabric" + }, + "O": { + "tag": "modulargolems:revelation_ingot" + }, + "U": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + " F ", + "BOB", + " U " + ], + "result": { + "item": "modulargolems:the_profane" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/the_terrible.json b/src/generated/resources/data/modulargolems/recipes/the_terrible.json new file mode 100644 index 000000000..87e1e1954 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/the_terrible.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "goety_revelation" + } + ], + "key": { + "B": { + "item": "goety:unholy_blood" + }, + "F": { + "item": "goety:unholy_fabric" + }, + "O": { + "tag": "modulargolems:revelation_ingot" + }, + "U": { + "item": "modulargolems:empty_upgrade" + } + }, + "pattern": [ + " B ", + "FOF", + " U " + ], + "result": { + "item": "modulargolems:the_terrible" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/thunderstorm.json b/src/generated/resources/data/modulargolems/recipes/thunderstorm.json new file mode 100644 index 000000000..3c938e336 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/thunderstorm.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "legendary_monsters" + } + ], + "key": { + "O": { + "item": "modulargolems:empty_upgrade" + }, + "R": { + "item": "legendary_monsters:cloud_rod" + }, + "X": { + "item": "legendary_monsters:air_rune" + } + }, + "pattern": [ + " X ", + "ROR", + " R " + ], + "result": { + "item": "modulargolems:thunderstorm" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/void_construct.json b/src/generated/resources/data/modulargolems/recipes/void_construct.json new file mode 100644 index 000000000..439cf4c74 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/void_construct.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "modulargolems:void_cube" + }, + "B": { + "item": "cataclysm:void_jaw" + }, + "C": { + "item": "cataclysm:void_core" + } + }, + "pattern": [ + "ABA", + "BCB", + "ABA" + ], + "result": { + "count": 3, + "item": "modulargolems:void_construct" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/void_cube.json b/src/generated/resources/data/modulargolems/recipes/void_cube.json new file mode 100644 index 000000000..754de1fa0 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/void_cube.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "cataclysm" + } + ], + "key": { + "A": { + "item": "minecraft:purpur_block" + }, + "B": { + "item": "minecraft:end_stone" + }, + "C": { + "item": "minecraft:obsidian" + }, + "D": { + "item": "minecraft:shulker_shell" + }, + "E": { + "item": "cataclysm:void_jaw" + } + }, + "pattern": [ + "ADA", + "BEB", + "CDC" + ], + "result": { + "item": "modulargolems:void_cube" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/wind_spirit_boots.json b/src/generated/resources/data/modulargolems/recipes/wind_spirit_boots.json new file mode 100644 index 000000000..d5a354ebb --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/wind_spirit_boots.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:lapis_lazuli" + }, + "I": { + "item": "minecraft:diamond_boots" + } + }, + "pattern": [ + "I I", + "BAB" + ], + "result": { + "item": "modulargolems:wind_spirit_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/wroughtnaut.json b/src/generated/resources/data/modulargolems/recipes/wroughtnaut.json new file mode 100644 index 000000000..5a31b7ba4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/wroughtnaut.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "ingredients": [ + { + "item": "modulargolems:empty_upgrade" + }, + { + "tag": "modulargolems:wroughtnaut_items" + } + ], + "result": { + "item": "modulargolems:wroughtnaut" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/recipes/wroughtnaut_ingot.json b/src/generated/resources/data/modulargolems/recipes/wroughtnaut_ingot.json new file mode 100644 index 000000000..af191f1ac --- /dev/null +++ b/src/generated/resources/data/modulargolems/recipes/wroughtnaut_ingot.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "conditions": [ + { + "type": "forge:mod_loaded", + "modid": "mowziesmobs" + } + ], + "key": { + "A": { + "item": "modulargolems:metal_golem_template" + }, + "B": { + "item": "minecraft:iron_ingot" + }, + "C": { + "tag": "modulargolems:wroughtnaut_items" + } + }, + "pattern": [ + "ABA", + "BCB", + "ABA" + ], + "result": { + "count": 9, + "item": "modulargolems:wroughtnaut_ingot" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/entity_types/shield_breaker.json b/src/generated/resources/data/modulargolems/tags/entity_types/shield_breaker.json new file mode 100644 index 000000000..e80aa5aa6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/entity_types/shield_breaker.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:bosses" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/apocalyptium_armor.json b/src/generated/resources/data/modulargolems/tags/items/apocalyptium_armor.json new file mode 100644 index 000000000..d2d1b4403 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/apocalyptium_armor.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "id": "modulargolems:apocalyptium_helmet", + "required": false + }, + { + "id": "modulargolems:apocalyptium_chestplate", + "required": false + }, + { + "id": "modulargolems:apocalyptium_shinguard", + "required": false + }, + { + "id": "modulargolems:apocalyptium_boots", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/blue_upgrades.json b/src/generated/resources/data/modulargolems/tags/items/blue_upgrades.json index 833505584..4c130b13a 100644 --- a/src/generated/resources/data/modulargolems/tags/items/blue_upgrades.json +++ b/src/generated/resources/data/modulargolems/tags/items/blue_upgrades.json @@ -4,6 +4,10 @@ "id": "modulargolems:cleanse", "required": false }, + { + "id": "modulargolems:soul_collection", + "required": false + }, "modulargolems:bell", "modulargolems:ender_sight", "modulargolems:float", diff --git a/src/generated/resources/data/modulargolems/tags/items/cardboard.json b/src/generated/resources/data/modulargolems/tags/items/cardboard.json new file mode 100644 index 000000000..eb6c489d1 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/cardboard.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "create:cardboard", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/golem_interact.json b/src/generated/resources/data/modulargolems/tags/items/golem_interact.json index d7de36f0e..7c3883c9b 100644 --- a/src/generated/resources/data/modulargolems/tags/items/golem_interact.json +++ b/src/generated/resources/data/modulargolems/tags/items/golem_interact.json @@ -5,16 +5,13 @@ "modulargolems:summon_wand", "modulargolems:rider_wand", "modulargolems:squad_wand", - "modulargolems:omnipotent_wand_command", - "modulargolems:omnipotent_wand_retrieval", - "modulargolems:omnipotent_wand_summon", - "modulargolems:omnipotent_wand_rider", - "modulargolems:omnipotent_wand_squad", "modulargolems:target_filter_name", "modulargolems:target_filter_type", "modulargolems:target_filter_uuid", "modulargolems:target_filter_default", "modulargolems:patrol_path_recorder", + "modulargolems:hostile_wand", + "#modulargolems:golem_omni_wand", "#modulargolems:config_card", "#modulargolems:holders" ] diff --git a/src/generated/resources/data/modulargolems/tags/items/golem_omni_wand.json b/src/generated/resources/data/modulargolems/tags/items/golem_omni_wand.json new file mode 100644 index 000000000..a64b3b31a --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/golem_omni_wand.json @@ -0,0 +1,9 @@ +{ + "values": [ + "modulargolems:omnipotent_wand_command", + "modulargolems:omnipotent_wand_retrieval", + "modulargolems:omnipotent_wand_summon", + "modulargolems:omnipotent_wand_rider", + "modulargolems:omnipotent_wand_squad" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/large_golem_weapons.json b/src/generated/resources/data/modulargolems/tags/items/large_golem_weapons.json new file mode 100644 index 000000000..c880517ed --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/large_golem_weapons.json @@ -0,0 +1,116 @@ +{ + "values": [ + { + "id": "composite_material:etherite_sword", + "required": false + }, + { + "id": "composite_material:etherite_sword_reinforced", + "required": false + }, + { + "id": "cataclysm:the_annihilator", + "required": false + }, + { + "id": "cataclysm:the_immolator", + "required": false + }, + { + "id": "cataclysm:the_incinerator", + "required": false + }, + { + "id": "cataclysm:gauntlet_of_guard", + "required": false + }, + { + "id": "cataclysm:gauntlet_of_bulwark", + "required": false + }, + { + "id": "cataclysm:gauntlet_of_maelstrom", + "required": false + }, + { + "id": "cataclysm:soul_render", + "required": false + }, + { + "id": "cataclysm:meat_shredder", + "required": false + }, + { + "id": "cataclysm:infernal_forge", + "required": false + }, + { + "id": "cataclysm:void_forge", + "required": false + }, + { + "id": "cataclysm:wither_assault_shoulder_weapon", + "required": false + }, + { + "id": "cataclysm:void_assault_shoulder_weapon", + "required": false + }, + { + "id": "cataclysm:astrape", + "required": false + }, + { + "id": "cataclysm:ceraunus", + "required": false + }, + { + "id": "cataclysm:brontes", + "required": false + }, + { + "id": "l2weaponry:eternium_claw", + "required": false + }, + { + "id": "l2weaponry:eternium_dagger", + "required": false + }, + { + "id": "l2weaponry:eternium_machete", + "required": false + }, + { + "id": "l2weaponry:eternium_throwing_axe", + "required": false + }, + { + "id": "l2weaponry:eternium_hammer", + "required": false + }, + { + "id": "l2weaponry:eternium_battle_axe", + "required": false + }, + { + "id": "l2weaponry:eternium_scythe", + "required": false + }, + { + "id": "l2weaponry:eternium_spear", + "required": false + }, + { + "id": "l2weaponry:eternium_javelin", + "required": false + }, + { + "id": "l2weaponry:claw_of_determination", + "required": false + }, + { + "id": "l2weaponry:blade_of_illusion", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/revelation_bow.json b/src/generated/resources/data/modulargolems/tags/items/revelation_bow.json new file mode 100644 index 000000000..e27240cb4 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/revelation_bow.json @@ -0,0 +1,9 @@ +{ + "values": [ + "minecraft:bow", + { + "id": "goety_revelation:bow_of_revelation", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/revelation_doom.json b/src/generated/resources/data/modulargolems/tags/items/revelation_doom.json new file mode 100644 index 000000000..fb3090ad7 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/revelation_doom.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "goety_revelation:doom_medal", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/revelation_ingot.json b/src/generated/resources/data/modulargolems/tags/items/revelation_ingot.json new file mode 100644 index 000000000..5f03687ef --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/revelation_ingot.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "goety_revelation:apocalyptium_ingot", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/revelation_ring.json b/src/generated/resources/data/modulargolems/tags/items/revelation_ring.json new file mode 100644 index 000000000..8155cd827 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/revelation_ring.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "goety_revelation:ascension_halo", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/revelation_template.json b/src/generated/resources/data/modulargolems/tags/items/revelation_template.json new file mode 100644 index 000000000..e25633ad6 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/revelation_template.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "goety_revelation:apocalyptium_upgrade_smithing_template", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/shield_breaker_weapons.json b/src/generated/resources/data/modulargolems/tags/items/shield_breaker_weapons.json new file mode 100644 index 000000000..6d6335f7e --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/shield_breaker_weapons.json @@ -0,0 +1,65 @@ +{ + "values": [ + "modulargolems:golem_slicing_axe", + { + "id": "modulargolems:iron_golem_spear", + "required": false + }, + { + "id": "modulargolems:diamond_golem_spear", + "required": false + }, + { + "id": "modulargolems:netherite_golem_spear", + "required": false + }, + { + "id": "modulargolems:iron_golem_axe", + "required": false + }, + { + "id": "modulargolems:diamond_golem_axe", + "required": false + }, + { + "id": "modulargolems:netherite_golem_axe", + "required": false + }, + { + "id": "modulargolems:ironwood_golem_spear", + "required": false + }, + { + "id": "modulargolems:steeleaf_golem_spear", + "required": false + }, + { + "id": "modulargolems:knightmetal_golem_spear", + "required": false + }, + { + "id": "modulargolems:fiery_golem_spear", + "required": false + }, + { + "id": "modulargolems:ironwood_golem_axe", + "required": false + }, + { + "id": "modulargolems:steeleaf_golem_axe", + "required": false + }, + { + "id": "modulargolems:knightmetal_golem_axe", + "required": false + }, + { + "id": "modulargolems:fiery_golem_axe", + "required": false + }, + { + "id": "modulargolems:stellar_apocalypse", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/special_crafting_material.json b/src/generated/resources/data/modulargolems/tags/items/special_crafting_material.json index cae1dada5..0b66f10d5 100644 --- a/src/generated/resources/data/modulargolems/tags/items/special_crafting_material.json +++ b/src/generated/resources/data/modulargolems/tags/items/special_crafting_material.json @@ -1,5 +1,9 @@ { "values": [ + { + "id": "create:cardboard", + "required": false + }, { "id": "create:andesite_alloy", "required": false @@ -11,6 +15,26 @@ { "id": "create:railway_casing", "required": false + }, + { + "id": "#forge:ingots/amethyst_bronze", + "required": false + }, + { + "id": "#forge:ingots/cobalt", + "required": false + }, + { + "id": "#forge:ingots/manyullyn", + "required": false + }, + { + "id": "#forge:ingots/hepatizon", + "required": false + }, + { + "id": "#forge:ingots/rose_gold", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/tough_item.json b/src/generated/resources/data/modulargolems/tags/items/tough_item.json new file mode 100644 index 000000000..cefa105cd --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/tough_item.json @@ -0,0 +1,66 @@ +{ + "values": [ + "modulargolems:barbaric_vanguard_helmet", + "modulargolems:barbaric_vanguard_chestplate", + "modulargolems:barbaric_vanguard_shinguard", + "modulargolems:barbaric_vanguard_boots", + "modulargolems:beacon_boots", + "modulargolems:netherite_dog_golem_armor", + "modulargolems:netherite_mecha_bow", + "modulargolems:sonic_cannon", + "modulargolems:beacon_cannon", + "modulargolems:flame_thrower", + { + "id": "modulargolems:fiery_helmet", + "required": false + }, + { + "id": "modulargolems:fiery_chestplate", + "required": false + }, + { + "id": "modulargolems:fiery_shinguard", + "required": false + }, + { + "id": "modulargolems:fiery_boots", + "required": false + }, + { + "id": "modulargolems:ignis_helmet", + "required": false + }, + { + "id": "modulargolems:ignis_chestplate", + "required": false + }, + { + "id": "modulargolems:ignis_shinguard", + "required": false + }, + { + "id": "modulargolems:harbinger_helmet", + "required": false + }, + { + "id": "modulargolems:harbinger_chestplate", + "required": false + }, + { + "id": "modulargolems:harbinger_shinguard", + "required": false + }, + { + "id": "modulargolems:monstrosity_helmet", + "required": false + }, + { + "id": "modulargolems:monstrosity_chestplate", + "required": false + }, + { + "id": "modulargolems:monstrosity_shinguard", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/upgrades.json b/src/generated/resources/data/modulargolems/tags/items/upgrades.json index fe4557bf4..32530e628 100644 --- a/src/generated/resources/data/modulargolems/tags/items/upgrades.json +++ b/src/generated/resources/data/modulargolems/tags/items/upgrades.json @@ -137,6 +137,66 @@ { "id": "modulargolems:ancient_remnant_sandstorm", "required": false + }, + { + "id": "modulargolems:scylla_lightning_upgrade", + "required": false + }, + { + "id": "modulargolems:soul_collection", + "required": false + }, + { + "id": "modulargolems:fire_blast", + "required": false + }, + { + "id": "modulargolems:fire_tornado", + "required": false + }, + { + "id": "modulargolems:hell_cloud", + "required": false + }, + { + "id": "modulargolems:hell_bolt", + "required": false + }, + { + "id": "modulargolems:hell_blast", + "required": false + }, + { + "id": "modulargolems:apostle", + "required": false + }, + { + "id": "modulargolems:the_abhorrent", + "required": false + }, + { + "id": "modulargolems:the_terrible", + "required": false + }, + { + "id": "modulargolems:the_profane", + "required": false + }, + { + "id": "modulargolems:the_atrocious", + "required": false + }, + { + "id": "modulargolems:wroughtnaut", + "required": false + }, + { + "id": "modulargolems:thunderstorm", + "required": false + }, + { + "id": "modulargolems:etherite", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/modulargolems/tags/items/wroughtnaut_items.json b/src/generated/resources/data/modulargolems/tags/items/wroughtnaut_items.json new file mode 100644 index 000000000..198909944 --- /dev/null +++ b/src/generated/resources/data/modulargolems/tags/items/wroughtnaut_items.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "id": "mowziesmobs:wrought_axe", + "required": false + }, + { + "id": "mowziesmobs:wrought_helmet", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/mowziesmobs/modulargolems_config/materials/mowziesmobs.json b/src/generated/resources/data/mowziesmobs/modulargolems_config/materials/mowziesmobs.json new file mode 100644 index 000000000..73f3dfd22 --- /dev/null +++ b/src/generated/resources/data/mowziesmobs/modulargolems_config/materials/mowziesmobs.json @@ -0,0 +1,27 @@ +{ + "ingredients": { + "mowziesmobs:wroughtnaut": { + "item": "modulargolems:wroughtnaut_ingot" + } + }, + "modifiers": { + "mowziesmobs:wroughtnaut": { + "modulargolems:armor_penetration": 1, + "modulargolems:fire_immune": 1, + "modulargolems:magic_immune": 1, + "modulargolems:projectile_reject": 1, + "modulargolems:wroughtnaut": 1 + } + }, + "repairIngredients": { + "mowziesmobs:wroughtnaut": { + "item": "modulargolems:wroughtnaut_ingot" + } + }, + "stats": { + "mowziesmobs:wroughtnaut": { + "modulargolems:attack": 25.0, + "modulargolems:max_health": 360.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/modulargolems_config/materials/tconstruct.json b/src/generated/resources/data/tconstruct/modulargolems_config/materials/tconstruct.json new file mode 100644 index 000000000..5f855061c --- /dev/null +++ b/src/generated/resources/data/tconstruct/modulargolems_config/materials/tconstruct.json @@ -0,0 +1,73 @@ +{ + "ingredients": { + "tconstruct:amethyst_bronze": { + "tag": "forge:ingots/amethyst_bronze" + }, + "tconstruct:cobalt": { + "tag": "forge:ingots/cobalt" + }, + "tconstruct:hepatizon": { + "tag": "forge:ingots/hepatizon" + }, + "tconstruct:manyullyn": { + "tag": "forge:ingots/manyullyn" + }, + "tconstruct:rose_gold": { + "tag": "forge:ingots/rose_gold" + } + }, + "modifiers": { + "tconstruct:amethyst_bronze": {}, + "tconstruct:cobalt": {}, + "tconstruct:hepatizon": { + "modulargolems:hepatizon_defense": 1 + }, + "tconstruct:manyullyn": { + "modulargolems:manyullyn_attack": 1, + "modulargolems:manyullyn_defense": 1 + }, + "tconstruct:rose_gold": { + "modulargolems:add_slot": 1 + } + }, + "repairIngredients": { + "tconstruct:amethyst_bronze": { + "tag": "forge:ingots/amethyst_bronze" + }, + "tconstruct:cobalt": { + "tag": "forge:ingots/cobalt" + }, + "tconstruct:hepatizon": { + "tag": "forge:ingots/hepatizon" + }, + "tconstruct:manyullyn": { + "tag": "forge:ingots/manyullyn" + }, + "tconstruct:rose_gold": { + "tag": "forge:ingots/rose_gold" + } + }, + "stats": { + "tconstruct:amethyst_bronze": { + "modulargolems:attack": 15.0, + "modulargolems:max_health": 200.0 + }, + "tconstruct:cobalt": { + "modulargolems:attack": 20.0, + "modulargolems:max_health": 220.0, + "modulargolems:speed": 0.3 + }, + "tconstruct:hepatizon": { + "modulargolems:attack": 15.0, + "modulargolems:max_health": 250.0 + }, + "tconstruct:manyullyn": { + "modulargolems:attack": 35.0, + "modulargolems:max_health": 300.0 + }, + "tconstruct:rose_gold": { + "modulargolems:attack": 10.0, + "modulargolems:max_health": 40.0 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/modulargolems_config/materials/twilightforest.json b/src/generated/resources/data/twilightforest/modulargolems_config/materials/twilightforest.json index 58faedcd3..fd581274c 100644 --- a/src/generated/resources/data/twilightforest/modulargolems_config/materials/twilightforest.json +++ b/src/generated/resources/data/twilightforest/modulargolems_config/materials/twilightforest.json @@ -15,7 +15,7 @@ }, "modifiers": { "twilightforest:fiery": { - "modulargolems:fiery": 1, + "modulargolems:fiery": 2, "modulargolems:fire_immune": 1, "modulargolems:tf_damage": 1, "modulargolems:tf_healing": 1, @@ -35,6 +35,20 @@ "modulargolems:tf_healing": 1 } }, + "repairIngredients": { + "twilightforest:fiery": { + "tag": "forge:ingots/fiery" + }, + "twilightforest:ironwood": { + "tag": "forge:ingots/ironwood" + }, + "twilightforest:knightmetal": { + "tag": "forge:ingots/knightmetal" + }, + "twilightforest:steeleaf": { + "tag": "forge:ingots/steeleaf" + } + }, "stats": { "twilightforest:fiery": { "modulargolems:attack": 20.0, @@ -52,8 +66,10 @@ "modulargolems:weight": -0.4 }, "twilightforest:steeleaf": { - "modulargolems:attack": 24.0, - "modulargolems:max_health": 20.0 + "modulargolems:attack": 20.0, + "modulargolems:max_health": 60.0, + "modulargolems:regen": 4.0, + "modulargolems:weight": 0.2 } } } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/backpack/L2BCompat.java b/src/main/java/dev/xkmc/modulargolems/compat/backpack/L2BCompat.java new file mode 100644 index 000000000..14fb1e551 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/backpack/L2BCompat.java @@ -0,0 +1,151 @@ +package dev.xkmc.modulargolems.compat.backpack; + +import dev.xkmc.l2backpack.content.remote.worldchest.WorldChestItem; +import dev.xkmc.l2backpack.init.registrate.BackpackItems; +import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +public class L2BCompat { + + private static boolean hasEnder(Player player) { + List list = new ArrayList<>(); + list.add(player.getMainHandItem()); + list.add(player.getOffhandItem()); + list.add(player.getItemBySlot(EquipmentSlot.CHEST)); + for (var e : list) { + if (e.is(BackpackItems.ENDER_BACKPACK.get())) { + return true; + } + } + if (ModList.get().isLoaded(CuriosApi.MODID)) { + return CurioCompatRegistry.hasItem(player, BackpackItems.ENDER_BACKPACK.get()); + } + return false; + } + + private static List getAllContainers(Player player, boolean hasEnder) { + List list = new ArrayList<>(); + list.add(player.getOffhandItem()); + list.add(player.getItemBySlot(EquipmentSlot.CHEST)); + if (ModList.get().isLoaded(CuriosApi.MODID)) { + list.addAll(CurioCompatRegistry.getItems(player, e -> e.getItem() instanceof WorldChestItem)); + } + for (int i = 0; i < 36; i++) { + list.add(player.getInventory().getItem(i)); + } + if (hasEnder) { + for (int i = 0; i < 27; i++) { + list.add(player.getEnderChestInventory().getItem(i)); + } + } + list.removeIf(e -> !(e.getItem() instanceof WorldChestItem)); + return list; + } + + public static boolean addGolemToPlayer(ServerPlayer player, ItemStack golem, AbstractGolemEntity entity) { + //TODO has upgrade + var hasEnder = hasEnder(player); + var config = GolemHolder.getGolemConfig(golem); + if (config.isPresent()) { + var list = getAllContainers(player, hasEnder); + for (var stack : list) { + if (!(stack.getItem() instanceof WorldChestItem chest)) continue; + if (chest.color.getId() != config.get().getSecond()) continue; + var owner = WorldChestItem.getOwner(stack); + if (owner.isEmpty() || !owner.get().equals(config.get().getFirst())) continue; + var opt = chest.getContainer(stack, player.serverLevel()); + if (opt.isEmpty()) continue; + var cont = opt.get().container; + if (cont.addItem(golem).isEmpty()) { + entity.setRetrivedTo(GolemTracker.RetrieveTarget.DIMENSIONAL); + return true; + } + } + } + if (hasEnder) { + if (player.getEnderChestInventory().addItem(golem).isEmpty()) { + entity.setRetrivedTo(GolemTracker.RetrieveTarget.ENDER); + return true; + } + } + return false; + } + + public static boolean summonGolemFromPlayer(ServerPlayer player, Predicate use) { + var hasEnder = hasEnder(player); + var list = getAllContainers(player, hasEnder); + for (var stack : list) { + if (!(stack.getItem() instanceof WorldChestItem chest)) continue; + var opt = chest.getContainer(stack, player.serverLevel()); + if (opt.isEmpty()) continue; + var cont = opt.get().container; + for (int i = 0; i < cont.getContainerSize(); i++) { + var item = cont.getItem(i); + var config = GolemHolder.getGolemConfig(item); + if (config.isPresent() && config.get().getSecond() == chest.color.getId()) { + //TODO has upgrade + if (use.test(item)) { + return true; + } + } + } + } + if (hasEnder) { + for (int i = 0; i < 27; i++) { + var stack = player.getEnderChestInventory().getItem(i); + //TODO has upgrade + if (use.test(stack)) { + return true; + } + } + } + return false; + } + + public static void tickPlayer(ServerPlayer player) { + var hasEnder = hasEnder(player); + var list = getAllContainers(player, hasEnder); + for (var stack : list) { + if (!(stack.getItem() instanceof WorldChestItem chest)) continue; + var opt = chest.getContainer(stack, player.serverLevel()); + if (opt.isEmpty()) continue; + var cont = opt.get().container; + for (int i = 0; i < cont.getContainerSize(); i++) { + var item = cont.getItem(i); + if (item.getItem() instanceof GolemHolder holder) { + holder.inventoryTick(item, player.serverLevel(), player, 0, false); + } + } + } + if (hasEnder) { + for (int i = 0; i < 27; i++) { + var stack = player.getEnderChestInventory().getItem(i); + if (stack.getItem() instanceof GolemHolder holder) { + holder.inventoryTick(stack, player.serverLevel(), player, 0, false); + } + } + } + } + + @SubscribeEvent + public static void onPlayerTick(LivingEvent.LivingTickEvent event) { + if (event.getEntity() instanceof ServerPlayer sp && sp.isAlive() && sp.tickCount % 20 == 0) { + tickPlayer(sp); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/sync/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/backpack/package-info.java similarity index 76% rename from src/main/java/dev/xkmc/modulargolems/content/entity/sync/package-info.java rename to src/main/java/dev/xkmc/modulargolems/compat/backpack/package-info.java index 8ef63a554..7a6a13698 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/sync/package-info.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/backpack/package-info.java @@ -1,7 +1,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package dev.xkmc.modulargolems.content.entity.sync; +package dev.xkmc.modulargolems.compat.backpack; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/CurioCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/CurioCompatRegistry.java index 7b756c3f4..d757916ed 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/curio/CurioCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/CurioCompatRegistry.java @@ -1,6 +1,5 @@ package dev.xkmc.modulargolems.compat.curio; -import com.mojang.datafixers.util.Pair; import com.tterrag.registrate.util.entry.MenuEntry; import dev.xkmc.l2tabs.compat.CuriosEventHandler; import dev.xkmc.l2tabs.init.data.L2TabsLangData; @@ -14,15 +13,21 @@ import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.fml.ModList; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotResult; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Predicate; public class CurioCompatRegistry { @@ -39,6 +44,43 @@ public static CurioCompatRegistry get() { return null; } + public static Optional getItem(LivingEntity e, String slot) { + return CuriosApi.getCuriosInventory(e).resolve() + .flatMap(x -> x.findCurio(slot, 0).map(SlotResult::stack)); + } + + public static boolean hasItem(LivingEntity e, Item pred) { + var opt = CuriosApi.getCuriosInventory(e).resolve(); + if (opt.isEmpty()) return false; + List ans = new ArrayList<>(); + return opt.get().findFirstCurio(pred).isPresent(); + } + + + public static List getItems(LivingEntity e, Predicate pred) { + var opt = CuriosApi.getCuriosInventory(e).resolve(); + if (opt.isEmpty()) return List.of(); + List ans = new ArrayList<>(); + for (var sr : opt.get().findCurios(pred)) { + ans.add(sr.stack()); + } + return ans; + } + + public static void getAllItems(LivingEntity e, List list) { + var opt = CuriosApi.getCuriosInventory(e).resolve(); + if (opt.isEmpty()) return; + for (var ent : opt.get().getCurios().entrySet()) { + var handler = ent.getValue(); + for (int i = 0; i < handler.getSlots(); i++) { + var curio = handler.getStacks().getStackInSlot(i); + if (!curio.isEmpty()) list.add(curio); + var cosmetic = handler.getCosmeticStacks().getStackInSlot(i); + if (!cosmetic.isEmpty()) list.add(curio); + } + } + } + public static void register() { var ins = get(); if (ins == null) return; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/CuriosClientRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/CuriosClientRegistry.java new file mode 100644 index 000000000..03c7e47f6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/CuriosClientRegistry.java @@ -0,0 +1,15 @@ +package dev.xkmc.modulargolems.compat.curio; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemRenderer; +import top.theillusivec4.curios.client.render.CuriosLayer; + +public class CuriosClientRegistry { + + public static void createLayer(HumanoidGolemRenderer renderer) { + try { + renderer.addLayer(new CuriosLayer<>(renderer)); + } catch (Throwable ignored) { + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCurioTab.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCurioTab.java index 9db10c2f6..b0a23b75c 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCurioTab.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCurioTab.java @@ -26,7 +26,7 @@ public void onTabClicked() { @Override protected void renderIcon(GuiGraphics g) { g.blit(new ResourceLocation(Curios.MODID, "textures/gui/inventory.png"), - getX() + 7, getY() + 7, 50, 14, 14, 14); + getX() + 7, getY() + 5, 50, 14, 14, 14); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListMenu.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListMenu.java index f14f8f223..746a16399 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListMenu.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListMenu.java @@ -4,12 +4,14 @@ import dev.xkmc.l2tabs.compat.BaseCuriosListMenu; import dev.xkmc.l2tabs.compat.CuriosEventHandler; import dev.xkmc.l2tabs.compat.CuriosWrapper; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.MenuType; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; @@ -40,4 +42,12 @@ public void switchPage(ServerPlayer player, int i) { } } + @Override + public boolean stillValid(Player player) { + if (!player.isAlive()) return false; + if (curios.entity instanceof AbstractGolemEntity golem) + return !golem.isRemoved() && golem.getGuardedDataImpl() > 0; + return curios.entity.isAlive(); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListScreen.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListScreen.java index e808d9d53..ac8cbd2d8 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListScreen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosListScreen.java @@ -19,8 +19,10 @@ public void init() { super.init(); var compat = CurioCompatRegistry.get(); assert compat != null; - new GolemTabManager<>(this, new EquipmentGroup((AbstractGolemEntity) menu.curios.entity)) - .init(this::addRenderableWidget, compat.tab); + var e = menu.curios.entity; + if (e instanceof AbstractGolemEntity golem) + new GolemTabManager<>(this, new EquipmentGroup(golem)) + .init(this::addRenderableWidget, compat.tab); } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosMenuPvd.java b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosMenuPvd.java index 08bcd2acc..ad5acf2a6 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosMenuPvd.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/curio/GolemCuriosMenuPvd.java @@ -1,7 +1,6 @@ package dev.xkmc.modulargolems.compat.curio; import dev.xkmc.l2tabs.compat.CuriosWrapper; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.menu.registry.IMenuPvd; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemAddSlotExtension.java b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemAddSlotExtension.java new file mode 100644 index 000000000..ce2973dc0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemAddSlotExtension.java @@ -0,0 +1,72 @@ +package dev.xkmc.modulargolems.compat.jei; + +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.recipe.GolemSmithAddSlotRecipe; +import mezz.jei.api.gui.builder.IIngredientAcceptor; +import mezz.jei.api.recipe.category.extensions.vanilla.smithing.ISmithingCategoryExtension; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public record GolemAddSlotExtension( +) implements ISmithingCategoryExtension { + + @Override + public > void setTemplate(GolemSmithAddSlotRecipe r, T t) { + t.addIngredients(r.template); + } + + @Override + public > void setBase(GolemSmithAddSlotRecipe r, T t) { + if (r.base.getItems()[0].getItem() instanceof GolemHolder golem) { + List list = new ArrayList<>(); + for (ResourceLocation rl : GolemMaterialConfig.get().getAllMaterials()) { + ItemStack stack = new ItemStack(golem); + for (var part : golem.getEntityType().values()) { + GolemHolder.addMaterial(stack, part.toItem(), rl); + } + var mat = GolemMaterialConfig.get().ingredients.get(rl); + for (var ing : mat.getItems()) { + list.add(stack); + } + } + t.addItemStacks(list); + } else t.addIngredients(r.base); + } + + @Override + public > void setAddition(GolemSmithAddSlotRecipe r, T t) { + if (r.base.getItems()[0].getItem() instanceof GolemHolder) { + List list = new ArrayList<>(); + for (ResourceLocation rl : GolemMaterialConfig.get().getAllMaterials()) { + var mat = GolemMaterialConfig.get().ingredients.get(rl); + list.addAll(List.of(mat.getItems())); + } + t.addItemStacks(list); + } else t.addIngredients(r.addition); + } + + @Override + public > void setOutput(GolemSmithAddSlotRecipe r, T t) { + if (r.template.getItems()[0].getItem() instanceof IUpgradeItem item && + r.base.getItems()[0].getItem() instanceof GolemHolder golem) { + List list = new ArrayList<>(); + for (ResourceLocation rl : GolemMaterialConfig.get().getAllMaterials()) { + ItemStack stack = new ItemStack(golem); + for (var part : golem.getEntityType().values()) { + GolemHolder.addMaterial(stack, part.toItem(), rl); + } + var mat = GolemMaterialConfig.get().ingredients.get(rl); + GolemHolder.addUpgrade(stack, item); + for (var ing : mat.getItems()) { + list.add(stack); + } + } + t.addItemStacks(list); + } + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemJEIPlugin.java b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemJEIPlugin.java index 9055082db..fcd8c45c6 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemJEIPlugin.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemJEIPlugin.java @@ -6,17 +6,24 @@ import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; import dev.xkmc.modulargolems.content.core.GolemType; import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.item.golem.GolemFacade; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; import dev.xkmc.modulargolems.content.item.golem.GolemPart; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.menu.config.ToggleGolemConfigScreen; import dev.xkmc.modulargolems.content.menu.equipment.EquipmentsScreen; import dev.xkmc.modulargolems.content.menu.filter.ItemConfigScreen; +import dev.xkmc.modulargolems.content.menu.path.PathConfigScreen; +import dev.xkmc.modulargolems.content.menu.table.GolemDisinegrateScreen; +import dev.xkmc.modulargolems.content.menu.table.GolemUpgradeScreen; import dev.xkmc.modulargolems.content.menu.tabs.ITabScreen; import dev.xkmc.modulargolems.content.menu.target.TargetConfigScreen; import dev.xkmc.modulargolems.content.recipe.GolemAssembleRecipe; +import dev.xkmc.modulargolems.content.recipe.GolemReplaceRecipe; +import dev.xkmc.modulargolems.content.recipe.GolemSmithAddSlotRecipe; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; import mezz.jei.api.constants.RecipeTypes; @@ -53,6 +60,7 @@ public void registerItemSubtypes(ISubtypeRegistration registration) { for (Item item : GolemPart.LIST) { registration.registerSubtypeInterpreter(item, GolemJEIPlugin::partSubtype); } + registration.registerSubtypeInterpreter(GolemItems.FACADE.get(), GolemJEIPlugin::facadeSubtype); } @Override @@ -69,6 +77,8 @@ public void registerRecipes(IRecipeRegistration registration) { @Override public void registerVanillaCategoryExtensions(IVanillaCategoryExtensionRegistration registration) { registration.getCraftingCategory().addCategoryExtension(GolemAssembleRecipe.class, GolemAssemblyExtension::new); + registration.getCraftingCategory().addCategoryExtension(GolemReplaceRecipe.class, GolemReplaceExtension::new); + registration.getSmithingCategory().addExtension(GolemSmithAddSlotRecipe.class, new GolemAddSlotExtension()); } @Override @@ -79,6 +89,9 @@ public void registerGuiHandlers(IGuiHandlerRegistration registration) { registration.addGuiScreenHandler(ToggleGolemConfigScreen.class, GolemJEIPlugin::create); registration.addGuiScreenHandler(ItemConfigScreen.class, GolemJEIPlugin::create); registration.addGuiScreenHandler(TargetConfigScreen.class, GolemJEIPlugin::create); + registration.addGuiScreenHandler(PathConfigScreen.class, GolemJEIPlugin::create); + registration.addGuiScreenHandler(GolemUpgradeScreen.class, GolemJEIPlugin::create); + registration.addGuiScreenHandler(GolemDisinegrateScreen.class, GolemJEIPlugin::create); CurioCompatRegistry.onJEIRegistry(e -> registration.addGuiScreenHandler(Wrappers.cast(e), GolemJEIPlugin::create)); } @@ -87,9 +100,9 @@ public static IGuiProperties create(ITabScreen screen) { if (screen.screenWidth() <= 0 || screen.screenHeight() <= 0) { return null; } - int x = screen.getGuiLeft(); + int x = screen.getGuiLeft() - screen.getLeftExpansion(); int y = screen.getGuiTop(); - int width = screen.getXSize() + 32; + int width = screen.getXSize() + screen.getLeftExpansion() + screen.getRightExpansion(); int height = screen.getYSize(); if (width <= 0 || height <= 0) { return null; @@ -100,14 +113,22 @@ public static IGuiProperties create(ITabScreen screen) { ); } - private static String partSubtype(ItemStack stack, UidContext ctx) { return GolemPart.getMaterial(stack).orElse(GolemMaterial.EMPTY).toString(); } + private static String facadeSubtype(ItemStack stack, UidContext ctx) { + return GolemFacade.getMaterial(stack).toString(); + } + private static void addPartCraftRecipes(List recipes, GolemMaterialConfig config, IVanillaRecipeFactory factory) { for (var mat : config.getAllMaterials()) { - var arr = config.ingredients.get(mat).getItems(); + { + recipes.add(factory.createAnvilRecipe(new ItemStack(GolemItems.EMPTY_UPGRADE), + List.of(config.getRepairIngredient(mat).getItems()), + List.of(GolemFacade.setMaterial(GolemItems.FACADE.asStack(), mat)))); + } + var arr = config.getCraftIngredient(mat).getItems(); boolean special = false; for (ItemStack stack : arr) { if (stack.is(MGTagGen.SPECIAL_CRAFT)) { @@ -140,7 +161,7 @@ private static void addRepairRecipes(List recipes, GolemMateria ItemStack damaged = golem.copy(); damaged.getOrCreateTag().putFloat(GolemHolder.KEY_DISPLAY, 0.75f); input.add(damaged); - var arr = config.ingredients.get(mat).getItems(); + var arr = config.getRepairIngredient(mat).getItems(); material.add(new ItemStack(arr.length > 0 ? arr[0].getItem() : Items.BARRIER)); golem.getOrCreateTag().putFloat(GolemHolder.KEY_DISPLAY, 1f); result.add(golem); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemReplaceExtension.java b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemReplaceExtension.java new file mode 100644 index 000000000..f8cb40b8d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/jei/GolemReplaceExtension.java @@ -0,0 +1,83 @@ +package dev.xkmc.modulargolems.compat.jei; + +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.content.recipe.GolemReplaceRecipe; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.ingredient.ICraftingGridHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICraftingCategoryExtension; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +import java.util.ArrayList; +import java.util.List; + +public record GolemReplaceExtension(GolemReplaceRecipe recipe) implements ICraftingCategoryExtension { + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { + var in = focuses.getItemStackFocuses(RecipeIngredientRole.INPUT).findAny(); + if (in.isPresent()) { + ItemStack inStack = in.get().getTypedValue().getIngredient(); + if (inStack.getItem() instanceof GolemPart) { + var opt = GolemPart.getMaterial(inStack); + if (opt.isPresent()) { + setRecipeSpecial(builder, craftingGridHelper, inStack, opt.get()); + return; + } + } + } + setRecipeAll(builder, craftingGridHelper, focuses); + } + + private void setRecipeAll(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { + List> inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + for (Ingredient ing : recipe.getIngredients()) { + ItemStack[] stacks = ing.getItems(); + if (stacks.length == 1 && stacks[0].getItem() instanceof GolemPart part) { + List list = new ArrayList<>(); + for (ResourceLocation rl : GolemMaterialConfig.get().getAllMaterials()) { + ItemStack stack = new ItemStack(part); + list.add(GolemPart.setMaterial(stack, rl)); + outputs.add(recipe.assembleForJEI(rl)); + } + inputs.add(list); + } else { + inputs.add(List.of(stacks)); + } + } + int width = getWidth(); + int height = getHeight(); + craftingGridHelper.createAndSetOutputs(builder, outputs); + craftingGridHelper.createAndSetInputs(builder, inputs, width, height); + } + + private void setRecipeSpecial(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, ItemStack focusResult, ResourceLocation mat) { + List> inputs = new ArrayList<>(); + for (Ingredient ing : recipe.getIngredients()) { + ItemStack[] stacks = ing.getItems(); + if (stacks.length == 1 && stacks[0].getItem() instanceof GolemPart) { + inputs.add(List.of(focusResult)); + } else inputs.add(List.of(stacks)); + } + int width = getWidth(); + int height = getHeight(); + craftingGridHelper.createAndSetOutputs(builder, List.of(recipe.assembleForJEI(mat))); + craftingGridHelper.createAndSetInputs(builder, inputs, width, height); + } + + @Override + public int getWidth() { + return recipe.getWidth(); + } + + @Override + public int getHeight() { + return recipe.getHeight(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemHealUtils.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemHealUtils.java new file mode 100644 index 000000000..360f07a8f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemHealUtils.java @@ -0,0 +1,120 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class GolemHealUtils { + + private final EntityMaid owner; + private final CombinedInvWrapper inv; + + private final Map cache = new LinkedHashMap<>(); + + public GolemHealUtils(EntityMaid owner, CombinedInvWrapper inv) { + this.owner = owner; + this.inv = inv; + } + + public boolean tryHealGolem(EntityMaid owner, AbstractGolemEntity golem) { + if (!shouldHeal(golem)) return false; + var opt = owner.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET); + if (opt.isPresent()) { + var target = opt.get(); + if (target instanceof AbstractGolemEntity old) { + if (shouldHeal(old)) { + return false; + } + } + } + if (owner.distanceTo(golem) < 2.5) { + var mat = golem.getMaterials().get(MetalGolemPartType.BODY.ordinal()).id(); + var index = getIndexOfMaterial(mat); + if (index >= 0) { + if (!inv.extractItem(index, 1, false).isEmpty()) { + golem.repairWithItem(); + owner.getBrain().eraseMemory(MemoryModuleType.INTERACTION_TARGET); + return true; + } + } + } + owner.getBrain().setMemory(MemoryModuleType.INTERACTION_TARGET, golem); + return false; + } + + public void tryFixGolem() { + for (int slot = 0; slot < inv.getSlots(); slot++) { + var stack = inv.getStackInSlot(slot); + if (stack.getItem() instanceof GolemHolder holder) { + var mats = GolemHolder.getMaterial(stack); + var type = holder.getEntityType(); + var part = type.getBodyPart(); + if (mats.size() <= part.ordinal()) continue; + var mat = mats.get(part.ordinal()).id(); + int reforge = GolemHolder.getReforge(stack); + if (reforge > 0) { + var index = getIndexOfMaterial(mat); + if (index >= 0) { + if (!inv.extractItem(index, 1, false).isEmpty()) { + GolemHolder.setReforge(stack, reforge - 1); + inv.setStackInSlot(slot, stack); + } + } + continue; + } + float max = GolemHolder.getMaxHealth(stack); + float health = GolemHolder.getHealth(stack); + if (health == -1) continue; + if (health > max * 0.75) continue; + var heal = holder.getInvHeal(stack, owner); + if (heal > 0) continue; + var index = getIndexOfMaterial(mat); + if (index >= 0) { + if (!inv.extractItem(index, 1, false).isEmpty()) { + GolemHolder.setHealth(stack, Math.min(max, health + max / 4)); + inv.setStackInSlot(slot, stack); + } + } + } + } + } + + private boolean shouldHeal(AbstractGolemEntity golem) { + if (golem.getType() != GolemTypes.ENTITY_GOLEM.get()) + return false; + if (golem.getGuardedDataImpl() > golem.getMaxHealth() * 0.75 && !golem.isReforged()) + return false; + var mat = golem.getMaterials().get(MetalGolemPartType.BODY.ordinal()).id(); + return getIndexOfMaterial(mat) >= 0; + } + + private int getIndexOfMaterial(ResourceLocation mat) { + Ingredient ing = GolemMaterialConfig.get().getRepairIngredient(mat); + var old = cache.get(mat); + if (old != null) { + if (old == -1) return -1; + var item = inv.getStackInSlot(old); + if (!item.isEmpty() && ing.test(item)) return old; + } + for (int i = 0; i < inv.getSlots(); i++) { + var item = inv.getStackInSlot(i); + if (!item.isEmpty() && ing.test(item)) { + cache.put(mat, i); + return i; + } + } + cache.put(mat, -1); + return -1; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidExtraBrain.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidExtraBrain.java new file mode 100644 index 000000000..8161aa5f8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidExtraBrain.java @@ -0,0 +1,15 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.api.entity.ai.IExtraMaidBrain; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; + +import java.util.List; + +public class GolemMaidExtraBrain implements IExtraMaidBrain { + + @Override + public List> getExtraMemoryTypes() { + return List.of(MaidRegistry.GOLEMS.get(), MemoryModuleType.INTERACTION_TARGET); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidModelGui.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidModelGui.java new file mode 100644 index 000000000..2a06949e6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemMaidModelGui.java @@ -0,0 +1,135 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.client.gui.entity.model.AbstractModelGui; +import com.github.tartaricacid.touhoulittlemaid.client.resource.CustomPackLoader; +import com.github.tartaricacid.touhoulittlemaid.client.resource.pojo.MaidModelInfo; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.github.tartaricacid.touhoulittlemaid.util.EntityCacheUtil; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutionException; + +import static com.github.tartaricacid.touhoulittlemaid.client.event.SpecialMaidRenderEvent.EASTER_EGG_MODEL; +import static com.github.tartaricacid.touhoulittlemaid.util.EntityCacheUtil.clearMaidDataResidue; + +public class GolemMaidModelGui extends AbstractModelGui { + + private static int PAGE_INDEX = 0; + private static int PACK_INDEX = 0; + private static int ROW_INDEX = 0; + + public GolemMaidModelGui(HumanoidGolemEntity golem) { + super(golem, CustomPackLoader.MAID_MODELS.getPackList()); + } + + @Override + protected void drawLeftEntity(GuiGraphics graphics, int middleX, int middleY, float mouseX, float mouseY) { + String modelId = entity.getMaidModelId(); + float renderItemScale = modelId.isEmpty() ? 1.0f : CustomPackLoader.MAID_MODELS.getModelRenderItemScale(modelId); + int x = (middleX - 256 / 2) / 2; + int y = middleY + 90; + int scale = (int) (45 * renderItemScale); + InventoryScreen.renderEntityInInventoryFollowsMouse(graphics, x, y, scale, (middleX - 256 / 2f) / 2 - mouseX, middleY + 80 - 40 - mouseY, entity); + } + + @Override + protected void drawRightEntity(GuiGraphics graphics, int posX, int posY, MaidModelInfo modelItem) { + drawMaidEntity(graphics, posX, posY, modelItem); + } + + @Override + protected void openDetailsGui(HumanoidGolemEntity golem, MaidModelInfo modelInfo) { + } + + @Override + protected void notifyModelChange(HumanoidGolemEntity golem, MaidModelInfo info) { + if (info.getEasterEgg() == null) { + String modelId = info.getModelId().toString(); + String soundPackId = info.getUseSoundPackId(); + if (soundPackId == null) soundPackId = ""; + ModularGolems.HANDLER.toServer(SetMaidModelToServer.of(golem.getId(), modelId, soundPackId)); + if (minecraft != null && minecraft.player != null) { + golem.setMaidModelId(modelId); + golem.setSoundPackId(soundPackId); + } + } + } + + @Override + protected void addModelCustomTips(MaidModelInfo modelItem, List tooltips) { + String useSoundPackId = modelItem.getUseSoundPackId(); + if (StringUtils.isNotBlank(useSoundPackId)) { + tooltips.add(Component.translatable("gui.touhou_little_maid.skin.tooltips.maid_use_sound_pack_id", useSoundPackId).withStyle(ChatFormatting.GOLD)); + } + } + + @Override + protected int getPackIndex() { + return PACK_INDEX; + } + + @Override + protected void setPackIndex(int packIndex) { + PACK_INDEX = packIndex; + } + + @Override + protected int getRowIndex() { + return ROW_INDEX; + } + + @Override + protected void setRowIndex(int rowIndex) { + ROW_INDEX = rowIndex; + } + + @Override + protected int getPageIndex() { + return PAGE_INDEX; + } + + @Override + protected void setPageIndex(int pageIndex) { + PAGE_INDEX = pageIndex; + } + + private void drawMaidEntity(GuiGraphics graphics, int posX, int posY, MaidModelInfo modelItem) { + Level world = getMinecraft().level; + if (world == null) return; + + EntityMaid maid; + try { + maid = (EntityMaid) EntityCacheUtil.ENTITY_CACHE.get(EntityMaid.TYPE, () -> { + Entity e = EntityMaid.TYPE.create(world); + return Objects.requireNonNullElseGet(e, () -> new EntityMaid(world)); + }); + } catch (ExecutionException | ClassCastException e) { + e.fillInStackTrace(); + return; + } + + clearMaidDataResidue(maid, false); + if (modelItem.getEasterEgg() != null) { + maid.setModelId(EASTER_EGG_MODEL); + } else { + maid.setModelId(modelItem.getModelId().toString()); + } + InventoryScreen.renderEntityInInventoryFollowsMouse(graphics, posX, posY, (int) (12 * modelItem.getRenderItemScale()), -25, -20, maid); + } + + @Override + protected void onClickCloseButton() { + this.onClose(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemSummonUtils.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemSummonUtils.java new file mode 100644 index 000000000..08d56ec32 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/GolemSummonUtils.java @@ -0,0 +1,150 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.mode.GolemModes; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.IItemHandlerModifiable; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.UUID; + +public class GolemSummonUtils { + + public static boolean findAndSummonGolem(ServerLevel level, EntityMaid owner, IItemHandlerModifiable inv, List list, LivingEntity target) { + for (int i = 0; i < inv.getSlots(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if (!stack.is(MGTagGen.GOLEM_HOLDERS)) continue; + if (inv.extractItem(i, 1, true).isEmpty()) continue; + var hp = GolemHolder.getHealth(stack); + if (hp != -1 && hp < summonHealth(owner) * GolemHolder.getMaxHealth(stack)) continue; + if (placeGolem(owner, target, list, stack)) { + inv.extractItem(i, 1, false); + return true; + } + return false; + } + return false; + } + + public static void collectAll(EntityMaid owner) { + var level = owner.level(); + if (!(level instanceof ServerLevel sl)) return; + var opt = owner.getBrain().getMemory(MaidRegistry.GOLEMS.get()); + if (opt.isEmpty()) return; + var list = opt.get(); + var inv = owner.getAvailableInv(false); + var itr = list.iterator(); + while (itr.hasNext()) { + var id = itr.next(); + if (sl.getEntity(id) instanceof AbstractGolemEntity golem && golem.isAlive()) { + int index = getEmptySlot(inv); + if (index < 0) break; + var stack = golem.toItem(owner); + inv.insertItem(index, stack, false); + } + itr.remove(); + } + owner.getBrain().setMemory(MaidRegistry.GOLEMS.get(), list); + } + + public static boolean returnToInv(EntityMaid maid, ItemStack stack) { + var inv = maid.getAvailableInv(false); + int index = getEmptySlot(inv); + return inv.insertItem(index, stack, false).isEmpty(); + } + + public static boolean retrieveGolem(EntityMaid owner, IItemHandlerModifiable inv, AbstractGolemEntity golem) { + int index = getEmptySlot(inv); + if (index < 0) return false; + var stack = golem.toItem(owner); + inv.insertItem(index, stack, false); + return true; + } + + @Nullable + private static BlockPos getRandomPos(Level sl, EntityType type, EntityMaid owner, LivingEntity target, int r, int round) { + BlockPos tpos = target.blockPosition(); + BlockPos opos = owner.blockPosition(); + Vec3 teye = target.getEyePosition(); + Vec3 oeye = target.getEyePosition(); + RandomSource rand = owner.getRandom(); + var diff = tpos.getCenter().subtract(opos.getCenter()); + int minDist = 4; + int maxDist = getSummonRange(owner); + var len = diff.length(); + double dist; + if (len < maxDist - minDist) { + dist = len / 2; + } else if (len < maxDist + minDist) { + dist = len - minDist; + } else dist = maxDist; + BlockPos pos = BlockPos.containing(opos.getCenter().add(diff.normalize().scale(dist))); + for (int i = 0; i < round; ++i) { + BlockPos p = pos.offset(rand.nextInt(0, r * 2 + 1) - r, 0, + rand.nextInt(0, r * 2 + 1) - r + ); + int h = -1; + for (int y = 0; y < 3; y++) { + if (sl.noCollision(type.getAABB(p.getX(), p.getY() + y, p.getZ()))) { + h = y; + break; + } + } + if (h == -1) continue; + Vec3 e = Vec3.atBottomCenterOf(p).add(0.0F, (type.getHeight() / 2.0F) + h, 0.0F); + BlockHitResult thit = sl.clip(new ClipContext(teye, e, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, null)); + BlockHitResult ohit = sl.clip(new ClipContext(oeye, e, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, null)); + if (thit.getType() == HitResult.Type.MISS && ohit.getType() == HitResult.Type.MISS) { + return p; + } + } + return null; + } + + private static boolean placeGolem(EntityMaid owner, LivingEntity target, List list, ItemStack stack) { + if (!(stack.getItem() instanceof GolemHolder holder)) return false; + var player = owner.getOwner() instanceof Player pl ? pl : null; + var pos = getRandomPos(owner.level(), holder.getEntityType().type(), owner, target, 4, 6); + if (pos == null) return false; + return holder.summon(stack, owner.level(), Vec3.atBottomCenterOf(pos), player, e -> { + e.setLeader(owner); + e.setMode(GolemModes.FOLLOW.getID(), BlockPos.ZERO); + list.add(e.getUUID()); + e.resetTarget(target); + }); + } + + private static int getEmptySlot(IItemHandlerModifiable inv) { + for (int i = 0; i < inv.getSlots(); i++) { + if (inv.getStackInSlot(i).isEmpty() && inv.insertItem(i, GolemItems.HOLDER_GOLEM.asStack(), true).isEmpty()) { + return i; + } + } + return -1; + } + + private static float summonHealth(EntityMaid maid) { + return 0.5f; + } + + private static int getSummonRange(EntityMaid maid) { + return 10; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidManageGolemBehavior.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidManageGolemBehavior.java new file mode 100644 index 000000000..04dfd0e36 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidManageGolemBehavior.java @@ -0,0 +1,90 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraftforge.items.IItemHandlerModifiable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +class MaidManageGolemBehavior extends Behavior { + + private static final int CD = 40, HCD = 20, MAX_DIST = 35; + + private int summonCooldown = 0; + private int healCooldown = 0; + + public MaidManageGolemBehavior() { + super(ImmutableMap.of( + MaidRegistry.GOLEMS.get(), MemoryStatus.REGISTERED, + MemoryModuleType.LOOK_TARGET, MemoryStatus.REGISTERED, + MemoryModuleType.ATTACK_TARGET, MemoryStatus.VALUE_PRESENT + ), 1200); + } + + protected boolean canStillUse(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + return entityIn.getBrain().hasMemoryValue(MemoryModuleType.ATTACK_TARGET) && this.checkExtraStartConditions(worldIn, entityIn); + } + + protected void tick(ServerLevel level, EntityMaid owner, long gameTime) { + var opt = owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET); + if (opt.isEmpty()) return; + var target = opt.get(); + var inv = owner.getAvailableInv(false); + var list = new ArrayList<>(owner.getBrain().getMemory(MaidRegistry.GOLEMS.get()).orElse(List.of())); + if (healCooldown > 0) healCooldown--; + var helper = new GolemHealUtils(owner, inv); + checkGolemsInLevel(level, owner, helper, inv, list, target); + helper.tryFixGolem(); + if (summonCooldown > 0) summonCooldown--; + else if (GolemSummonUtils.findAndSummonGolem(level, owner, inv, list, target)) + summonCooldown = CD; + owner.getBrain().setMemory(MaidRegistry.GOLEMS.get(), list); + } + + protected void stop(ServerLevel worldIn, EntityMaid self, long gameTimeIn) { + GolemSummonUtils.collectAll(self); + } + + private void checkGolemsInLevel(ServerLevel level, EntityMaid owner, GolemHealUtils helper, IItemHandlerModifiable inv, List list, LivingEntity target) { + var itr = list.iterator(); + while (itr.hasNext()) { + var id = itr.next(); + if (level.getEntity(id) instanceof AbstractGolemEntity golem) { + if (!golem.isAlive()) continue; + if (shouldCollect(owner, golem)) { + if (GolemSummonUtils.retrieveGolem(owner, inv, golem)) { + itr.remove(); + continue; + } + } + if (healCooldown <= 0) { + if (helper.tryHealGolem(owner, golem)) { + healCooldown = HCD; + } + } + if (golem.getTarget() != target) + golem.resetTarget(target); + } else { + itr.remove(); + } + } + } + + private boolean shouldCollect(EntityMaid owner, AbstractGolemEntity golem) { + return golem.isAlive() && (golem.getGuardedDataImpl() < golem.getMaxHealth() * collectHealth(owner) || + golem.distanceTo(owner) > MAX_DIST); + } + + private float collectHealth(EntityMaid maid) { + return 0.25f; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidPlugin.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidPlugin.java new file mode 100644 index 000000000..1f7611841 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidPlugin.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.api.ILittleMaid; +import com.github.tartaricacid.touhoulittlemaid.api.LittleMaidExtension; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.ExtraMaidBrainManager; +import com.github.tartaricacid.touhoulittlemaid.entity.task.TaskManager; + +@LittleMaidExtension +public class MaidPlugin implements ILittleMaid { + + @Override + public void addMaidTask(TaskManager manager) { + manager.add(new MaidSummonerTask()); + } + + @Override + public void addExtraMaidBrain(ExtraMaidBrainManager manager) { + manager.addExtraMaidBrain(new GolemMaidExtraBrain()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidRegistry.java new file mode 100644 index 000000000..ae583acd8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidRegistry.java @@ -0,0 +1,52 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.events.event.GolemToOwnerEvent; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.core.UUIDUtil; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class MaidRegistry { + + public static final RegistryEntry>> GOLEMS = ModularGolems.REGISTRATE.simple( + "golem_ids", Registries.MEMORY_MODULE_TYPE, () -> new MemoryModuleType<>(Optional.of(UUIDUtil.CODEC.listOf()))); + + @SubscribeEvent + public static void onGolemReturn(GolemToOwnerEvent event) { + if (event.getOwner() instanceof EntityMaid maid) { + if (GolemSummonUtils.returnToInv(maid, event.getStack())) { + event.setCanceled(true); + } + } + } + + @SubscribeEvent + public static void maidTick(LivingEvent.LivingTickEvent event) { + if (event.getEntity() instanceof EntityMaid maid) { + var inv = maid.getAvailableInv(false); + for (int i = 0; i < inv.getSlots(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if (!stack.is(MGTagGen.GOLEM_HOLDERS)) continue; + stack.inventoryTick(maid.level(), maid, i, false); + inv.setStackInSlot(i, stack); + } + } + } + + public static void register() { + MinecraftForge.EVENT_BUS.register(MaidRegistry.class); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSkinCompat.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSkinCompat.java new file mode 100644 index 000000000..d0848e03d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSkinCompat.java @@ -0,0 +1,173 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; +import com.github.tartaricacid.touhoulittlemaid.api.event.ConvertMaidEvent; +import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.EntityMaidRenderer; +import com.github.tartaricacid.touhoulittlemaid.init.InitItems; +import com.github.tartaricacid.touhoulittlemaid.item.ItemGarageKit; +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.ClientSkinDispatch; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.SpecialRenderSkin; +import dev.xkmc.modulargolems.content.menu.equipment.EquipmentsScreen; +import dev.xkmc.modulargolems.events.event.HumanoidSkinEvent; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ImageButton; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class MaidSkinCompat { + + private static final ResourceLocation MAID_BUTTON = new ResourceLocation("touhou_little_maid", "textures/gui/maid_gui_button.png"); + + private static EntityMaidRenderer RENDERER; + + @SubscribeEvent + public static void onMaidConvert(ConvertMaidEvent event) { + if (!(event.getEntity() instanceof HumanoidGolemEntity golem)) return; + MaidWrapper data = golem.renderCompatData instanceof MaidWrapper ans ? ans : new MaidWrapper(golem); + event.setMaid(data); + } + + @SubscribeEvent + public static void onHumanoidSkin(HumanoidSkinEvent event) { + ItemStack stack = event.getStack(); + if (stack.is(InitItems.GARAGE_KIT.get())) { + var id = ItemGarageKit.getMaidData(stack).getString("ModelId"); + event.setSkin(new MaidSkin(id)); + } else { + HumanoidGolemEntity golem = event.getGolem(); + String modelId = golem.getMaidModelId(); + if (!modelId.isEmpty()) { + event.setSkin(new MaidSkin(modelId)); + } + } + } + + @SubscribeEvent + public static void onScreenInit(ScreenEvent.Init.Post event) { + if (!(event.getScreen() instanceof EquipmentsScreen screen)) return; + if (!(screen.getMenu().golem instanceof HumanoidGolemEntity golem)) return; + int x = screen.getGuiLeft() + 150; + int y = screen.getGuiTop() + 5; + screen.addSkinWidget(new MaidSkinButton(x, y, golem, b -> { + var mc = Minecraft.getInstance(); + if (mc.player != null) { + mc.setScreen(new GolemMaidModelGui(golem)); + } + })); + } + + public static void addLayers(EntityRenderersEvent.AddLayers event) { + RENDERER = new EntityMaidRenderer(event.getContext()); + } + + private record MaidSkin(String id) implements SpecialRenderSkin { + + @Override + public void render(HumanoidGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { + if (RENDERER == null) return; + stack.pushPose(); + try { + float r = entity.getScale(); + stack.scale(r, r, r); + RENDERER.render(entity, f1, f2, stack, source, i); + } catch (Exception e) { + ModularGolems.LOGGER.debug("Error rendering golem with TLM skin", e); + } finally { + stack.popPose(); + } + } + + } + + private static final class MaidWrapper implements IMaid { + + private final HumanoidGolemEntity mob; + + private final ItemStack[] maidAnimItemCache = {ItemStack.EMPTY, ItemStack.EMPTY}; + + private MaidWrapper(HumanoidGolemEntity mob) { + this.mob = mob; + mob.renderCompatData = this; + } + + @Override + public Mob asEntity() { + return mob; + } + + @Override + public String getModelId() { + if (ClientSkinDispatch.get(mob) instanceof MaidSkin skin) + return skin.id(); + return ""; + } + + @Override + public boolean isYsmModel() { + return false; + } + + @Override + public String getYsmModelId() { + return ""; + } + + @Override + public String getYsmModelTexture() { + return ""; + } + + @Override + public Component getYsmModelName() { + return Component.empty(); + } + + @Override + public ItemStack[] getHandItemsForAnimation() { + return maidAnimItemCache; + } + + @Override + public boolean isSwingingArms() { + return mob.isAggressive(); + } + + } + + private static final class MaidSkinButton extends ImageButton { + + private final HumanoidGolemEntity golem; + + public MaidSkinButton(int x, int y, HumanoidGolemEntity golem, OnPress onPress) { + super(x, y, 9, 9, 72, 43, 10, MAID_BUTTON, onPress); + this.golem = golem; + setTooltip(Tooltip.create(Component.translatable(ModularGolems.MODID + ".tooltip.maid_skin_button"))); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (this.active && this.visible && this.clicked(mouseX, mouseY)) { + if (button == 1) { + this.playDownSound(Minecraft.getInstance().getSoundManager()); + ModularGolems.HANDLER.toServer(SetMaidModelToServer.of(golem.getId(), "", "")); + golem.setMaidModelId(""); + golem.setSoundPackId(""); + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerStrafingBehavior.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerStrafingBehavior.java new file mode 100644 index 000000000..eab7e07ce --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerStrafingBehavior.java @@ -0,0 +1,82 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.behavior.BehaviorUtils; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraft.world.item.ItemStack; + +public class MaidSummonerStrafingBehavior extends Behavior { + private boolean strafingClockwise; + private boolean strafingBackwards; + private int strafingTime = -1; + + private final int startDist, endDist; + + public MaidSummonerStrafingBehavior(int startDist, int endDist) { + super(ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT, MemoryModuleType.LOOK_TARGET, MemoryStatus.REGISTERED, MemoryModuleType.ATTACK_TARGET, MemoryStatus.VALUE_PRESENT, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryStatus.VALUE_PRESENT), 1200); + this.startDist = startDist; + this.endDist = endDist; + } + + protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owner) { + return MaidSummonerTask.hasGolemWand(owner) && owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).filter(Entity::isAlive).isPresent(); + } + + protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) { + ItemStack stack = owner.getMainHandItem(); + var opt = owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET); + if (opt.isEmpty()) return; + var target = opt.get(); + double distance = owner.distanceTo(target); + if (distance < (double) owner.searchRadius()) { + ++this.strafingTime; + } else { + this.strafingTime = -1; + } + + if (this.strafingTime >= 20) { + if ((double) owner.getRandom().nextFloat() < 0.3) { + this.strafingClockwise = !this.strafingClockwise; + } + + if ((double) owner.getRandom().nextFloat() < 0.3) { + this.strafingBackwards = !this.strafingBackwards; + } + + this.strafingTime = 0; + } + + if (this.strafingTime > -1) { + if (distance > endDist) { + this.strafingBackwards = false; + } else if (distance < startDist) { + this.strafingBackwards = true; + } + + owner.getMoveControl().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F); + owner.setYRot(Mth.rotateIfNecessary(owner.getYRot(), owner.yHeadRot, 0.0F)); + BehaviorUtils.lookAtEntity(owner, target); + } else { + BehaviorUtils.lookAtEntity(owner, target); + } + } + + protected void start(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + entityIn.setSwingingArms(true); + } + + protected void stop(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + entityIn.setSwingingArms(false); + entityIn.getMoveControl().strafe(0.0F, 0.0F); + } + + protected boolean canStillUse(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + return this.checkExtraStartConditions(worldIn, entityIn); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerTask.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerTask.java new file mode 100644 index 000000000..f30ee9043 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/MaidSummonerTask.java @@ -0,0 +1,142 @@ +package dev.xkmc.modulargolems.compat.maid; + +import com.github.tartaricacid.touhoulittlemaid.api.task.IAttackTask; +import com.github.tartaricacid.touhoulittlemaid.api.task.IRangedAttackTask; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.EntityTracker; +import net.minecraft.world.entity.ai.behavior.StartAttacking; +import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid; +import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities; +import net.minecraft.world.entity.ai.memory.WalkTarget; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +public class MaidSummonerTask implements IRangedAttackTask { + + public static final ResourceLocation UID = ModularGolems.loc("summon_golems"); + + private static final int STOP_MOVING_DIST = 24; + private static final int STOP_ATTACK_DIST = 35; + + public ResourceLocation getUid() { + return UID; + } + + public ItemStack getIcon() { + return GolemItems.HOLDER_GOLEM.asStack(); + } + + @Nullable + public SoundEvent getAmbientSound(EntityMaid maid) { + return InitSounds.MAID_FIND_TARGET.get(); + } + + public List>> createBrainTasks(EntityMaid maid) { + return Lists.newArrayList( + Pair.of(5, createStartAttack()), + Pair.of(5, createStopAttack(maid)), + Pair.of(5, createMoveToTarget(0.6f)), + Pair.of(5, new MaidSummonerStrafingBehavior(20, STOP_MOVING_DIST)), + Pair.of(5, new MaidManageGolemBehavior()) + ); + } + + public List>> createRideBrainTasks(EntityMaid maid) { + return Lists.newArrayList( + Pair.of(5, createStartAttack()), + Pair.of(5, createStopAttack(maid)), + Pair.of(5, new MaidManageGolemBehavior()) + ); + } + + private void stopAttack(EntityMaid self, LivingEntity target) { + GolemSummonUtils.collectAll(self); + } + + public List>> getConditionDescription(EntityMaid maid) { + return Collections.singletonList(Pair.of("has_golem_wand", MaidSummonerTask::hasGolemWand)); + } + + @Override + public void performRangedAttack(EntityMaid maid, LivingEntity target, float v) { + } + + @Override + public float searchRadius(EntityMaid maid) { + return STOP_ATTACK_DIST; + } + + public static boolean hasGolemWand(EntityMaid maid) { + return maid.getMainHandItem().is(MGTagGen.GOLEM_OMNI_WAND); + } + + private boolean farAway(LivingEntity target, EntityMaid maid) { + return maid.distanceTo(target) > STOP_ATTACK_DIST; + } + + private BehaviorControl createStartAttack() { + return StartAttacking.create(MaidSummonerTask::hasGolemWand, IAttackTask::findFirstValidAttackTarget); + } + + private BehaviorControl createStopAttack(EntityMaid maid) { + return StopAttackingIfTargetInvalid.create( + (target) -> !hasGolemWand(maid) || this.farAway(target, maid), + this::stopAttack, true + ); + } + + private BehaviorControl createMoveToTarget(float speed) { + return BehaviorBuilder.create((ins) -> ins.group( + ins.registered(MemoryModuleType.WALK_TARGET), + ins.registered(MemoryModuleType.LOOK_TARGET), + ins.registered(MemoryModuleType.INTERACTION_TARGET), + ins.present(MemoryModuleType.ATTACK_TARGET), + ins.registered(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES) + ).apply(ins, ( + toNavigate, + toLook, + interactTarget, + attackTarget, + targetList) -> + (level, self, time) -> { + var fix = ins.tryGet(interactTarget); + if (fix.isPresent()) { + toLook.set(new EntityTracker(fix.get(), true)); + if (self.closerThan(fix.get(), 1.5)) { + toNavigate.erase(); + } else { + toNavigate.set(new WalkTarget(new EntityTracker(fix.get(), false), speed, 0)); + } + } else { + LivingEntity atk = ins.get(attackTarget); + Optional optList = ins.tryGet(targetList); + if (optList.isPresent() && optList.get().contains(atk) && self.closerThan(atk, STOP_MOVING_DIST)) { + toNavigate.erase(); + } else { + toLook.set(new EntityTracker(atk, true)); + toNavigate.set(new WalkTarget(new EntityTracker(atk, false), speed, 0)); + } + } + return true; + }) + ); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/SetMaidModelToServer.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/SetMaidModelToServer.java new file mode 100644 index 000000000..d8a184620 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/SetMaidModelToServer.java @@ -0,0 +1,36 @@ +package dev.xkmc.modulargolems.compat.maid; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import net.minecraftforge.network.NetworkEvent; + +@SerialClass +public class SetMaidModelToServer extends SerialPacketBase { + + @SerialClass.SerialField + public int id; + @SerialClass.SerialField + public String modelId; + @SerialClass.SerialField + public String soundPackId; + public static SetMaidModelToServer of(int id, String modelId, String soundPackId) { + var ans = new SetMaidModelToServer(); + ans.id = id; + ans.modelId = modelId; + ans.soundPackId = soundPackId; + return ans; + } + + @Override + public void handle(NetworkEvent.Context context) { + var sp = context.getSender(); + if (sp == null) return; + var entity = sp.level().getEntity(id); + if (entity instanceof HumanoidGolemEntity golem && golem.canModify(sp)) { + if (modelId != null) golem.setMaidModelId(modelId); + if (soundPackId != null) golem.setSoundPackId(soundPackId); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemMaidModelProvider.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemMaidModelProvider.java new file mode 100644 index 000000000..9b31ad56b --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemMaidModelProvider.java @@ -0,0 +1,38 @@ +package dev.xkmc.modulargolems.compat.maid.jade; + +import com.github.tartaricacid.touhoulittlemaid.client.resource.CustomPackLoader; +import com.github.tartaricacid.touhoulittlemaid.util.ParseI18n; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import snownee.jade.api.EntityAccessor; +import snownee.jade.api.IEntityComponentProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public enum GolemMaidModelProvider implements IEntityComponentProvider { + + INSTANCE; + + private static final ResourceLocation UID = new ResourceLocation(ModularGolems.MODID, "maid_model"); + + @Override + public void appendTooltip(ITooltip tooltip, EntityAccessor accessor, IPluginConfig config) { + if (accessor.getEntity() instanceof HumanoidGolemEntity golem) { + String modelId = golem.getMaidModelId(); + if (!modelId.isEmpty()) { + Component name = CustomPackLoader.MAID_MODELS.getInfo(modelId) + .map(info -> ParseI18n.parse(info.getName())) + .orElse(Component.literal(modelId)); + tooltip.add(Component.translatable("top." + ModularGolems.MODID + ".maid_model", name)); + } + } + } + + @Override + public ResourceLocation getUid() { + return UID; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemPlayerSkinProvider.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemPlayerSkinProvider.java new file mode 100644 index 000000000..a78f09d2b --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/GolemPlayerSkinProvider.java @@ -0,0 +1,42 @@ +package dev.xkmc.modulargolems.compat.maid.jade; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import snownee.jade.api.EntityAccessor; +import snownee.jade.api.IEntityComponentProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public enum GolemPlayerSkinProvider implements IEntityComponentProvider { + + INSTANCE; + + private static final ResourceLocation UID = new ResourceLocation(ModularGolems.MODID, "player_skin"); + + @Override + public void appendTooltip(ITooltip tooltip, EntityAccessor accessor, IPluginConfig config) { + if (accessor.getEntity() instanceof HumanoidGolemEntity golem) { + String skin = golem.getPlayerSkin(); + if (!skin.isEmpty()) { + if (skin.contains("/") || skin.contains("\\") || skin.contains(":")) { + String name = skin.replace('\\', '/'); + name = name.substring(name.lastIndexOf('/') + 1); + if (name.contains(".")) { + name = name.substring(0, name.lastIndexOf('.')); + } + tooltip.add(Component.translatable("top." + ModularGolems.MODID + ".file_skin", name)); + } else { + tooltip.add(Component.translatable("top." + ModularGolems.MODID + ".player_skin", skin)); + } + } + } + } + + @Override + public ResourceLocation getUid() { + return UID; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/JadeGolemPlugin.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/JadeGolemPlugin.java new file mode 100644 index 000000000..ca2cde7ad --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/jade/JadeGolemPlugin.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.maid.jade; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaCommonRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; + +@WailaPlugin +public class JadeGolemPlugin implements IWailaPlugin { + + @Override + public void registerClient(IWailaClientRegistration registration) { + registration.registerEntityComponent(GolemMaidModelProvider.INSTANCE, HumanoidGolemEntity.class); + registration.registerEntityComponent(GolemPlayerSkinProvider.INSTANCE, HumanoidGolemEntity.class); + } + + @Override + public void register(IWailaCommonRegistration registration) { + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/maid/package-info.java similarity index 76% rename from src/main/java/dev/xkmc/modulargolems/content/entity/ranged/package-info.java rename to src/main/java/dev/xkmc/modulargolems/compat/maid/package-info.java index a12add0f9..af148760d 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/package-info.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/maid/package-info.java @@ -1,7 +1,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package dev.xkmc.modulargolems.content.entity.ranged; +package dev.xkmc.modulargolems.compat.maid; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACCompatRegistry.java new file mode 100644 index 000000000..f24b9b3b0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACCompatRegistry.java @@ -0,0 +1,89 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves; + +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import dev.xkmc.l2complements.init.L2Complements; +import dev.xkmc.l2complements.init.data.TagGen; +import dev.xkmc.modulargolems.compat.materials.alexscaves.modifier.*; +import dev.xkmc.modulargolems.content.item.upgrade.CraftMaterialItem; +import dev.xkmc.modulargolems.content.item.upgrade.RepairMaterialItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.item.Item; +import net.minecraftforge.common.Tags; +import net.minecraftforge.fml.ModList; + +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class ACCompatRegistry { + + public static final RegistryEntry STICKY; + public static final RegistryEntry SHOOT; + public static final RegistryEntry FREE; + public static final RegistryEntry POLARIZE; + public static final RegistryEntry REFORMATION; + public static final RegistryEntry RADIATION; + public static final RegistryEntry ATOMIC; + + public static final ItemEntry REPAIR_CANDY, REPAIR_MAGNETIC; + public static final ItemEntry CRAFT_CANDY, CRAFT_MAGNETIC; + public static final ItemEntry CRAFT_NUCLEAR; + + public static final RegistryEntry EFF_ATOMIC; + public static final ItemEntry DUMMY_IRON, DUMMY_URANIUM; + + static { + STICKY = reg("sticky_caramel", CandyStickModifier::new, + "Put molten caramel on attack targets"); + SHOOT = reg("gum_shooter", CandyShootModifier::new, + "Shoot gumballs at targets dealing %s damage"); + FREE = reg("free_movement", FreeMoveModifier::new, + "Golem will not be stuck by blocks or caramel"); + POLARIZE = reg("polarize", PolarizeModifier::new, + "Pull enemies in melee mode and push enemies away in ranged/standing mode, deal %s electrical damage constantly."); + REFORMATION = reg("reformation", ReformationModifier::new, + "Consume iron ingot to gain %s absorption and heal %s. Golem may hold at most %s absorption"); + RADIATION = reg("radiation", RadiationModifier::new, + "Inflict %s to attack targets. Damage to radiated target increase by %s per radiation level."); + ATOMIC = reg("atomic_fueling", AtomicFuelingModifier::new, + "Consume [%s] to heal %s HP, and boost attack and speed by %s for %s seconds. Makes golem immune to irradiated effect."); + + REPAIR_CANDY = GolemItems.item(ACDispatch.MODID, "candy_mixture", RepairMaterialItem::new); + CRAFT_CANDY = GolemItems.item(ACDispatch.MODID, "candy_construct", CraftMaterialItem::new); + REPAIR_MAGNETIC = GolemItems.item(ACDispatch.MODID, "magnetic_alloy", RepairMaterialItem::new); + CRAFT_MAGNETIC = GolemItems.item(ACDispatch.MODID, "magnetic_construct", CraftMaterialItem::new); + CRAFT_NUCLEAR = GolemItems.item(ACDispatch.MODID, "nuclear_construct", Item::new); + + EFF_ATOMIC = genEffect("atomic_boost", () -> new AtomicBoostedEffect(MobEffectCategory.BENEFICIAL, 0xffffffff), + "Increase golem attack damage and movement speed"); + + DUMMY_IRON = ModularGolems.REGISTRATE.item("dummy_iron_consumer", p -> new DummyConsumer(Tags.Items.INGOTS_IRON)) + .model((ctx, pvd) -> pvd.withExistingParent("item/" + ctx.getName(), "block/air")) + .removeTab(GolemItems.ITEMS.getKey()) + .register(); + + DUMMY_URANIUM = ModularGolems.REGISTRATE.item("dummy_uranium_consumer", + p -> new DummyConsumer(ItemTags.create(new ResourceLocation("forge", "nuggets/uranium")))) + .model((ctx, pvd) -> pvd.withExistingParent("item/" + ctx.getName(), "block/air")) + .removeTab(GolemItems.ITEMS.getKey()) + .register(); + } + + private static RegistryEntry genEffect(String name, NonNullSupplier sup, String desc) { + return ModularGolems.REGISTRATE.effect(name, sup, desc).lang(MobEffect::getDescriptionId).register(); + } + + public static void register() { + if (ModList.get().isLoaded(L2Complements.MODID)) { + MGTagGen.OPTIONAL_EFF.add(e -> e.addTag(TagGen.SKILL_EFFECT) + .addOptional(EFF_ATOMIC.getId())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACConfigGen.java new file mode 100644 index 000000000..48b8478d8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACConfigGen.java @@ -0,0 +1,52 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class ACConfigGen extends ConfigDataProvider { + + public ACConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Alex's Caves"); + } + + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(ACDispatch.MODID, ACDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(ACDispatch.MODID, "candy"), + Ingredient.of(ACCompatRegistry.CRAFT_CANDY.get()), + Ingredient.of(ACCompatRegistry.REPAIR_CANDY.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 80) + .addStat(GolemTypes.STAT_ATTACK.get(), 5) + .addStat(GolemTypes.STAT_SPEED.get(), 0.3) + .addModifier(ACCompatRegistry.STICKY.get(), 1) + .addModifier(ACCompatRegistry.SHOOT.get(), 1) + .addModifier(ACCompatRegistry.FREE.get(), 1) + .end() + + .addMaterial(new ResourceLocation(ACDispatch.MODID, "magnetic"), + Ingredient.of(ACCompatRegistry.CRAFT_MAGNETIC.get()), + Ingredient.of(ACCompatRegistry.REPAIR_MAGNETIC.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 200) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addStat(GolemTypes.STAT_WEIGHT.get(), -0.2) + .addModifier(ACCompatRegistry.POLARIZE.get(), 1) + .addModifier(ACCompatRegistry.REFORMATION.get(), 1) + .end() + + .addMaterial(new ResourceLocation(ACDispatch.MODID, "nuclear"), + Ingredient.of(ACCompatRegistry.CRAFT_NUCLEAR.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 120) + .addStat(GolemTypes.STAT_ATTACK.get(), 10) + .addStat(GolemTypes.STAT_WEIGHT.get(), -0.4) + .addModifier(ACCompatRegistry.RADIATION.get(), 1) + .addModifier(ACCompatRegistry.ATOMIC.get(), 1) + .end() + + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACDispatch.java new file mode 100644 index 000000000..1a721a408 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/ACDispatch.java @@ -0,0 +1,109 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves; + +import com.github.alexmodguy.alexscaves.server.block.ACBlockRegistry; +import com.github.alexmodguy.alexscaves.server.item.ACItemRegistry; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.events.event.GolemEquipItemEvent; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class ACDispatch extends ModDispatch { + + public static final String MODID = "alexscaves"; + + @SubscribeEvent + public static void onGolemEquip(GolemEquipItemEvent event) { + if (event.getEntity().getModifiers().containsKey(ACCompatRegistry.ATOMIC.get())) { + if (ACCompatRegistry.DUMMY_URANIUM.get().isValid(event.getStack())) { + event.setSlot(event.getStack().getCount(), EquipmentSlot.OFFHAND); + } + } + if (event.getEntity().getModifiers().containsKey(ACCompatRegistry.REFORMATION.get())) { + if (ACCompatRegistry.DUMMY_IRON.get().isValid(event.getStack())) { + event.setSlot(event.getStack().getCount(), EquipmentSlot.OFFHAND); + } + } + } + + public ACDispatch() { + ACCompatRegistry.register(); + MinecraftForge.EVENT_BUS.register(ACDispatch.class); + } + + public void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".candy", "Candy"); + pvd.add("golem_material." + MODID + ".magnetic", "Magnetic"); + pvd.add("golem_material." + MODID + ".nuclear", "Nuclear"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, + ACCompatRegistry.REPAIR_CANDY.get())::unlockedBy, + ACItemRegistry.CARAMEL.get()) + .pattern("BBB").pattern("CDC").pattern("AAA") + .define('A', ACBlockRegistry.FROSTED_GINGERBREAD_BLOCK.get()) + .define('B', ACBlockRegistry.CANDY_CANE_BLOCK.get()) + .define('C', ACItemRegistry.CARAMEL.get()) + .define('D', ACBlockRegistry.LICOROOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, + ACCompatRegistry.CRAFT_CANDY.get(), 3)::unlockedBy, + ACItemRegistry.RADIANT_ESSENCE.get().asItem()) + .pattern("GBG").pattern("ZCZ").pattern("AAA") + .define('A', ACCompatRegistry.REPAIR_CANDY.get()) + .define('B', ACItemRegistry.GUMBALL_PILE.get()) + .define('G', ACBlockRegistry.SUGAR_GLASS.get()) + .define('Z', ACItemRegistry.HOT_CHOCOLATE_BOTTLE.get()) + .define('C', ACItemRegistry.RADIANT_ESSENCE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, + ACCompatRegistry.REPAIR_MAGNETIC.get())::unlockedBy, + ACItemRegistry.SCARLET_NEODYMIUM_INGOT.get()) + .pattern("SBC").pattern("BCB").pattern("CBA") + .define('A', ACItemRegistry.AZURE_NEODYMIUM_INGOT.get()) + .define('S', ACItemRegistry.SCARLET_NEODYMIUM_INGOT.get()) + .define('B', ACItemRegistry.FERROUSLIME_BALL.get()) + .define('C', ACBlockRegistry.PACKED_GALENA.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, + ACCompatRegistry.CRAFT_MAGNETIC.get(), 3)::unlockedBy, + ACBlockRegistry.HEART_OF_IRON.get().asItem()) + .pattern("ANA").pattern("TCT").pattern("ANA") + .define('A', ACCompatRegistry.REPAIR_MAGNETIC.get()) + .define('T', ACItemRegistry.TELECORE.get()) + .define('N', ACItemRegistry.NOTOR_COMPONENT.get()) + .define('C', ACBlockRegistry.HEART_OF_IRON.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, + ACCompatRegistry.CRAFT_NUCLEAR.get(), 3)::unlockedBy, + ACBlockRegistry.HEART_OF_IRON.get().asItem()) + .pattern("AAA").pattern("CDC").pattern("BBB") + .define('A', ACItemRegistry.POLYMER_PLATE.get()) + .define('B', ACItemRegistry.CHARRED_REMNANT.get()) + .define('C', ACBlockRegistry.URANIUM_ROD.get()) + .define('D', ACItemRegistry.FISSILE_CORE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new ACConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicBoostedEffect.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicBoostedEffect.java new file mode 100644 index 000000000..ff2054f65 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicBoostedEffect.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import dev.xkmc.l2library.base.effects.api.InherentEffect; +import dev.xkmc.l2library.util.math.MathHelper; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.UUID; + +public class AtomicBoostedEffect extends InherentEffect { + + public AtomicBoostedEffect(MobEffectCategory category, int color) { + super(category, color); + String name = "atomic_boost"; + UUID id = MathHelper.getUUIDFromString(name); + double boost = 0.2; + addAttributeModifier(Attributes.ATTACK_DAMAGE, id.toString(), boost, AttributeModifier.Operation.MULTIPLY_TOTAL); + addAttributeModifier(Attributes.MOVEMENT_SPEED, id.toString(), boost, AttributeModifier.Operation.MULTIPLY_BASE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicFuelingModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicFuelingModifier.java new file mode 100644 index 000000000..3c523afad --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/AtomicFuelingModifier.java @@ -0,0 +1,99 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import com.github.alexmodguy.alexscaves.server.item.ACItemRegistry; +import com.github.alexmodguy.alexscaves.server.potion.ACEffectRegistry; +import dev.xkmc.l2complements.init.L2Complements; +import dev.xkmc.l2complements.init.registrate.LCEffects; +import dev.xkmc.modulargolems.compat.materials.alexscaves.ACCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.ModList; + +import java.util.List; +import java.util.function.BiConsumer; + +public class AtomicFuelingModifier extends GolemModifier { + + private static int time() { + return MGConfig.COMMON.atomicDuration.get(); + } + + private static float health() { + return (float) (double) MGConfig.COMMON.atomicHeal.get(); + } + + public AtomicFuelingModifier() { + super(StatFilterType.HEALTH, 2); + } + + private void perform(AbstractGolemEntity golem, int level) { + float max = golem.getMaxHealth(); + if (ModList.get().isLoaded(L2Complements.MODID)) { + if (golem.hasEffect(LCEffects.CURSE.get())) { + golem.removeEffect(LCEffects.CURSE.get()); + } + } + golem.repair(max * health() * level); + var ins = golem.getEffect(ACCompatRegistry.EFF_ATOMIC.get()); + int t = ins == null ? 0 : ins.getDuration(); + golem.addEffect(new MobEffectInstance(ACCompatRegistry.EFF_ATOMIC.get(), t + time(), level)); + float f1 = 1 + (golem.getRandom().nextFloat() - golem.getRandom().nextFloat()) * 0.2F; + golem.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1, f1); + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + if (golem.tickCount % 20 != 0) return; + float hp = golem.getGuardedDataImpl(); + float max = golem.getMaxHealth(); + if (max * (1 - health()) <= hp) return; + ItemStack uranium = golem.getProjectile(ACCompatRegistry.DUMMY_URANIUM.asStack()); + if (uranium.isEmpty()) return; + uranium.shrink(1); + perform(golem, level); + } + + @Override + public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand, int level) { + ItemStack stack = player.getItemInHand(hand); + if (!ACCompatRegistry.DUMMY_URANIUM.get().isValid(stack)) return InteractionResult.PASS; + float hp = golem.getGuardedDataImpl(); + float max = golem.getMaxHealth(); + if (!player.level().isClientSide()) { + if (!player.isCreative()) stack.shrink(1); + perform(golem, level); + } + return InteractionResult.SUCCESS; + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + entity.effectImmunity.add(ACEffectRegistry.IRRADIATED.get()); + if (ModList.get().isLoaded(L2Complements.MODID)) { + entity.effectImmunity.add(LCEffects.CURSE.get()); + } + } + + @Override + public List getDetail(int v) { + var item = ACItemRegistry.URANIUM_SHARD.get().getDefaultInstance().getHoverName(); + var heal = Component.literal(Math.round(health() * 100 * v) + "%").withStyle(ChatFormatting.AQUA); + var boost = Component.literal("20%").withStyle(ChatFormatting.AQUA); + var time = Component.literal(time() / 20 + "").withStyle(ChatFormatting.AQUA); + return List.of(Component.translatable(getDescriptionId() + ".desc", item, heal, boost, time).withStyle(ChatFormatting.GREEN)); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyShootModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyShootModifier.java new file mode 100644 index 000000000..a73aedc31 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyShootModifier.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.List; +import java.util.function.BiConsumer; + +public class CandyShootModifier extends GolemModifier { + + public CandyShootModifier() { + super(StatFilterType.HEAD, 1); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(2, new GumShootAttackGoal(20, 2, 16, entity, lv)); + } + + @Override + public List getDetail(int v) { + int num = (int) Math.round(MGConfig.COMMON.candyDamage.get() * v); + var val = Component.literal("" + num).withStyle(ChatFormatting.AQUA); + return List.of(Component.translatable(getDescriptionId() + ".desc", val).withStyle(ChatFormatting.GREEN)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyStickModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyStickModifier.java new file mode 100644 index 000000000..80029959d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/CandyStickModifier.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import com.github.alexmodguy.alexscaves.server.entity.ACEntityRegistry; +import com.github.alexmodguy.alexscaves.server.entity.item.MeltedCaramelEntity; +import com.github.alexmodguy.alexscaves.server.misc.ACMath; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class CandyStickModifier extends GolemModifier { + + private static int time() { + return 100;//TODO + } + + public CandyStickModifier() { + super(StatFilterType.ATTACK, 2); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + var target = event.getEntity(); + var caramel = new MeltedCaramelEntity(ACEntityRegistry.MELTED_CARAMEL.get(), entity.level()); + Vec3 vec3 = new Vec3(target.getX(), target.getY() + 0.02, target.getZ()); + caramel.setPos(ACMath.getGroundBelowPosition(entity.level(), vec3)); + caramel.setDespawnsIn(time() * level); + entity.level().addFreshEntity(caramel); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/DummyConsumer.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/DummyConsumer.java new file mode 100644 index 000000000..deae52a08 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/DummyConsumer.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ProjectileWeaponItem; + +import java.util.function.Predicate; + +public class DummyConsumer extends ProjectileWeaponItem { + + private final TagKey ammo; + + public DummyConsumer(TagKey ammo) { + super(new Properties()); + this.ammo = ammo; + } + + public boolean isValid(ItemStack stack) { + return stack.is(ammo); + } + + @Override + public Predicate getAllSupportedProjectiles() { + return this::isValid; + } + + @Override + public int getDefaultProjectileRange() { + return 0; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/FreeMoveModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/FreeMoveModifier.java new file mode 100644 index 000000000..1f09a96e1 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/FreeMoveModifier.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; + +import java.util.function.Consumer; + +public class FreeMoveModifier extends GolemModifier { + + public FreeMoveModifier() { + super(StatFilterType.MOVEMENT, 1); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.FREE_MOVE); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/GumShootAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/GumShootAttackGoal.java new file mode 100644 index 000000000..ce62c30fa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/GumShootAttackGoal.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import com.github.alexmodguy.alexscaves.server.entity.item.GumballEntity; +import dev.xkmc.mob_weapon_api.util.ShootUtils; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.LivingEntity; + +public class GumShootAttackGoal extends BaseRangedAttackGoal { + + public GumShootAttackGoal(int waitTime, int near, int far, AbstractGolemEntity golem, int lv) { + super(waitTime, near, far, golem, lv); + } + + @Override + protected boolean performAttack(LivingEntity target) { + var proj = new GumballEntity(target.level(), golem); + proj.setPos(golem.getEyePosition()); + proj.setDamage((float) (MGConfig.COMMON.candyDamage.get() * lv)); + ShootUtils.shootAimHelper(target, proj, 1.5f, 0.08f); + golem.level().addFreshEntity(proj); + return true; + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/PolarizeModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/PolarizeModifier.java new file mode 100644 index 000000000..bb8769776 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/PolarizeModifier.java @@ -0,0 +1,102 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import com.github.alexmodguy.alexscaves.client.particle.ACParticleRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; + +import java.util.List; + +public class PolarizeModifier extends GolemModifier { + + public static double range(int lv) { + return (4 + lv) * 0.2 * MGConfig.COMMON.polarizeRange.get(); + } + + public static double damage(int lv) { + return (1 + lv) / 2f * MGConfig.COMMON.polarizeDamage.get(); + } + + public static double force() { + return MGConfig.COMMON.polarizeForce.get(); + } + + public PolarizeModifier() { + super(StatFilterType.MASS, 4); + } + + @Override + public void onClientTick(AbstractGolemEntity golem, int level) { + if (golem.tickCount % 5 != 0) return; + if (!golem.isAggressive()) return; + double r = range(level); + boolean ranged = golem.isInRangedMode() || golem.hasRangeAttack(); + Vec3 src = golem.position().add(0.0, 0.2, 0.0); + float particleMax = (float) (5 + golem.getRandom().nextInt(5)); + for (int particles = 0; (float) particles < particleMax; ++particles) { + Vec3 dst = new Vec3( + (golem.getRandom().nextFloat() - 0.5) * 0.3, + (golem.getRandom().nextFloat() - 0.5) * 0.3, + (r * 0.5F + r * 0.5F * golem.getRandom().nextFloat()) + ).yRot((float) ((particles / particleMax) * Math.PI * 2.0)).add(src); + if (!ranged) { + golem.level().addParticle(ACParticleRegistry.SCARLET_SHIELD_LIGHTNING.get(), + dst.x, dst.y, dst.z, src.x, src.y, src.z); + } else { + golem.level().addParticle(ACParticleRegistry.AZURE_SHIELD_LIGHTNING.get(), + src.x, src.y, src.z, dst.x, dst.y, dst.z); + } + } + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + var target = golem.getTarget(); + if (target == null) return; + boolean dmg = golem.tickCount % 10 == 0; + float damage = (float) damage(level); + double r = range(level); + boolean ranged = golem.isInRangedMode() || golem.hasRangeAttack(); + var aabb = golem.getBoundingBox().inflate(r); + List list = golem.level().getEntities(EntityTypeTest.forClass(LivingEntity.class), aabb, + e -> e != golem && golem.canAttack(e)); + Vec3 pos = golem.position().add(0, golem.getBbHeight() / 2, 0); + Vec3 forward = target.position().add(0, target.getBbHeight() / 2, 0).subtract(pos); + forward = forward.length() < 1 ? golem.getForward().normalize() : forward.normalize(); + double val = golem.getAttributeValue(ForgeMod.ENTITY_REACH.get()) * 0.8; + if (val < 1) val = 1; + forward = forward.scale(val); + for (var e : list) { + Vec3 tar = e.position().add(0, e.getBbHeight() / 2, 0); + if (tar.distanceTo(pos) > r) continue; + Vec3 dir; + if (ranged) { + dir = tar.subtract(pos); + if (dir.length() > 1) dir = dir.normalize(); + } else { + dir = pos.add(forward).subtract(tar); + } + if (dir.length() > 1) dir = dir.normalize(); + dir = dir.scale(force()); + e.push(dir.x, dir.y, dir.z); + if (dmg) e.hurt(golem.damageSources().mobAttack(golem), damage); + } + } + + @Override + public List getDetail(int v) { + int num = (int) Math.round(damage(v)); + var val = Component.literal("" + num).withStyle(ChatFormatting.AQUA); + return List.of(Component.translatable(getDescriptionId() + ".desc", val).withStyle(ChatFormatting.GREEN)); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/RadiationModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/RadiationModifier.java new file mode 100644 index 000000000..9d392b96a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/RadiationModifier.java @@ -0,0 +1,57 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import com.github.alexmodguy.alexscaves.server.potion.ACEffectRegistry; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.StringUtil; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +import java.util.List; + +public class RadiationModifier extends GolemModifier { + + private static int time() { + return MGConfig.COMMON.radiationDuration.get(); + } + + private static float atk() { + return (float) (double) MGConfig.COMMON.radiationDamage.get(); + } + + public RadiationModifier() { + super(StatFilterType.ATTACK, 2); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + event.getEntity().addEffect(new MobEffectInstance( + ACEffectRegistry.IRRADIATED.get(), time(), level * 2 - 1 + )); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var ins = cache.getAttackTarget().getEffect(ACEffectRegistry.IRRADIATED.get()); + if (ins == null) return; + cache.addHurtModifier(DamageModifier.multTotal(1 + (ins.getAmplifier() + 1) * atk())); + } + + @Override + public List getDetail(int v) { + var val = Component.translatable(ACEffectRegistry.IRRADIATED.get().getDescriptionId()); + val = Component.translatable("potion.withAmplifier", val, Component.translatable("potion.potency." + (v * 2 - 1))); + val = Component.translatable("potion.withDuration", val, Component.literal(StringUtil.formatTickDuration(time()))); + val = val.withStyle(ChatFormatting.RED); + var atk = Component.literal(Math.round(atk() * 100) + "%").withStyle(ChatFormatting.AQUA); + return List.of(Component.translatable(getDescriptionId() + ".desc", val, atk).withStyle(ChatFormatting.GREEN)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/ReformationModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/ReformationModifier.java new file mode 100644 index 000000000..e40a8c83b --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/ReformationModifier.java @@ -0,0 +1,83 @@ +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import dev.xkmc.modulargolems.compat.materials.alexscaves.ACCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public class ReformationModifier extends GolemModifier { + + private static int max(int lv) { + return lv * MGConfig.COMMON.reformationMax.get(); + } + + private static float health() { + return (float) (double) MGConfig.COMMON.reformationAbsorption.get(); + } + + + private static float heal(int lv) { + return (float) (MGConfig.COMMON.reformationHealing.get() * lv); + } + + public ReformationModifier() { + super(StatFilterType.HEALTH, 2); + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + if (golem.tickCount % 20 != 0) return; + float hp = golem.getAbsorptionAmount(); + float max = max(level) * health(); + if (max <= hp) return; + ItemStack iron = golem.getProjectile(ACCompatRegistry.DUMMY_IRON.asStack()); + if (iron.isEmpty()) return; + iron.shrink(1); + golem.setAbsorptionAmount(hp + health()); + golem.repair(heal(level)); + float f1 = 1 + (golem.getRandom().nextFloat() - golem.getRandom().nextFloat()) * 0.2F; + golem.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1, f1); + //TODO visual effects + } + + @Override + public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand, int level) { + ItemStack stack = player.getItemInHand(hand); + if (!ACCompatRegistry.DUMMY_IRON.get().isValid(stack)) return InteractionResult.PASS; + float hp = golem.getAbsorptionAmount(); + float max = max(level) * health(); + if (max <= hp) return InteractionResult.FAIL; + if (!player.level().isClientSide()) { + if (!player.isCreative()) stack.shrink(1); + golem.setAbsorptionAmount(hp + health()); + golem.repair(heal(level)); + float f1 = 1 + (golem.getRandom().nextFloat() - golem.getRandom().nextFloat()) * 0.2F; + golem.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1, f1); + } + return InteractionResult.SUCCESS; + } + + @Override + public List getDetail(int v) { + int nab = Math.round(health()); + int nhp = Math.round(heal(v)); + int nmax = nab * max(v); + var cab = Component.literal("" + nab).withStyle(ChatFormatting.AQUA); + var chp = Component.literal("" + nhp).withStyle(ChatFormatting.AQUA); + var cmax = Component.literal("" + nmax).withStyle(ChatFormatting.AQUA); + return List.of(Component.translatable(getDescriptionId() + ".desc", cab, chp, cmax).withStyle(ChatFormatting.GREEN)); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/package-info.java new file mode 100644 index 000000000..a34a3a8f6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/modifier/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.alexscaves.modifier; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/package-info.java new file mode 100644 index 000000000..fbf37a50f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/alexscaves/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.alexscaves; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMConfigGen.java new file mode 100644 index 000000000..1be0754cb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMConfigGen.java @@ -0,0 +1,73 @@ +package dev.xkmc.modulargolems.compat.materials.allthemodium; + +import com.thevortex.allthemodium.registry.ModRegistry; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class ATMConfigGen extends ConfigDataProvider { + + public ATMConfigGen(DataGenerator generator) { + super(generator, "Golem Config for ATM"); + } + + @Override + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(ATMDispatch.MODID, ATMDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(ATMDispatch.MODID, "allthemodium"), + Ingredient.of(ModRegistry.ALLTHEMODIUM_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 500) + .addStat(GolemTypes.STAT_ATTACK.get(), 50) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.2) + .addStat(GolemTypes.STAT_REGEN.get(), 5) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PLAYER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.RECYCLE.get(), 1) + .addModifier(GolemModifiers.ADD_SLOT.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 1) + .end() + + .addMaterial(new ResourceLocation(ATMDispatch.MODID, "vibranium"), + Ingredient.of(ModRegistry.VIBRANIUM_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 800) + .addStat(GolemTypes.STAT_ATTACK.get(), 80) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.4) + .addStat(GolemTypes.STAT_REGEN.get(), 8) + .addStat(GolemTypes.STAT_SWEEP.get(), 3) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PLAYER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.EXPLOSION_RES.get(), 2) + .addModifier(GolemModifiers.RECYCLE.get(), 1) + .addModifier(GolemModifiers.ADD_SLOT.get(), 2) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 2) + .end() + + .addMaterial(new ResourceLocation(ATMDispatch.MODID, "unobtainium"), + Ingredient.of(ModRegistry.UNOBTAINIUM_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 1000) + .addStat(GolemTypes.STAT_ATTACK.get(), 100) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.6) + .addStat(GolemTypes.STAT_REGEN.get(), 10) + .addStat(GolemTypes.STAT_SWEEP.get(), 4) + .addStat(GolemTypes.STAT_RANGE.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PLAYER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.MAGIC_IMMUNE.get(), 1) + .addModifier(GolemModifiers.EXPLOSION_RES.get(), 2) + .addModifier(GolemModifiers.RECYCLE.get(), 1) + .addModifier(GolemModifiers.ADD_SLOT.get(), 3) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 3) + .end() + + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMDispatch.java new file mode 100644 index 000000000..37f6cb661 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/ATMDispatch.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.compat.materials.allthemodium; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import net.minecraft.data.DataGenerator; + +public class ATMDispatch extends ModDispatch { + + public static final String MODID = "allthemodium"; + + public ATMDispatch() { + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".allthemodium", "Allthemodium"); + pvd.add("golem_material." + MODID + ".vibranium", "Vibranium"); + pvd.add("golem_material." + MODID + ".unobtainium", "Unobtainium"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new ATMConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/package-info.java new file mode 100644 index 000000000..e5098cdfd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/allthemodium/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.allthemodium; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClient.java new file mode 100644 index 000000000..afb4df65c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClient.java @@ -0,0 +1,12 @@ +package dev.xkmc.modulargolems.compat.materials.blazegear; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; + +public class BGClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + DuplicateBlazeArmsLayer.registerLayer(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClientEvents.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClientEvents.java deleted file mode 100644 index 64b044ec3..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGClientEvents.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.blazegear; - -import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.event.EntityRenderersEvent; - -public class BGClientEvents { - - public static ModelLayerLocation BLAZE_ARMS_LAYER = new ModelLayerLocation(new ResourceLocation("mineraft:player"), "blazegear_blaze_arms"); - - public BGClientEvents() { - } - - public static void registerLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { - event.registerLayerDefinition(BLAZE_ARMS_LAYER, DuplicatedBlazeArmsModel::createBodyLayer); - } - -} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGDispatch.java index 7765dd8f9..a3bde3826 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BGDispatch.java @@ -4,16 +4,14 @@ import com.tterrag.registrate.providers.RegistrateRecipeProvider; import dev.xkmc.l2library.serial.config.ConfigDataProvider; import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; -import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.data.DataGenerator; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; public class BGDispatch extends ModDispatch { public static final String MODID = "blazegear"; public BGDispatch() { + super(() -> BGClient::new); BGCompatRegistry.register(); } @@ -30,10 +28,4 @@ public ConfigDataProvider getDataGen(DataGenerator gen) { return new BGConfigGen(gen); } - @OnlyIn(Dist.CLIENT) - @Override - public void dispatchClientSetup() { - DuplicateBlazeArmsLayer.registerLayer(); - ModularGolems.MOD_BUS.addListener(BGClientEvents::registerLayer); - } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BlazingModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BlazingModifier.java index a251ab6fe..17620698f 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BlazingModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/BlazingModifier.java @@ -5,8 +5,6 @@ import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import java.util.function.BiConsumer; @@ -21,7 +19,6 @@ public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal.accept(5, new BlazeAttackGoal(entity, lv)); } - @OnlyIn(Dist.CLIENT) @Override public void onClientTick(AbstractGolemEntity entity, int value) { entity.level().addParticle(ParticleTypes.LARGE_SMOKE, entity.getRandomX(0.5D), entity.getRandomY(), entity.getRandomZ(0.5D), 0.0D, 0.0D, 0.0D); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/DuplicateBlazeArmsLayer.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/DuplicateBlazeArmsLayer.java index bdf82903d..6e829f0ca 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/DuplicateBlazeArmsLayer.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/blazegear/DuplicateBlazeArmsLayer.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemRenderer; +import dev.xkmc.modulargolems.init.GolemClient; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.MultiBufferSource; @@ -21,7 +22,7 @@ public static void registerLayer() { public DuplicateBlazeArmsLayer(LivingEntityRenderer owner) { super(owner); - this.model = new DuplicatedBlazeArmsModel<>(Minecraft.getInstance().getEntityModels().bakeLayer(BGClientEvents.BLAZE_ARMS_LAYER)); + this.model = new DuplicatedBlazeArmsModel<>(Minecraft.getInstance().getEntityModels().bakeLayer(GolemClient.BLAZE_ARMS_LAYER)); } public void render(PoseStack matrixStack, MultiBufferSource buffer, int lightness, T entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotCompatRegistry.java index 6996332bf..349fc5fe1 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotCompatRegistry.java @@ -5,23 +5,23 @@ import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; public class BotCompatRegistry { - public static final RegistryEntry MANA_MENDING; - public static final RegistryEntry MANA_BOOSTING; - public static final RegistryEntry MANA_PRODUCTION; - public static final RegistryEntry MANA_BURST; - public static final RegistryEntry PIXIE_ATTACK; - public static final RegistryEntry PIXIE_COUNTERATTACK; + public static final RegistryEntry MANA_MENDING; + public static final RegistryEntry MANA_BOOSTING; + public static final RegistryEntry MANA_PRODUCTION; + public static final RegistryEntry MANA_BURST; + public static final RegistryEntry PIXIE_ATTACK; + public static final RegistryEntry PIXIE_COUNTERATTACK; - static { - MANA_MENDING = reg("mana_mending", ManaMendingModifier::new, "Get %s regeneration at a %s mana/hp efficiency"); - MANA_BOOSTING = reg("mana_boosting", ManaBoostModifier::new, "Deal %s%% extra damage costing %s mana"); - MANA_PRODUCTION = reg("mana_production", ManaProductionModifier::new, "Generate %s mana per second"); - MANA_BURST = reg("mana_burst", ManaBurstModifier::new, "Shoot mana burst toward faraway targets dealing %s%% attack damage, costing %s mana"); - PIXIE_ATTACK = reg("pixie_attack", PixieAttackModifier::new, "Summon a pixie with a %s%% chance when attacking. Pixie damage +%s."); - PIXIE_COUNTERATTACK = reg("pixie_counterattack", PixieCounterattackModifier::new, "Summon a pixie with a %s%% chance when attacked."); - } + static { + MANA_MENDING = reg("mana_mending", ManaMendingModifier::new, "Get %s regeneration at a %s mana/hp efficiency"); + MANA_BOOSTING = reg("mana_boosting", ManaBoostModifier::new, "Deal %s%% extra damage costing %s mana"); + MANA_PRODUCTION = reg("mana_production", ManaProductionModifier::new, "Generate %s mana per second"); + MANA_BURST = reg("mana_burst", ManaBurstModifier::new, "Shoot mana burst toward faraway targets dealing %s%% attack damage, costing %s mana"); + PIXIE_ATTACK = reg("pixie_attack", PixieAttackModifier::new, "Summon a pixie with a %s%% chance when attacking. Pixie damage +%s."); + PIXIE_COUNTERATTACK = reg("pixie_counterattack", PixieCounterattackModifier::new, "Summon a pixie with a %s%% chance when attacked."); + } - public static void register() { - } + public static void register() { + } - } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotConfigGen.java index 3dc85e335..18f2ee2df 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotConfigGen.java @@ -3,7 +3,6 @@ import dev.xkmc.l2library.serial.config.ConfigDataProvider; import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; import dev.xkmc.modulargolems.init.ModularGolems; -import dev.xkmc.modulargolems.init.registrate.GolemModifiers; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; @@ -12,37 +11,37 @@ public class BotConfigGen extends ConfigDataProvider { - public BotConfigGen(DataGenerator generator) { - super(generator, "Golem Config for Botania"); - } + public BotConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Botania"); + } - public void add(Collector map) { - map.add(ModularGolems.MATERIALS, new ResourceLocation(BotDispatch.MODID, BotDispatch.MODID), new GolemMaterialConfig() - .addMaterial(new ResourceLocation(BotDispatch.MODID, "manasteel"), Ingredient.of(BotaniaItems.manaSteel)) - .addStat(GolemTypes.STAT_HEALTH.get(), 150) - .addStat(GolemTypes.STAT_ATTACK.get(), 15) - .addModifier(BotCompatRegistry.MANA_MENDING.get(), 1) - .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 1) - .end() + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(BotDispatch.MODID, BotDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(BotDispatch.MODID, "manasteel"), Ingredient.of(BotaniaItems.manaSteel)) + .addStat(GolemTypes.STAT_HEALTH.get(), 150) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addModifier(BotCompatRegistry.MANA_MENDING.get(), 1) + .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 1) + .end() - .addMaterial(new ResourceLocation(BotDispatch.MODID, "terrasteel"), Ingredient.of(BotaniaItems.terrasteel)) - .addStat(GolemTypes.STAT_HEALTH.get(), 300) - .addStat(GolemTypes.STAT_ATTACK.get(), 30) - .addModifier(BotCompatRegistry.MANA_MENDING.get(), 2) - .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 2) - .addModifier(BotCompatRegistry.MANA_PRODUCTION.get(), 1) - .addModifier(BotCompatRegistry.MANA_BURST.get(), 1) - .end() + .addMaterial(new ResourceLocation(BotDispatch.MODID, "terrasteel"), Ingredient.of(BotaniaItems.terrasteel)) + .addStat(GolemTypes.STAT_HEALTH.get(), 300) + .addStat(GolemTypes.STAT_ATTACK.get(), 30) + .addModifier(BotCompatRegistry.MANA_MENDING.get(), 2) + .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 2) + .addModifier(BotCompatRegistry.MANA_PRODUCTION.get(), 1) + .addModifier(BotCompatRegistry.MANA_BURST.get(), 1) + .end() - .addMaterial(new ResourceLocation(BotDispatch.MODID, "elementium"), Ingredient.of(BotaniaItems.elementium)) - .addStat(GolemTypes.STAT_HEALTH.get(), 200) - .addStat(GolemTypes.STAT_ATTACK.get(), 15) - .addModifier(BotCompatRegistry.MANA_MENDING.get(), 1) - .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 1) - .addModifier(BotCompatRegistry.PIXIE_ATTACK.get(), 1) - .addModifier(BotCompatRegistry.PIXIE_COUNTERATTACK.get(), 1) - .end() - ); - } + .addMaterial(new ResourceLocation(BotDispatch.MODID, "elementium"), Ingredient.of(BotaniaItems.elementium)) + .addStat(GolemTypes.STAT_HEALTH.get(), 200) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addModifier(BotCompatRegistry.MANA_MENDING.get(), 1) + .addModifier(BotCompatRegistry.MANA_BOOSTING.get(), 1) + .addModifier(BotCompatRegistry.PIXIE_ATTACK.get(), 1) + .addModifier(BotCompatRegistry.PIXIE_COUNTERATTACK.get(), 1) + .end() + ); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotDispatch.java index 04446a860..5fb557a41 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/BotDispatch.java @@ -3,36 +3,44 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; import dev.xkmc.l2library.serial.config.ConfigDataProvider; -import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; -import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.events.event.GolemInfoEvent; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.world.item.Items; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; public class BotDispatch extends ModDispatch { - public static final String MODID = "botania"; + public static final String MODID = "botania"; - public BotDispatch() { - BotCompatRegistry.register(); - } + public BotDispatch() { + BotCompatRegistry.register(); + MinecraftForge.EVENT_BUS.register(BotDispatch.class); - public void genLang(RegistrateLangProvider pvd) { - pvd.add("golem_material." + MODID + ".manasteel", "Manasteel"); - pvd.add("golem_material." + MODID + ".terrasteel", "Terrasteel"); - pvd.add("golem_material." + MODID + ".elementium", "Elementium"); - } + } - @Override - public void genRecipe(RegistrateRecipeProvider pvd) { + public void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".manasteel", "Manasteel"); + pvd.add("golem_material." + MODID + ".terrasteel", "Terrasteel"); + pvd.add("golem_material." + MODID + ".elementium", "Elementium"); + } - } + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { - @Override - public ConfigDataProvider getDataGen(DataGenerator gen) { - return new BotConfigGen(gen); - } + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new BotConfigGen(gen); + } + + @SubscribeEvent + public static void onGolemInfo(GolemInfoEvent event) { + if (event.getGolem().hasFlag(GolemFlags.BOTANIA)) { + event.addLine(BotUtils.getDesc(event.getGolem())); + } + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBoostModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBoostModifier.java index 87b721a51..32e6d65e9 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBoostModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBoostModifier.java @@ -13,25 +13,25 @@ public class ManaBoostModifier extends ManaModifier { - public ManaBoostModifier() { - super(StatFilterType.ATTACK, MAX_LEVEL); - } - - @Override - public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { - int manaCost = MGConfig.COMMON.manaBoostingCost.get() * level; - double damageBoost = MGConfig.COMMON.manaBoostingDamage.get() * level; - int consumed = new BotUtils(entity).consumeMana(manaCost); - if (consumed <= 0) return; - if (consumed < manaCost) damageBoost = damageBoost * consumed / manaCost; - cache.addHurtModifier(DamageModifier.multTotal(1 + (float) damageBoost)); - - } - - public List getDetail(int v) { - int bonus = (int) Math.round((MGConfig.COMMON.manaBoostingDamage.get() * v) * 100); - int manaCost = MGConfig.COMMON.manaBoostingCost.get() * v; - return List.of(Component.translatable(getDescriptionId() + ".desc", bonus, manaCost).withStyle(ChatFormatting.GREEN)); - } + public ManaBoostModifier() { + super(StatFilterType.ATTACK, MAX_LEVEL); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + int manaCost = MGConfig.COMMON.manaBoostingCost.get() * level; + double damageBoost = MGConfig.COMMON.manaBoostingDamage.get() * level; + int consumed = new BotUtils(entity).consumeMana(manaCost); + if (consumed <= 0) return; + if (consumed < manaCost) damageBoost = damageBoost * consumed / manaCost; + cache.addHurtModifier(DamageModifier.multTotal(1 + (float) damageBoost)); + + } + + public List getDetail(int v) { + int bonus = (int) Math.round((MGConfig.COMMON.manaBoostingDamage.get() * v) * 100); + int manaCost = MGConfig.COMMON.manaBoostingCost.get() * v; + return List.of(Component.translatable(getDescriptionId() + ".desc", bonus, manaCost).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstAttackGoal.java index 74c92ec69..c5dc1e0a6 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstAttackGoal.java @@ -12,17 +12,18 @@ public class ManaBurstAttackGoal extends BaseRangedAttackGoal { public ManaBurstAttackGoal(AbstractGolemEntity golem, int lv) { - super(40, 4, 48, golem, lv); + super(40, 0, 48, golem, lv); } @Override - protected void performAttack(LivingEntity target) { + protected boolean performAttack(LivingEntity target) { var manaCost = MGConfig.COMMON.manaBurstCost.get() * lv; var bot = new BotUtils(golem); - if (bot.getMana() < manaCost) return; + if (bot.getMana() < manaCost) return true; bot.consumeMana(manaCost); var burst = getBurst(golem); golem.level().addFreshEntity(burst); + return true; } public ManaBurstEntity getBurst(LivingEntity golem) { diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstModifier.java index 0a172a588..a4f8235f4 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaBurstModifier.java @@ -13,19 +13,19 @@ public class ManaBurstModifier extends ManaModifier { - public ManaBurstModifier() { - super(StatFilterType.ATTACK, MAX_LEVEL); - } + public ManaBurstModifier() { + super(StatFilterType.ATTACK, MAX_LEVEL); + } - @Override - public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new ManaBurstAttackGoal(entity, lv)); - } + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new ManaBurstAttackGoal(entity, lv)); + } - public List getDetail(int v) { - int prob = (int) Math.round((MGConfig.COMMON.manaBurstDamage.get() * v) * 100); - int manaCost = MGConfig.COMMON.manaBurstCost.get() * v; - return List.of(Component.translatable(getDescriptionId() + ".desc", prob, manaCost).withStyle(ChatFormatting.GREEN)); - } + public List getDetail(int v) { + int prob = (int) Math.round((MGConfig.COMMON.manaBurstDamage.get() * v) * 100); + int manaCost = MGConfig.COMMON.manaBurstCost.get() * v; + return List.of(Component.translatable(getDescriptionId() + ".desc", prob, manaCost).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaMendingModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaMendingModifier.java index 1fba474dd..a257b16f5 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaMendingModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaMendingModifier.java @@ -11,25 +11,25 @@ public class ManaMendingModifier extends ManaModifier { - public ManaMendingModifier() { - super(StatFilterType.HEALTH, MAX_LEVEL); - } + public ManaMendingModifier() { + super(StatFilterType.HEALTH, MAX_LEVEL); + } - @Override - public double onHealTick(double heal, AbstractGolemEntity le, int level) { - var healthDiff = le.getMaxHealth() - le.getHealth() - heal; - var cost = MGConfig.COMMON.manaMendingCost.get(); - int maxHeal = (int) Math.floor(Math.min(healthDiff, MGConfig.COMMON.manaMendingVal.get() * level)); - if (maxHeal <= 0) return heal; - int maxCost = maxHeal * cost; - int consume = new BotUtils(le).consumeMana(maxCost); - double toHeal = 1d * consume / cost; - return heal + toHeal; - } + @Override + public double onHealTick(double heal, AbstractGolemEntity le, int level) { + var healthDiff = le.getMaxHealth() - le.getGuardedDataImpl() - heal; + var cost = MGConfig.COMMON.manaMendingCost.get(); + int maxHeal = (int) Math.floor(Math.min(healthDiff, MGConfig.COMMON.manaMendingVal.get() * level)); + if (maxHeal <= 0) return heal; + int maxCost = maxHeal * cost; + int consume = new BotUtils(le).consumeMana(maxCost); + double toHeal = 1d * consume / cost; + return heal + toHeal; + } - public List getDetail(int v) { - int eff = MGConfig.COMMON.manaMendingCost.get(); - double val = MGConfig.COMMON.manaMendingVal.get() * v; - return List.of(Component.translatable(getDescriptionId() + ".desc", val, eff).withStyle(ChatFormatting.GREEN)); - } + public List getDetail(int v) { + int eff = MGConfig.COMMON.manaMendingCost.get(); + double val = MGConfig.COMMON.manaMendingVal.get() * v; + return List.of(Component.translatable(getDescriptionId() + ".desc", val, eff).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaProductionModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaProductionModifier.java index 3a0916f8c..6b7a617e8 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaProductionModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/ManaProductionModifier.java @@ -11,19 +11,19 @@ public class ManaProductionModifier extends ManaModifier { - public ManaProductionModifier() { - super(StatFilterType.HEALTH, MAX_LEVEL); - } + public ManaProductionModifier() { + super(StatFilterType.HEALTH, MAX_LEVEL); + } - @Override - public double onHealTick(double heal, AbstractGolemEntity entity, int level) { - int prod = MGConfig.COMMON.manaProductionVal.get() * level; - new BotUtils(entity).generateMana(prod); - return heal; - } + @Override + public double onHealTick(double heal, AbstractGolemEntity entity, int level) { + int prod = MGConfig.COMMON.manaProductionVal.get() * level; + new BotUtils(entity).generateMana(prod); + return heal; + } - public List getDetail(int v) { - var prod = MGConfig.COMMON.manaProductionVal.get() * v; - return List.of(Component.translatable(getDescriptionId() + ".desc", prod).withStyle(ChatFormatting.GREEN)); - } + public List getDetail(int v) { + var prod = MGConfig.COMMON.manaProductionVal.get() * v; + return List.of(Component.translatable(getDescriptionId() + ".desc", prod).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieAttackModifier.java index 82dd17fc6..7ce0f8143 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieAttackModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieAttackModifier.java @@ -16,28 +16,28 @@ public class PixieAttackModifier extends GolemModifier { - public PixieAttackModifier() { - super(StatFilterType.ATTACK, MAX_LEVEL); - } + public PixieAttackModifier() { + super(StatFilterType.ATTACK, MAX_LEVEL); + } - @Override - public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { - double prob = MGConfig.COMMON.pixieCounterattackProb.get() * level; - if (entity.getRandom().nextDouble() < prob) { - PixieEntity pixie = new PixieEntity(entity.level()); - pixie.setPos(entity.getX(), entity.getY() + 2, entity.getZ()); - float dmg = 4 + 2 * level; - pixie.setProps(event.getEntity(), entity, 0, dmg); - pixie.finalizeSpawn((ServerLevelAccessor) entity.level(), entity.level().getCurrentDifficultyAt(pixie.blockPosition()), - MobSpawnType.EVENT, null, null); - entity.level().addFreshEntity(pixie); - } - } + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + double prob = MGConfig.COMMON.pixieCounterattackProb.get() * level; + if (entity.getRandom().nextDouble() < prob) { + PixieEntity pixie = new PixieEntity(entity.level()); + pixie.setPos(entity.getX(), entity.getY() + 2, entity.getZ()); + float dmg = 4 + 2 * level; + pixie.setProps(event.getEntity(), entity, 0, dmg); + pixie.finalizeSpawn((ServerLevelAccessor) entity.level(), entity.level().getCurrentDifficultyAt(pixie.blockPosition()), + MobSpawnType.EVENT, null, null); + entity.level().addFreshEntity(pixie); + } + } - public List getDetail(int v) { - int prob = (int) Math.round((MGConfig.COMMON.pixieAttackProb.get() * v) * 100); - double extraDmg = 2*v; - return List.of(Component.translatable(getDescriptionId() + ".desc", prob, extraDmg).withStyle(ChatFormatting.GREEN)); - } + public List getDetail(int v) { + int prob = (int) Math.round((MGConfig.COMMON.pixieAttackProb.get() * v) * 100); + double extraDmg = 2 * v; + return List.of(Component.translatable(getDescriptionId() + ".desc", prob, extraDmg).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieCounterattackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieCounterattackModifier.java index 3c0f5f42b..0d57656f0 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieCounterattackModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/botania/PixieCounterattackModifier.java @@ -17,29 +17,29 @@ public class PixieCounterattackModifier extends GolemModifier { - public PixieCounterattackModifier() { - super(StatFilterType.HEALTH, MAX_LEVEL); - } + public PixieCounterattackModifier() { + super(StatFilterType.HEALTH, MAX_LEVEL); + } - @Override - public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { - if (event.getSource().getEntity() instanceof LivingEntity le) { - double prob = MGConfig.COMMON.pixieCounterattackProb.get() * level; - if (entity.getRandom().nextDouble() < prob) { - PixieEntity pixie = new PixieEntity(entity.level()); - pixie.setPos(entity.getX(), entity.getY() + 2, entity.getZ()); - float dmg = 4 + 2 * entity.getModifiers().getOrDefault(BotCompatRegistry.PIXIE_ATTACK.get(), 0); - pixie.setProps(le, entity, 0, dmg); - pixie.finalizeSpawn((ServerLevelAccessor) entity.level(), entity.level().getCurrentDifficultyAt(pixie.blockPosition()), - MobSpawnType.EVENT, null, null); - entity.level().addFreshEntity(pixie); - } - } - } + @Override + public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + if (event.getSource().getEntity() instanceof LivingEntity le) { + double prob = MGConfig.COMMON.pixieCounterattackProb.get() * level; + if (entity.getRandom().nextDouble() < prob) { + PixieEntity pixie = new PixieEntity(entity.level()); + pixie.setPos(entity.getX(), entity.getY() + 2, entity.getZ()); + float dmg = 4 + 2 * entity.getModifiers().getOrDefault(BotCompatRegistry.PIXIE_ATTACK.get(), 0); + pixie.setProps(le, entity, 0, dmg); + pixie.finalizeSpawn((ServerLevelAccessor) entity.level(), entity.level().getCurrentDifficultyAt(pixie.blockPosition()), + MobSpawnType.EVENT, null, null); + entity.level().addFreshEntity(pixie); + } + } + } - public List getDetail(int v) { - int prob = (int) Math.round((MGConfig.COMMON.pixieCounterattackProb.get() * v) * 100); - return List.of(Component.translatable(getDescriptionId() + ".desc", prob).withStyle(ChatFormatting.GREEN)); - } + public List getDetail(int v) { + int prob = (int) Math.round((MGConfig.COMMON.pixieCounterattackProb.get() * v) * 100); + return List.of(Component.translatable(getDescriptionId() + ".desc", prob).withStyle(ChatFormatting.GREEN)); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormAttackGoal.java deleted file mode 100644 index 279405e69..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormAttackGoal.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.entity.effect.Sandstorm_Entity; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.phys.Vec3; - -public class AncientRemnantSandstormAttackGoal extends BaseRangedAttackGoal { - - public AncientRemnantSandstormAttackGoal(AbstractGolemEntity golem, int lv) { - super(100, 4, 35, golem, lv); - } - - @Override - protected void performAttack(LivingEntity target) { - Vec3 diff = target.position().subtract(golem.position()).normalize(); - float angle = (float) Math.atan2(diff.z, diff.x); - double sx = target.getX(); - double sy = target.getY(); - double sz = target.getZ(); - Sandstorm_Entity projectile = new Sandstorm_Entity(golem.level(), sx, sy, sz, 100, angle, golem.getUUID()); - golem.level().addFreshEntity(projectile); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataClient.java new file mode 100644 index 000000000..e03a6c36e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataClient.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm; + +import dev.xkmc.modulargolems.compat.materials.cataclysm.client.HarbingerArmors; +import dev.xkmc.modulargolems.compat.materials.cataclysm.client.IgnisArmors; +import dev.xkmc.modulargolems.compat.materials.cataclysm.client.MaledictusArmors; +import dev.xkmc.modulargolems.compat.materials.cataclysm.client.MonstrosityArmors; +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; +import dev.xkmc.modulargolems.content.client.override.ModelOverride; +import dev.xkmc.modulargolems.content.client.override.ModelOverrides; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.event.EntityRenderersEvent; + +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.regAndAdd; + +public class CataClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + ModelOverrides.registerOverride(new ResourceLocation(CataDispatch.MODID, "ignitium"), + ModelOverride.texturePredicate((e) -> CataDispatch.ignisBlue(e) ? "_soul" : "")); + } + + @Override + public void dispatchEntityLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { + + regAndAdd(event, HarbingerArmors.HELMET_LAYER, HarbingerArmors::createHelmet); + regAndAdd(event, HarbingerArmors.CHESTPLATE_LAYER, HarbingerArmors::createChestplate); + regAndAdd(event, HarbingerArmors.SHINGUARD_LAYER, HarbingerArmors::createLeggings); + + regAndAdd(event, MonstrosityArmors.HELMET_LAYER, MonstrosityArmors::createHelmet); + regAndAdd(event, MonstrosityArmors.CHESTPLATE_LAYER, MonstrosityArmors::createChestplate); + regAndAdd(event, MonstrosityArmors.SHINGUARD_LAYER, MonstrosityArmors::createLeggings); + + regAndAdd(event, IgnisArmors.HELMET_LAYER, IgnisArmors::createHelmet); + regAndAdd(event, IgnisArmors.CHESTPLATE_LAYER, IgnisArmors::createChestplate); + regAndAdd(event, IgnisArmors.SHINGUARD_LAYER, IgnisArmors::createLeggings); + + regAndAdd(event, MaledictusArmors.HELMET_LAYER, MaledictusArmors::createHelmet); + regAndAdd(event, MaledictusArmors.CHESTPLATE_LAYER, MaledictusArmors::createChestplate); + regAndAdd(event, MaledictusArmors.SHINGUARD_LAYER, MaledictusArmors::createLeggings); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataCompatRegistry.java index 6b997c2ba..e4249239d 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataCompatRegistry.java @@ -1,15 +1,40 @@ package dev.xkmc.modulargolems.compat.materials.cataclysm; +import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import dev.xkmc.l2complements.init.L2Complements; +import dev.xkmc.l2complements.init.data.TagGen; +import dev.xkmc.modulargolems.compat.materials.cataclysm.armor.*; +import dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers.*; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.CraftMaterialItem; +import dev.xkmc.modulargolems.content.item.upgrade.RepairMaterialItem; import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; - +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import net.minecraftforge.fml.ModList; + +import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; public class CataCompatRegistry { + public static final ItemEntry HARBINGER_TEMPLATE, MONSTROSITY_TEMPLATE; + public static final ItemEntry HARBINGER_HELMET, HARBINGER_CHESTPLATE, HARBINGER_SHINGUARD; + public static final ItemEntry MONSTROSITY_HELMET, MONSTROSITY_CHESTPLATE, MONSTROSITY_SHINGUARD; + public static final ItemEntry IGNIS_HELMET, IGNIS_CHESTPLATE, IGNIS_SHINGUARD; + public static final ItemEntry MALEDICTUS_HELMET, MALEDICTUS_CHESTPLATE, MALEDICTUS_SHINGUARD; + public static final RegistryEntry IGNIS_FIREBALL; + public static final RegistryEntry IGNIS_JUMP; public static final RegistryEntry IGNIS_ATTACK; public static final RegistryEntry HARBINGER_BEAM; public static final RegistryEntry HARBINGER_MISSILE; @@ -18,15 +43,94 @@ public class CataCompatRegistry { public static final RegistryEntry RUNE; public static final RegistryEntry EARTHQUAKE; public static final RegistryEntry SANDSTORM; + public static final RegistryEntry ANCIENT_MELTDOWN; + public static final RegistryEntry EARTHQUAKE_SPEAR; + public static final RegistryEntry MALEDICTUS_ATTACK; + public static final RegistryEntry SCYLLA_LIGHTNING; + public static final RegistryEntry SCYLLA_WAVE; + + public static final RegistryEntry EFF_FORCE; - public static final RegistryEntry LEVIATHAN, ENDER_GUARDIAN, MONSTROSITY, ANCIENT_REMNANT; + public static final RegistryEntry LEVIATHAN, ENDER_GUARDIAN, MONSTROSITY, ANCIENT_REMNANT, SCYLLA; + public static final RegistryEntry VOID_CUBE, AZURE_CUBE; + public static final RegistryEntry VOID_CONSTRUCT, STORM_CONSTRUCT; static { + + HARBINGER_TEMPLATE = REGISTRATE.item("harbinger_upgrade_template", Item::new) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/" + ctx.getName()))) + .register(); + + MONSTROSITY_TEMPLATE = REGISTRATE.item("monstrosity_upgrade_template", Item::new) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/" + ctx.getName()))) + .register(); + + HARBINGER_HELMET = REGISTRATE.item("harbinger_helmet", p -> new HarbingerArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 14, 8, CataArmorPaths.WITHERITE_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + HARBINGER_CHESTPLATE = REGISTRATE.item("harbinger_chestplate", p -> new HarbingerArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 18, 8, CataArmorPaths.WITHERITE_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + HARBINGER_SHINGUARD = REGISTRATE.item("harbinger_shinguard", p -> new HarbingerArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 10, 8, CataArmorPaths.WITHERITE_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + MONSTROSITY_HELMET = REGISTRATE.item("monstrosity_helmet", p -> new MonstrosityArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 14, 8, CataArmorPaths.MONSTROSITY_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + MONSTROSITY_CHESTPLATE = REGISTRATE.item("monstrosity_chestplate", p -> new MonstrosityArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 18, 8, CataArmorPaths.MONSTROSITY_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + MONSTROSITY_SHINGUARD = REGISTRATE.item("monstrosity_shinguard", p -> new MonstrosityArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 10, 8, CataArmorPaths.MONSTROSITY_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + IGNIS_HELMET = REGISTRATE.item("ignis_helmet", p -> new IgnisArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 14, 8, CataArmorPaths.IGNIS_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Ignitium Golem Helmet").register(); + IGNIS_CHESTPLATE = REGISTRATE.item("ignis_chestplate", p -> new IgnisArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 18, 8, CataArmorPaths.IGNIS_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Ignitium Golem Chestplate").register(); + IGNIS_SHINGUARD = REGISTRATE.item("ignis_shinguard", p -> new IgnisArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 10, 8, CataArmorPaths.IGNIS_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Ignitium Golem Shinguard").register(); + + MALEDICTUS_HELMET = REGISTRATE.item("maledictus_helmet", p -> new MaledictusArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 14, 8, CataArmorPaths.MALEDICTUS_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Cursium Golem Helmet").register(); + MALEDICTUS_CHESTPLATE = REGISTRATE.item("maledictus_chestplate", p -> new MaledictusArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 18, 8, CataArmorPaths.MALEDICTUS_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Cursium Golem Chestplate").register(); + MALEDICTUS_SHINGUARD = REGISTRATE.item("maledictus_shinguard", p -> new MaledictusArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 10, 8, CataArmorPaths.MALEDICTUS_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, cataLoc("item/equipments/" + ctx.getName()))) + .lang("Cursium Golem Shinguard").register(); + + VOID_CUBE = GolemItems.item(CataDispatch.MODID, "void_cube", RepairMaterialItem::new); + VOID_CONSTRUCT = GolemItems.item(CataDispatch.MODID, "void_construct", CraftMaterialItem::new); + + AZURE_CUBE = GolemItems.item(CataDispatch.MODID, "azure_cube", RepairMaterialItem::new); + STORM_CONSTRUCT = GolemItems.item(CataDispatch.MODID, "storm_construct", CraftMaterialItem::new); + IGNIS_FIREBALL = reg("ignis_fireball", () -> new IgnisFireballModifier(StatFilterType.HEAD, 2), "When target is faraway, shoot Ignis fireballs toward target."); + IGNIS_JUMP = reg("ignis_jump", () -> new IgnisJumpModifier(StatFilterType.MOVEMENT, 1), + "Flame Strike", "Jump toward target. On landing, perform flame strike on all nearby targets."); + IGNIS_ATTACK = reg("ignis_attack", () -> new IgnisAttackModifier(StatFilterType.ATTACK, 2), - "Stack Blazing Brande effect and regenerate health when hit target. When health is lower than half, direct damage bypasses armor."); + "Blazing Brand", "Stack Blazing Brande effect and regenerate health when hit target. When health is lower than half, direct damage bypasses armor."); HARBINGER_BEAM = reg("harbinger_death_beam", () -> new HarbingerDeathBeamModifier(StatFilterType.HEAD, 1), "When target is faraway, shoot Death Beam toward target."); @@ -34,10 +138,21 @@ public class CataCompatRegistry { HARBINGER_MISSILE = reg("harbinger_missile", () -> new HarbingerHomingMissileModifier(StatFilterType.ATTACK, 2), "When target is faraway, shoot Homing Missile toward target."); - PORTAL = reg("leviathan_blast_portal", LeviathanBlastPortalModifier::new, "When target is faraway, create blast portal at target position"); - RUNE = reg("ender_guardian_void_rune", EnderGuardianVoidRuneModifier::new, "Summon void rune toward target"); - EARTHQUAKE = reg("netherite_monstrosity_earthquake", NetheriteMonstrosityEarthquakeModifier::new, "Jump and cause earthquake on land"); - SANDSTORM = reg("ancient_remnant_sandstorm", AncientRemnantSandstormModifier::new, "When target is faraway, summon sandstorm at target position"); + PORTAL = reg("leviathan_blast_portal", LeviathanBlastPortalModifier::new, "Ccreate blast portal at target position. Attacks multiple targets"); + RUNE = reg("ender_guardian_void_rune", EnderGuardianVoidRuneModifier::new, "Summon vortex and void rune toward multiple targets"); + EARTHQUAKE = reg("netherite_monstrosity_earthquake", NetheriteMonstrosityEarthquakeModifier::new, "Jump and cause earthquake on landing"); + SANDSTORM = reg("ancient_remnant_sandstorm", AncientRemnantSandstormModifier::new, "Summon sandstorm at target position. Attacks multiple targets. Increase damage to target inflicted with Curse of Desert"); + ANCIENT_MELTDOWN = reg("ancient_remnant_reformation", AncientMeltdownModifier::new, "Reforge: Consumes body material to repair itself at the cost of max health. Consumption be restored with ingot."); + EARTHQUAKE_SPEAR = reg("maledictus_earthquake", MaledictusEarthquakeModifier::new, "Phantom Halberd Jump Attack", "Jump and cause area damage on landing, summoning phantom halberds"); + MALEDICTUS_ATTACK = reg("maledictus_attack", MaledictusAttackModifier::new, + "Golem melee damage bypass armor. Stack rage counter after dealing damage, up to %s layers"); + SCYLLA_LIGHTNING = reg("scylla_lightning", ScyllaLightningAttackModifier::new, + "Shoot lightning spear at multiple targets"); + SCYLLA_WAVE = reg("scylla_wave", ScyllaWaveAttackModifier::new, + "When attacked, summon waves to push attackers away"); + + EFF_FORCE = genEffect("maledictus_rage", () -> new RageEffect(MobEffectCategory.BENEFICIAL, 0xffffffff), + "Increase golem attack damage"); LEVIATHAN = regModUpgrade("leviathan_blast_portal", () -> PORTAL, CataDispatch.MODID) .lang("Leviathan Upgrade").register(); @@ -47,11 +162,35 @@ public class CataCompatRegistry { .lang("Netherite Monstrosity Upgrade").register(); ANCIENT_REMNANT = regModUpgrade("ancient_remnant_sandstorm", () -> SANDSTORM, CataDispatch.MODID) .lang("Ancient Remnant Upgrade").register(); + SCYLLA = regModUpgrade("scylla_lightning_upgrade", () -> SCYLLA_LIGHTNING, CataDispatch.MODID) + .lang("Scylla Upgrade").register(); + + } + private static RegistryEntry genEffect(String name, NonNullSupplier sup, String desc) { + return ModularGolems.REGISTRATE.effect(name, sup, desc).lang(MobEffect::getDescriptionId).register(); } public static void register() { + if (ModList.get().isLoaded(L2Complements.MODID)) { + MGTagGen.OPTIONAL_EFF.add(e -> e.addTag(TagGen.SKILL_EFFECT) + .addOptional(EFF_FORCE.getId())); + MGTagGen.OPTIONAL_ITEM.add(e -> e.addTag(MGTagGen.TOUGH_ITEM) + .addOptional(IGNIS_HELMET.getId()) + .addOptional(IGNIS_CHESTPLATE.getId()) + .addOptional(IGNIS_SHINGUARD.getId()) + .addOptional(HARBINGER_HELMET.getId()) + .addOptional(HARBINGER_CHESTPLATE.getId()) + .addOptional(HARBINGER_SHINGUARD.getId()) + .addOptional(MONSTROSITY_HELMET.getId()) + .addOptional(MONSTROSITY_CHESTPLATE.getId()) + .addOptional(MONSTROSITY_SHINGUARD.getId()) + ); + } + } + public static ResourceLocation cataLoc(String id) { + return new ResourceLocation(CataDispatch.MODID, id); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataConfigGen.java index e42e75e97..2069eb25c 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataConfigGen.java @@ -21,26 +21,92 @@ public void add(Collector collector) { collector.add(ModularGolems.MATERIALS, new ResourceLocation(CataDispatch.MODID, CataDispatch.MODID), new GolemMaterialConfig() .addMaterial(new ResourceLocation(CataDispatch.MODID, "ignitium"), Ingredient.of(ModItems.IGNITIUM_INGOT.get())) .addStat(GolemTypes.STAT_HEALTH.get(), 450) - .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_ATTACK.get(), 30) .addStat(GolemTypes.STAT_SWEEP.get(), 2) .addStat(GolemTypes.STAT_RANGE.get(), 1) + .addStat(GolemTypes.STAT_DR.get(), 2) .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) .addModifier(GolemModifiers.DAMAGE_CAP.get(), 3) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) .addModifier(CataCompatRegistry.IGNIS_FIREBALL.get(), 2) + .addModifier(CataCompatRegistry.IGNIS_JUMP.get(), 1) .addModifier(CataCompatRegistry.IGNIS_ATTACK.get(), 1) .end() .addMaterial(new ResourceLocation(CataDispatch.MODID, "witherite"), Ingredient.of(ModItems.WITHERITE_INGOT.get())) .addStat(GolemTypes.STAT_HEALTH.get(), 390) - .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_ATTACK.get(), 30) .addStat(GolemTypes.STAT_REGEN.get(), 2) .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_DR.get(), 2) .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) .addModifier(GolemModifiers.DAMAGE_CAP.get(), 2) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) .addModifier(CataCompatRegistry.HARBINGER_BEAM.get(), 1) .addModifier(CataCompatRegistry.HARBINGER_MISSILE.get(), 1) .end() + + .addMaterial(new ResourceLocation(CataDispatch.MODID, "cursium"), Ingredient.of(ModItems.CURSIUM_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 390) + .addStat(GolemTypes.STAT_ATTACK.get(), 40) + .addStat(GolemTypes.STAT_REGEN.get(), 2) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_DR.get(), 2) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) + .addModifier(GolemModifiers.RECYCLE.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 2) + .addModifier(CataCompatRegistry.EARTHQUAKE_SPEAR.get(), 1) + .addModifier(CataCompatRegistry.MALEDICTUS_ATTACK.get(), 1) + .end() + + .addMaterial(new ResourceLocation(CataDispatch.MODID, "ender_guardian"), + Ingredient.of(CataCompatRegistry.VOID_CONSTRUCT.get()), + Ingredient.of(CataCompatRegistry.VOID_CUBE.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 333) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_DR.get(), 2) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 3) + .addModifier(CataCompatRegistry.RUNE.get(), 2) + .end() + + .addMaterial(new ResourceLocation(CataDispatch.MODID, "storm"), + Ingredient.of(CataCompatRegistry.STORM_CONSTRUCT.get()), + Ingredient.of(CataCompatRegistry.AZURE_CUBE.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 390) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_REGEN.get(), 2) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_DR.get(), 2) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) + .addModifier(GolemModifiers.SWIM.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.THUNDER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 2) + .addModifier(CataCompatRegistry.SCYLLA_LIGHTNING.get(), 1) + .addModifier(CataCompatRegistry.SCYLLA_WAVE.get(), 1) + .end() + + + .addMaterial(new ResourceLocation(CataDispatch.MODID, "ancient_metal"), Ingredient.of(ModItems.ANCIENT_METAL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 288) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_DR.get(), 1) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(CataCompatRegistry.ANCIENT_MELTDOWN.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 1) + .addModifier(CataCompatRegistry.SANDSTORM.get(), 1) + .end() ); + + + // } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataDispatch.java index 9f294d490..72ec53cdd 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataDispatch.java @@ -1,53 +1,41 @@ package dev.xkmc.modulargolems.compat.materials.cataclysm; -import com.github.L_Ender.cataclysm.init.ModItems; +import com.github.L_Ender.cataclysm.init.ModEntities; import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.cataclysm_mux.GolemCataProxy; import dev.xkmc.l2library.serial.config.ConfigDataProvider; -import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.cataclysm.armor.IgnisArmorItem; import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; -import dev.xkmc.modulargolems.content.client.override.ModelOverride; -import dev.xkmc.modulargolems.content.client.override.ModelOverrides; -import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import static dev.xkmc.modulargolems.init.data.RecipeGen.unlock; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.common.MinecraftForge; public class CataDispatch extends ModDispatch { public static final String MODID = "cataclysm"; public CataDispatch() { + super(() -> CataClient::new); CataCompatRegistry.register(); + MinecraftForge.EVENT_BUS.register(CataEventHandler.class); } public void genLang(RegistrateLangProvider pvd) { pvd.add("golem_material." + MODID + ".ignitium", "Ignitium"); pvd.add("golem_material." + MODID + ".witherite", "Witherite"); + pvd.add("golem_material." + MODID + ".cursium", "Cursium"); + pvd.add("golem_material." + MODID + ".storm", "Storm"); + pvd.add("golem_material." + MODID + ".ender_guardian", "Ender Guardian"); + pvd.add("golem_material." + MODID + ".ancient_metal", "Ancient Metal"); } @Override public void genRecipe(RegistrateRecipeProvider pvd) { - unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.ENDER_GUARDIAN.get())::unlockedBy, - ModItems.GAUNTLET_OF_GUARD.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.GAUNTLET_OF_GUARD.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.LEVIATHAN.get())::unlockedBy, - ModItems.TIDAL_CLAWS.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.TIDAL_CLAWS.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.MONSTROSITY.get())::unlockedBy, - ModItems.INFERNAL_FORGE.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.INFERNAL_FORGE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.ANCIENT_REMNANT.get())::unlockedBy, - ModItems.SANDSTORM_IN_A_BOTTLE.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.SANDSTORM_IN_A_BOTTLE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + CataRecipGen.genRecipe(pvd); } @Override @@ -55,10 +43,26 @@ public ConfigDataProvider getDataGen(DataGenerator gen) { return new CataConfigGen(gen); } - @OnlyIn(Dist.CLIENT) @Override - public void dispatchClientSetup() { - ModelOverrides.registerOverride(new ResourceLocation(CataDispatch.MODID, "ignitium"), - ModelOverride.texturePredicate((e) -> e.getHealth() <= e.getMaxHealth() / 2 ? "_soul" : "")); + public void genLootModifier(MGGLMGen pvd) { + pvd.drop(MODID, ModEntities.IGNIS.get(), "ignitium"); + pvd.drop(MODID, ModEntities.THE_HARBINGER.get(), "witherite"); + pvd.drop(MODID, ModEntities.MALEDICTUS.get(), "cursium"); + pvd.drop(ModularGolems.MODID, ModEntities.NETHERITE_MONSTROSITY.get(), "netherite"); + pvd.drop(MODID, ModEntities.ENDER_GUARDIAN.get(), "ender_guardian"); + pvd.drop(MODID, ModEntities.SCYLLA.get(), "storm"); + pvd.drop(MODID, ModEntities.ANCIENT_REMNANT.get(), "ancient_metal"); } + + public static boolean ignisBlue(LivingEntity e) { + return e.getHealth() <= e.getMaxHealth() / 2 || e.getItemBySlot(EquipmentSlot.CHEST).is(CataCompatRegistry.IGNIS_CHESTPLATE.get()); + } + + public static void stackBlazingBrand(LivingEntity golem, LivingEntity target, float dmg, int min) { + if (golem.getItemBySlot(EquipmentSlot.HEAD).getItem() instanceof IgnisArmorItem) min++; + if (golem.getItemBySlot(EquipmentSlot.CHEST).getItem() instanceof IgnisArmorItem) min++; + if (golem.getItemBySlot(EquipmentSlot.LEGS).getItem() instanceof IgnisArmorItem) min++; + GolemCataProxy.stackBlazingBrand(golem, target, dmg, min); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataEventHandler.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataEventHandler.java new file mode 100644 index 000000000..e95e93997 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataEventHandler.java @@ -0,0 +1,102 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.modulargolems.compat.materials.cataclysm.armor.MaledictusArmorItem; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.TraceableEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraftforge.event.entity.EntityMobGriefingEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.level.ExplosionEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.registries.ForgeRegistries; + +public class CataEventHandler { + + @SubscribeEvent + public static void onDeath(LivingDeathEvent event) { + if (!(event.getEntity() instanceof MetalGolemEntity golem)) return; + if (event.getSource().is(DamageTypeTags.BYPASSES_INVULNERABILITY)) return; + var stack = golem.getItemBySlot(EquipmentSlot.CHEST); + if (!stack.is(CataCompatRegistry.MALEDICTUS_CHESTPLATE.get())) return; + long prev = stack.getOrCreateTag().getLong("NextAvailableTime"); + long time = golem.level().getGameTime(); + if (prev > time) return; + event.setCanceled(true); + int count = MaledictusArmorItem.getCount(golem); + int cd = MGConfig.COMMON.maledictusReviveCD.get(); + int red = MGConfig.COMMON.maledictusReviveCDPartReduction.get(); + cd = (cd - red * count) * 20; + long next = time + cd; + stack.getOrCreateTag().putLong("NextAvailableTime", next); + double php = MGConfig.COMMON.maledictusRevivePHP.get(); + double bonus = MGConfig.COMMON.maledictusRevivePHPPartBonus.get(); + php = php + bonus * count; + golem.setGuardedDataImpl(golem.getMaxHealth() * (float) php); + golem.level().playSound(null, golem.getX(), golem.getY(), golem.getZ(), SoundEvents.TOTEM_USE, golem.getSoundSource(), 1.25F, 1.0F); + golem.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 200, 0)); + double d0 = golem.getX(); + double d1 = golem.getY() + golem.getBbHeight() + 1; + double d2 = golem.getZ(); + var particle = new ResourceLocation(CataDispatch.MODID, "cursed_algiz"); + var reg = ForgeRegistries.PARTICLE_TYPES; + if (!reg.containsKey(particle)) return; + if (reg.getValue(particle) instanceof ParticleOptions type && golem.level() instanceof ServerLevel sl) + sl.sendParticles(type, d0, d1, d2, 1, 0.0F, 0.0F, 0.0F, 0.0F); + } + + @SubscribeEvent + public static void onExplosion(ExplosionEvent.Detonate event) { + var direct = event.getExplosion().getDirectSourceEntity(); + var owner = event.getExplosion().getIndirectSourceEntity(); + if (direct == null || !(owner instanceof AbstractGolemEntity golem)) return; + boolean fireball = GolemCataProxy.isIgnisExplosive(direct); + boolean strike = GolemCataProxy.isIgnisStrike(direct); + if (fireball || strike) { + if (!golem.isHostile()) event.getAffectedBlocks().clear(); + event.getAffectedEntities().removeIf(e -> { + if (e instanceof ItemEntity) return true; + if (e instanceof LivingEntity le) { + if (!golem.canAttack(le)) return true; + if (GolemCataProxy.isAbyssFireball(direct)) { + GolemCataProxy.inflictStun(golem, le, 60); + le.invulnerableTime = 0; + } else if (GolemCataProxy.isSoul(direct)) { + GolemCataProxy.inflictStun(golem, le, 40); + le.invulnerableTime = 0; + } + } + if (e instanceof TraceableEntity proj) { + if (proj.getOwner() == golem) { + return true; + } + } + return false; + }); + } + } + + @SubscribeEvent + public static void onMobGrief(EntityMobGriefingEvent event) { + var owner = GolemCataProxy.getOwner(event.getEntity()); + if (owner instanceof AbstractGolemEntity golem) { + if (!golem.isHostile()) { + event.setResult(Event.Result.DENY); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataRecipGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataRecipGen.java new file mode 100644 index 000000000..6ed4ff6b2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/CataRecipGen.java @@ -0,0 +1,189 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm; + +import com.github.L_Ender.cataclysm.init.ModBlocks; +import com.github.L_Ender.cataclysm.init.ModItems; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.data.recipes.SmithingTransformRecipeBuilder; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.Blocks; + +import static dev.xkmc.modulargolems.init.data.RecipeGen.unlock; + +public class CataRecipGen { + + public static void genRecipe(RegistrateRecipeProvider pvd) { + var output = ConditionalRecipeWrapper.mod(pvd, CataDispatch.MODID); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.VOID_CUBE.get())::unlockedBy, + ModItems.VOID_JAW.get()).pattern("ADA").pattern("BEB").pattern("CDC") + .define('C', Items.OBSIDIAN) + .define('B', Items.END_STONE) + .define('A', Items.PURPUR_BLOCK) + .define('D', Items.SHULKER_SHELL) + .define('E', ModItems.VOID_JAW.get()) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.VOID_CONSTRUCT.get(), 3)::unlockedBy, + ModItems.VOID_JAW.get()).pattern("ABA").pattern("BCB").pattern("ABA") + .define('A', CataCompatRegistry.VOID_CUBE.get()) + .define('B', ModItems.VOID_JAW.get()) + .define('C', ModItems.VOID_CORE.get()) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.AZURE_CUBE.get(), 4)::unlockedBy, + ModItems.LACRIMA.get()).pattern("ABA").pattern("BCB").pattern("ABA") + .define('A', ModBlocks.AZURE_SEASTONE.get()) + .define('B', ModItems.LACRIMA.get()) + .define('C', Items.SEA_LANTERN) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.STORM_CONSTRUCT.get(), 3)::unlockedBy, + ModItems.ESSENCE_OF_THE_STORM.get()).pattern(" B ").pattern("BCB").pattern(" B ") + .define('B', CataCompatRegistry.AZURE_CUBE.get()) + .define('C', ModItems.ESSENCE_OF_THE_STORM.get()) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.SCYLLA.get(), 1)::unlockedBy, + ModItems.ESSENCE_OF_THE_STORM.get()).pattern("BAB").pattern("BCB").pattern("BAB") + .define('C', GolemItems.EMPTY_UPGRADE.get()) + .define('B', ModItems.LACRIMA.get()) + .define('A', ModItems.ESSENCE_OF_THE_STORM.get()) + .save(output); + + unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.ENDER_GUARDIAN.get())::unlockedBy, + ModItems.GAUNTLET_OF_GUARD.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.GAUNTLET_OF_GUARD.get()) + .save(output); + + unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.LEVIATHAN.get())::unlockedBy, + ModItems.TIDAL_CLAWS.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.TIDAL_CLAWS.get()) + .save(output); + + unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.MONSTROSITY.get())::unlockedBy, + ModItems.INFERNAL_FORGE.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.INFERNAL_FORGE.get()) + .save(output); + + unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, CataCompatRegistry.ANCIENT_REMNANT.get())::unlockedBy, + ModItems.SANDSTORM_IN_A_BOTTLE.get()).requires(GolemItems.EMPTY_UPGRADE).requires(ModItems.SANDSTORM_IN_A_BOTTLE.get()) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.HARBINGER_TEMPLATE.get())::unlockedBy, + ModItems.WITHERITE_INGOT.get()) + .pattern("ASA").pattern("ABA").pattern("ACA") + .define('A', Items.REDSTONE_BLOCK) + .define('B', Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) + .define('C', ModItems.WITHERITE_INGOT.get()) + .define('S', Items.NETHER_STAR) + .save(output); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CataCompatRegistry.MONSTROSITY_TEMPLATE.get())::unlockedBy, + ModItems.MONSTROUS_HORN.get()) + .pattern("AGA").pattern("ABA").pattern("ACA") + .define('A', Blocks.BLACKSTONE) + .define('G', Items.GOLD_INGOT) + .define('B', Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) + .define('C', ModItems.LAVA_POWER_CELL.get()) + .save(output); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.HARBINGER_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()), + Ingredient.of(ModBlocks.WITHERITE_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.HARBINGER_HELMET.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()) + .save(output, CataCompatRegistry.HARBINGER_HELMET.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.HARBINGER_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()), + Ingredient.of(ModBlocks.WITHERITE_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.HARBINGER_CHESTPLATE.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()) + .save(output, CataCompatRegistry.HARBINGER_CHESTPLATE.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.HARBINGER_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()), + Ingredient.of(ModItems.WITHERITE_INGOT.get()), + RecipeCategory.COMBAT, CataCompatRegistry.HARBINGER_SHINGUARD.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()) + .save(output, CataCompatRegistry.HARBINGER_SHINGUARD.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.MONSTROSITY_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()), + Ingredient.of(ModItems.MONSTROUS_HORN.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MONSTROSITY_HELMET.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()) + .save(output, CataCompatRegistry.MONSTROSITY_HELMET.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.MONSTROSITY_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()), + Ingredient.of(ModItems.MONSTROUS_HORN.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MONSTROSITY_CHESTPLATE.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()) + .save(output, CataCompatRegistry.MONSTROSITY_CHESTPLATE.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(CataCompatRegistry.MONSTROSITY_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()), + Ingredient.of(ModItems.MONSTROUS_HORN.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MONSTROSITY_SHINGUARD.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()) + .save(output, CataCompatRegistry.MONSTROSITY_SHINGUARD.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.IGNITIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()), + Ingredient.of(ModItems.IGNITIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.IGNIS_HELMET.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()) + .save(output, CataCompatRegistry.IGNIS_HELMET.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.IGNITIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()), + Ingredient.of(ModItems.IGNITIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.IGNIS_CHESTPLATE.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()) + .save(output, CataCompatRegistry.IGNIS_CHESTPLATE.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.IGNITIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()), + Ingredient.of(ModItems.IGNITIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.IGNIS_SHINGUARD.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()) + .save(output, CataCompatRegistry.IGNIS_SHINGUARD.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.CURSIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()), + Ingredient.of(ModItems.CURSIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MALEDICTUS_HELMET.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()) + .save(output, CataCompatRegistry.MALEDICTUS_HELMET.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.CURSIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()), + Ingredient.of(ModItems.CURSIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MALEDICTUS_CHESTPLATE.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()) + .save(output, CataCompatRegistry.MALEDICTUS_CHESTPLATE.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(ModItems.CURSIUM_UPGARDE_SMITHING_TEMPLATE.get()), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()), + Ingredient.of(ModItems.CURSIUM_BLOCK.get()), + RecipeCategory.COMBAT, CataCompatRegistry.MALEDICTUS_SHINGUARD.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()) + .save(output, CataCompatRegistry.MALEDICTUS_SHINGUARD.getId()); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneAttackGoal.java deleted file mode 100644 index cd713a551..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneAttackGoal.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; -import net.minecraft.world.entity.LivingEntity; - -public class EnderGuardianVoidRuneAttackGoal extends BaseRangedAttackGoal { - - public EnderGuardianVoidRuneAttackGoal(AbstractGolemEntity golem, int lv) { - super(100, 0, 15, golem, lv); - } - - @Override - protected void performAttack(LivingEntity target) { - EnderGuardianVoidRuneModifier.addRune(golem, target, lv); - } - -} - diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneModifier.java deleted file mode 100644 index 68cd73ff0..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/EnderGuardianVoidRuneModifier.java +++ /dev/null @@ -1,70 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.entity.projectile.Void_Rune_Entity; -import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; - -import java.util.function.BiConsumer; - -public class EnderGuardianVoidRuneModifier extends GolemModifier { - - public static void addRune(LivingEntity user, LivingEntity target, int lv) { - double minY = Math.min(target.getY(), user.getY()); - double maxY = Math.max(target.getY(), user.getY()) + 1; - Vec3 v = target.getEyePosition().subtract(user.getEyePosition()).normalize(); - float angle = (float) (Mth.atan2(v.z, v.x)); - for (int j = 1; j <= 15; ++j) { - double dist = 1.25 * j; - spawnFangs(user, user.getX() + Mth.cos(angle) * dist, user.getZ() + Mth.sin(angle) * dist, minY, maxY, angle, j); - - } - - } - - private static void spawnFangs(LivingEntity user, double x, double z, double minY, double maxY, float rotation, int delay) { - BlockPos pos = BlockPos.containing(x, maxY, z); - boolean flag = false; - double dy = 0.0; - do { - BlockPos below = pos.below(); - BlockState state = user.level().getBlockState(below); - if (state.isFaceSturdy(user.level(), below, Direction.UP)) { - if (!user.level().isEmptyBlock(pos)) { - BlockState next = user.level().getBlockState(pos); - VoxelShape shape = next.getCollisionShape(user.level(), pos); - if (!shape.isEmpty()) { - dy = shape.max(Direction.Axis.Y); - } - } - flag = true; - break; - } - - pos = pos.below(); - } while (pos.getY() >= Mth.floor(minY) - 1); - if (flag) { - user.level().addFreshEntity(new Void_Rune_Entity(user.level(), x, pos.getY() + dy, z, rotation, delay, user)); - } - - } - - - public EnderGuardianVoidRuneModifier() { - super(StatFilterType.MASS, 1); - } - - @Override - public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new EnderGuardianVoidRuneAttackGoal(entity, lv)); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamModifier.java deleted file mode 100644 index 1438fea2c..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamModifier.java +++ /dev/null @@ -1,35 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.entity.projectile.Death_Laser_Beam_Entity; -import com.github.L_Ender.cataclysm.init.ModEntities; -import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; - -import java.util.function.BiConsumer; - -public class HarbingerDeathBeamModifier extends GolemModifier { - - public static Death_Laser_Beam_Entity addBeam(LivingEntity user) { - Death_Laser_Beam_Entity beam = new Death_Laser_Beam_Entity(ModEntities.DEATH_LASER_BEAM.get(), - user.level(), user, user.getX(), user.getEyeY(), user.getZ(), - (user.yHeadRot + 90.0F) * Mth.DEG_TO_RAD, - -user.getXRot() * Mth.DEG_TO_RAD, - 60); - user.level().addFreshEntity(beam); - return beam; - } - - public HarbingerDeathBeamModifier(StatFilterType type, int maxLevel) { - super(type, maxLevel); - } - - @Override - public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new HarbingerDeathBeamAttackGoal(entity, lv)); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileModifier.java deleted file mode 100644 index 9415b3458..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileModifier.java +++ /dev/null @@ -1,30 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.entity.projectile.Wither_Homing_Missile_Entity; -import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.phys.Vec3; - -import java.util.function.BiConsumer; - -public class HarbingerHomingMissileModifier extends GolemModifier { - - public static void addBeam(LivingEntity user, LivingEntity target, Vec3 pos) { - Wither_Homing_Missile_Entity laserBeam = new Wither_Homing_Missile_Entity(user.level(), user, target); - laserBeam.setPosRaw(pos.x(), pos.y(), pos.z()); - user.level().addFreshEntity(laserBeam); - } - - public HarbingerHomingMissileModifier(StatFilterType type, int maxLevel) { - super(type, maxLevel); - } - - @Override - public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new HarbingerHomingMissileAttackGoal(entity, lv)); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballModifier.java deleted file mode 100644 index 818493bd6..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballModifier.java +++ /dev/null @@ -1,68 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.entity.projectile.Ignis_Abyss_Fireball_Entity; -import com.github.L_Ender.cataclysm.entity.projectile.Ignis_Fireball_Entity; -import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.phys.Vec3; - -import java.util.function.BiConsumer; - -public class IgnisFireballModifier extends GolemModifier { - - private static final int[] TIME = {45, 61, 77, 93, 109}, ANGLE = {-5, -2, 0, 2, 5}; - - public IgnisFireballModifier(StatFilterType type, int maxLevel) { - super(type, maxLevel); - } - - @Override - public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new IgnisFireballAttackGoal(entity, lv)); - } - - public static void addFireball(LivingEntity user, int lv) { - user.level().playLocalSound(user.getX(), user.getY(), user.getZ(), SoundEvents.EVOKER_PREPARE_SUMMON, - user.getSoundSource(), 5.0F, 1.4F + user.getRandom().nextFloat() * 0.1F, false); - int index = user.getRandom().nextInt(5); - lv = Mth.clamp(lv, 0, 2); - for (int i = 2 - lv; i < 3 + lv; i++) { - shootFireball(user, new Vec3(ANGLE[i], 3.0D, 0.0D), TIME[i], index == i); - } - } - - private static void shootFireball(LivingEntity user, Vec3 shotAt, int timer, boolean abyss) { - shotAt = shotAt.yRot(-user.getYRot() * 0.017453292F); - Projectile shot; - if (abyss) { - var bullet = new Ignis_Abyss_Fireball_Entity(user.level(), user); - bullet.setUp(timer); - shot = bullet; - } else { - var bullet = new Ignis_Fireball_Entity(user.level(), user); - bullet.setUp(timer); - if (user.getHealth() < user.getMaxHealth() / 2) { - bullet.setSoul(true); - } - shot = bullet; - } - float rot = user.yBodyRot * 0.017453292F; - double width = (user.getBbWidth() + 1.0F) * 0.15D; - shot.setPos(user.getX() - width * Mth.sin(rot), - user.getY() + 1.0D, - user.getZ() + width * Mth.cos(rot)); - double d0 = shotAt.x; - double d1 = shotAt.y; - double d2 = shotAt.z; - float f = Mth.sqrt((float) (d0 * d0 + d2 * d2)) * 0.35F; - shot.shoot(d0, d1 + f, d2, 0.25F, 3.0F); - user.level().addFreshEntity(shot); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalAttackGoal.java deleted file mode 100644 index f434d0616..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalAttackGoal.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; -import net.minecraft.world.entity.LivingEntity; - -public class LeviathanBlastPortalAttackGoal extends BaseRangedAttackGoal { - - public LeviathanBlastPortalAttackGoal(AbstractGolemEntity golem, int lv) { - super(100, 2, 35, golem, lv); - } - - @Override - protected void performAttack(LivingEntity target) { - LeviathanBlastPortalModifier.addBeam(golem, target); - } - -} - diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/NetheriteMonstrosityEarthquakeModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/NetheriteMonstrosityEarthquakeModifier.java deleted file mode 100644 index 446b29f54..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/NetheriteMonstrosityEarthquakeModifier.java +++ /dev/null @@ -1,98 +0,0 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; - -import com.github.L_Ender.cataclysm.config.CMConfig; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.common.GolemFlags; -import dev.xkmc.modulargolems.content.modifier.base.AttributeGolemModifier; -import dev.xkmc.modulargolems.init.registrate.GolemTypes; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.function.Consumer; - -public class NetheriteMonstrosityEarthquakeModifier extends AttributeGolemModifier { - - public static final double RANGE = 5; - - public NetheriteMonstrosityEarthquakeModifier() { - super(1, - new AttrEntry(GolemTypes.STAT_ATTACK, () -> 5), - new AttrEntry(GolemTypes.STAT_ARMOR, () -> 5), - new AttrEntry(GolemTypes.STAT_TOUGH, () -> 5) - ); - } - - @Override - public void onRegisterFlag(Consumer cons) { - cons.accept(GolemFlags.EARTH_QUAKE); - } - - @Override - public void handleEvent(AbstractGolemEntity golem, int value, byte event) { - if (event == 83) { - makeParticles(golem, 0, 0); - } - } - - public static void performEarthQuake(AbstractGolemEntity golem) { - earthQuake(golem); - golem.level().broadcastEntityEvent(golem, (byte) 83); - } - - public static void earthQuake(LivingEntity le) { - le.playSound(SoundEvents.GENERIC_EXPLODE, 1.5F, 1.0F + le.getRandom().nextFloat() * 0.1F); - for (LivingEntity entity : le.level().getEntitiesOfClass(LivingEntity.class, le.getBoundingBox().inflate(7.0))) { - if (!le.isAlliedTo(entity) && entity != le) { - float damage = (float) (le.getAttributeValue(Attributes.ATTACK_DAMAGE) + - entity.getMaxHealth() * CMConfig.MonstrositysHpdamage); - boolean flag = entity.hurt(le.damageSources().mobAttack(le), damage); - if (flag) { - launch(le, entity); - } - } - } - } - - public static void makeParticles(LivingEntity le, float vec, float math) { - if (le.level().isClientSide) { - for (int i1 = 0; i1 < 80 + le.getRandom().nextInt(12); ++i1) { - double DeltaMovementX = le.getRandom().nextGaussian() * 0.07; - double DeltaMovementY = le.getRandom().nextGaussian() * 0.07; - double DeltaMovementZ = le.getRandom().nextGaussian() * 0.07; - float f = Mth.cos(le.yBodyRot * 0.017453292F); - float f1 = Mth.sin(le.yBodyRot * 0.017453292F); - float angle = 0.017453292F * le.yBodyRot + i1; - double extraX = 2.0F * Mth.sin((float) (Math.PI + angle)); - double extraY = 0.30000001192092896; - double extraZ = 2.0F * Mth.cos(angle); - double theta = le.yBodyRot * 0.017453292519943295; - ++theta; - double vecX = Math.cos(theta); - double vecZ = Math.sin(theta); - int hitX = Mth.floor(le.getX() + vec * vecX + extraX); - int hitY = Mth.floor(le.getY()); - int hitZ = Mth.floor(le.getZ() + vec * vecZ + extraZ); - BlockPos hit = new BlockPos(hitX, hitY, hitZ); - BlockState block = le.level().getBlockState(hit.below()); - le.level().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, block), le.getX() + (double) vec * vecX + extraX + (double) (f * math), le.getY() + extraY, le.getZ() + (double) vec * vecZ + extraZ + (double) (f1 * math), DeltaMovementX, DeltaMovementY, DeltaMovementZ); - } - } - - } - - private static void launch(LivingEntity le, Entity e) { - double d0 = e.getX() - le.getX(); - double d1 = e.getZ() - le.getZ(); - double d2 = Math.max(d0 * d0 + d1 * d1, 0.001); - float f = 2.0F; - e.push(d0 / d2 * f, 0.75, d1 / d2 * f); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/CataArmorPaths.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/CataArmorPaths.java new file mode 100644 index 000000000..3293bbed8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/CataArmorPaths.java @@ -0,0 +1,28 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; + +public class CataArmorPaths { + + public static final ResourceLocation + WITHERITE_HELMETS = ModularGolems.loc("harbinger/helmet"), + WITHERITE_CHESTPLATES = ModularGolems.loc("harbinger/chestplate"), + WITHERITE_LEGGINGS = ModularGolems.loc("harbinger/shinguard"); + + public static final ResourceLocation + MONSTROSITY_HELMETS = ModularGolems.loc("monstrosity/helmet"), + MONSTROSITY_CHESTPLATES = ModularGolems.loc("monstrosity/chestplate"), + MONSTROSITY_LEGGINGS = ModularGolems.loc("monstrosity/shinguard"); + + public static final ResourceLocation + IGNIS_HELMETS = ModularGolems.loc("ignis/helmet"), + IGNIS_CHESTPLATES = ModularGolems.loc("ignis/chestplate"), + IGNIS_LEGGINGS = ModularGolems.loc("ignis/shinguard"); + + public static final ResourceLocation + MALEDICTUS_HELMETS = ModularGolems.loc("maledictus/helmet"), + MALEDICTUS_CHESTPLATES = ModularGolems.loc("maledictus/chestplate"), + MALEDICTUS_LEGGINGS = ModularGolems.loc("maledictus/shinguard"); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/HarbingerArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/HarbingerArmorItem.java new file mode 100644 index 000000000..f8656e901 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/HarbingerArmorItem.java @@ -0,0 +1,70 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.l2damagetracker.init.L2DamageTracker; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class HarbingerArmorItem extends MetalGolemArmorItem { + + public HarbingerArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + switch (getSlot()) { + case HEAD -> list.add(MGLangData.HARBINGER_BOOST_LASER + .get(Math.round(MGConfig.COMMON.laserArmorBonus.get() * 100) + "%") + .withStyle(ChatFormatting.GOLD)); + case CHEST -> list.add(MGLangData.HARBINGER_BOOST_MISSILE + .get(Math.round(MGConfig.COMMON.missileArmorBonus.get() * 100) + "%") + .withStyle(ChatFormatting.GOLD)); + } + } + + @Override + public boolean emissive(LivingEntity user, ItemStack stack) { + return true; + } + + @Override + protected String namespace(String def) { + return CataDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(L2DamageTracker.ABSORB.get(), new AttributeModifier(uuid, "Harbinger Armor", 1, AttributeModifier.Operation.ADDITION)); + switch (getSlot()) { + case HEAD -> builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Harbinger Armor", 1, AttributeModifier.Operation.ADDITION)); + case CHEST -> builder.put(GolemTypes.GOLEM_SWEEP.get(), new AttributeModifier(uuid, + "Harbinger Armor", 1, AttributeModifier.Operation.ADDITION)); + case LEGS -> builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, + "Harbinger Armor", 0.5, AttributeModifier.Operation.MULTIPLY_BASE)); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/IgnisArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/IgnisArmorItem.java new file mode 100644 index 000000000..f30d4ed74 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/IgnisArmorItem.java @@ -0,0 +1,91 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.l2damagetracker.init.L2DamageTracker; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class IgnisArmorItem extends MetalGolemArmorItem { + + public IgnisArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + switch (getSlot()) { + case HEAD -> list.add(MGLangData.IGNIS_BOOST_FIREBALL + .get(Math.round(MGConfig.COMMON.fireballArmorBonus.get() * 100) + "%") + .withStyle(ChatFormatting.GOLD)); + case CHEST -> list.add(MGLangData.IGNIS_BOOST_SOUL.get() + .withStyle(ChatFormatting.GOLD)); + case LEGS -> list.add(MGLangData.IGNIS_BOOST_STRIKE + .get(Math.round(MGConfig.COMMON.flameStrikeArmorBonus.get() * 100) + "%") + .withStyle(ChatFormatting.GOLD)); + } + } + + @Override + public boolean emissive(LivingEntity user, ItemStack stack) { + return true; + } + + @Override + protected String namespace(String def) { + return CataDispatch.MODID; + } + + public ResourceLocation getModelTexture(LivingEntity user) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this); + assert rl != null; + var str = "textures/equipments/" + rl.getPath(); + if (user.getHealth() < 0.5 * user.getMaxHealth()) + str += "_soul"; + return new ResourceLocation(namespace(rl.getNamespace()), str + ".png"); + } + + public ResourceLocation getEmissiveModelTexture(LivingEntity user) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this); + assert rl != null; + var str = "textures/equipments/" + rl.getPath(); + if (user.getHealth() < 0.5 * user.getMaxHealth()) + str += "_soul"; + return new ResourceLocation(namespace(rl.getNamespace()), str + "_emissive.png"); + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(L2DamageTracker.REDUCTION.get(), new AttributeModifier(uuid, "Ignis Armor", -0.2, AttributeModifier.Operation.MULTIPLY_TOTAL)); + switch (getSlot()) { + case HEAD -> builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Ignis Armor", 1, AttributeModifier.Operation.ADDITION)); + case CHEST -> builder.put(GolemTypes.GOLEM_SWEEP.get(), new AttributeModifier(uuid, + "Ignis Armor", 1, AttributeModifier.Operation.ADDITION)); + case LEGS -> builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, + "Ignis Armor", 0.5, AttributeModifier.Operation.MULTIPLY_BASE)); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MaledictusArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MaledictusArmorItem.java new file mode 100644 index 000000000..51b03b979 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MaledictusArmorItem.java @@ -0,0 +1,118 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.l2damagetracker.init.L2DamageTracker; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.content.menu.equipment.EquipmentsMenu; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class MaledictusArmorItem extends MetalGolemArmorItem { + + public MaledictusArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + if (getSlot() == EquipmentSlot.HEAD) { + list.add(MGLangData.MALEDICTUS_BYPASS_CD.get()); + } else if (getSlot() == EquipmentSlot.LEGS) { + list.add(MGLangData.MALEDICTUS_FAST_SKILL.get()); + } else if (getSlot() == EquipmentSlot.CHEST) { + int cd = MGConfig.COMMON.maledictusReviveCD.get(); + int red = MGConfig.COMMON.maledictusReviveCDPartReduction.get(); + double php = MGConfig.COMMON.maledictusRevivePHP.get(); + double bonus = MGConfig.COMMON.maledictusRevivePHPPartBonus.get(); + list.add(MGLangData.MALEDICTUS_REVIVE.get((int) (php * 100), cd)); + list.add(MGLangData.MALEDICTUS_REVIVE_CD.get(red, bonus * 100)); + if (level != null && level.isClientSide()) { + long prev = stack.getOrCreateTag().getLong("NextAvailableTime"); + long time = level.getGameTime(); + if (prev > time) { + list.add(MGLangData.MALEDICTUS_REVIVE_IN_CD.get((prev - time) / 20)); + } else { + int count = ClientHandler.counter(); + if (count > 0) { + list.add(MGLangData.MALEDICTUS_REVIVE_ACTUAL_CD.get(cd - red * count)); + } + } + } + } + } + + @Override + public boolean emissive(LivingEntity user, ItemStack stack) { + long prev = stack.getOrCreateTag().getLong("NextAvailableTime"); + long time = user.level().getGameTime(); + return getSlot() == EquipmentSlot.CHEST && prev <= time; + } + + @Override + protected String namespace(String def) { + return CataDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(L2DamageTracker.ABSORB.get(), new AttributeModifier(uuid, "Maledictus Armor", 1, AttributeModifier.Operation.ADDITION)); + switch (getSlot()) { + case HEAD -> builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Maledictus Armor", 1, AttributeModifier.Operation.ADDITION)); + case CHEST -> builder.put(GolemTypes.DYNAMIC_REDUCTION.get(), new AttributeModifier(uuid, + "Maledictus Armor", 1, AttributeModifier.Operation.ADDITION)); + case LEGS -> builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, + "Maledictus Armor", 0.5, AttributeModifier.Operation.MULTIPLY_BASE)); + } + } + + public static int getCount(MetalGolemEntity golem) { + int count = 0; + var mat = CataCompatRegistry.cataLoc("cursium"); + for (var e : golem.getMaterials()) + if (e.id().equals(mat)) count++; + if (golem.getItemBySlot(EquipmentSlot.HEAD).is(CataCompatRegistry.MALEDICTUS_HELMET.get())) count++; + if (golem.getItemBySlot(EquipmentSlot.LEGS).is(CataCompatRegistry.MALEDICTUS_SHINGUARD.get())) count++; + return count; + } + + public static class ClientHandler { + + public static int counter() { + var player = Minecraft.getInstance().player; + if (player == null) return -1; + if (player.containerMenu instanceof EquipmentsMenu menu) { + if (menu.golem instanceof MetalGolemEntity e) { + return getCount(e); + } + } + return -1; + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MonstrosityArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MonstrosityArmorItem.java new file mode 100644 index 000000000..ea78ba8e8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/MonstrosityArmorItem.java @@ -0,0 +1,65 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.l2damagetracker.init.L2DamageTracker; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class MonstrosityArmorItem extends MetalGolemArmorItem { + + public MonstrosityArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + list.add(MGLangData.MONSTROSITY_BOOST + .get(Math.round(MGConfig.COMMON.earthquakeArmorBonus.get() * 100) + "%") + .withStyle(ChatFormatting.GOLD)); + } + + @Override + public boolean emissive(LivingEntity user, ItemStack stack) { + return true; + } + + @Override + protected String namespace(String def) { + return CataDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(L2DamageTracker.REDUCTION.get(), new AttributeModifier(uuid, "Monstrosity Armor", -0.2, AttributeModifier.Operation.MULTIPLY_TOTAL)); + switch (getSlot()) { + case HEAD -> builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Monstrosity Armor", 1, AttributeModifier.Operation.ADDITION)); + case CHEST -> builder.put(GolemTypes.GOLEM_SWEEP.get(), new AttributeModifier(uuid, + "Monstrosity Armor", 1, AttributeModifier.Operation.ADDITION)); + case LEGS -> builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, + "Monstrosity Armor", 0.5, AttributeModifier.Operation.MULTIPLY_BASE)); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/package-info.java new file mode 100644 index 000000000..e08100af0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/armor/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.cataclysm.armor; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/HarbingerArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/HarbingerArmors.java new file mode 100644 index 000000000..be5c69014 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/HarbingerArmors.java @@ -0,0 +1,115 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.cataclysm.armor.CataArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class HarbingerArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "harbinger_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "harbinger_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "harbinger_shinguard"), "main"); + + static { + GolemModelPath.register(WITHERITE_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1"), + List.of("head", "head2") + ))); + + GolemModelPath.register(WITHERITE_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("body", "body2"), + List.of("body", "body3"), + List.of("right_arm", "body4"), + List.of("right_arm", "body5"), + List.of("right_arm", "body7"), + List.of("left_arm", "body8"), + List.of("left_arm", "body9"), + List.of("left_arm", "body11") + ))); + + GolemModelPath.register(WITHERITE_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + } + + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 24).addBox(-1.5F, 1.0F, -6.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(62, 15).addBox(2.0F, -1.0F, -8.0F, 2.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(74, 15).addBox(2.0F, -1.0F, -6.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)) + .texOffs(80, 48).addBox(-2.5F, 9.0F, -6.0F, 1.0F, 3.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(82, 61).addBox(7.5F, 9.0F, -6.0F, 1.0F, 3.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(74, 27).addBox(-2.0F, 7.0F, 3.0F, 10.0F, 5.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(82, 74).addBox(-3.0F, 5.0F, -6.5F, 2.0F, 2.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.0F, -14.0F, 0.0F)); + + PartDefinition head2 = head.addOrReplaceChild("head2", CubeListBuilder.create().texOffs(28, 44).addBox(-5.5F, 5.0F, -2.0F, 1.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(36, 79).addBox(4.5F, 5.0F, -2.0F, 1.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -20.0F, 3.0F, -0.4363F, 0.0F, 0.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, 22.7F, -6.5F, 19.0F, 12.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -25.0F, 0.0F)); + + PartDefinition body2 = body.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(0, 77).addBox(-2.0F, -12.0F, -1.0F, 4.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -2.0F, -4.0F, -0.6471F, -0.1059F, -0.139F)); + + PartDefinition body3 = body.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(18, 79).addBox(7.0F, 2.0F, -3.0F, 4.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -13.0F, 7.0F, -0.6356F, 0.1309F, 0.1314F)); + + PartDefinition body4 = right_arm.addOrReplaceChild("body4", CubeListBuilder.create().texOffs(0, 62).addBox(2.5F, -2.0F, -3.5F, 5.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-16.0F, 19.0F, 0.0F)); + + PartDefinition body5 = right_arm.addOrReplaceChild("body5", CubeListBuilder.create().texOffs(36, 36).addBox(0.0F, -21.0F, -4.0F, 6.0F, 10.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-21.0F, 16.0F, 0.0F, 0.0F, 0.0F, 0.3491F)); + + PartDefinition body6 = body5.addOrReplaceChild("body6", CubeListBuilder.create().texOffs(86, 0).addBox(-3.0F, -3.0F, -1.0F, 3.0F, 4.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -19.0F, -2.0F, 0.0F, 0.0F, -0.5236F)); + + PartDefinition body7 = right_arm.addOrReplaceChild("body7", CubeListBuilder.create().texOffs(50, 66).addBox(-5.0F, -13.0F, 0.0F, 8.0F, 22.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(-16.0F, 21.0F, 0.0F)); + + PartDefinition body8 = left_arm.addOrReplaceChild("body8", CubeListBuilder.create().texOffs(62, 0).addBox(-10.5F, 17.0F, -3.5F, 5.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(19.0F, 0.0F, 0.0F)); + + PartDefinition body9 = left_arm.addOrReplaceChild("body9", CubeListBuilder.create().texOffs(0, 44).addBox(-10.5F, -4.0F, -4.0F, 6.0F, 10.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(19.0F, -2.0F, 0.0F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition body10 = body9.addOrReplaceChild("body10", CubeListBuilder.create().texOffs(82, 84).addBox(-3.0F, -4.0F, -3.0F, 3.0F, 4.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.6632F)); + + PartDefinition body11 = left_arm.addOrReplaceChild("body11", CubeListBuilder.create().texOffs(66, 66).addBox(-13.0F, 8.0F, -1.0F, 8.0F, 22.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(26.0F, 0.0F, 0.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(36, 23).addBox(-5.5F, 36.0F, -4.0F, 11.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -25.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(24, 67).addBox(-4.0F, -22.0F, -2.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(28, 54).addBox(-4.0F, -12.5F, -2.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 20.0F, -1.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(64, 36).addBox(-4.0F, -20.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(54, 54).addBox(-4.0F, -10.5F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 18.0F, 0.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/IgnisArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/IgnisArmors.java new file mode 100644 index 000000000..7e6859c46 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/IgnisArmors.java @@ -0,0 +1,130 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.cataclysm.armor.CataArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class IgnisArmors { + + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ignis_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ignis_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ignis_shinguard"), "main"); + + static { + GolemModelPath.register(IGNIS_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1"), + List.of("head", "head1", "right_helmet"), + List.of("head", "head1", "left_helmet"), + List.of("head", "head1", "head_plate"), + List.of("head", "head1", "right_horn"), + List.of("head", "head1", "left_horn") + ))); + + GolemModelPath.register(IGNIS_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(IGNIS_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + } + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 50).addBox(-4.0F, -8.0F, -4.5F, 8.0F, 10.0F, 8.0F, new CubeDeformation(0.5F)), PartPose.offsetAndRotation(0.0F, -4.5F, -1.0F, 0.0F, 0.0F, 0.0F)); + + PartDefinition right_helmet = head1.addOrReplaceChild("right_helmet", CubeListBuilder.create().texOffs(88, 93).addBox(-0.5F, 1.5F, -4.0F, 0.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.5F, -3.0F, -4.5F, 0.0F, -0.829F, 0.0F)); + + PartDefinition left_helmet = head1.addOrReplaceChild("left_helmet", CubeListBuilder.create().texOffs(94, 75).addBox(0.5F, 1.5F, -4.0F, 0.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.5F, -3.0F, -4.5F, 0.0F, 0.829F, 0.0F)); + + PartDefinition head_plate = head1.addOrReplaceChild("head_plate", CubeListBuilder.create().texOffs(24, 76).addBox(-1.5F, -1.0F, -1.5F, 3.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.0F, -4.0F, -0.2618F, 0.0F, 0.0F)); + + PartDefinition right_horn = head1.addOrReplaceChild("right_horn", CubeListBuilder.create().texOffs(24, 68).addBox(-1.0F, -5.0F, -1.0F, 2.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-3.5F, -7.5F, -3.5F, 0.3927F, 0.2182F, -0.1309F)); + + PartDefinition right_horn2 = right_horn.addOrReplaceChild("right_horn2", CubeListBuilder.create().texOffs(32, 97).addBox(-0.5F, -7.0F, 0.0F, 1.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -5.0F, -1.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition right_horn3 = right_horn2.addOrReplaceChild("right_horn3", CubeListBuilder.create().texOffs(62, 19).addBox(-0.5F, -0.01F, -3.99F, 1.0F, 1.0F, 4.0F, new CubeDeformation(-0.01F)), PartPose.offsetAndRotation(0.0F, -6.99F, 1.99F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition left_horn = head1.addOrReplaceChild("left_horn", CubeListBuilder.create().texOffs(24, 97).addBox(-1.0F, -5.0F, -1.0F, 2.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(3.5F, -7.5F, -3.5F, 0.3927F, -0.2182F, 0.1309F)); + + PartDefinition left_horn2 = left_horn.addOrReplaceChild("left_horn2", CubeListBuilder.create().texOffs(38, 97).addBox(-0.5F, -7.0F, 0.0F, 1.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -5.0F, -1.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition left_horn3 = left_horn2.addOrReplaceChild("left_horn3", CubeListBuilder.create().texOffs(92, 13).addBox(-0.5F, -0.01F, -3.99F, 1.0F, 1.0F, 4.0F, new CubeDeformation(-0.01F)), PartPose.offsetAndRotation(0.0F, -6.99F, 1.99F, -0.5236F, 0.0F, 0.0F)); + + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -6.5F, 19.0F, 13.0F, 12.0F, new CubeDeformation(0.0F)) + .texOffs(70, 51).addBox(-3.0F, -33.0F, -8.0F, 6.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r1 = body1.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(38, 25).addBox(-1.0F, -1.5F, -1.0F, 6.0F, 12.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(5.0F, -33.0F, -6.0F, 0.0F, 0.0F, 0.1309F)); + + PartDefinition cube_r2 = body1.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(0, 25).addBox(-5.0F, -1.5F, -1.0F, 6.0F, 12.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.0F, -33.0F, -6.0F, 0.0F, 0.0F, -0.1309F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(86, 63).addBox(-13.5F, -26.0F, -3.5F, 5.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(76, 19).addBox(-23.0F, -41.0F, 0.0F, 12.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(62, 62).addBox(-13.5F, -15.0F, -3.5F, 5.0F, 12.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r3 = body2.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(92, 0).addBox(-2.0F, -2.0F, -4.5F, 3.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-13.0F, -18.0F, 1.0F, 0.0F, 0.0F, -0.1309F)); + + PartDefinition cube_r4 = body2.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(24, 81).addBox(-1.0F, -2.0F, -4.0F, 3.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-15.0F, -12.0F, 0.0F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition cube_r5 = body2.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(62, 0).addBox(0.0F, -3.0F, -4.0F, 7.0F, 11.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-15.0F, -33.0F, 0.0F, 0.0F, 0.0F, 0.2618F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(0, 87).addBox(-14.5F, -26.0F, -3.5F, 5.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(76, 35).addBox(-12.0F, -41.0F, 0.0F, 12.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 68).addBox(-14.5F, -15.0F, -3.5F, 5.0F, 12.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(23.0F, 31.0F, 0.0F)); + + PartDefinition cube_r6 = body3.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(68, 93).addBox(-2.0F, -2.0F, -4.5F, 3.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -18.0F, 1.0F, 0.0F, 0.0F, 0.1309F)); + + PartDefinition cube_r7 = body3.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(46, 81).addBox(-1.0F, -2.0F, -4.0F, 3.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -12.0F, 0.0F, 0.0F, 0.0F, 0.3491F)); + + PartDefinition cube_r8 = body3.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(32, 62).addBox(-0.4F, -4.5F, -4.0F, 7.0F, 11.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-14.0F, -30.0F, 0.0F, 0.0F, 0.0F, -0.2618F)); + + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(32, 50).addBox(-5.5F, -20.0F, -4.0F, 11.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(68, 81).addBox(-8.0F, -14.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(86, 51).addBox(1.0F, -14.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MaledictusArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MaledictusArmors.java new file mode 100644 index 000000000..b68c76745 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MaledictusArmors.java @@ -0,0 +1,107 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.cataclysm.armor.CataArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class MaledictusArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "maledictus_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "maledictus_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "maledictus_shinguard"), "main"); + + static { + GolemModelPath.register(MALEDICTUS_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(MALEDICTUS_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(MALEDICTUS_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + } + + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 26).addBox(-4.5F, -43.5F, -8.0F, 9.0F, 10.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(36, 38).addBox(-5.0F, -38.0F, -9.0F, 10.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + PartDefinition bone2 = head1.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(80, 51).addBox(-2.0F, -1.0F, -2.0F, 6.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(86, 4).addBox(-3.0F, 3.0F, -0.5F, 6.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 79).addBox(4.0F, -7.0F, -2.0F, 4.0F, 10.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(56, 83).addBox(5.0F, -4.0F, -0.5F, 6.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0F, -42.0F, -3.0F, 0.0F, 0.0F, -0.6109F)); + + PartDefinition bone = head1.addOrReplaceChild("bone", CubeListBuilder.create().texOffs(70, 44).addBox(-4.0F, -1.0F, -2.0F, 6.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(86, 0).addBox(-3.0F, 3.0F, -0.5F, 6.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(78, 67).addBox(-8.0F, -7.0F, -2.0F, 4.0F, 10.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(78, 80).addBox(-11.0F, -4.0F, -0.5F, 6.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.0F, -42.0F, -3.0F, 0.0F, 0.0F, 0.6109F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -7.0F, 19.0F, 13.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r1 = body1.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(24, 69).addBox(0.0F, -8.0F, -2.0F, 0.0F, 13.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.0F, -29.0F, 7.0F, 0.0F, 0.6109F, 0.0F)); + + PartDefinition cube_r2 = body1.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(40, 69).addBox(0.0F, -8.0F, -2.0F, 0.0F, 13.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -29.0F, 7.0F, 0.0F, -0.6109F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(56, 51).addBox(-14.0F, -29.0F, -3.5F, 5.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).mirror().addBox(-14.0F, -16.0F, -3.5F, 4.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r4 = body2.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(0, 45).addBox(-5.0F, -3.0F, -4.0F, 6.0F, 10.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -30.0F, 0.0F, 0.0F, 0.0F, 1.0472F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(0, 63).addBox(9.0F, -29.0F, -3.5F, 5.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(56, 67).addBox(10.0F, -16.0F, -3.5F, 4.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r5 = body3.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(28, 51).addBox(-1.0F, -3.0F, -4.0F, 6.0F, 10.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.0F, -30.0F, 0.0F, 0.0F, 0.0F, -1.0472F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(36, 26).addBox(-5.5F, -20.0F, -4.0F, 11.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r3 = legs1.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(80, 58).addBox(-4.0F, -2.0F, 0.5F, 8.0F, 8.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -18.0F, -5.0F, -0.2182F, 0.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(74, 16).addBox(-8.0F, -16.3F, -3.5F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(74, 30).addBox(3.0F, -16.3F, -3.5F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MonstrosityArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MonstrosityArmors.java new file mode 100644 index 000000000..51fdb8634 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/MonstrosityArmors.java @@ -0,0 +1,99 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.cataclysm.armor.CataArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class MonstrosityArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "monstrosity_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "monstrosity_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "monstrosity_shinguard"), "main"); + + static { + GolemModelPath.register(MONSTROSITY_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(MONSTROSITY_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(MONSTROSITY_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + } + + + public static LayerDefinition createHelmet() { + + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(20, 75).addBox(-8.0F, -45.0F, -5.0F, 2.0F, 7.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 24).addBox(-4.5F, -45.0F, -8.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(0, 73).addBox(-5.0F, -37.0F, -9.0F, 2.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(74, 24).addBox(3.0F, -37.0F, -9.0F, 2.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(66, 36).addBox(-5.0F, -38.0F, -1.0F, 10.0F, 5.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(44, 75).addBox(-6.0F, -42.0F, -5.0F, 2.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(56, 75).addBox(4.0F, -42.0F, -5.0F, 2.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(32, 75).addBox(6.0F, -45.0F, -5.0F, 2.0F, 7.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + + + public static LayerDefinition createChestplate() { + + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, 15.7F, -6.5F, 19.0F, 12.0F, 12.0F, new CubeDeformation(0.0F)) + .texOffs(62, 15).addBox(-6.0F, 15.5F, 5.5F, 12.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -18.0F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(36, 36).addBox(-16.0F, -31.0F, -4.0F, 7.0F, 6.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(30, 50).addBox(-14.0F, -36.0F, -4.0F, 5.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 58).addBox(-13.5F, -19.0F, -3.5F, 5.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(68, 75).addBox(-14.0F, -16.0F, 2.0F, 1.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(74, 75).addBox(-14.0F, -16.0F, -4.0F, 1.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(0, 44).addBox(9.0F, -31.0F, -4.0F, 7.0F, 6.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(56, 50).addBox(9.0F, -36.0F, -4.0F, 5.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(62, 0).addBox(8.5F, -19.0F, -3.5F, 5.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(76, 63).addBox(13.0F, -16.0F, -4.0F, 1.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(80, 71).addBox(13.0F, -16.0F, 2.0F, 1.0F, 6.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(36, 24).addBox(-5.5F, -10.0F, -4.0F, 11.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 21.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(24, 63).addBox(-8.0F, -11.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(50, 63).addBox(1.0F, -11.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/package-info.java new file mode 100644 index 000000000..273ac8caa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/client/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.cataclysm.client; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientMeltdownModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientMeltdownModifier.java new file mode 100644 index 000000000..ebffef370 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientMeltdownModifier.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; + +import java.util.function.Consumer; + +public class AncientMeltdownModifier extends GolemModifier { + + public AncientMeltdownModifier() { + super(StatFilterType.HEAD, 1); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.REFORGE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormAttackGoal.java new file mode 100644 index 000000000..d00adc695 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormAttackGoal.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.modulargolems.compat.materials.goety.multi.MultiTargetRangedGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class AncientRemnantSandstormAttackGoal extends MultiTargetRangedGoal { + + public AncientRemnantSandstormAttackGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 35, golem, lv); + } + + @Override + protected int searchRange() { + return 35; + } + + @Override + protected int getMaxTarget() { + return lv * 3; + } + + @Override + protected int cd() { + return 10; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + GolemCataProxy.sandstormAttack(golem, target, 100); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormModifier.java new file mode 100644 index 000000000..906e3ca32 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/AncientRemnantSandstormModifier.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +import java.util.function.BiConsumer; + +public class AncientRemnantSandstormModifier extends GolemModifier { + + public AncientRemnantSandstormModifier() { + super(StatFilterType.ATTACK, 3); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new AncientRemnantSandstormAttackGoal(entity, lv)); + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + if (GolemCataProxy.isSandstorm(event.getSource())) { + event.getEntity().invulnerableTime = 0; + } + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingHurtEvent(); + if (event == null) return; + int lv = GolemCataProxy.getSandCurseLevel(cache.getAttackTarget()); + if (lv > 0) { + cache.addHurtModifier(DamageModifier.multTotal(1 + level * MGConfig.COMMON.sandCurseBonus.get().floatValue())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneAttackGoal.java new file mode 100644 index 000000000..00e95359f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneAttackGoal.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.cataclysm_mux.MWCataProxy; +import dev.xkmc.modulargolems.compat.materials.goety.multi.MultiTargetRangedGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class EnderGuardianVoidRuneAttackGoal extends MultiTargetRangedGoal { + + public EnderGuardianVoidRuneAttackGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 15, golem, lv); + } + + @Override + protected int searchRange() { + return 15; + } + + @Override + protected int getMaxTarget() { + return lv * 2; + } + + @Override + protected int cd() { + return 20; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + GolemCataProxy.addRune(golem, target); + MWCataProxy.spawnVortex(golem, target.position()); + } + +} + diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneModifier.java new file mode 100644 index 000000000..521a3c929 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/EnderGuardianVoidRuneModifier.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class EnderGuardianVoidRuneModifier extends GolemModifier { + + public EnderGuardianVoidRuneModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new EnderGuardianVoidRuneAttackGoal(entity, lv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamAttackGoal.java similarity index 59% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamAttackGoal.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamAttackGoal.java index e6314b37c..553a6a043 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerDeathBeamAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamAttackGoal.java @@ -1,16 +1,17 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; -import com.github.L_Ender.cataclysm.entity.projectile.Death_Laser_Beam_Entity; +import dev.xkmc.cataclysm_mux.GolemCataProxy; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; public class HarbingerDeathBeamAttackGoal extends BaseRangedAttackGoal { - private Death_Laser_Beam_Entity beam; + private Entity beam; public HarbingerDeathBeamAttackGoal(AbstractGolemEntity golem, int lv) { - super(100, 4, 35, golem, lv); + super(100, 0, 35, golem, lv); } @Override @@ -25,6 +26,11 @@ public void tick() { if (beam.isRemoved()) { beam = null; } else { + var target = golem.getTarget(); + if (target != null) { + golem.getLookControl().setLookAt(target, 30, 90); + } + GolemCataProxy.updateLaser(golem, beam); beam.setPosRaw(golem.getX(), golem.getEyeY(), golem.getZ()); } } @@ -32,9 +38,10 @@ public void tick() { } @Override - protected void performAttack(LivingEntity target) { - beam = HarbingerDeathBeamModifier.addBeam(golem); + protected boolean performAttack(LivingEntity target) { + beam = GolemCataProxy.addLaserBeam(golem, 60); golem.getNavigation().stop(); + return true; } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamModifier.java new file mode 100644 index 000000000..80df324e8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerDeathBeamModifier.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class HarbingerDeathBeamModifier extends GolemModifier { + + public HarbingerDeathBeamModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new HarbingerDeathBeamAttackGoal(entity, lv)); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + if (GolemCataProxy.isLaser(source) && entity.getItemBySlot(EquipmentSlot.HEAD).is(CataCompatRegistry.HARBINGER_HELMET.get())) { + cache.addHurtModifier(DamageModifier.multTotal(1 + MGConfig.COMMON.laserArmorBonus.get().floatValue())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileAttackGoal.java similarity index 79% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileAttackGoal.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileAttackGoal.java index 32bb0afea..0b631c404 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/HarbingerHomingMissileAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileAttackGoal.java @@ -1,5 +1,7 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; @@ -14,7 +16,7 @@ public HarbingerHomingMissileAttackGoal(AbstractGolemEntity golem, int lv) } @Override - protected void performAttack(LivingEntity target) { + protected boolean performAttack(LivingEntity target) { if (golem.getType() == GolemTypes.ENTITY_GOLEM.get()) { if (golem.getMaterials().get(MetalGolemPartType.LEFT.ordinal()) .modifiers().containsKey(CataCompatRegistry.HARBINGER_MISSILE.get())) @@ -25,10 +27,11 @@ protected void performAttack(LivingEntity target) { } else { addMissile(target, 1, 0); } + return true; } private void addMissile(LivingEntity target, float y, float r) { - HarbingerHomingMissileModifier.addBeam(golem, target, golem.position().add( + GolemCataProxy.addMissile(golem, target, golem.position().add( r * Math.cos(golem.yBodyRot * Mth.DEG_TO_RAD), y + golem.getEyeHeight(), r * Math.sin(golem.yBodyRot * Mth.DEG_TO_RAD) diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileModifier.java new file mode 100644 index 000000000..10d3f655a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/HarbingerHomingMissileModifier.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class HarbingerHomingMissileModifier extends GolemModifier { + + public HarbingerHomingMissileModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new HarbingerHomingMissileAttackGoal(entity, lv)); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + if (GolemCataProxy.isMissile(source) && entity.getItemBySlot(EquipmentSlot.CHEST).is(CataCompatRegistry.HARBINGER_CHESTPLATE.get())) { + cache.addHurtModifier(DamageModifier.multTotal(1 + MGConfig.COMMON.missileArmorBonus.get().floatValue())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisAttackModifier.java similarity index 52% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisAttackModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisAttackModifier.java index cb3852a81..6d51699d0 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisAttackModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisAttackModifier.java @@ -1,16 +1,15 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; -import com.github.L_Ender.cataclysm.config.CMConfig; -import com.github.L_Ender.cataclysm.init.ModEffect; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; import dev.xkmc.l2damagetracker.contents.attack.CreateSourceEvent; import dev.xkmc.l2damagetracker.contents.damage.DefaultDamageState; import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; -import net.minecraft.world.effect.MobEffectInstance; +import dev.xkmc.modulargolems.init.data.MGConfig; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.event.entity.living.LivingHurtEvent; public class IgnisAttackModifier extends GolemModifier { @@ -19,19 +18,15 @@ public IgnisAttackModifier(StatFilterType type, int maxLevel) { } @Override - public void onHurtTarget(AbstractGolemEntity golem, LivingHurtEvent event, int level) { - LivingEntity target = event.getEntity(); - var eff = ModEffect.EFFECTBLAZING_BRAND.get(); - var old = target.getEffect(eff); - int i = old == null ? 0 : Math.min(4, old.getAmplifier() + 1); - MobEffectInstance ins = new MobEffectInstance(eff, 240, i, false, true, true); - target.addEffect(ins); - golem.heal(level * (float) CMConfig.IgnisHealingMultiplier * (float) (i + 1)); + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int level) { + LivingEntity target = cache.getAttackTarget(); + float rate = MGConfig.COMMON.ignitiumHealRate.get().floatValue() * level; + CataDispatch.stackBlazingBrand(golem, target, rate * cache.getDamageDealt(), 1); } @Override public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { - if (golem.getHealth() < golem.getMaxHealth() / 2) { + if (CataDispatch.ignisBlue(golem)) { if (event.getResult() != null && event.getResult().toRoot() == L2DamageTypes.MOB_ATTACK) { event.enable(DefaultDamageState.BYPASS_ARMOR); } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballAttackGoal.java similarity index 70% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballAttackGoal.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballAttackGoal.java index 05c2213b3..d20a17034 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/IgnisFireballAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballAttackGoal.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; @@ -7,12 +7,13 @@ public class IgnisFireballAttackGoal extends BaseRangedAttackGoal { public IgnisFireballAttackGoal(AbstractGolemEntity golem, int lv) { - super(200, 4, 25, golem, lv); + super(200, 0, 25, golem, lv); } @Override - protected void performAttack(LivingEntity target) { + protected boolean performAttack(LivingEntity target) { IgnisFireballModifier.addFireball(golem, lv); + return true; } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballModifier.java new file mode 100644 index 000000000..665534dba --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisFireballModifier.java @@ -0,0 +1,82 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +import java.util.function.BiConsumer; + +public class IgnisFireballModifier extends GolemModifier { + + private static final int[] ANGLE = {-5, -2, 0, 2, 5}; + + public IgnisFireballModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new IgnisFireballAttackGoal(entity, lv)); + } + + public static void addFireball(LivingEntity user, int lv) { + user.level().playLocalSound(user.getX(), user.getY(), user.getZ(), SoundEvents.EVOKER_PREPARE_SUMMON, + user.getSoundSource(), 5.0F, 1.4F + user.getRandom().nextFloat() * 0.1F, false); + int index = user.getRandom().nextInt(5); + lv = Mth.clamp(lv, 0, 2); + for (int i = 2 - lv; i < 3 + lv; i++) { + GolemCataProxy.shootFireball(user, new Vec3(ANGLE[i], 3.0D, 0.0D), 15 + i * 10, index == i, CataDispatch.ignisBlue(user)); + } + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct == null || !GolemCataProxy.isIgnisExplosive(direct)) return; + cache.addHurtModifier(DamageModifier.multTotal(MGConfig.COMMON.ignisSkillDamageFactor.get().floatValue())); + if (entity.getItemBySlot(EquipmentSlot.HEAD).is(CataCompatRegistry.IGNIS_HELMET.get())) { + cache.addHurtModifier(DamageModifier.multTotal(1 + MGConfig.COMMON.fireballArmorBonus.get().floatValue())); + } + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct != null && GolemCataProxy.isIgnisExplosive(direct)) { + if (GolemCataProxy.isSoul(direct)) { + event.getEntity().invulnerableTime = 0; + GolemCataProxy.inflictStun(entity, event.getEntity(), 20); + } + } + } + + @Override + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int level) { + var event = cache.getLivingDamageEvent(); + assert event != null; + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct == null || !GolemCataProxy.isIgnisExplosive(direct)) return; + LivingEntity target = cache.getAttackTarget(); + float rate = MGConfig.COMMON.ignitiumHealRate.get().floatValue(); + CataDispatch.stackBlazingBrand(golem, target, rate * cache.getDamageDealt(), GolemCataProxy.isSoul(direct) ? 3 : 1); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisJumpModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisJumpModifier.java new file mode 100644 index 000000000..daef4de00 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/IgnisJumpModifier.java @@ -0,0 +1,156 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Consumer; + +public class IgnisJumpModifier extends GolemModifier implements EarthquakeHelper.Modifier { + + public IgnisJumpModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.EARTH_QUAKE); + } + + @Override + public double getEarthquakeRangeSqr(AbstractGolemEntity golem, LivingEntity target, int lv) { + return 25 * 25; + } + + @Override + public void performJump(AbstractGolemEntity golem, int lv) { + var target = golem.getTarget(); + if (target == null || golem.getControllingPassenger() instanceof Player) + golem.addDeltaMovement(new Vec3(0, 1.3, 0)); + else golem.setDeltaMovement( + (target.getX() - golem.getX()) * 0.15, + 1.3, + (target.getZ() - golem.getZ()) * 0.15 + ); + } + + @Override + public void performEarthQuake(AbstractGolemEntity golem, int lv) { + var level = golem.level(); + var aabb = golem.getBoundingBox().inflate(16, 6, 16); + List list = new ArrayList<>(); + for (var e : level.getEntitiesOfClass(LivingEntity.class, aabb)) { + if (!golem.predicateTarget(e)) continue; + var ans = findFloor(level, e.position(), 4); + if (ans == null) continue; + boolean tooClose = false; + for (var other : list) { + if (other.distanceTo(ans) < 6) { + tooClose = true; + break; + } + } + if (!tooClose) { + list.add(ans); + } + } + boolean soul = CataDispatch.ignisBlue(golem); + float atk = (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE); + if (soul) atk *= 4f / 3; + var self = golem.position(); + list.sort(Comparator.comparingDouble(self::distanceToSqr)); + for (int i = 0; i < list.size(); i++) { + GolemCataProxy.createBlast(golem, list.get(i), 40, i * 2, 3, atk, soul); + } + } + + @Override + public int getCoolDown(AbstractGolemEntity golem, int lv) { + return 200; + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct == null || !GolemCataProxy.isIgnisStrike(direct)) return; + cache.addHurtModifier(DamageModifier.multTotal(MGConfig.COMMON.ignisSkillDamageFactor.get().floatValue())); + if (entity.getItemBySlot(EquipmentSlot.LEGS).is(CataCompatRegistry.IGNIS_SHINGUARD.get())) { + cache.addHurtModifier(DamageModifier.multTotal(1 + MGConfig.COMMON.flameStrikeArmorBonus.get().floatValue())); + } + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct != null && GolemCataProxy.isIgnisStrike(direct)) { + if (GolemCataProxy.isSoul(direct)) { + event.getEntity().invulnerableTime = 0; + GolemCataProxy.inflictStun(entity, event.getEntity(), 20); + } + } + } + + @Override + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int level) { + var event = cache.getLivingDamageEvent(); + assert event != null; + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct == null || !GolemCataProxy.isIgnisStrike(direct)) return; + LivingEntity target = cache.getAttackTarget(); + float rate = MGConfig.COMMON.ignitiumHealRate.get().floatValue(); + CataDispatch.stackBlazingBrand(golem, target, rate * cache.getDamageDealt(), GolemCataProxy.isSoul(direct) ? 3 : 1); + } + + @Nullable + private static Vec3 findFloor(Level level, Vec3 p, int diff) { + double x = p.x, maxY = p.y, z = p.z, minY = maxY - diff; + BlockPos pos = BlockPos.containing(x, maxY, z); + double dy = 0.0F; + + do { + BlockPos low = pos.below(); + BlockState lowState = level.getBlockState(low); + if (lowState.isFaceSturdy(level, low, Direction.UP)) { + if (!level.isEmptyBlock(pos)) { + BlockState state = level.getBlockState(pos); + VoxelShape shape = state.getCollisionShape(level, pos); + if (!shape.isEmpty()) { + dy = shape.max(Direction.Axis.Y); + } + } + return new Vec3(x, pos.getY() + dy, z); + } + pos = pos.below(); + } while (pos.getY() >= minY); + return null; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalAttackGoal.java new file mode 100644 index 000000000..1456af1a8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalAttackGoal.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.modulargolems.compat.materials.goety.multi.MultiTargetRangedGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class LeviathanBlastPortalAttackGoal extends MultiTargetRangedGoal { + + public LeviathanBlastPortalAttackGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 35, golem, lv); + } + + @Override + protected int searchRange() { + return 35; + } + + @Override + protected int getMaxTarget() { + return lv * 3; + } + + @Override + protected int cd() { + return 10; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + LeviathanBlastPortalModifier.addBeam(golem, target); + } + +} + diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalModifier.java similarity index 85% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalModifier.java index 65a3d7913..3d35b80a8 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/LeviathanBlastPortalModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/LeviathanBlastPortalModifier.java @@ -1,6 +1,6 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; -import com.github.L_Ender.cataclysm.entity.AnimationMonster.BossMonsters.The_Leviathan.Abyss_Blast_Portal_Entity; +import dev.xkmc.cataclysm_mux.GolemCataProxy; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; @@ -46,13 +46,13 @@ private static void spawnFangs(LivingEntity user, Level level, double x, double pos = pos.below(); } while (pos.getY() >= Mth.floor(minY) - 1); if (flag) { - level.addFreshEntity(new Abyss_Blast_Portal_Entity(level, x, (double) pos.getY() + dy, z, rotation, delay, user)); + GolemCataProxy.spawnBlastPortal(user, x, pos.getY() + dy, z, rotation, delay); } } public LeviathanBlastPortalModifier() { - super(StatFilterType.MASS, 1); + super(StatFilterType.MASS, 3); } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusAttackModifier.java new file mode 100644 index 000000000..2e97f12f1 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusAttackModifier.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.l2damagetracker.contents.attack.CreateSourceEvent; +import dev.xkmc.l2damagetracker.contents.damage.DefaultDamageState; +import dev.xkmc.l2library.base.effects.EffectUtil; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +import java.util.List; + +public class MaledictusAttackModifier extends GolemModifier { + + public MaledictusAttackModifier() { + super(StatFilterType.ATTACK, 2); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + CataCompatRegistry.EFF_FORCE.get().addTo(entity, 100, level == 1 ? 0 : 4, + EffectUtil.AddReason.SELF, entity); + } + + @Override + public List getDetail(int v) { + return List.of(Component.translatable(getDescriptionId() + ".desc", v == 1 ? 1 : 5).withStyle(ChatFormatting.GREEN)); + } + + @Override + public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { + if (event.getResult() == null) return; + if (!event.getResult().validState(DefaultDamageState.BYPASS_ARMOR)) return; + event.enable(DefaultDamageState.BYPASS_ARMOR); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusEarthquakeModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusEarthquakeModifier.java new file mode 100644 index 000000000..b1a0e6a10 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/MaledictusEarthquakeModifier.java @@ -0,0 +1,78 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.cataclysm_mux.MWCataProxy; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import dev.xkmc.modulargolems.util.GolemUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +import java.util.function.Consumer; + +public class MaledictusEarthquakeModifier extends GolemModifier implements EarthquakeHelper.Modifier { + + public MaledictusEarthquakeModifier() { + super(StatFilterType.HEALTH, 1); + } + + @Override + public void onRegisterFlag(Consumer cons) { + cons.accept(GolemFlags.EARTH_QUAKE); + } + + @Override + public void handleEvent(AbstractGolemEntity golem, int value, byte event) { + if (event == EarthquakeHelper.FLAG) { + EarthquakeHelper.makeParticles(golem, 0, 0); + } + } + + @Override + public int getCoolDown(AbstractGolemEntity golem, int lv) { + int cd = EarthquakeHelper.Modifier.super.getCoolDown(golem, lv); + if (golem.getItemBySlot(EquipmentSlot.LEGS).is(CataCompatRegistry.MALEDICTUS_SHINGUARD.get())) + cd /= 2; + return cd; + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + var source = event.getSource(); + var direct = source.getDirectEntity(); + if (direct != null && direct.getType().builtInRegistryHolder().unwrapKey().orElseThrow().location() + .equals(new ResourceLocation(CataDispatch.MODID, "phantom_halberd"))) { + if (entity.getItemBySlot(EquipmentSlot.HEAD).is(CataCompatRegistry.MALEDICTUS_HELMET.get())) { + event.getEntity().invulnerableTime = 0; + } + } + } + + @Override + public void performEarthQuake(AbstractGolemEntity golem, int level) { + golem.playSound(SoundEvents.GENERIC_EXPLODE, 1.5F, 1.0F + golem.getRandom().nextFloat() * 0.1F); + for (LivingEntity entity : golem.level().getEntitiesOfClass(LivingEntity.class, golem.getBoundingBox().inflate(7.0))) { + if (!golem.isAlliedTo(entity) && entity != golem) { + float damage = GolemUtils.adjustedDamage( + (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE), + entity.getMaxHealth() * GolemCataProxy.maledictusEarthquakeDamage() + ); + boolean flag = entity.hurt(golem.damageSources().mobAttack(golem), damage); + if (flag) { + EarthquakeHelper.launch(golem, entity, 0.5f); + } + } + } + MWCataProxy.spawnHalberd(golem); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/NetheriteMonstrosityEarthquakeModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/NetheriteMonstrosityEarthquakeModifier.java new file mode 100644 index 000000000..78ff678e9 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/NetheriteMonstrosityEarthquakeModifier.java @@ -0,0 +1,65 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.GolemCataProxy; +import dev.xkmc.modulargolems.compat.materials.cataclysm.CataCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.AttributeGolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import dev.xkmc.modulargolems.util.GolemUtils; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.function.Consumer; + +public class NetheriteMonstrosityEarthquakeModifier extends AttributeGolemModifier implements EarthquakeHelper.Modifier { + + public NetheriteMonstrosityEarthquakeModifier() { + super(1, + new AttrEntry(GolemTypes.STAT_ATTACK, () -> 5), + new AttrEntry(GolemTypes.STAT_ARMOR, () -> 5), + new AttrEntry(GolemTypes.STAT_TOUGH, () -> 5) + ); + } + + @Override + public void onRegisterFlag(Consumer cons) { + cons.accept(GolemFlags.EARTH_QUAKE); + } + + @Override + public void handleEvent(AbstractGolemEntity golem, int value, byte event) { + if (event == EarthquakeHelper.FLAG) { + EarthquakeHelper.makeParticles(golem, 0, 0); + } + } + + @Override + public void performEarthQuake(AbstractGolemEntity golem, int level) { + golem.playSound(SoundEvents.GENERIC_EXPLODE, 1.5F, 1.0F + golem.getRandom().nextFloat() * 0.1F); + for (LivingEntity entity : golem.level().getEntitiesOfClass(LivingEntity.class, golem.getBoundingBox().inflate(7.0))) { + if (!golem.isAlliedTo(entity) && entity != golem) { + float damage = GolemUtils.adjustedDamage( + (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE), + GolemCataProxy.monstrosityEarthquakeDamage() * entity.getMaxHealth() + ); + float factor = 0; + if (golem.getItemBySlot(EquipmentSlot.HEAD).is(CataCompatRegistry.MONSTROSITY_HELMET.get())) + factor++; + if (golem.getItemBySlot(EquipmentSlot.CHEST).is(CataCompatRegistry.MONSTROSITY_CHESTPLATE.get())) + factor++; + if (golem.getItemBySlot(EquipmentSlot.LEGS).is(CataCompatRegistry.MONSTROSITY_SHINGUARD.get())) + factor++; + boolean flag = entity.hurt(golem.damageSources().mobAttack(golem), damage * (1 + MGConfig.COMMON.earthquakeArmorBonus.get().floatValue() * factor)); + if (flag) { + EarthquakeHelper.launch(golem, entity, 2f); + } + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/RageEffect.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/RageEffect.java new file mode 100644 index 000000000..f8d139194 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/RageEffect.java @@ -0,0 +1,18 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.l2library.base.effects.api.InherentEffect; +import dev.xkmc.l2library.util.math.MathHelper; +import dev.xkmc.modulargolems.compat.materials.common.StackableEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +public class RageEffect extends InherentEffect implements StackableEffect { + + public RageEffect(MobEffectCategory category, int color) { + super(category, color); + var uuid = MathHelper.getUUIDFromString("modulargolems:rage"); + addAttributeModifier(Attributes.ATTACK_DAMAGE, uuid.toString(), 0.2, AttributeModifier.Operation.MULTIPLY_TOTAL); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackGoal.java new file mode 100644 index 000000000..bc6a21693 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackGoal.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.MWCataProxy; +import dev.xkmc.modulargolems.compat.materials.goety.multi.MultiTargetRangedGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class ScyllaLightningAttackGoal extends MultiTargetRangedGoal { + + public ScyllaLightningAttackGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 35, golem, lv); + } + + @Override + protected int searchRange() { + return 24 + lv * 4; + } + + @Override + protected int getMaxTarget() { + return lv * 3; + } + + @Override + protected int cd() { + return 20; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + MWCataProxy.astrape(golem.level(), golem, target); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackModifier.java similarity index 60% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackModifier.java index 84465adfa..bd2cdfcdc 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/AncientRemnantSandstormModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaLightningAttackModifier.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.compat.materials.cataclysm; +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; @@ -7,15 +7,15 @@ import java.util.function.BiConsumer; -public class AncientRemnantSandstormModifier extends GolemModifier { +public class ScyllaLightningAttackModifier extends GolemModifier { - public AncientRemnantSandstormModifier() { - super(StatFilterType.MASS, 1); + public ScyllaLightningAttackModifier() { + super(StatFilterType.ATTACK, 3); } @Override public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { - addGoal.accept(5, new AncientRemnantSandstormAttackGoal(entity, lv)); + addGoal.accept(5, new ScyllaLightningAttackGoal(entity, lv)); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaWaveAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaWaveAttackModifier.java new file mode 100644 index 000000000..5ca6fe846 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/ScyllaWaveAttackModifier.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import dev.xkmc.cataclysm_mux.MWCataProxy; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +public class ScyllaWaveAttackModifier extends GolemModifier { + + public ScyllaWaveAttackModifier() { + super(StatFilterType.HEALTH, 1); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + var attacker = event.getSource().getEntity(); + if (!(attacker instanceof LivingEntity le)) return; + long time = entity.level().getGameTime(); + var last = entity.getPersistentData().getLong("ScyllaWaveTime"); + if (last < time && last > time - 40) return; + entity.getPersistentData().putLong("ScyllaWaveTime", time); + MWCataProxy.ceraunus(entity.level(), entity, le); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/package-info.java new file mode 100644 index 000000000..ee70a1381 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/cataclysm/modifiers/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.cataclysm.modifiers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientCompatManager.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientCompatManager.java new file mode 100644 index 000000000..b9e902287 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientCompatManager.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.common; + +import net.minecraftforge.client.event.EntityRenderersEvent; + +public class ClientCompatManager { + + public static void dispatchClientSetup() { + for (ModDispatch dispatch : CompatManager.LIST) { + dispatch.client.resolve().ifPresent(ClientModDispatch::dispatchClientSetup); + } + } + + public static void dispatchEntityLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { + for (ModDispatch dispatch : CompatManager.LIST) { + dispatch.client.resolve().ifPresent(e -> e.dispatchEntityLayer(event)); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientModDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientModDispatch.java new file mode 100644 index 000000000..030eeb781 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ClientModDispatch.java @@ -0,0 +1,14 @@ +package dev.xkmc.modulargolems.compat.materials.common; + +import net.minecraftforge.client.event.EntityRenderersEvent; + +public abstract class ClientModDispatch { + + public void dispatchClientSetup() { + } + + public void dispatchEntityLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/CompatManager.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/CompatManager.java index ed3fc8952..c7542db68 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/CompatManager.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/CompatManager.java @@ -1,23 +1,45 @@ package dev.xkmc.modulargolems.compat.materials.common; +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2backpack.init.L2Backpack; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.backpack.L2BCompat; +import dev.xkmc.modulargolems.compat.maid.MaidRegistry; +import dev.xkmc.modulargolems.compat.materials.alexscaves.ACDispatch; +import dev.xkmc.modulargolems.compat.materials.allthemodium.ATMDispatch; import dev.xkmc.modulargolems.compat.materials.blazegear.BGDispatch; import dev.xkmc.modulargolems.compat.materials.botania.BotDispatch; import dev.xkmc.modulargolems.compat.materials.cataclysm.CataDispatch; +import dev.xkmc.modulargolems.compat.materials.compositematerial.CMDispatch; import dev.xkmc.modulargolems.compat.materials.create.CreateDispatch; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyDispatch; +import dev.xkmc.modulargolems.compat.materials.goety.revelation.GRDispatch; +import dev.xkmc.modulargolems.compat.materials.iceandfire.IAFDispatch; import dev.xkmc.modulargolems.compat.materials.l2complements.LCDispatch; import dev.xkmc.modulargolems.compat.materials.l2hostility.LHDispatch; +import dev.xkmc.modulargolems.compat.materials.legendarymonsters.LMDispatch; +import dev.xkmc.modulargolems.compat.materials.mowziesmobs.MowzieDispatch; +import dev.xkmc.modulargolems.compat.materials.tinker.TCDispatch; import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; import dev.xkmc.modulargolems.compat.misc.CEICompat; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import dev.xkmc.modulargolems.compat.musket.GolemMusketCompat; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.data.MGConfigGen; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; +import ewewukek.musketmod.MusketMod; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.fml.ModList; import plus.dragons.createenchantmentindustry.EnchantmentIndustry; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public abstract class CompatManager { @@ -31,9 +53,35 @@ public static void register() { if (ModList.get().isLoaded(BGDispatch.MODID)) LIST.add(new BGDispatch()); if (ModList.get().isLoaded(LHDispatch.MODID)) LIST.add(new LHDispatch()); if (ModList.get().isLoaded(CataDispatch.MODID)) LIST.add(new CataDispatch()); + if (ModList.get().isLoaded(ACDispatch.MODID)) LIST.add(new ACDispatch()); + if (ModList.get().isLoaded(IAFDispatch.MODID)) LIST.add(new IAFDispatch()); + if (ModList.get().isLoaded(TCDispatch.MODID)) LIST.add(new TCDispatch()); + if (ModList.get().isLoaded(GoetyDispatch.MODID)) LIST.add(new GoetyDispatch()); + if (GRDispatch.isLoaded()) LIST.add(new GRDispatch()); + if (ModList.get().isLoaded(MowzieDispatch.MODID)) LIST.add(new MowzieDispatch()); + if (ModList.get().isLoaded(LMDispatch.MODID)) LIST.add(new LMDispatch()); + if (ModList.get().isLoaded(ATMDispatch.MODID)) LIST.add(new ATMDispatch()); if (ModList.get().isLoaded(EnchantmentIndustry.ID)) CEICompat.register(); + if (ModList.get().isLoaded(TouhouLittleMaid.MOD_ID)) MaidRegistry.register(); + if (ModList.get().isLoaded(CMDispatch.MODID)) LIST.add(new CMDispatch()); + if (ModList.get().isLoaded(L2Backpack.MODID)) + MinecraftForge.EVENT_BUS.register(L2BCompat.class); } + public static void commonSetup() { + for (ModDispatch dispatch : LIST) { + dispatch.commonSetup(); + } + if (ModList.get().isLoaded(MusketMod.MODID)) GolemMusketCompat.init(); + } + + public static void lateRegister() { + for (ModDispatch dispatch : LIST) { + dispatch.lateRegister(); + } + } + + public static void dispatchGenLang(RegistrateLangProvider pvd) { for (ModDispatch dispatch : LIST) { dispatch.genLang(pvd); @@ -55,17 +103,31 @@ public static void dispatchGenRecipe(RegistrateRecipeProvider pvd) { } } - @OnlyIn(Dist.CLIENT) - public static void dispatchClientSetup() { + public static void onGLMGen(MGGLMGen pvd) { for (ModDispatch dispatch : LIST) { - dispatch.dispatchClientSetup(); + dispatch.genLootModifier(pvd); } } - public static void lateRegister() { - for (ModDispatch dispatch : LIST) { - dispatch.lateRegister(); + private static Map ALL_CONFIGS; + + @SuppressWarnings("ConstantConditions") + public static Map gatherConfig() { + if (ALL_CONFIGS != null) return ALL_CONFIGS; + ConfigDataProvider.Collector map = new ConfigDataProvider.Collector(new HashMap<>()); + for (ModDispatch dispatch : CompatManager.LIST) { + var gen = dispatch.getDataGen(null); + gen.add(map); + } + new MGConfigGen(null).add(map); + Map ing = new HashMap<>(); + for (ConfigDataProvider.ConfigEntry config : map.map().values()) { + if (config.config() instanceof GolemMaterialConfig mat) { + ing.putAll(mat.ingredients); + } } + ALL_CONFIGS = ing; + return ing; } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ModDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ModDispatch.java index 840d3c534..c1a0d2574 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ModDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/ModDispatch.java @@ -4,18 +4,29 @@ import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.util.DataIngredient; import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.data.DataGenerator; import net.minecraft.world.item.Item; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nullable; import java.util.function.BiFunction; +import java.util.function.Supplier; public abstract class ModDispatch { + final LazyOptional client; + + protected ModDispatch() { + this.client = LazyOptional.empty(); + } + + protected ModDispatch(Supplier> client) { + this.client = LazyOptional.of(() -> client.get().get()); + } + protected abstract void genLang(RegistrateLangProvider pvd); public abstract void genRecipe(RegistrateRecipeProvider pvd); @@ -27,11 +38,13 @@ public static T safeUpgrade(RegistrateRecipeProvider pvd, BiFunction { + + default void addTo(LivingEntity target, int dur, int max, EffectUtil.AddReason reason, @Nullable Entity source) { + MobEffectInstance old = target.getEffect(this.getThis()); + MobEffectInstance ins; + if (old == null) { + ins = new MobEffectInstance(this.getThis(), dur); + } else { + ins = new MobEffectInstance(this.getThis(), Math.max(dur, old.getDuration()), Math.min(max, old.getAmplifier() + 1)); + } + + EffectUtil.addEffect(target, ins, reason, source); + } + + default T getThis() { + return Wrappers.cast(this); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/materials.txt b/src/main/java/dev/xkmc/modulargolems/compat/materials/common/materials.txt deleted file mode 100644 index d3f601e7d..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/materials.txt +++ /dev/null @@ -1,24 +0,0 @@ -Thermal Foundation -- Silver 50/10 Smite I Smite Thorn I -- Nickel 150/20 ? -- Lead 80/20 -40% speed Poison I Magic Res II -- Steel 200/20 ? -- Rose Gold 50/10 AddSlot I -- Constantan 200/10 Fire Immune Cold Immune -- Invar 250/25 ? -- Signalum 100/10 ? -- Luminum 100/10 ? -- Enderium 100/10 ? - -Tinker Construct -- Cobalt -- Manyullyn -- Pig Iron -- Slime Steel -- Queem Slime Steel -- ... - -Botania -- Blue -- Red -- Green \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMCompatRegistry.java new file mode 100644 index 000000000..e3a8ed4af --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMCompatRegistry.java @@ -0,0 +1,57 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.compat.materials.compositematerial.modifier.*; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import io.github.rcneg.compositematerial.common.init.ItemRegistry; + +import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.multilinereg; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class CMCompatRegistry { + public static final RegistryEntry DUNGEON_ABSORPTION; + public static final RegistryEntry DUNGEON_LINK; + public static final RegistryEntry OBSIDIAN; + public static final RegistryEntry PRIMITIVE_BLAST; + public static final RegistryEntry PRIMITIVE_CURSE; + public static final RegistryEntry RESONANT_ATTACK; + public static final RegistryEntry RESONANT_HEAL; + public static final RegistryEntry ETHERTITE_PLATING; + public static final RegistryEntry UP_ETHERITE; + + static { + DUNGEON_ABSORPTION = reg("dungeon_absorption", () -> new DungeonAttackModifier(StatFilterType.ATTACK, 4), + "Dungeon Absorption", "Direct attacks heal for %s%% of damage dealt"); + DUNGEON_LINK = reg("dungeon_link", () -> new DungeonHealModifier(StatFilterType.HEALTH, 5), + "Dungeon Link", "Non-repair healing effects also restore %s%% of the amount to the player"); + OBSIDIAN = reg("obsidian", ObsidianModifier::new, + "Obsidian", "Reduces final damage taken by %s"); + PRIMITIVE_BLAST = reg("primitive_blast", () -> new PrimitiveBlastModifier(StatFilterType.ATTACK, 5), + "Primitive Blast", "Increases damage by %s of max health"); + PRIMITIVE_CURSE = reg("primitive_curse", () -> new PrimitiveCurseModifier(StatFilterType.MASS, 5), + "Primitive Curse", "Reduces upgrade slots by %2$s and damage taken by %1$s%%"); + RESONANT_ATTACK = reg("resonant_attack", () -> new ResonantAttackModifier(StatFilterType.ATTACK, 5), + "Resonant Attack", "Golem damage deals additional %2$s%% magic damage to all other targets of same type within %1$s blocks."); + RESONANT_HEAL = reg("resonant_heal", () -> new ResonantHealModifier(StatFilterType.HEALTH, 5), + "Resonant Heal", "Non-repair Therapy heals allies with the same trait within %2$s tiles for %1$s%% HP per target's trait level."); + ETHERTITE_PLATING = multilinereg("etherite_plating", EtheriteModifier::new, + "Etherite Plating", "According to the level, the following effects are provided:", + "- Immune to projectile damage", + "- Immune to conventional debuffs", + "- Immune to environmental damage", + "- Periodic self-repair"); + UP_ETHERITE = regModUpgrade("etherite", () -> ETHERTITE_PLATING, CMDispatch.MODID).lang("Etherite Plating Upgrade").register(); + } + + public static void register() { + MGTagGen.OPTIONAL_ITEM.add(pvd -> pvd.addTag(MGTagGen.LARGE_GOLEM_WEAPONS) + .addOptional(ItemRegistry.ETHERITE_SWORD.getId()) + .addOptional(ItemRegistry.ETHERITE_SWORD_REINFORCED.getId()) + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMConfigGen.java new file mode 100644 index 000000000..3bd1f63ad --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMConfigGen.java @@ -0,0 +1,76 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import io.github.rcneg.compositematerial.common.init.ItemRegistry; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class CMConfigGen extends ConfigDataProvider { + + public CMConfigGen(DataGenerator generator) { + super(generator, "Golem Config for CompositeMaterial"); + } + + @Override + public void add(ConfigDataProvider.Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(CMDispatch.MODID, CMDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(CMDispatch.MODID, "allay_steel"), + Ingredient.of(ItemRegistry.ALLAY_STEEL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 240) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.4) + .addStat(GolemTypes.STAT_REGEN.get(), 2) + .addModifier(CMCompatRegistry.RESONANT_ATTACK.get(), 1) + .addModifier(CMCompatRegistry.RESONANT_HEAL.get(), 1) + .end() + + .addMaterial(new ResourceLocation(CMDispatch.MODID, "dungeon_steel"), + Ingredient.of(ItemRegistry.DUNGEON_STEEL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 200) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addModifier(CMCompatRegistry.DUNGEON_ABSORPTION.get(), 1) + .addModifier(CMCompatRegistry.DUNGEON_LINK.get(), 1) + .end() + + .addMaterial(new ResourceLocation(CMDispatch.MODID, "etherite"), + Ingredient.of(ItemRegistry.ETHERITE_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 500) + .addStat(GolemTypes.STAT_ATTACK.get(), 35) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.2) + .addStat(GolemTypes.STAT_REGEN.get(), 4) + .addStat(GolemTypes.STAT_SWEEP.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 1) + .addModifier(GolemModifiers.RECYCLE.get(), 1) + .addModifier(CMCompatRegistry.ETHERTITE_PLATING.get(),1) + .end() + + .addMaterial(new ResourceLocation(CMDispatch.MODID, "primitive"), + Ingredient.of(ItemRegistry.PRIMITIVE_TENACITY.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 500) + .addStat(GolemTypes.STAT_ATTACK.get(), 5) + .addStat(GolemTypes.STAT_WEIGHT.get(), -0.2) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.SWIM.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 1) + .addModifier(CMCompatRegistry.PRIMITIVE_BLAST.get(), 1) + .addModifier(CMCompatRegistry.PRIMITIVE_CURSE.get(), 1) + .end() + + .addMaterial(new ResourceLocation(CMDispatch.MODID, "obsidian_steel"), + Ingredient.of(ItemRegistry.OBSIDIAN_STEEL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 150) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.EXPLOSION_RES.get(), 2) + .addModifier(CMCompatRegistry.OBSIDIAN.get(), 1) + .end() + + ); + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMDispatch.java new file mode 100644 index 000000000..008e81441 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/CMDispatch.java @@ -0,0 +1,51 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import io.github.rcneg.compositematerial.common.init.ItemRegistry; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +public class CMDispatch extends ModDispatch { + + public static final String MODID = "composite_material"; + + public CMDispatch() { + CMCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".allay_steel", "Allay Steel"); + pvd.add("golem_material." + MODID + ".dungeon_steel", "Dungeon Steel"); + pvd.add("golem_material." + MODID + ".etherite", "Etherite"); + pvd.add("golem_material." + MODID + ".primitive", "Primitive"); + pvd.add("golem_material." + MODID + ".obsidian_steel", "Obsidian Steel"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, CMCompatRegistry.UP_ETHERITE.get())::unlockedBy, ItemRegistry.ETHERITE_INGOT.get()) + .pattern("CAC").pattern("ABA").pattern("CAC") + .define('A', ItemRegistry.ETHERITE_INGOT.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('C', ItemRegistry.PERKIN.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + // Returns a new instance of CMConfigGen for data generation + return new CMConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonAttackModifier.java new file mode 100644 index 000000000..cd334f4e9 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonAttackModifier.java @@ -0,0 +1,36 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +public class DungeonAttackModifier extends GolemModifier { + + public DungeonAttackModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int value) { + var event = cache.getLivingAttackEvent(); + if (event == null) return; + var source = event.getSource(); + if (!source.is(L2DamageTypes.DIRECT)) return; + double cost = MGConfig.COMMON.dungeonMeleeHealFactor.get(); + golem.heal((float) (cache.getDamageDealt() * cost * value)); + } + + public List getDetail(int v) { + float factor = (float) (v * MGConfig.COMMON.dungeonMeleeHealFactor.get()); + int perc = Math.round(100 * factor); + return List.of(Component.translatable(getDescriptionId() + ".desc", perc).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonHealModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonHealModifier.java new file mode 100644 index 000000000..c6abfd24e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/DungeonHealModifier.java @@ -0,0 +1,38 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +public class DungeonHealModifier extends GolemModifier { + + private static boolean recursive = false; + + public DungeonHealModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onHealPost(float heal, AbstractGolemEntity golem, int value) { + if (recursive) return; + recursive = true; + double factor = MGConfig.COMMON.dungeonLinkHealFactor.get(); + var val = heal * factor * value; + var player = golem.getOwner(); + if (player != null) + player.heal((float) val); + recursive = false; + } + + public List getDetail(int v) { + float factor = (float) (v * MGConfig.COMMON.dungeonLinkHealFactor.get()); + int perc = Math.round(100 * factor); + return List.of(Component.translatable(getDescriptionId() + ".desc", perc).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/EtheriteModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/EtheriteModifier.java new file mode 100644 index 000000000..2883707fc --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/EtheriteModifier.java @@ -0,0 +1,65 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Items; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class EtheriteModifier extends GolemModifier { + + public EtheriteModifier() { + super(StatFilterType.MASS, 4); + } + + @Override + public void onAttacked(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + var source = event.getSource(); + if (source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) return; + if (source.is(DamageTypeTags.BYPASSES_EFFECTS)) return; + // 等级1以上,免疫弹射物 + if (level >= 1 && source.is(DamageTypeTags.IS_PROJECTILE)) { + event.setCanceled(true); + return; + } + // 等级3以上,免疫环境伤害 + if (level >= 3 && source.getEntity() == null) { + event.setCanceled(true); + return; + } + super.onAttacked(entity, event, level); + } + + @Override + public boolean isImmuneTo(AbstractGolemEntity golem, MobEffectInstance ins, int level) { + // 等级2以上,免疫非增益且可被牛奶清除的效果 + return level >= 2 && !ins.getEffect().isBeneficial() && ins.isCurativeItem(Items.MILK_BUCKET.getDefaultInstance()); + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + // 限制触发频率 + // 每600tick(30秒)触发一次,且在tickCount为20时触发 + if (level >= 4 && golem.tickCount % MGConfig.COMMON.ethertiteRepairDelay.get() == 20) { + golem.repairWithItem(); + } + } + + public List getDetail(int v) { + return IntStream.range(0, 5) + .mapToObj(i -> Component.translatable(getDescriptionId() + ".desc" + (i + 1)).withStyle + (i==0 ? ChatFormatting.DARK_GREEN : i <= v ? ChatFormatting.DARK_GREEN : ChatFormatting.DARK_GRAY)) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ObsidianModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ObsidianModifier.java new file mode 100644 index 000000000..4d2d64949 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ObsidianModifier.java @@ -0,0 +1,30 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +import java.util.List; + +public class ObsidianModifier extends GolemModifier { + + public ObsidianModifier() { + super(StatFilterType.MASS, 5); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + int factor = MGConfig.COMMON.obsidianDamageReduction.get(); + event.setAmount(Math.max(0, event.getAmount() - level * factor)); + } + + public List getDetail(int v) { + int factor = v * MGConfig.COMMON.obsidianDamageReduction.get(); + return List.of(Component.translatable(getDescriptionId() + ".desc", factor).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveBlastModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveBlastModifier.java new file mode 100644 index 000000000..60c115a0e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveBlastModifier.java @@ -0,0 +1,38 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +public class PrimitiveBlastModifier extends GolemModifier { + + public PrimitiveBlastModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + var event = cache.getLivingAttackEvent(); + if (event == null) return; + var source = event.getSource(); + if (!source.is(L2DamageTypes.DIRECT)) return; + double ratio = MGConfig.COMMON.primitiveHealthRatio.get(); + float val = entity.getMaxHealth() * level * (float) ratio; + cache.addHurtModifier(DamageModifier.addExtra(val)); + } + + public List getDetail(int v) { + float ratio = (float) (v * MGConfig.COMMON.primitiveHealthRatio.get()); + int perc = Math.round(100 * ratio); + return List.of(Component.translatable(getDescriptionId() + ".desc", perc).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveCurseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveCurseModifier.java new file mode 100644 index 000000000..06f9aa974 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/PrimitiveCurseModifier.java @@ -0,0 +1,38 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +import java.util.List; + +public class PrimitiveCurseModifier extends GolemModifier { + + public PrimitiveCurseModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + double multiplier = MGConfig.COMMON.primitiveDamageMultiplier.get(); + float fac = (float) Math.pow(multiplier, level); + event.setAmount(event.getAmount() * fac); + } + + @Override + public int addSlot(List upgrades, int lv) { + return -lv; + } + + public List getDetail(int v) { + float multiplier = (float) Math.pow(MGConfig.COMMON.primitiveDamageMultiplier.get(), v); + int perc = Math.round(100 * (1 - multiplier)); + return List.of(Component.translatable(getDescriptionId() + ".desc", -perc, -v).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantAttackModifier.java new file mode 100644 index 000000000..0691a5e74 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantAttackModifier.java @@ -0,0 +1,59 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2library.init.events.GeneralEventHandler; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.LivingEntity; + +import java.util.List; + +public class ResonantAttackModifier extends GolemModifier { + + private static final String KEY = "ResonantAttackTimeStamp"; + + public ResonantAttackModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int value) { + var level = golem.level(); + long last = golem.getPersistentData().getLong(KEY); + long time = level.getGameTime(); + if (last <= time && last > time - MGConfig.COMMON.resonanceAttackCooldown.get()) return; + golem.getPersistentData().putLong(KEY, time); + var target = cache.getAttackTarget(); + double factor = MGConfig.COMMON.resonanceAttackDamageFactor.get(); + var damage = cache.getDamageDealt() * (float)factor * value; + var aabb = target.getBoundingBox().inflate(MGConfig.COMMON.resonanceAttackRange.get()); + // TODO add particle + GeneralEventHandler.schedulePersistent(() -> { + if (level.getGameTime() > time + 10) {//TODO delay should be adjusted + var source = golem.damageSources().magic(); + var list = level.getEntitiesOfClass(LivingEntity.class, aabb); + for (var e : list) { + if (e.getType() != target.getType()) continue; + if (TargetManager.predicateTarget(golem, e) != null) { + e.hurt(source, damage); + } + } + return true; + } + return false; + }); + } + + public List getDetail(int v) { + float factor = (float)(MGConfig.COMMON.resonanceAttackDamageFactor.get() * v); + int perc = Math.round(100 * factor); + int range = MGConfig.COMMON.resonanceAttackRange.get(); + return List.of(Component.translatable(getDescriptionId() + ".desc", range, perc).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantHealModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantHealModifier.java new file mode 100644 index 000000000..4d83b0457 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/ResonantHealModifier.java @@ -0,0 +1,45 @@ +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +public class ResonantHealModifier extends GolemModifier { + + private static boolean recursive = false; + + public ResonantHealModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onHealPost(float heal, AbstractGolemEntity golem, int value) { + if (recursive) return; + recursive = true; + double factor = MGConfig.COMMON.resonanceHealFactor.get(); + var val = heal * factor * value; + var level = golem.level(); + var aabb = golem.getBoundingBox().inflate(MGConfig.COMMON.resonanceHealRange.get()); + var list = level.getEntitiesOfClass(AbstractGolemEntity.class, aabb); + for (var e : list) { + if (e == golem || !e.isAlliedTo(golem)) continue; + if (!e.getModifiers().containsKey(this)) continue; + int lvl = (Integer) e.getModifiers().get(this); + e.heal((float) val * lvl); + } + recursive = false; + } + + public List getDetail(int v) { + float factor = (float)(MGConfig.COMMON.resonanceHealFactor.get() * v); + int perc = Math.round(factor * 100); + int range = MGConfig.COMMON.resonanceHealRange.get(); + return List.of(Component.translatable(getDescriptionId() + ".desc", perc, range).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/package-info.java new file mode 100644 index 000000000..6452651b0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/modifier/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.compositematerial.modifier; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/package-info.java new file mode 100644 index 000000000..ac3a92015 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/compositematerial/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.compositematerial; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateClient.java new file mode 100644 index 000000000..62d8965e2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateClient.java @@ -0,0 +1,15 @@ +package dev.xkmc.modulargolems.compat.materials.create; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; +import dev.xkmc.modulargolems.compat.materials.create.arm.ArmAttachmentItem; +import dev.xkmc.modulargolems.compat.materials.create.arm.ArmPose; +import dev.xkmc.modulargolems.content.client.pose.GolemShoulderPose; + +public class CreateClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + GolemShoulderPose.register(ArmAttachmentItem.ID, new ArmPose()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateCompatRegistry.java index c6fbb5a61..a46d467e2 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateCompatRegistry.java @@ -7,6 +7,7 @@ import com.tterrag.registrate.util.nullness.NonNullSupplier; import dev.xkmc.l2complements.init.L2Complements; import dev.xkmc.l2complements.init.data.TagGen; +import dev.xkmc.modulargolems.compat.materials.create.arm.ArmAttachmentItem; import dev.xkmc.modulargolems.compat.materials.create.automation.DummyFurnace; import dev.xkmc.modulargolems.compat.materials.create.modifier.*; import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; @@ -16,8 +17,11 @@ import dev.xkmc.modulargolems.init.registrate.GolemItems; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.item.Item; import net.minecraftforge.fml.ModList; import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; @@ -36,11 +40,14 @@ public class CreateCompatRegistry { public static final ItemEntry UP_COATING, UP_PUSH; public static final ItemEntry DUMMY; + public static final ItemEntry ARM; + + public static final TagKey CARDBOARD = ItemTags.create(ModularGolems.loc("cardboard")); static { COATING = reg("coating", CoatingModifier::new, "Reduce damage taken by %s"); PUSH = reg("push", () -> new AttributeGolemModifier(1, - new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_ATKKB, () -> 1) + new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_ATKKB, () -> 2) )).register(); BODY = reg("mechanical_engine", MechBodyModifier::new, "Consumes fuels to power the golem up."); MOBILE = reg("mechanical_mobility", MechMobileModifier::new, "When burning fuels, increase speed by %s%%"); @@ -55,8 +62,12 @@ public class CreateCompatRegistry { DUMMY = ModularGolems.REGISTRATE.item("dummy_furnace", p -> new DummyFurnace()) .model((ctx, pvd) -> pvd.withExistingParent("item/" + ctx.getName(), "block/air")) - .removeTab(GolemItems.TAB.getKey()) + .removeTab(GolemItems.ITEMS.getKey()) .register(); + + ARM = ModularGolems.REGISTRATE.item("mechanical_arm", ArmAttachmentItem::new) + .model((ctx, pvd) -> pvd.generated(ctx, loc("item/equipments/" + ctx.getName()))) + .lang("Mechanic Repair Arm").register(); } private static RegistryEntry genEffect(String name, NonNullSupplier sup, String desc) { @@ -64,7 +75,10 @@ private static RegistryEntry genEffect(String name, Non } public static void register() { + MGTagGen.OPTIONAL_ITEM.add(e -> e.addTag(CARDBOARD) + .addOptional(new ResourceLocation("create", "cardboard"))); MGTagGen.OPTIONAL_ITEM.add(e -> e.addTag(MGTagGen.SPECIAL_CRAFT) + .addOptional(new ResourceLocation("create", "cardboard")) .addOptional(AllItems.ANDESITE_ALLOY.getId()) .addOptionalTag(new ResourceLocation("forge", "ingots/brass")) .addOptional(AllBlocks.RAILWAY_CASING.getId())); @@ -74,4 +88,8 @@ public static void register() { } } + public static ResourceLocation loc(String id) { + return new ResourceLocation("create", id); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateConfigGen.java index 84866f596..7c24e5656 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateConfigGen.java @@ -27,6 +27,14 @@ public void add(Collector map) { ITagManager manager = Objects.requireNonNull(ForgeRegistries.ITEMS.tags()); map.add(ModularGolems.MATERIALS, new ResourceLocation(CreateDispatch.MODID, CreateDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(CreateDispatch.MODID, "cardboard"), + Ingredient.of(CreateCompatRegistry.CARDBOARD)) + .addStat(GolemTypes.STAT_HEALTH.get(), 2) + .addStat(GolemTypes.STAT_ATTACK.get(), 2) + .addStat(GolemTypes.STAT_ATKKB.get(), 2) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.4) + .end() + .addMaterial(new ResourceLocation(CreateDispatch.MODID, "zinc"), Ingredient.of(AllTags.forgeItemTag("ingots/zinc"))) .addStat(GolemTypes.STAT_HEALTH.get(), 50) @@ -59,6 +67,7 @@ public void add(Collector map) { .addStat(GolemTypes.STAT_SWEEP.get(), 1) .addStat(GolemTypes.STAT_KBRES.get(), 1) .addStat(GolemTypes.STAT_ATKKB.get(), 1) + .addStat(GolemTypes.STAT_WEIGHT.get(), -0.2) .addModifier(CreateCompatRegistry.BODY.get(), 1) .addModifier(CreateCompatRegistry.MOBILE.get(), 2) .addModifier(CreateCompatRegistry.FORCE.get(), 2) diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateDispatch.java index d12e47e9e..fb1d65a41 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/CreateDispatch.java @@ -8,15 +8,26 @@ import dev.xkmc.l2library.serial.config.ConfigDataProvider; import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; -import dev.xkmc.modulargolems.compat.materials.create.automation.*; +import dev.xkmc.modulargolems.compat.materials.create.automation.CreateGolemRecipeGen; +import dev.xkmc.modulargolems.compat.materials.create.automation.CreateJEIEvents; +import dev.xkmc.modulargolems.compat.materials.create.automation.CreateRecipeEvents; +import dev.xkmc.modulargolems.compat.materials.create.automation.GolemIncompleteItem; +import dev.xkmc.modulargolems.compat.misc.PatchouliFlagHelper; +import dev.xkmc.modulargolems.events.event.GolemEquipItemEvent; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; import java.util.List; @@ -24,13 +35,33 @@ public class CreateDispatch extends ModDispatch { public static final String MODID = "create"; + @SubscribeEvent + public static void onGolemEquip(GolemEquipItemEvent event) { + if (event.getEntity().getModifiers().containsKey(CreateCompatRegistry.BODY.get())) { + int time = ForgeHooks.getBurnTime(event.getStack(), RecipeType.SMELTING); + if (time > 0) { + event.setSlot(event.getStack().getCount(), EquipmentSlot.OFFHAND); + } + } + } + public CreateDispatch() { + super(() -> CreateClient::new); CreateCompatRegistry.register(); MinecraftForge.EVENT_BUS.register(CreateRecipeEvents.class); + MinecraftForge.EVENT_BUS.register(CreateDispatch.class); if (ModList.get().isLoaded("jei")) { MinecraftForge.EVENT_BUS.register(CreateJEIEvents.class); } + } + @Override + public void commonSetup() { + if (ModList.get().isLoaded("patchouli")) { + boolean flag = ForgeRegistries.ITEMS.containsKey( + new ResourceLocation(MODID, "cardboard")); + PatchouliFlagHelper.setFlag("modulargolems:create:cardboard", flag); + } } @Override @@ -41,7 +72,7 @@ public void lateRegister() { for (var part : str) { ModularGolems.REGISTRATE.item("incomplete_" + part.getId().getPath(), p -> new GolemIncompleteItem(p, part)) - .removeTab(GolemItems.TAB.getKey()) + .removeTab(GolemItems.GOLEMS.getKey()) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) .defaultLang().register(); @@ -49,6 +80,7 @@ public void lateRegister() { } public void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".cardboard", "Cardboard"); pvd.add("golem_material." + MODID + ".zinc", "Zinc"); pvd.add("golem_material." + MODID + ".andesite_alloy", "Andesite Alloy"); pvd.add("golem_material." + MODID + ".brass", "Brass"); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAngleTarget.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAngleTarget.java new file mode 100644 index 000000000..d5cff30ee --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAngleTarget.java @@ -0,0 +1,96 @@ +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class ArmAngleTarget { + static final ArmAngleTarget NO_TARGET = new ArmAngleTarget(); + float baseAngle; + float lowerArmAngle; + float upperArmAngle; + float headAngle; + + private ArmAngleTarget() { + this.lowerArmAngle = 135.0F; + this.upperArmAngle = 45.0F; + this.headAngle = 0.0F; + } + + public ArmAngleTarget(Vec3 origin, Vec3 pointTarget, Direction clawFacing, boolean ceiling) { + Vec3 target = pointTarget.add(Vec3.atLowerCornerOf(clawFacing.getOpposite().getNormal()).scale(0.5F)); + Vec3 diff = target.subtract(origin); + float horizontalDistance = (float) diff.multiply(1.0F, 0.0F, 1.0F).length(); + float baseAngle = deg(Mth.atan2(diff.x, diff.z)) + 180.0F; + if (ceiling) { + diff = diff.multiply(1.0F, -1.0F, 1.0F); + baseAngle = 180.0F - baseAngle; + } + + float alphaOffset = deg(Mth.atan2(diff.y, horizontalDistance)); + float a = 0.875F; + float a2 = a * a; + float b = 0.9375F; + float b2 = b * b; + float diffLength = Mth.clamp(Mth.sqrt((float) (diff.y * diff.y + (horizontalDistance * horizontalDistance))), 0.125F, a + b); + float diffLength2 = diffLength * diffLength; + float alphaRatio = (-b2 + a2 + diffLength2) / (2.0F * a * diffLength); + float alpha = deg(Math.acos(alphaRatio)) + alphaOffset; + float betaRatio = (-diffLength2 + a2 + b2) / (2.0F * b * a); + float beta = deg(Math.acos(betaRatio)); + if (Float.isNaN(alpha)) { + alpha = 0.0F; + } + + if (Float.isNaN(beta)) { + beta = 0.0F; + } + + Vec3 headPos = new Vec3(0.0F, 0.0F, 0.0F); + headPos = rotate(headPos.add(0.0F, b, 0.0F), (beta + 180.0F), Axis.X); + headPos = rotate(headPos.add(0.0F, a, 0.0F), (alpha - 90.0F), Axis.X); + headPos = rotate(headPos, baseAngle, Axis.Y); + headPos = rotate(headPos, ceiling ? 180.0F : 0.0F, Axis.X); + headPos = headPos.add(origin); + Vec3 headDiff = pointTarget.subtract(headPos); + if (ceiling) { + headDiff = headDiff.multiply(1.0F, -1.0F, 1.0F); + } + + float horizontalHeadDistance = (float) headDiff.multiply(1.0F, 0.0F, 1.0F).length(); + float headAngle = alpha + beta + 135.0F - deg(Mth.atan2(headDiff.y, horizontalHeadDistance)); + this.lowerArmAngle = alpha; + this.upperArmAngle = beta; + this.headAngle = -headAngle; + this.baseAngle = baseAngle; + } + + + public static float deg(double angle) { + return angle == (double) 0.0F ? 0.0F : (float) (angle * (double) 180.0F / Math.PI); + } + + public static Vec3 rotate(Vec3 vec, double deg, Direction.Axis axis) { + if (deg == (double) 0.0F) { + return vec; + } else if (vec == Vec3.ZERO) { + return vec; + } else { + float angle = (float) (deg / (double) 180.0F * Math.PI); + double sin = (double) Mth.sin(angle); + double cos = (double) Mth.cos(angle); + double x = vec.x; + double y = vec.y; + double z = vec.z; + if (axis == Axis.X) { + return new Vec3(x, y * cos - z * sin, z * cos + y * sin); + } else if (axis == Axis.Y) { + return new Vec3(x * cos + z * sin, y, z * cos - x * sin); + } else { + return axis == Axis.Z ? new Vec3(x * cos - y * sin, y * cos + x * sin, z) : vec; + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAttachmentItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAttachmentItem.java new file mode 100644 index 000000000..b1061b9b9 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmAttachmentItem.java @@ -0,0 +1,120 @@ +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import dev.xkmc.modulargolems.compat.materials.create.CreateCompatRegistry; +import dev.xkmc.modulargolems.content.client.weapon.ShoulderAnimData; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; +import dev.xkmc.modulargolems.content.item.ranged.ShouldWeaponItem; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ArmAttachmentItem extends ShouldWeaponItem { + + public static final ResourceLocation ID = CreateCompatRegistry.loc("arm"); + + public ArmAttachmentItem(Properties properties) { + super(properties); + } + + @Override + public @Nullable ResourceLocation getModelForHand(InteractionHand hand) { + return ID; + } + + @Override + public List getAnimationData(MetalGolemEntity user, ItemStack stack, InteractionHand hand) { + return List.of(); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.MECHANICAL_ARM.get()); + super.appendHoverText(stack, level, list, flag); + } + + @Override + public void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand) { + if (e.level().isClientSide()) return; + var time = e.level().getGameTime(); + var tag = stack.getOrCreateTag(); + long last = tag.getLong("FixAction"); + int takingItem = tag.getInt("TakingItem"); + var speed = Mth.clamp(tag.getFloat("FixSpeed"), 0.25f, 4f); + if (last > time || last < time - (int) (100 / speed)) { + ItemStack other = hand == InteractionHand.MAIN_HAND ? e.getLeftShoulder().getItem() : e.getRightShoulder().getItem(); + if (other.getItem() instanceof ArmAttachmentItem) { + long prev = other.getOrCreateTag().getLong("FixAction"); + if (prev <= time && prev > time - 20) return; + } + if (e.getGuardedDataImpl() > e.getMaxHealth() * 0.75 && !e.isReforged()) return; + var take = fetch(e, true); + if (take.isEmpty()) return; + tag.putLong("FixAction", time); + tag.putInt("TakingItem", 2); + tag.putFloat("FixSpeed", getSpeed(e)); + tag.put("DisplayItem", take.save(new CompoundTag())); + } else { + if (takingItem == 2 && last >= time - (int) (40 / speed)) { + tag.putInt("TakingItem", 1); + if (e.getGuardedDataImpl() > e.getMaxHealth() * 0.75 && !e.isReforged()) + tag.putLong("FixAction", 0); + } + if (takingItem >= 1 && last >= time - (int) (60 / speed)) { + tag.remove("TakingItem"); + if (e.getGuardedDataImpl() <= e.getMaxHealth() * 0.75 || e.isReforged()) { + var take = fetch(e, false); + if (!take.isEmpty()) { + e.repairWithItem(); + } + } + } + } + } + + public static float getSpeed(MetalGolemEntity e) { + float ans = MGConfig.COMMON.mechanicalArmSpeed.get().floatValue(); + if (e.getPersistentData().getLong("MechEngineLastPoweredUp") > e.level().getGameTime()) { + ans += MGConfig.COMMON.mechanicalArmPowerBonus.get().floatValue(); + } + float bonus = 0; + if (e.getModifiers().containsKey(CreateCompatRegistry.BODY.get())) + bonus += 0.2f; + var mobile = e.getEffect(CreateCompatRegistry.EFF_MOBILE.get()); + var force = e.getEffect(CreateCompatRegistry.EFF_FORCE.get()); + if (mobile != null) bonus += mobile.getAmplifier() * 0.2f; + if (force != null) bonus += force.getAmplifier() * 0.1f; + ans += MGConfig.COMMON.mechanicalArmMiscBonusFactor.get().floatValue() * bonus; + return Mth.clamp(ans, 0.5f, 4f); + } + + private static ItemStack fetch(MetalGolemEntity e, boolean simulate) { + var opt = e.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve(); + if (opt.isEmpty()) return ItemStack.EMPTY; + var mat = e.getMaterials().get(MetalGolemPartType.BODY.ordinal()); + Ingredient ing = GolemMaterialConfig.get().getRepairIngredient(mat.id()); + for (int i = 0; i < opt.get().getSlots(); i++) { + ItemStack stack = opt.get().getStackInSlot(i); + if (ing.test(stack)) { + var take = opt.get().extractItem(i, 1, simulate); + if (take.getCount() == 1) + return stack; + } + } + return ItemStack.EMPTY; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmPose.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmPose.java new file mode 100644 index 000000000..b129b1a17 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmPose.java @@ -0,0 +1,75 @@ +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.client.pose.GolemShoulderPose; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.nbt.Tag; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.Vec3; + +public class ArmPose implements GolemShoulderPose { + + @Override + public void setup(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, float pTick) { + + } + + @Override + public void render(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, PoseStack pose, MultiBufferSource source, int light, float pTick) { + pose.pushPose(); + try { + int s0 = hand == InteractionHand.MAIN_HAND ? 1 : -1; + var src = new Vec3(s0 * 7f / 16, 31f / 16, 0); + var def = ArmAngleTarget.NO_TARGET; + ArmState state; + var tag = stack.getOrCreateTag(); + long last = tag.getLong("FixAction"); + float speed = Mth.clamp(tag.getFloat("FixSpeed"), 0.25f, 4f); + long current = entity.level().getGameTime(); + float time = ((current - last) + pTick) * speed; + ItemStack repair = Items.IRON_INGOT.getDefaultInstance(); + if (tag.contains("DisplayItem", Tag.TAG_COMPOUND)) { + repair = ItemStack.of(tag.getCompound("DisplayItem")); + } + if (last > current || time > 80) { + state = new ArmState(entity.level(), ItemStack.EMPTY, 0, def, def); + } else if (time < 40) { + float progress = 1 - Math.abs(time / 20 - 1); + var dst = new Vec3(0, 18 / 16f, 20 / 16f); + var target = new ArmAngleTarget(src, dst, Direction.SOUTH, false); + target.headAngle += 180; + var diff = ArmState.getShortestAngleDiff(def.baseAngle, target.baseAngle); + diff = diff > 0 ? diff - 360 : diff + 360; + target.baseAngle = def.baseAngle + diff; + ItemStack held = time > 20 ? repair : ItemStack.EMPTY; + state = new ArmState(entity.level(), held, progress, def, target); + } else { + float progress = 1 - Math.abs((time - 40) / 20 - 1); + var dst = new Vec3(0, 18 / 16f, -20 / 16f); + var target = new ArmAngleTarget(src, dst, Direction.NORTH, false); + target.headAngle += 180; + var diff = ArmState.getShortestAngleDiff(def.baseAngle, target.baseAngle); + target.baseAngle = def.baseAngle + diff; + ItemStack held = time < 60 ? repair : ItemStack.EMPTY; + state = new ArmState(entity.level(), held, progress, def, target); + } + + pose.scale(-1, -1, 1); + pose.translate(src.x - 0.5f, src.y - 2f, src.z - 8.5f / 16); + + ArmRenderer.render(state, pTick, pose, source, light, OverlayTexture.NO_OVERLAY); + + } catch (Throwable e) { + + } + pose.popPose(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmRenderer.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmRenderer.java new file mode 100644 index 000000000..675e7d362 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmRenderer.java @@ -0,0 +1,105 @@ +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPartialModels; +import dev.engine_room.flywheel.lib.transform.PoseTransformStack; +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + +public class ArmRenderer { + + public static void render(ArmState be, float pt, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + ItemStack item = be.heldItem; + boolean hasItem = !item.isEmpty(); + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + BakedModel bakedModel = itemRenderer.getModel(item, be.level, null, 0); + boolean isBlockItem = hasItem && item.getItem() instanceof BlockItem && bakedModel.isGui3d(); + VertexConsumer builder = buffer.getBuffer(RenderType.solid()); + PoseStack msLocal = new PoseStack(); + PoseTransformStack msr = TransformStack.of(msLocal); + float a0 = be.baseAngle; + float a1 = be.lowerArmAngle - 135.0F; + float a2 = be.upperArmAngle - 90.0F; + float a3 = be.headAngle; + int color = 16777215; + + msr.center(); + + renderArm(builder, ms, msLocal, msr, color, a0, a1, a2, a3, hasItem, isBlockItem, light); + + if (hasItem) { + ms.pushPose(); + float itemScale = isBlockItem ? 0.5F : 0.625F; + msr.rotateXDegrees(90.0F); + msLocal.translate(0.0F, isBlockItem ? -0.5625F : -0.625F, 0.0F); + msLocal.scale(itemScale, itemScale, itemScale); + ms.last().pose().mul(msLocal.last().pose()); + itemRenderer.render(item, ItemDisplayContext.FIXED, false, ms, buffer, light, overlay, bakedModel); + ms.popPose(); + } + + } + + private static void renderArm(VertexConsumer builder, PoseStack ms, PoseStack msLocal, TransformStack msr, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { + BlockState blockState = AllBlocks.MECHANICAL_ARM.getDefaultState(); + SuperByteBuffer base = CachedBuffers.partial(AllPartialModels.ARM_BASE, blockState).light(light); + SuperByteBuffer lowerBody = CachedBuffers.partial(AllPartialModels.ARM_LOWER_BODY, blockState).light(light); + SuperByteBuffer upperBody = CachedBuffers.partial(AllPartialModels.ARM_UPPER_BODY, blockState).light(light); + SuperByteBuffer claw = CachedBuffers.partial(AllPartialModels.ARM_CLAW_BASE, blockState).light(light); + SuperByteBuffer upperClawGrip = CachedBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER, blockState).light(light); + SuperByteBuffer lowerClawGrip = CachedBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER, blockState).light(light); + transformBase(msr, baseAngle); + (base.transform(msLocal)).renderInto(ms, builder); + transformLowerArm(msr, lowerArmAngle); + (lowerBody.color(color).transform(msLocal)).renderInto(ms, builder); + transformUpperArm(msr, upperArmAngle); + (upperBody.color(color).transform(msLocal)).renderInto(ms, builder); + transformHead(msr, headAngle); + (claw.transform(msLocal)).renderInto(ms, builder); + for (int flip : Iterate.positiveAndNegative) { + msLocal.pushPose(); + transformClawHalf(msr, hasItem, isBlockItem, flip); + (flip > 0 ? lowerClawGrip : upperClawGrip).transform(msLocal).renderInto(ms, builder); + msLocal.popPose(); + } + + } + + public static void transformClawHalf(TransformStack msr, boolean hasItem, boolean isBlockItem, int flip) { + msr.translate(0.0F, ((float) (-flip) * (hasItem ? (isBlockItem ? 0.1875F : 0.078125F) : 0.0625F)), -0.375F); + } + + public static void transformHead(TransformStack msr, float headAngle) { + msr.translate(0.0F, 0.0F, -0.9375F); + msr.rotateXDegrees(headAngle - 45.0F); + } + + public static void transformUpperArm(TransformStack msr, float upperArmAngle) { + msr.translate(0.0F, 0.0F, -0.875F); + msr.rotateXDegrees(upperArmAngle - 90.0F); + } + + public static void transformLowerArm(TransformStack msr, float lowerArmAngle) { + msr.translate(0.0F, 0.125F, 0.0F); + msr.rotateXDegrees(lowerArmAngle + 135.0F); + } + + public static void transformBase(TransformStack msr, float baseAngle) { + msr.translate(0.0F, 0.25F, 0.0F); + msr.rotateYDegrees(baseAngle); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmState.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmState.java new file mode 100644 index 000000000..fa1c851c8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/ArmState.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class ArmState { + + public ItemStack heldItem; + public Level level; + public float baseAngle, lowerArmAngle, upperArmAngle, headAngle; + + public ArmState(Level level, ItemStack stack, float progress, ArmAngleTarget src, ArmAngleTarget dst) { + this.level = level; + this.heldItem = stack; + this.baseAngle = Mth.lerp(progress, src.baseAngle, dst.baseAngle); + this.lowerArmAngle = Mth.lerp(progress, src.lowerArmAngle, dst.lowerArmAngle); + this.upperArmAngle = Mth.lerp(progress, src.upperArmAngle, dst.upperArmAngle); + this.headAngle = angleLerp(progress, (src.headAngle % 360.0F), (dst.headAngle % 360.0F)); + } + + public static float angleLerp(double pct, double current, double target) { + return (float) (current + getShortestAngleDiff(current, target) * pct); + } + + public static float getShortestAngleDiff(double current, double target) { + current %= 360.0F; + target %= 360.0F; + return (float) (((target - current) % 360.0F + 540.0F) % 360.0F - 180.0F); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/package-info.java new file mode 100644 index 000000000..81f240de5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/arm/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.create.arm; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateGolemRecipeGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateGolemRecipeGen.java index bdd51ec73..6166dc5d5 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateGolemRecipeGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateGolemRecipeGen.java @@ -3,26 +3,35 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllTags; +import com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeBuilder; +import com.simibubi.create.content.kinetics.crusher.CrushingRecipe; import com.simibubi.create.content.kinetics.deployer.DeployerApplicationRecipe; import com.simibubi.create.content.kinetics.press.PressingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; import com.tterrag.registrate.providers.RegistrateRecipeProvider; -import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import com.tterrag.registrate.util.entry.ItemEntry; import dev.xkmc.modulargolems.compat.materials.common.CompatManager; -import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.compat.materials.create.CreateCompatRegistry; import dev.xkmc.modulargolems.compat.materials.create.CreateDispatch; -import dev.xkmc.modulargolems.compat.materials.create.automation.ConditionalSARecipeBuilder; -import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.compat.materials.tinker.TCDispatch; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFGolemWeaponMaterial; import dev.xkmc.modulargolems.content.item.golem.GolemPart; import dev.xkmc.modulargolems.init.ModularGolems; -import dev.xkmc.modulargolems.init.data.MGConfigGen; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; +import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; +import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; +import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; -import java.util.HashMap; -import java.util.Map; import java.util.Set; public class CreateGolemRecipeGen { @@ -30,14 +39,230 @@ public class CreateGolemRecipeGen { private static final Set SPECIAL = Set.of("andesite_alloy", "brass", "railway"); public static void genAllUpgradeRecipes(RegistrateRecipeProvider pvd) { - var ing = gatherConfig(); + var ing = CompatManager.gatherConfig(); for (var part : GolemPart.LIST) { for (var ent : ing.entrySet()) { if (SPECIAL.contains(ent.getKey().getPath())) continue; + if (ent.getKey().getNamespace().equals(TCDispatch.MODID)) continue; genAssembly(pvd, part, ent.getKey(), ent.getValue()); } } genSpecialRecipes(pvd); + genRecycleRecipes(pvd); + + + new MechanicalCraftingRecipeBuilder(CreateCompatRegistry.ARM.get(), 1) + .patternLine(" A ").patternLine("CCC").patternLine("BEB").patternLine("DED") + .whenModLoaded(CreateDispatch.MODID) + .key('A', AllBlocks.MECHANICAL_ARM.asItem()) + .key('B', AllItems.BRASS_SHEET.get()) + .key('C', AllItems.PRECISION_MECHANISM.get()) + .key('D', GolemItems.GOLEM_TEMPLATE) + .key('E', AllBlocks.GEARBOX) + .build(pvd); + } + + public static void genRecycleRecipes(RegistrateRecipeProvider pvd) { + genCrushingRecipe(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE) + .output(Items.DIAMOND, 40) + .output(Items.NETHERITE_INGOT, 6) + .build(pvd); + + genCrushingRecipe(GolemItems.BARBARICFLAMEVANGUARD_HELMET) + .output(Items.DIAMOND, 20) + .output(Items.NETHERITE_INGOT, 5) + .build(pvd); + + genCrushingRecipe(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD) + .output(Items.DIAMOND, 18) + .output(Items.NETHERITE_INGOT, 3) + .build(pvd); + + genCrushingRecipe(GolemItems.WINDSPIRIT_CHESTPLATE) + .output(Items.DIAMOND, 40) + .build(pvd); + + genCrushingRecipe(GolemItems.WINDSPIRIT_HELMET) + .output(Items.DIAMOND, 20) + .build(pvd); + + genCrushingRecipe(GolemItems.WINDSPIRIT_SHINGUARD) + .output(Items.DIAMOND, 18) + .build(pvd); + + genCrushingRecipe(GolemItems.WINDSPIRIT_BOOTS) + .output(Items.DIAMOND, 7) + .build(pvd); + + genCrushingRecipe(GolemItems.GOLEMGUARD_CHESTPLATE) + .output(Items.IRON_INGOT, 40) + .build(pvd); + + genCrushingRecipe(GolemItems.GOLEMGUARD_HELMET) + .output(Items.IRON_INGOT, 20) + .build(pvd); + + genCrushingRecipe(GolemItems.GOLEMGUARD_SHINGUARD) + .output(Items.IRON_INGOT, 18) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()]) + .output(Items.DIAMOND, 4) + .output(Items.NETHERITE_SCRAP, 4) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()]) + .output(Items.DIAMOND, 5) + .output(Items.NETHERITE_SCRAP, 4) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()]) + .output(Items.DIAMOND, 3) + .output(Items.NETHERITE_SCRAP, 4) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()]) + .output(Items.DIAMOND, 4) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()]) + .output(Items.DIAMOND, 5) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()]) + .output(Items.DIAMOND, 3) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()]) + .output(Items.IRON_INGOT, 4) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()]) + .output(Items.IRON_INGOT, 5) + .build(pvd); + + genCrushingRecipe(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()]) + .output(Items.IRON_INGOT, 3) + .build(pvd); + + if (ModList.get().isLoaded(TFDispatch.MODID)) { + genCrushingRecipe(TFCompatRegistry.IRONWOOD_HELMET) + .output(TFItems.IRONWOOD_INGOT.get(), 20) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.IRONWOOD_CHESTPLATE) + .output(TFItems.IRONWOOD_INGOT.get(), 40) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.IRONWOOD_SHINGUARD) + .output(TFItems.IRONWOOD_INGOT.get(), 18) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.IRONWOOD_BOOTS) + .output(TFItems.IRONWOOD_INGOT.get(), 7) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.NAGA_HELMET) + .output(TFBlocks.NAGA_TROPHY.get(), 1) + .output(TFItems.NAGA_SCALE.get(), 4) + .output(TFItems.IRONWOOD_INGOT.get(), 1) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.NAGA_CHESTPLATE) + .output(TFItems.NAGA_SCALE.get(), 10) + .output(TFItems.IRONWOOD_INGOT.get(), 1) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.NAGA_SHINGUARD) + .output(TFItems.NAGA_SCALE.get(), 6) + .output(TFItems.IRONWOOD_INGOT.get(), 4) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.NAGA_BOOTS) + .output(TFItems.NAGA_SCALE.get(), 3) + .output(TFItems.IRONWOOD_INGOT.get(), 1) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.KNIGHTMETAL_HELMET) + .output(TFItems.KNIGHTMETAL_INGOT.get(), 20) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.KNIGHTMETAL_CHESTPLATE) + .output(TFItems.KNIGHTMETAL_INGOT.get(), 40) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.KNIGHTMETAL_SHINGUARD) + .output(TFItems.KNIGHTMETAL_INGOT.get(), 18) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.KNIGHTMETAL_BOOTS) + .output(TFItems.KNIGHTMETAL_INGOT.get(), 7) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.FIERY_HELMET) + .output(TFItems.FIERY_INGOT.get(), 20) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.FIERY_CHESTPLATE) + .output(TFItems.FIERY_INGOT.get(), 40) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.FIERY_SHINGUARD) + .output(TFItems.FIERY_INGOT.get(), 18) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.FIERY_BOOTS) + .output(TFItems.FIERY_INGOT.get(), 7) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + for (var e : TFGolemWeaponMaterial.values()) { + + genCrushingRecipe(TFCompatRegistry.TF_GOLEM_WEAPON + [GolemWeaponType.AXE.ordinal()][e.ordinal()]) + .output(e.getIngot(), 4) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.TF_GOLEM_WEAPON + [GolemWeaponType.SWORD.ordinal()][e.ordinal()]) + .whenModLoaded(TFDispatch.MODID) + .output(e.getIngot(), 5) + .build(pvd); + + genCrushingRecipe(TFCompatRegistry.TF_GOLEM_WEAPON + [GolemWeaponType.SPEAR.ordinal()][e.ordinal()]) + .output(e.getIngot(), 3) + .whenModLoaded(TFDispatch.MODID) + .build(pvd); + + } + + + } + + } + + private static ProcessingRecipeBuilder genCrushingRecipe(ItemEntry item) { + var recipe = new ProcessingRecipeBuilder<>(CrushingRecipe::new, item.getId()); + recipe.withCondition(new ModLoadedCondition(CreateDispatch.MODID)); + recipe.require(item); + return recipe; } public static void genSpecialRecipes(RegistrateRecipeProvider pvd) { @@ -82,21 +307,4 @@ private static void genAssembly(RegistrateRecipeProvider pvd, GolemPart pa recipe.build(pvd); } - @SuppressWarnings("ConstantConditions") - private static Map gatherConfig() { - ConfigDataProvider.Collector map = new ConfigDataProvider.Collector(new HashMap<>()); - for (ModDispatch dispatch : CompatManager.LIST) { - var gen = dispatch.getDataGen(null); - gen.add(map); - } - new MGConfigGen(null).add(map); - Map ing = new HashMap<>(); - for (ConfigDataProvider.ConfigEntry config : map.map().values()) { - if (config.config() instanceof GolemMaterialConfig mat) { - ing.putAll(mat.ingredients); - } - } - return ing; - } - } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateRecipeEvents.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateRecipeEvents.java index 23ca0c0b9..7e55ce4b0 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateRecipeEvents.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/CreateRecipeEvents.java @@ -1,23 +1,12 @@ package dev.xkmc.modulargolems.compat.materials.create.automation; import com.simibubi.create.content.kinetics.deployer.DeployerRecipeSearchEvent; -import dev.xkmc.modulargolems.content.core.IGolemPart; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.item.equipments.GolemEquipmentItem; +import dev.xkmc.modulargolems.content.item.golem.GolemEquipUtil; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; -import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; -import dev.xkmc.modulargolems.events.CraftEventListeners; -import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.ForgeRegistries; -import top.theillusivec4.curios.Curios; -import top.theillusivec4.curios.api.CuriosApi; import java.util.Optional; @@ -30,66 +19,12 @@ public static void addRecipe(DeployerRecipeSearchEvent event) { if (!(first.getItem() instanceof GolemHolder holder)) return; ItemStack result; Level level = event.getBlockEntity().getLevel(); - if (!(level instanceof ServerLevel sl)) return; - if (second.getItem() instanceof UpgradeItem upgrade) { - result = CraftEventListeners.appendUpgrade(first, holder, upgrade); - } else if (isGolemCurio(holder, second)) { - result = equipCurio(holder, first, second, sl); - } else if (holder.getEntityType() == GolemTypes.TYPE_GOLEM.get()) { - if (!(second.getItem() instanceof GolemEquipmentItem equipment)) return; - if (!equipment.isFor(GolemTypes.ENTITY_GOLEM.get())) return; - EquipmentSlot slot = equipment.getSlot(); - result = equip(holder, first, second, slot, sl); - } else if (holder.getEntityType() == GolemTypes.TYPE_HUMANOID.get()) { - EquipmentSlot slot = LivingEntity.getEquipmentSlotForItem(second); - result = equip(holder, first, second, slot, sl); - } else return; + if (!(level instanceof ServerLevel)) return; + var ctx = new GolemEquipUtil(false, level); + result = ctx.applyItemOnHolder(holder, first.copy(), second.copy()); if (result.isEmpty()) return; event.addRecipe(() -> Optional.of(new DeployerUpgradeRecipe(result)), 1000); } - private static boolean isGolemCurio(GolemHolder holder, ItemStack stack) { - if (!ModList.get().isLoaded(Curios.MODID)) return false; - var set = CuriosApi.getEntitySlots(holder.getEntityType().type()).keySet(); - return ForgeRegistries.ITEMS.tags().getReverseTag(stack.getItem()) - .map(e -> e.getTagKeys().anyMatch(t -> - t.location().getNamespace().equals(Curios.MODID) && - set.contains(t.location().getPath()))) - .orElse(false); - } - - private static , P extends IGolemPart

> - ItemStack equipCurio(GolemHolder holder, ItemStack golem, ItemStack equip, Level level) { - if (!ModList.get().isLoaded(Curios.MODID)) return ItemStack.EMPTY; - T entity = holder.createDummy(golem, level); - if (entity == null) return ItemStack.EMPTY; - var opt = CuriosApi.getCuriosInventory(entity).resolve(); - if (opt.isEmpty()) return ItemStack.EMPTY; - equip = equip.copy(); - equip.setCount(1); - for (var slot : CuriosApi.getItemStackSlots(equip, entity).keySet()) { - var handler = opt.get().getStacksHandler(slot); - if (handler.isEmpty()) continue; - var stacks = handler.get().getStacks(); - for (int i = 0; i < stacks.getSlots(); i++) { - if (stacks.getStackInSlot(i).isEmpty()) { - stacks.setStackInSlot(i, equip); - return GolemHolder.setEntity(entity); - } - } - } - return ItemStack.EMPTY; - } - - private static , P extends IGolemPart

> - ItemStack equip(GolemHolder holder, ItemStack golem, ItemStack equip, EquipmentSlot slot, Level level) { - T entity = holder.createDummy(golem, level); - if (entity == null) return ItemStack.EMPTY; - if (!entity.getItemBySlot(slot).isEmpty()) return ItemStack.EMPTY; - equip = equip.copy(); - equip.setCount(1); - entity.setItemSlot(slot, equip); - return GolemHolder.setEntity(entity); - } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/DummyFurnace.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/DummyFurnace.java index c6f9603b6..d8b557897 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/DummyFurnace.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/automation/DummyFurnace.java @@ -14,7 +14,8 @@ public DummyFurnace() { } private static boolean isValid(ItemStack stack) { - return ForgeHooks.getBurnTime(stack, RecipeType.SMELTING) > 0; + return !stack.isEmpty() && (stack.isStackable() || stack.hasCraftingRemainingItem()) && + ForgeHooks.getBurnTime(stack, RecipeType.SMELTING) > 0; } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechBodyModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechBodyModifier.java index 8ebc6b5f2..fc7d894e8 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechBodyModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechBodyModifier.java @@ -1,8 +1,10 @@ package dev.xkmc.modulargolems.compat.materials.create.modifier; import dev.xkmc.modulargolems.compat.materials.create.CreateCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.create.arm.ArmAttachmentItem; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGConfig; import net.minecraft.sounds.SoundEvents; @@ -28,7 +30,12 @@ public void onAiStep(AbstractGolemEntity golem, int level) { if (golem.tickCount % 20 != 0) return; int mobile = golem.getModifiers().getOrDefault(CreateCompatRegistry.MOBILE.get(), 0); int force = golem.getModifiers().getOrDefault(CreateCompatRegistry.FORCE.get(), 0); - if (mobile == 0 && force == 0) return; + int arm = 0; + if (golem instanceof MetalGolemEntity e && (e.getGuardedDataImpl() < e.getMaxHealth() * 0.75 || e.isReforged())) { + if (e.getLeftShoulder().getItem().getItem() instanceof ArmAttachmentItem) arm++; + if (e.getRightShoulder().getItem().getItem() instanceof ArmAttachmentItem) arm++; + } + if (mobile == 0 && force == 0 && arm == 0) return; var mobileIns = golem.getEffect(CreateCompatRegistry.EFF_MOBILE.get()); var forceIns = golem.getEffect(CreateCompatRegistry.EFF_FORCE.get()); int mobileTime = 0; @@ -58,17 +65,25 @@ public void onAiStep(AbstractGolemEntity golem, int level) { mobileTime + time, mobile - 1)); if (force > 0) golem.addEffect(new MobEffectInstance(CreateCompatRegistry.EFF_FORCE.get(), forceTime + time, force - 1)); + long last = golem.getPersistentData().getLong("MechEngineLastPoweredUp"); + long next = Math.max(last, golem.level().getGameTime()) + time; + golem.getPersistentData().putLong("MechEngineLastPoweredUp", next); } } @Override - public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand) { + public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand, int value) { ItemStack stack = player.getItemInHand(hand); int time = ForgeHooks.getBurnTime(stack, RecipeType.SMELTING); if (time <= 0) return InteractionResult.PASS; int mobile = golem.getModifiers().getOrDefault(CreateCompatRegistry.MOBILE.get(), 0); int force = golem.getModifiers().getOrDefault(CreateCompatRegistry.FORCE.get(), 0); - if (mobile == 0 && force == 0) return InteractionResult.FAIL; + int arm = 0; + if (golem instanceof MetalGolemEntity e && (e.getGuardedDataImpl() < e.getMaxHealth() * 0.75 || e.isReforged())) { + if (e.getLeftShoulder().getItem().getItem() instanceof ArmAttachmentItem) arm++; + if (e.getRightShoulder().getItem().getItem() instanceof ArmAttachmentItem) arm++; + } + if (mobile == 0 && force == 0 && arm == 0) return InteractionResult.FAIL; if (player.level().isClientSide()) return InteractionResult.SUCCESS; var mobileIns = golem.getEffect(CreateCompatRegistry.EFF_MOBILE.get()); var forceIns = golem.getEffect(CreateCompatRegistry.EFF_FORCE.get()); @@ -77,14 +92,18 @@ public InteractionResult interact(Player player, AbstractGolemEntity golem if (mobileIns != null) mobileTime = mobileIns.getDuration(); if (forceIns != null) forceTime = forceIns.getDuration(); int maxFactor = MGConfig.COMMON.mechMaxFuel.get(); - if (mobile > 0 && mobileTime >= time * maxFactor) - return InteractionResult.FAIL; - if (force > 0 && forceTime >= time * maxFactor) + boolean pass = arm > 0; + pass |= mobile > 0 && mobileTime < time * maxFactor; + pass |= force > 0 && forceTime < time * maxFactor; + if (!pass) return InteractionResult.FAIL; if (mobile > 0) golem.addEffect(new MobEffectInstance(CreateCompatRegistry.EFF_MOBILE.get(), mobileTime + time, mobile - 1)); if (force > 0) golem.addEffect(new MobEffectInstance(CreateCompatRegistry.EFF_FORCE.get(), forceTime + time, force - 1)); + long last = golem.getPersistentData().getLong("MechEngineLastPoweredUp"); + long next = Math.max(last, golem.level().getGameTime()) + time; + golem.getPersistentData().putLong("MechEngineLastPoweredUp", next); if (!player.isCreative()) { ItemStack remain = stack.getCraftingRemainingItem(); stack.shrink(1); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechForceModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechForceModifier.java index c8c28268e..e9c090271 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechForceModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechForceModifier.java @@ -6,7 +6,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; import java.util.List; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechMobileModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechMobileModifier.java index 46bc34c20..920eef0c6 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechMobileModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/create/modifier/MechMobileModifier.java @@ -1,13 +1,11 @@ package dev.xkmc.modulargolems.compat.materials.create.modifier; import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGConfig; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraftforge.event.entity.living.LivingDamageEvent; import java.util.List; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyCompatRegistry.java new file mode 100644 index 000000000..579e8be91 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyCompatRegistry.java @@ -0,0 +1,99 @@ +package dev.xkmc.modulargolems.compat.materials.goety; + +import com.Polarice3.Goety.common.effects.GoetyEffects; +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.*; +import dev.xkmc.modulargolems.compat.materials.goety.multi.*; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; +import dev.xkmc.modulargolems.content.modifier.base.PotionAttackModifier; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; + +import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class GoetyCompatRegistry { + + public static final RegistryEntry BUSTED; + public static final RegistryEntry SOUL; + public static final RegistryEntry HAUNTED; + public static final RegistryEntry SOUL_REPAIR; + public static final RegistryEntry FIRE_BLAST; + public static final RegistryEntry FIRE_TORNADO; + public static final RegistryEntry HELL_CLOUD; + public static final RegistryEntry HELL_BOLT; + public static final RegistryEntry HELL_BLAST; + public static final RegistryEntry APOSTLE; + + + public static final RegistryEntry UPGRADE_SOUL, + UPGRADE_BLAST, UPGRADE_TORNADO, UPGRADE_CLOUD, + UPGRADE_BOLT, UPGRADE_BALL, UPGRADE_APOSTLE; + + public static final TagKey REV_RING = ItemTags.create(ModularGolems.loc("revelation_ring")); + public static final TagKey REV_DOOM = ItemTags.create(ModularGolems.loc("revelation_doom")); + public static final TagKey REV_INGOT = ItemTags.create(ModularGolems.loc("revelation_ingot")); + public static final TagKey REV_TEMPLATE = ItemTags.create(ModularGolems.loc("revelation_template")); + public static final TagKey REV_BOW = ItemTags.create(ModularGolems.loc("revelation_bow")); + public static final TagKey REV_ARMOR = ItemTags.create(ModularGolems.loc("apocalyptium_armor")); + + static { + BUSTED = reg("fallen_attack", () -> new PotionAttackModifier(StatFilterType.ATTACK, 2, + i -> new MobEffectInstance(GoetyEffects.BUSTED.get(), 100 * i, 0)), null); + HAUNTED = reg("haunted", HauntedModifier::new, + "Might summon haunted armor servant when killing enemies. " + + "Higher chance to summon when killed target is armored"); + SOUL = reg("soul_collection", SoulCollectionModifier::new, "Collect soul from entities killed and give it to owner"); + SOUL_REPAIR = reg("soul_repair", SoulRepairModifier::new, + "Repair golem equipments with player's soul energy. " + + "Also heal golem with soul energy when health is low"); + FIRE_BLAST = reg("fire_blast", FireBlastModifier::new, + "Summon Fire Blast Trap in the front"); + FIRE_TORNADO = reg("fire_tornado", FireTornadoModifier::new, + "Summon Fire Tornado Trap toward target position"); + HELL_CLOUD = reg("hell_cloud", HellCloudModifier::new, + "Summon Hell cloud on target position"); + HELL_BOLT = reg("hell_bolt", HellBoltModifier::new, + "Shoot Hell bolt toward targets"); + HELL_BLAST = reg("hell_blast", HellBlastModifier::new, + "Shoot Hell blast toward targets"); + APOSTLE = reg("apostle", ApostleModifier::new, "Apostle Upgrades will not consume slot"); + + UPGRADE_SOUL = regModUpgrade("soul_collection", () -> SOUL, GoetyDispatch.MODID) + .lang("Soul Collection Upgrade").register(); + UPGRADE_BLAST = regModUpgrade("fire_blast", () -> FIRE_BLAST, GoetyDispatch.MODID) + .lang("Apostle Upgrade: Fire Blast").register(); + UPGRADE_TORNADO = regModUpgrade("fire_tornado", () -> FIRE_TORNADO, GoetyDispatch.MODID) + .lang("Apostle Upgrade: Fire Tornado").register(); + UPGRADE_CLOUD = regModUpgrade("hell_cloud", () -> HELL_CLOUD, GoetyDispatch.MODID) + .lang("Apostle Upgrade: Hell Cloud").register(); + UPGRADE_BOLT = regModUpgrade("hell_bolt", () -> HELL_BOLT, GoetyDispatch.MODID) + .lang("Apostle Upgrade: Hell Bolt").register(); + UPGRADE_BALL = regModUpgrade("hell_blast", () -> HELL_BLAST, GoetyDispatch.MODID) + .lang("Apostle Upgrade: Hell Blast").register(); + UPGRADE_APOSTLE = regModUpgrade("apostle", () -> APOSTLE, GoetyDispatch.MODID) + .lang("Apostle Ascension Upgrade").register(); + + } + + public static void register() { + MGTagGen.OPTIONAL_ITEM.add(pvd -> { + pvd.addTag(MGTagGen.BLUE_UPGRADES).addOptional(UPGRADE_SOUL.getId()); + pvd.addTag(REV_RING).addOptional(new ResourceLocation("goety_revelation", "ascension_halo")); + pvd.addTag(REV_DOOM).addOptional(new ResourceLocation("goety_revelation", "doom_medal")); + pvd.addTag(REV_INGOT).addOptional(new ResourceLocation("goety_revelation", "apocalyptium_ingot")); + pvd.addTag(REV_TEMPLATE).addOptional(new ResourceLocation("goety_revelation", "apocalyptium_upgrade_smithing_template")); + pvd.addTag(REV_BOW).add(Items.BOW).addOptional(new ResourceLocation("goety_revelation", "bow_of_revelation")); + pvd.addTag(REV_ARMOR); + }); + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyConfigGen.java new file mode 100644 index 000000000..5d17b7122 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyConfigGen.java @@ -0,0 +1,47 @@ +package dev.xkmc.modulargolems.compat.materials.goety; + +import com.Polarice3.Goety.common.items.ModItems; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class GoetyConfigGen extends ConfigDataProvider { + + public GoetyConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Goety"); + } + + @Override + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(GoetyDispatch.MODID, GoetyDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(GoetyDispatch.MODID, "cursed_metal"), + Ingredient.of(ModItems.CURSED_METAL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 100) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.MAGIC_RES.get(), 1) + .addModifier(GoetyCompatRegistry.BUSTED.get(), 1) + .end() + + .addMaterial(new ResourceLocation(GoetyDispatch.MODID, "dark_metal"), + Ingredient.of(ModItems.DARK_METAL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 160) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_REGEN.get(), 4) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.EXPLOSION_RES.get(), 2) + .addModifier(GolemModifiers.MAGIC_RES.get(), 2) + .addModifier(GoetyCompatRegistry.HAUNTED.get(), 2) + .addModifier(GoetyCompatRegistry.SOUL_REPAIR.get(), 1) + .addModifier(GoetyCompatRegistry.SOUL.get(), 1) + .end() + + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyDispatch.java new file mode 100644 index 000000000..a4209a880 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyDispatch.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.compat.materials.goety; + +import com.Polarice3.Goety.Goety; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import net.minecraft.data.DataGenerator; +import org.jetbrains.annotations.Nullable; + +public class GoetyDispatch extends ModDispatch { + + public static final String MODID = Goety.MOD_ID; + + public GoetyDispatch() { + GoetyCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".cursed_metal", "Cursed Metal"); + pvd.add("golem_material." + MODID + ".dark_metal", "Dark Metal"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + GoetyRecipeGen.genRecipe(pvd); + } + + @Override + public @Nullable ConfigDataProvider getDataGen(DataGenerator gen) { + return new GoetyConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyRecipeGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyRecipeGen.java new file mode 100644 index 000000000..74b033a1f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/GoetyRecipeGen.java @@ -0,0 +1,96 @@ +package dev.xkmc.modulargolems.compat.materials.goety; + +import com.Polarice3.Goety.common.items.ModItems; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.world.item.Items; +import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; +import net.minecraftforge.common.crafting.conditions.NotCondition; + +import static dev.xkmc.modulargolems.compat.materials.goety.GoetyDispatch.MODID; + +public class GoetyRecipeGen { + + public static void genRecipe(RegistrateRecipeProvider pvd) { + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_SOUL.get())::unlockedBy, ModItems.DARK_METAL_INGOT.get()) + .pattern("EDE").pattern("FXF").pattern("IFI") + .define('X', GolemItems.EMPTY_UPGRADE) + .define('I', ModItems.DARK_METAL_INGOT.get()) + .define('E', ModItems.ECTOPLASM.get()) + .define('F', ModItems.SPIRIT_FABRIC.get()) + .define('D', ModItems.SOUL_EMERALD.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_BLAST.get())::unlockedBy, ModItems.UNHOLY_BLOOD.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.UNHOLY_BLOOD.get()) + .requires(ModItems.FIRE_BLAST_FOCUS.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_TORNADO.get())::unlockedBy, ModItems.UNHOLY_BLOOD.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.UNHOLY_BLOOD.get()) + .requires(ModItems.CYCLONE_FOCUS.get()) + .requires(Items.LAVA_BUCKET) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_CLOUD.get())::unlockedBy, ModItems.UNHOLY_BLOOD.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.UNHOLY_BLOOD.get()) + .requires(ModItems.HAIL_FOCUS.get()) + .requires(Items.LAVA_BUCKET) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_BOLT.get())::unlockedBy, ModItems.UNHOLY_FABRIC.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.FIREBALL_FOCUS.get()) + .requires(ModItems.UNHOLY_FABRIC.get()) + .requires(ModItems.UNHOLY_BLOOD.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_BALL.get())::unlockedBy, ModItems.UNHOLY_FABRIC.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.LAVABALL_FOCUS.get()) + .requires(ModItems.UNHOLY_FABRIC.get()) + .requires(ModItems.UNHOLY_BLOOD.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + { + + + var base = ConditionalRecipeWrapper.of(pvd, + new ModLoadedCondition(MODID), new NotCondition(new ModLoadedCondition("goety_revelation"))); + + var rev = ConditionalRecipeWrapper.of(pvd, + new ModLoadedCondition(MODID), new ModLoadedCondition("goety_revelation")); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_APOSTLE.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(ModItems.UNHOLY_HAT.get()) + .save(base, GoetyCompatRegistry.UPGRADE_APOSTLE.getId().withSuffix("_base")); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GoetyCompatRegistry.UPGRADE_APOSTLE.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .pattern("BFB").pattern("BOB").pattern("BUB") + .define('U', GolemItems.EMPTY_UPGRADE) + .define('F', GoetyCompatRegistry.REV_RING) + .define('B', GoetyCompatRegistry.REV_DOOM) + .define('O', ModItems.UNHOLY_ROBE.get()) + .save(rev, GoetyCompatRegistry.UPGRADE_APOSTLE.getId().withSuffix("_revelation")); + + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/ApostleModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/ApostleModifier.java new file mode 100644 index 000000000..6e85446a6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/ApostleModifier.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; + +import java.util.List; + +public class ApostleModifier extends GolemModifier { + + public ApostleModifier() { + super(StatFilterType.HEAD, 1); + } + + @Override + public int addSlot(List upgrades, int lv) { + int add = 0; + for (var e : upgrades) { + if (!e.get().isEmpty() && e.get().get(0).mod() instanceof IApostleModifier) { + add++; + } + } + return add; + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/HauntedModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/HauntedModifier.java new file mode 100644 index 000000000..754ceddcd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/HauntedModifier.java @@ -0,0 +1,72 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +import com.Polarice3.Goety.common.entities.ModEntityType; +import com.Polarice3.Goety.common.entities.ally.undead.HauntedArmorServant; +import com.Polarice3.Goety.common.items.ModItems; +import com.Polarice3.Goety.init.ModSounds; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraftforge.event.entity.living.LivingDeathEvent; + +public class HauntedModifier extends GolemModifier { + + public HauntedModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void onKillTarget(AbstractGolemEntity golem, LivingEntity entity, LivingDeathEvent event, int level) { + if (!(entity instanceof Enemy)) return; + double chance = 1; + for (var e : EquipmentSlot.values()) { + if (e.isArmor() && !entity.getItemBySlot(e).isEmpty()) + chance++; + } + chance *= level * MGConfig.COMMON.hauntedBaseChance.get(); + if (chance < golem.getRandom().nextDouble()) return; + HauntedArmorServant summoned = new HauntedArmorServant(ModEntityType.HAUNTED_ARMOR_SERVANT.get(), golem.level()); + + for (EquipmentSlot e : EquipmentSlot.values()) { + summoned.setItemSlot(e, entity.getItemBySlot(e)); + summoned.setGuaranteedDrop(e); + entity.setItemSlot(e, ItemStack.EMPTY); + } + + setIfEmpty(summoned, EquipmentSlot.HEAD, ModItems.CURSED_KNIGHT_HELMET.get()); + setIfEmpty(summoned, EquipmentSlot.CHEST, ModItems.CURSED_KNIGHT_CHESTPLATE.get()); + setIfEmpty(summoned, EquipmentSlot.LEGS, ModItems.CURSED_KNIGHT_LEGGINGS.get()); + setIfEmpty(summoned, EquipmentSlot.FEET, ModItems.CURSED_KNIGHT_BOOTS.get()); + + summoned.setPersistenceRequired(); + summoned.moveTo(entity.blockPosition(), entity.getYRot(), entity.getXRot()); + summoned.setLeftHanded(entity.getMainArm() == HumanoidArm.LEFT); + if (golem.getOwner() != null) { + summoned.setTrueOwner(golem.getOwner()); + } else { + summoned.setOwnerId(golem.getOwnerUUID()); + } + if (golem.level().addFreshEntity(summoned)) { + golem.playSound(ModSounds.SUMMON_SPELL.get()); + } + } + + private void setIfEmpty(Mob summoned, EquipmentSlot slot, Item item) { + if (summoned.getItemBySlot(slot).isEmpty()) { + ItemStack stack = item.getDefaultInstance(); + stack.enchant(Enchantments.VANISHING_CURSE, 1); + summoned.setItemSlot(slot, stack); + summoned.setDropChance(slot, 0); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleGoal.java new file mode 100644 index 000000000..ef668224d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleGoal.java @@ -0,0 +1,4 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +public interface IApostleGoal { +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleModifier.java new file mode 100644 index 000000000..181559d44 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/IApostleModifier.java @@ -0,0 +1,4 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +public interface IApostleModifier { +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulCollectionModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulCollectionModifier.java new file mode 100644 index 000000000..2a9ebf7d6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulCollectionModifier.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +import com.Polarice3.Goety.utils.SEHelper; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.entity.living.LivingDeathEvent; + +public class SoulCollectionModifier extends GolemModifier { + + public SoulCollectionModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void onKillTarget(AbstractGolemEntity golem, LivingEntity entity, LivingDeathEvent event, int level) { + Player owner = golem.getOwner(); + if (owner == null || owner instanceof FakePlayer) return; + for (int i = 0; i < level; i++) { + SEHelper.handleKill(owner, event.getEntity(), event.getSource()); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulRepairModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulRepairModifier.java new file mode 100644 index 000000000..31daab83d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/SoulRepairModifier.java @@ -0,0 +1,62 @@ +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +import com.Polarice3.Goety.config.ItemConfig; +import com.Polarice3.Goety.utils.SEHelper; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public class SoulRepairModifier extends GolemModifier { + + public SoulRepairModifier() { + super(StatFilterType.MASS, 10); + } + + @Override + public double onInventoryHealTick(double heal, HealingContext ctx, int level) { + if (ctx.health() > ctx.maxHealth() * MGConfig.COMMON.soulHealingThreshold.get()) return heal; + Player player = null; + float factor = 1; + if (ctx.owner() instanceof Player pl) player = pl; + else if (ctx.owner() instanceof AbstractGolemEntity golem) { + for (EquipmentSlot slot : EquipmentSlot.values()) { + if (golem.getItemBySlot(slot).is(GoetyCompatRegistry.REV_ARMOR)) + factor += MGConfig.COMMON.soulHealingArmorBonus.get().floatValue(); + } + player = golem.getOwner(); + } + if (player == null) return heal; + if (!SEHelper.getSoulsContainer(player)) return heal; + int rate = ItemConfig.ItemsRepairAmount.get() * MGConfig.COMMON.soulHealingCost.get(); + if (rate <= 0) return heal; + int max = Math.min(level * MGConfig.COMMON.soulHealingRate.get(), SEHelper.getSoulAmountInt(player) / rate); + if (max <= 0) return heal; + SEHelper.decreaseSouls(player, max * rate); + return heal + max * factor; + } + + @Override + public double onHealTick(double heal, AbstractGolemEntity entity, int level) { + Player player = entity.getOwner(); + if (player != null && SEHelper.getSoulsContainer(player)) { + int rate = ItemConfig.ItemsRepairAmount.get(); + for (var e : EquipmentSlot.values()) { + ItemStack stack = entity.getItemBySlot(e); + if (!stack.isEmpty() && stack.isDamaged()) { + int max = Math.min(Math.min(stack.getDamageValue(), level), SEHelper.getSoulAmountInt(player) / rate); + if (max > 0) { + SEHelper.decreaseSouls(player, rate * max); + stack.setDamageValue(stack.getDamageValue() - max); + } + } + } + } + return super.onHealTick(heal, entity, level); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/package-info.java new file mode 100644 index 000000000..e0b09b5a9 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/modifier/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.goety.modifier; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastGoal.java new file mode 100644 index 000000000..30df28c99 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastGoal.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.util.FireBlastTrap; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class FireBlastGoal extends MultiTargetRangedGoal implements IApostleGoal { + + public FireBlastGoal(AbstractGolemEntity golem, int lv) { + super(200, 0, 35, golem, lv); + } + + @Override + protected int searchRange() { + return 35; + } + + @Override + protected int getMaxTarget() { + return lv; + } + + @Override + protected int cd() { + return 10; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + var level = golem.level(); + FireBlastTrap e = new FireBlastTrap(level, target.getX(), target.getY() + (double) 0.25F, target.getZ()); + e.setOwner(golem); + e.setAreaOfEffect(lv + 3); + level.addFreshEntity(e); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastModifier.java new file mode 100644 index 000000000..4c71b3122 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireBlastModifier.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class FireBlastModifier extends GolemModifier implements IApostleModifier { + + public FireBlastModifier() { + super(StatFilterType.MASS, 3); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new FireBlastGoal(entity, lv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoGoal.java new file mode 100644 index 000000000..126343180 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoGoal.java @@ -0,0 +1,42 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.projectiles.FireTornado; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class FireTornadoGoal extends MultiTargetRangedGoal implements IApostleGoal { + + public FireTornadoGoal(AbstractGolemEntity golem, int lv) { + super(200, 0, 16 + lv * 2, golem, lv); + } + + @Override + protected int searchRange() { + return 16 + lv * 2; + } + + @Override + protected int getMaxTarget() { + return lv + 2; + } + + @Override + protected int cd() { + return 10; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + var level = golem.level(); + double d1 = target.getX() - golem.getX(); + double d2 = target.getY(0.5F) - golem.getY(0.5F); + double d3 = target.getZ() - golem.getZ(); + FireTornado e = new FireTornado(level, golem, d1, d2, d3); + e.setOwnerId(golem.getUUID()); + e.setTotalLife(140 + 20 * lv); + e.setPos(golem.getX(), golem.getY(), golem.getZ()); + e.setDamage(9 + 3 * lv); + level.addFreshEntity(e); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoModifier.java new file mode 100644 index 000000000..80e9b3467 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/FireTornadoModifier.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.projectiles.FireTornado; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +import java.util.function.BiConsumer; + +public class FireTornadoModifier extends GolemModifier implements IApostleModifier { + + public FireTornadoModifier() { + super(StatFilterType.MASS, 5); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new FireTornadoGoal(entity, lv)); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + if (event.getSource().getDirectEntity() instanceof FireTornado && event.getSource().getEntity() == entity) { + event.setAmount(event.getAmount() * (1 + 0.5f * (level - 1))); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastGoal.java new file mode 100644 index 000000000..6bc42f177 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastGoal.java @@ -0,0 +1,45 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.projectiles.HellBlast; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; + +public class HellBlastGoal extends MultiTargetRangedGoal implements IApostleGoal { + + public HellBlastGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 16, golem, lv); + } + + protected int getMaxTarget() { + return lv * 2; + } + + @Override + protected int searchRange() { + return 16; + } + + @Override + protected int cd() { + return Math.max(4 - lv, 0) * 2; + } + + protected void performAttackImpl(LivingEntity target) { + var level = golem.level(); + Vec3 dir = target.position() + .add(0, target.getBbHeight() / 2, 0) + .subtract(golem.getEyePosition()) + .normalize(); + HellBlast hellBlast = new HellBlast( + golem.getX() + dir.x / (double) 2.0F, + this.golem.getEyeY() - 0.2, + this.golem.getZ() + dir.z / (double) 2.0F, + dir.x, dir.y, dir.z, level); + hellBlast.setDamage(10 + lv * 10); + hellBlast.setOwner(golem); + level.addFreshEntity(hellBlast); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastModifier.java new file mode 100644 index 000000000..a3750ebbe --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBlastModifier.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class HellBlastModifier extends GolemModifier implements IApostleModifier { + + public HellBlastModifier() { + super(StatFilterType.MASS, 3); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(3, new HellBlastGoal(entity, lv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltGoal.java new file mode 100644 index 000000000..606628189 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltGoal.java @@ -0,0 +1,45 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.projectiles.HellBolt; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; + +public class HellBoltGoal extends MultiTargetRangedGoal implements IApostleGoal { + + public HellBoltGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 35, golem, lv); + } + + protected int getMaxTarget() { + return lv * 4; + } + + @Override + protected int searchRange() { + return 35; + } + + @Override + protected int cd() { + return Math.max(4 - lv, 0); + } + + protected void performAttackImpl(LivingEntity target) { + var level = golem.level(); + Vec3 dir = target.position() + .add(0, target.getBbHeight() / 2, 0) + .subtract(golem.getEyePosition()).normalize(); + HellBolt hellBolt = new HellBolt( + golem.getX() + dir.x / (double) 2.0F, + golem.getEyeY() - 0.2, + golem.getZ() + dir.z / (double) 2.0F, dir.x, dir.y, dir.z, level); + hellBolt.setOwner(golem); + hellBolt.setDamage(5 + lv * 5); + level.playSound(null, golem.getX(), golem.getY(), golem.getZ(), SoundEvents.BLAZE_SHOOT, golem.getSoundSource(), 1.0F, 1.0F); + level.addFreshEntity(hellBolt); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltModifier.java new file mode 100644 index 000000000..459fdfdfc --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellBoltModifier.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class HellBoltModifier extends GolemModifier implements IApostleModifier { + + public HellBoltModifier() { + super(StatFilterType.MASS, 3); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(3, new HellBoltGoal(entity, lv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudGoal.java new file mode 100644 index 000000000..d87c00949 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudGoal.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import com.Polarice3.Goety.common.entities.projectiles.HellCloud; +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class HellCloudGoal extends MultiTargetRangedGoal implements IApostleGoal { + + public HellCloudGoal(AbstractGolemEntity golem, int lv) { + super(200, 0, 35, golem, lv); + } + + protected int getMaxTarget() { + return lv + 2; + } + + @Override + protected int searchRange() { + return 35; + } + + @Override + protected int cd() { + return 10; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + HellCloud hellCloud = new HellCloud(golem.level(), golem, target); + hellCloud.setRadius(3.5f + lv * 0.5f); + hellCloud.setLifeSpan(100 + 20 * lv); + hellCloud.setExtraDamage(3 + lv); + golem.level().addFreshEntity(hellCloud); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudModifier.java new file mode 100644 index 000000000..c9e00d59c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/HellCloudModifier.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.function.BiConsumer; + +public class HellCloudModifier extends GolemModifier implements IApostleModifier { + + public HellCloudModifier() { + super(StatFilterType.MASS, 5); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new HellCloudGoal(entity, lv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/MultiTargetRangedGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/MultiTargetRangedGoal.java new file mode 100644 index 000000000..cd10abf19 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/MultiTargetRangedGoal.java @@ -0,0 +1,75 @@ +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.entity.EntityTypeTest; + +import javax.annotation.Nullable; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.Optional; + +public abstract class MultiTargetRangedGoal extends BaseRangedAttackGoal { + + protected final int lv; + @Nullable + private LinkedList targets = null; + private int cd = 0; + + public MultiTargetRangedGoal(int waitTime, int near, int far, AbstractGolemEntity golem, int lv) { + super(waitTime, near, far, golem, lv); + this.lv = lv; + } + + protected void makeTarget() { + var list = golem.level().getEntities( + EntityTypeTest.forClass(LivingEntity.class), + golem.getBoundingBox().inflate(searchRange()), + e -> golem.canAttack(e) && golem.hasLineOfSight(e) && golem.predicateTarget(e)); + list.sort(Comparator.comparing(ke -> Optional.ofNullable( + TargetManager.predicateTarget(golem, ke) + ).map(Enum::ordinal).orElse(100))); + + targets = new LinkedList<>(); + for (var e : list) { + if (targets.size() < getMaxTarget()) + targets.add(e); + else break; + } + } + + protected abstract int searchRange(); + + protected abstract int getMaxTarget(); + + protected abstract int cd(); + + @Override + protected final boolean performAttack(LivingEntity target) { + if (targets == null) { + makeTarget(); + } + if (cd > 0) { + cd--; + return false; + } + if (targets.isEmpty()) { + targets = null; + return true; + } + var e = targets.poll(); + if (e.isAlive()) { + performAttackImpl(e); + cd = cd(); + } + if (targets.isEmpty()) { + targets = null; + return true; + } + return false; + } + + protected abstract void performAttackImpl(LivingEntity target); +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/package-info.java new file mode 100644 index 000000000..2c6e0e524 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/multi/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.goety.multi; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/package-info.java new file mode 100644 index 000000000..2be6dc25e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.goety; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmorItem.java new file mode 100644 index 000000000..350b0566d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmorItem.java @@ -0,0 +1,48 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.l2damagetracker.init.L2DamageTracker; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class ApollyonArmorItem extends MetalGolemArmorItem { + + public ApollyonArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + int bonus = (int) (MGConfig.COMMON.soulHealingArmorBonus.get().floatValue() * 100); + list.add(MGLangData.APOCALYPTIUM_ARMOR.get(bonus)); + } + + @Override + protected String namespace(String def) { + return GRDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(L2DamageTracker.REDUCTION.get(), new AttributeModifier(uuid, "Apollyon Armor", -0.2, AttributeModifier.Operation.MULTIPLY_TOTAL)); + builder.put(GolemTypes.DYNAMIC_REDUCTION.get(), new AttributeModifier(uuid, "Apollyon Armor", 0.5, AttributeModifier.Operation.ADDITION)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmors.java new file mode 100644 index 000000000..efebcabc2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonArmors.java @@ -0,0 +1,130 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.goety.revelation.GRArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class ApollyonArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "apocalyptium_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "apocalyptium_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "apocalyptium_shinguard"), "main"); + public static final ModelLayerLocation BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "apocalyptium_boots"), "main"); + + static { + GolemModelPath.register(APOLLYON_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(APOLLYON_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(APOLLYON_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + GolemModelPath.register(APOLLYON_BOOTS, + new GolemModelPath(BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots2") + ))); + } + + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 43).addBox(-4.5F, -45.0F, -8.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(36, 43).addBox(-5.0F, -38.0F, -9.0F, 10.0F, 5.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + PartDefinition cube_r4 = head1.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(100, 67).addBox(0.0F, -1.0F, -3.0F, 1.0F, 2.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(84, 100).addBox(11.0F, -1.0F, -3.0F, 1.0F, 2.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-6.0F, -44.0F, -4.0F, 1.0036F, 0.0F, 0.0F)); + + PartDefinition cube_r5 = head1.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(62, 16).addBox(-1.0F, -2.0F, -3.0F, 2.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -43.0F, -7.0F, 0.6981F, 0.0F, 0.0F)); + + PartDefinition cube_r6 = head1.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(36, 58).addBox(-4.0F, -3.0F, -4.0F, 9.0F, 5.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -39.0F, -7.0F, 0.4754F, -0.7268F, -0.3295F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -6.5F, 19.0F, 13.0F, 12.0F, new CubeDeformation(0.0F)) + .texOffs(62, 0).addBox(-9.0F, -42.0F, 7.0F, 17.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r1 = body1.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(42, 25).addBox(0.0F, -3.0F, -1.0F, 8.0F, 5.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -30.0F, -6.0F, 0.0F, 0.0F, -0.1745F)); + + PartDefinition cube_r2 = body1.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(0, 25).addBox(-8.0F, -3.0F, -1.0F, 8.0F, 5.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -30.0F, -6.0F, 0.0F, 0.0F, 0.1745F)); + + PartDefinition cube_r3 = body1.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(96, 0).addBox(-4.0F, -4.0F, -1.0F, 8.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -28.0F, -7.0F, 0.0F, 0.0F, 0.7854F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(38, 72).addBox(-15.0F, -34.0F, -4.0F, 6.0F, 11.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(66, 77).addBox(-13.5F, -15.0F, -3.5F, 5.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(18, 102).addBox(-17.0F, -18.0F, 0.0F, 4.0F, 13.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 100).addBox(-13.5F, -22.0F, -3.5F, 2.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r7 = body2.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(90, 89).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 3.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-13.0F, -35.0F, 1.0F, 0.6109F, 0.0F, 0.0F)); + + PartDefinition cube_r8 = body2.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(24, 91).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 3.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-16.0F, -30.0F, 1.0F, 0.4548F, -0.276F, -0.1325F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(72, 58).addBox(-13.0F, -34.0F, -4.0F, 6.0F, 11.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 84).addBox(-13.5F, -15.0F, -3.5F, 5.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(26, 102).addBox(-9.0F, -18.0F, 0.0F, 4.0F, 13.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(100, 55).addBox(-10.5F, -22.0F, -3.5F, 2.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(22.0F, 31.0F, 0.0F)); + + PartDefinition cube_r9 = body3.addOrReplaceChild("cube_r9", CubeListBuilder.create().texOffs(64, 93).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 3.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -35.0F, 1.0F, 0.6109F, 0.0F, 0.0F)); + + PartDefinition cube_r10 = body3.addOrReplaceChild("cube_r10", CubeListBuilder.create().texOffs(44, 91).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 3.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-6.0F, -30.0F, 1.0F, 0.4548F, 0.276F, 0.1325F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(0, 72).addBox(-5.5F, -20.0F, -4.0F, 11.0F, 4.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(76, 43).addBox(-8.0F, -14.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(84, 16).addBox(-8.0F, -14.0F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition boots1 = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create().texOffs(84, 28).addBox(-4.0F, -2.5F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + PartDefinition boots2 = left_leg.addOrReplaceChild("boots2", CubeListBuilder.create().texOffs(90, 77).addBox(-4.0F, -2.5F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonSword.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonSword.java new file mode 100644 index 000000000..2ffb7973f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/ApollyonSword.java @@ -0,0 +1,114 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import com.Polarice3.Goety.common.effects.GoetyEffects; +import com.Polarice3.Goety.utils.SEHelper; +import com.tterrag.registrate.util.entry.ItemEntry; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IAttackListenerWeapon; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.loaders.SeparateTransformsModelBuilder; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; + +public class ApollyonSword extends MetalGolemWeaponItem implements IAttackListenerWeapon { + + public ApollyonSword(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { + super(properties, attackDamage, percentAttack, range, sweep); + } + + @Override + public void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand) { + long prevTime = stack.getOrCreateTag().getLong("DashAttackTimeStamp"); + if (e.level().getGameTime() < prevTime) return; + var target = e.getTarget(); + if (target == null) return; + if (!e.meleeGoal.canReachTarget(target) && e.meleeGoal.isTimeToAttack()) { + stack.getOrCreateTag().putLong("DashAttackTimeStamp", e.level().getGameTime() + 200); + Vec3 diff = target.position().subtract(e.position()); + diff = diff.normalize().scale(2); + if (diff.y <= 0.2) { + diff = diff.add(0.0F, 0.2, 0.0F); + } + e.setDeltaMovement(diff); + e.hasImpulse = true; + } + } + + @Override + public void onAttack(AttackCache cache, DamageSource source, MetalGolemEntity e, ItemStack stack) { + var target = cache.getAttackTarget(); + target.invulnerableTime = 0; + float hp = target.getHealth(); + var tag = stack.getOrCreateTag(); + var id = target.getUUID(); + if (tag.hasUUID("TargetUUID")) { + var old = tag.getUUID("TargetUUID"); + if (old.equals(id)) + hp = Math.min(hp, tag.getFloat("TargetHealth")); + } + tag.putUUID("TargetUUID", id); + tag.putFloat("TargetHealth", hp); + target.addEffect(new MobEffectInstance(GoetyEffects.CURSED.get(), 60, 0), e); + } + + @Override + public void onDamage(AttackCache cache, DamageSource source, MetalGolemEntity e, ItemStack stack) { + float diff = cache.getAttackTarget().getHealth() - stack.getOrCreateTag().getFloat("TargetHealth"); + var dmg = Math.max( + e.getAttributeValue(Attributes.ATTACK_DAMAGE), + Math.max(cache.getPreDamageOriginal(), cache.getPreDamage())); + var dmg2 = Math.max(dmg, Math.sqrt(dmg * cache.getAttackTarget().getMaxHealth())); + cache.addDealtModifier(DamageModifier.nonlinearMiddle(81, x -> { + var ans = Math.max(x, (float) dmg2) + Math.max(diff, 0); + if (e.getOwner() != null) + SEHelper.increaseSouls(e.getOwner(), (int) ans); + return ans; + })); + + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + list.add(MGLangData.APOCALYPTIUM_SWORD.get()); + list.add(MGLangData.APOCALYPTIUM_DASH.get()); + } + + public static ItemEntry buildItem(String id) { + return REGISTRATE.item(id, p -> new ApollyonSword(p.stacksTo(1).fireResistant(), + 0, 1, 2, 2)) + .model((ctx, pvd) -> + pvd.getBuilder(ctx.getName()) + .guiLight(BlockModel.GuiLight.FRONT) + .customLoader(SeparateTransformsModelBuilder::begin) + .base(new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(new ModelFile.UncheckedModelFile(ModularGolems.loc("custom/" + id))) + .texture("tex", GRCompatRegistry.grLoc("item/equipments/" + ctx.getName()))) + .perspective(ItemDisplayContext.GUI, new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(pvd.getExistingFile(pvd.mcLoc("item/generated"))) + .texture("layer0", GRCompatRegistry.grLoc("item/equipments/" + ctx.getName() + "_icon")))) + .defaultLang().register(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRArmorPaths.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRArmorPaths.java new file mode 100644 index 000000000..0f58eb53d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRArmorPaths.java @@ -0,0 +1,14 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; + +public class GRArmorPaths { + + public static final ResourceLocation + APOLLYON_HELMETS = ModularGolems.loc("apocalyptium/helmet"), + APOLLYON_CHESTPLATES = ModularGolems.loc("apocalyptium/chestplate"), + APOLLYON_LEGGINGS = ModularGolems.loc("apocalyptium/shinguard"), + APOLLYON_BOOTS = ModularGolems.loc("apocalyptium/boots"); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRClient.java new file mode 100644 index 000000000..cd91edffe --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRClient.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; +import dev.xkmc.modulargolems.compat.materials.twilightforest.client.FieryArmors; +import net.minecraftforge.client.event.EntityRenderersEvent; + +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.regAndAdd; + +public class GRClient extends ClientModDispatch { + + @Override + public void dispatchEntityLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { + regAndAdd(event, ApollyonArmors.HELMET_LAYER, ApollyonArmors::createHelmet); + regAndAdd(event, ApollyonArmors.CHESTPLATE_LAYER, ApollyonArmors::createChestplate); + regAndAdd(event, ApollyonArmors.SHINGUARD_LAYER, ApollyonArmors::createLeggings); + regAndAdd(event, ApollyonArmors.BOOTS_LAYER, ApollyonArmors::createBoots); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRCompatRegistry.java new file mode 100644 index 000000000..097003b80 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRCompatRegistry.java @@ -0,0 +1,84 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.compat.materials.goety.title.*; +import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ArmorItem; + +import static dev.xkmc.modulargolems.compat.materials.goety.GoetyCompatRegistry.REV_ARMOR; +import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; +import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class GRCompatRegistry { + + public static final ItemEntry APOCALYPTIUM_HELMET, APOCALYPTIUM_CHESTPLATE, APOCALYPTIUM_SHINGUARD, APOCALYPTIUM_BOOTS; + public static final ItemEntry STELLAR_APOCALYPSE; + public static final RegistryEntry CD_BYPASS; + public static final RegistryEntry REVIVE; + public static final RegistryEntry BOW; + public static final RegistryEntry CURSE; + public static final RegistryEntry FAST; + + public static final ItemEntry UPGRADE_CD, UPGRADE_BOW, UPGRADE_CURSE, UPGRADE_FAST; + + static { + APOCALYPTIUM_HELMET = REGISTRATE.item("apocalyptium_helmet", p -> new ApollyonArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 16, 10, GRArmorPaths.APOLLYON_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, grLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + APOCALYPTIUM_CHESTPLATE = REGISTRATE.item("apocalyptium_chestplate", p -> new ApollyonArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 20, 10, GRArmorPaths.APOLLYON_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, grLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + APOCALYPTIUM_SHINGUARD = REGISTRATE.item("apocalyptium_shinguard", p -> new ApollyonArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 12, 10, GRArmorPaths.APOLLYON_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, grLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + APOCALYPTIUM_BOOTS = REGISTRATE.item("apocalyptium_boots", p -> new ApollyonArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 12, 10, GRArmorPaths.APOLLYON_BOOTS)) + .model((ctx, pvd) -> pvd.generated(ctx, grLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + STELLAR_APOCALYPSE = ApollyonSword.buildItem("stellar_apocalypse"); + + CD_BYPASS = reg("the_abhorrent", CooldownBypassModifier::new, "The Abhorrent", + "Reduce target invulnerability frames on hit"); + BOW = reg("the_terrible", FastBowModifier::new, "The Terrible", + "Golem draws bow faster. Shoots %s arrows each toward at most %s targets"); + CURSE = reg("the_profane", CurseModifier::new, "The Profane", + "Golem remove %s random positive effects from target on hit"); + FAST = reg("the_atrocious", FastSkillModifier::new, "The Atrocious", + "Reduce Apostle modifier skill cooldown"); + REVIVE = reg("the_risen", ReviveModifier::new, "The Risen", + "Golem drops holder item with 0 health on death. Golem holder item can still heal when it has no health"); + + UPGRADE_CD = regModUpgrade("the_abhorrent", () -> CD_BYPASS, GRDispatch.MODID) + .lang("Apostle Title: The Abhorrent").register(); + UPGRADE_BOW = regModUpgrade("the_terrible", () -> BOW, GRDispatch.MODID) + .lang("Apostle Title: The Terrible").register(); + UPGRADE_CURSE = regModUpgrade("the_profane", () -> CURSE, GRDispatch.MODID) + .lang("Apostle Title: The Profane").register(); + UPGRADE_FAST = regModUpgrade("the_atrocious", () -> FAST, GRDispatch.MODID) + .lang("Apostle Title: The Atrocious").register(); + } + + public static ResourceLocation grLoc(String id) { + return new ResourceLocation(GRDispatch.MODID, id); + } + + public static void register() { + MGTagGen.OPTIONAL_ITEM.add(pvd -> pvd.addTag(REV_ARMOR) + .addOptional(APOCALYPTIUM_HELMET.getId()) + .addOptional(APOCALYPTIUM_CHESTPLATE.getId()) + .addOptional(APOCALYPTIUM_SHINGUARD.getId()) + .addOptional(APOCALYPTIUM_BOOTS.getId()) + ); + MGTagGen.OPTIONAL_ITEM.add(pvd -> pvd.addTag(MGTagGen.SHIELD_BREAKER_WEAPONS) + .addOptional(STELLAR_APOCALYPSE.getId())); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRConfigGen.java new file mode 100644 index 000000000..0386da5bb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRConfigGen.java @@ -0,0 +1,48 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyCompatRegistry; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class GRConfigGen extends ConfigDataProvider { + + public GRConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Goety Relevation"); + } + + @Override + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(GRDispatch.MODID, GRDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(GRDispatch.MODID, "apocalyptium"), + Ingredient.of(GoetyCompatRegistry.REV_INGOT)) + .addStat(GolemTypes.STAT_HEALTH.get(), 666) + .addStat(GolemTypes.STAT_ATTACK.get(), 33) + .addStat(GolemTypes.STAT_REGEN.get(), 6) + .addStat(GolemTypes.STAT_SPEED.get(), 0.66) + .addStat(GolemTypes.STAT_RANGE.get(), 1) + .addStat(GolemTypes.STAT_SWEEP.get(), 3) + .addStat(GolemTypes.STAT_DR.get(), 2) + .addModifier(GolemModifiers.DYNAMIC_REDUCTION.get(), 1) + .addModifier(GolemModifiers.ADD_SLOT.get(), 2) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.MAGIC_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.EXPLOSION_RES.get(), 3) + .addModifier(GoetyCompatRegistry.SOUL_REPAIR.get(), 2) + .addModifier(GoetyCompatRegistry.APOSTLE.get(), 1) + .addModifier(GRCompatRegistry.REVIVE.get(), 1) + .addModifier(GRCompatRegistry.CD_BYPASS.get(), 1) + .addModifier(GRCompatRegistry.BOW.get(), 2) + .addModifier(GoetyCompatRegistry.SOUL.get(), 2) + .end() + + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRDispatch.java new file mode 100644 index 000000000..95f7c7b55 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRDispatch.java @@ -0,0 +1,65 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.mob_weapon_api.registry.WeaponRegistry; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyDispatch; +import dev.xkmc.modulargolems.compat.materials.goety.title.ApollyonBowGoal; +import dev.xkmc.modulargolems.compat.misc.PatchouliFlagHelper; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.Optional; + +public class GRDispatch extends ModDispatch { + + public static boolean isLoaded() { + return ModList.get().isLoaded(GRDispatch.MODID) || ModList.get().isLoaded(GoetyDispatch.MODID) && !FMLLoader.isProduction(); + } + + public static final String MODID = "goety_revelation"; + + public GRDispatch() { + super(() -> GRClient::new); + GRCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".apocalyptium", "Apocalyptium"); + } + + @Override + public void commonSetup() { + if (ModList.get().isLoaded("patchouli")) { + boolean flag = ForgeRegistries.ITEMS.containsKey( + new ResourceLocation(MODID, "apocalyptium_ingot")); + PatchouliFlagHelper.setFlag("modulargolems:goety_revelation:apocalyptium", flag); + } + GolemWeaponRegistry.HUMANOID.register(new ResourceLocation(MODID, "bow"), + (golem, stack, hand) -> + golem instanceof HumanoidGolemEntity h && h.getModifiers().getOrDefault( + GRCompatRegistry.BOW.get(), 0) > 0 ? + WeaponRegistry.BOW.getProperties(stack) : Optional.empty(), + (golem, melee) -> new ApollyonBowGoal<>(golem, melee, 1.0D, 35) + ); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + GRRecipeGen.genRecipe(pvd); + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new GRConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRRecipeGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRRecipeGen.java new file mode 100644 index 000000000..a6941e9ea --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/GRRecipeGen.java @@ -0,0 +1,103 @@ +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import com.Polarice3.Goety.common.items.ModItems; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyCompatRegistry; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; +import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.SmithingTransformRecipeBuilder; +import net.minecraft.world.item.crafting.Ingredient; + +import static dev.xkmc.modulargolems.compat.materials.goety.revelation.GRDispatch.MODID; +import static dev.xkmc.modulargolems.init.data.RecipeGen.unlock; + +public class GRRecipeGen { + + public static void genRecipe(RegistrateRecipeProvider pvd) { + + var output = ConditionalRecipeWrapper.mod(pvd, MODID); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GRCompatRegistry.UPGRADE_CD.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .pattern("BFB").pattern("BOB").pattern("BUB") + .define('U', GolemItems.EMPTY_UPGRADE) + .define('O', GoetyCompatRegistry.REV_INGOT) + .define('F', ModItems.UNHOLY_FABRIC.get()) + .define('B', ModItems.UNHOLY_BLOOD.get()) + .save(output); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GRCompatRegistry.UPGRADE_BOW.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .pattern(" B ").pattern("FOF").pattern(" U ") + .define('U', GolemItems.EMPTY_UPGRADE) + .define('O', GoetyCompatRegistry.REV_INGOT) + .define('F', ModItems.UNHOLY_FABRIC.get()) + .define('B', ModItems.UNHOLY_BLOOD.get()) + .save(output); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GRCompatRegistry.UPGRADE_FAST.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .pattern("BBB").pattern("FOF").pattern("FUF") + .define('U', GolemItems.EMPTY_UPGRADE) + .define('O', GoetyCompatRegistry.REV_INGOT) + .define('F', ModItems.UNHOLY_FABRIC.get()) + .define('B', ModItems.UNHOLY_BLOOD.get()) + .save(output); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + GRCompatRegistry.UPGRADE_CURSE.get())::unlockedBy, ModItems.UNHOLY_HAT.get()) + .pattern(" F ").pattern("BOB").pattern(" U ") + .define('U', GolemItems.EMPTY_UPGRADE) + .define('O', GoetyCompatRegistry.REV_INGOT) + .define('F', ModItems.UNHOLY_FABRIC.get()) + .define('B', ModItems.UNHOLY_BLOOD.get()) + .save(output); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(GoetyCompatRegistry.REV_TEMPLATE), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()), + Ingredient.of(GoetyCompatRegistry.REV_RING), + RecipeCategory.COMBAT, GRCompatRegistry.APOCALYPTIUM_HELMET.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_HELMET.get()) + .save(output, GRCompatRegistry.APOCALYPTIUM_HELMET.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(GoetyCompatRegistry.REV_TEMPLATE), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()), + Ingredient.of(GoetyCompatRegistry.REV_RING), + RecipeCategory.COMBAT, GRCompatRegistry.APOCALYPTIUM_CHESTPLATE.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE.get()) + .save(output, GRCompatRegistry.APOCALYPTIUM_CHESTPLATE.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(GoetyCompatRegistry.REV_TEMPLATE), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()), + Ingredient.of(GoetyCompatRegistry.REV_RING), + RecipeCategory.COMBAT, GRCompatRegistry.APOCALYPTIUM_SHINGUARD.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD.get()) + .save(output, GRCompatRegistry.APOCALYPTIUM_SHINGUARD.getId()); + + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(GoetyCompatRegistry.REV_TEMPLATE), + Ingredient.of(GolemItems.BARBARICFLAMEVANGUARD_BOOTS.get()), + Ingredient.of(GoetyCompatRegistry.REV_RING), + RecipeCategory.COMBAT, GRCompatRegistry.APOCALYPTIUM_BOOTS.get())::unlocks, + GolemItems.BARBARICFLAMEVANGUARD_BOOTS.get()) + .save(output, GRCompatRegistry.APOCALYPTIUM_BOOTS.getId()); + + var sword = GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()].get(); + unlock(pvd, SmithingTransformRecipeBuilder.smithing( + Ingredient.of(GoetyCompatRegistry.REV_TEMPLATE), + Ingredient.of(sword), + Ingredient.of(GoetyCompatRegistry.REV_RING), + RecipeCategory.COMBAT, GRCompatRegistry.STELLAR_APOCALYPSE.get())::unlocks, + sword) + .save(output, GRCompatRegistry.STELLAR_APOCALYPSE.getId()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/package-info.java new file mode 100644 index 000000000..299fcfacd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/revelation/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.goety.revelation; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ApollyonBowGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ApollyonBowGoal.java new file mode 100644 index 000000000..438e2b952 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ApollyonBowGoal.java @@ -0,0 +1,121 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.mob_weapon_api.api.ai.ISmartUser; +import dev.xkmc.mob_weapon_api.api.ai.IWeaponHolder; +import dev.xkmc.mob_weapon_api.api.goals.IMeleeGoal; +import dev.xkmc.mob_weapon_api.api.projectile.IBowBehavior; +import dev.xkmc.mob_weapon_api.example.goal.SmartBowAttackGoal; +import dev.xkmc.mob_weapon_api.registry.WeaponRegistry; +import dev.xkmc.modulargolems.compat.materials.goety.GoetyCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.goety.revelation.GRCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.entity.EntityTypeTest; + +import javax.annotation.Nullable; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.Optional; + +public class ApollyonBowGoal> extends SmartBowAttackGoal { + + public ApollyonBowGoal(E mob, IMeleeGoal melee, double speed, double radius) { + super(mob, melee, speed, radius); + } + + public ApollyonBowGoal(E mob, IWeaponHolder holder, IMeleeGoal melee, double speed, double radius) { + super(mob, holder, melee, speed, radius); + } + + protected void makeTarget(int range, int max) { + var list = mob.level().getEntities( + EntityTypeTest.forClass(LivingEntity.class), + mob.getBoundingBox().inflate(range), + e -> mob.canAttack(e) && mob.hasLineOfSight(e)); + list.sort(Comparator.comparing(ke -> Optional.ofNullable( + TargetManager.predicateTarget(mob, ke) + ).map(Enum::ordinal).orElse(100))); + + targets = new LinkedList<>(); + for (var e : list) { + if (targets.size() < max) + targets.add(e); + else break; + } + } + + @Override + public void tick() { + this.doMelee(); + this.strafing(); + LivingEntity target = this.mob.getTarget(); + InteractionHand hand = this.holder.getWeaponHand(); + ItemStack stack = this.mob.getItemInHand(hand); + Optional weapon = WeaponRegistry.BOW.get(this.mob, stack); + if (weapon.isEmpty()) return; + if (this.mob.isUsingItem() && target != null) { + ISmartUser user = this.holder.toUser(); + double dist = this.mob.distanceTo(target); + if (this.seeTime < -60) { + this.mob.stopUsingItem(); + } else if (this.seeTime > 0) { + int i = this.mob.getTicksUsingItem(); + int pullTime = weapon.get().getPreferredPullTime(user, stack, dist); + if (i >= pullTime) { + if (performRangedAttack(weapon.get().getPowerForTime(user, stack, i), stack, hand)) + mob.stopUsingItem(); + } else { + weapon.get().tickUsingBow(user, stack); + } + } + } else if (this.seeTime >= -60) { + ISmartUser user = this.holder.toUser(); + if (target != null) { + double dist = this.mob.distanceTo(target); + int pullTime = weapon.get().getPreferredPullTime(user, stack, dist); + if (pullTime <= 0) { + this.performRangedAttack(target, 0.0F, stack, hand); + return; + } + } + this.mob.startUsingItem(hand); + weapon.ifPresent((e) -> e.startUsingBow(user, stack)); + } + } + + @Nullable + private LinkedList targets = null; + private int count; + + public boolean performRangedAttack(float power, ItemStack stack, InteractionHand hand) { + int lv = mob.getModifiers().getOrDefault(GRCompatRegistry.BOW.get(), 0); + int range = 35; + int max = 4 + 4 * lv; + int maxCount = 2 + lv; + if (targets == null) { + makeTarget(range, max); + count = stack.is(GoetyCompatRegistry.REV_BOW) ? maxCount : 1; + } + if (targets.isEmpty()) { + targets = null; + return true; + } + var old = mob.getTarget(); + for (var e : targets) { + if (e.isAlive()) { + mob.setTarget(e); + performRangedAttack(e, power, stack, hand); + } + } + mob.setTarget(old); + count--; + if (count <= 0) { + targets = null; + return true; + } + return false; + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CooldownBypassModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CooldownBypassModifier.java new file mode 100644 index 000000000..42698efdd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CooldownBypassModifier.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +public class CooldownBypassModifier extends GolemModifier { + + public CooldownBypassModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + event.getEntity().invulnerableTime -= 5 * level; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CurseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CurseModifier.java new file mode 100644 index 000000000..4d809b398 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/CurseModifier.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.effect.MobEffect; +import net.minecraftforge.event.entity.living.LivingAttackEvent; + +import java.util.ArrayList; +import java.util.List; + +public class CurseModifier extends GolemModifier { + + public CurseModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void onAttackTarget(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + var e = event.getEntity(); + List list = new ArrayList<>(); + for (var eff : e.getActiveEffectsMap().keySet()) { + if (eff.isBeneficial()) + list.add(eff); + } + var rand = entity.getRandom(); + for (int i = 0; i < level; i++) { + if (list.isEmpty()) return; + var sel = list.remove(rand.nextInt(list.size())); + e.removeEffect(sel); + } + } + + public List getDetail(int v) { + return List.of(Component.translatable(getDescriptionId() + ".desc", v).withStyle(ChatFormatting.GREEN)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastBowModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastBowModifier.java new file mode 100644 index 000000000..d43c214c5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastBowModifier.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.mob_weapon_api.registry.WeaponRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +public class FastBowModifier extends GolemModifier { + + public FastBowModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + if (!golem.isUsingItem()) return; + if (WeaponRegistry.BOW.isValidItem(golem.getUseItem())) { + golem.speedUpUseItem(level); + } + } + + @Override + public boolean canExistOn(GolemPart part) { + return part == GolemItems.HUMANOID_ARMS.get(); + } + + public List getDetail(int v) { + return List.of(Component.translatable(getDescriptionId() + ".desc", 2 + v, 4 + 4 * v).withStyle(ChatFormatting.GREEN)); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastSkillModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastSkillModifier.java new file mode 100644 index 000000000..28967b514 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/FastSkillModifier.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.modulargolems.compat.materials.goety.modifier.IApostleGoal; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.BaseRangedAttackGoal; + +public class FastSkillModifier extends GolemModifier { + + public FastSkillModifier() { + super(StatFilterType.MASS, 1); + } + + @Override + public void onAiStep(AbstractGolemEntity golem, int level) { + for (var e : golem.goalSelector.getAvailableGoals()) { + var goal = e.getGoal(); + if (goal instanceof BaseRangedAttackGoal ranged && goal instanceof IApostleGoal) { + ranged.attackTime -= level; + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ReviveModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ReviveModifier.java new file mode 100644 index 000000000..07b587291 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/ReviveModifier.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; + +import java.util.function.Consumer; + +public class ReviveModifier extends GolemModifier { + + public ReviveModifier() { + super(StatFilterType.HEAD, 1); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.RECYCLE); + addFlag.accept(GolemFlags.REVIVE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/package-info.java new file mode 100644 index 000000000..0a91e680d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/goety/title/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.goety.title; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFCompatRegistry.java new file mode 100644 index 000000000..f9e7d5324 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFCompatRegistry.java @@ -0,0 +1,29 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers.FireDragonAttackModifier; +import dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers.IceDragonAttackModifier; +import dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers.IceDragonDefenseModifier; +import dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers.LightningDragonAttackModifier; + +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class IAFCompatRegistry { + + public static final RegistryEntry FIRE_ATK; + public static final RegistryEntry ICE_ATK; + public static final RegistryEntry LIGHTNING_ATK; + public static final RegistryEntry ICE_DEF; + + static { + FIRE_ATK = reg("fire_dragonsteel_attack", FireDragonAttackModifier::new, "Ignite and knockback target"); + ICE_ATK = reg("ice_dragonsteel_attack", IceDragonAttackModifier::new, "Freeze, slow, and knockback target"); + LIGHTNING_ATK = reg("lightning_dragonsteel_attack", LightningDragonAttackModifier::new, "Summon lightning bolt to attack target"); + ICE_DEF = reg("ice_dragonsteel_armor", IceDragonDefenseModifier::new, "Freeze, slow, and knockback attacker when attacked"); + } + + public static void register() { + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFConfigGen.java new file mode 100644 index 000000000..1d8728cda --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFConfigGen.java @@ -0,0 +1,44 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.blazegear.BGDispatch; +import dev.xkmc.modulargolems.compat.materials.iceandfire.proxy.IAFProxy; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class IAFConfigGen extends ConfigDataProvider { + + public IAFConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Ice and Fire"); + } + + @Override + public void add(Collector collector) { + collector.add(ModularGolems.MATERIALS, new ResourceLocation(IAFDispatch.MODID, IAFDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(IAFDispatch.MODID, "fire_dragonsteel"), Ingredient.of(IAFProxy.get().ingotFireSteel().get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 400) + .addStat(GolemTypes.STAT_ATTACK.get(), 40) + .addModifier(IAFCompatRegistry.FIRE_ATK.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .end() + .addMaterial(new ResourceLocation(IAFDispatch.MODID, "ice_dragonsteel"), Ingredient.of(IAFProxy.get().ingotIceSteel().get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 400) + .addStat(GolemTypes.STAT_ATTACK.get(), 40) + .addModifier(IAFCompatRegistry.ICE_ATK.get(), 1) + .addModifier(IAFCompatRegistry.ICE_DEF.get(), 1) + .end() + .addMaterial(new ResourceLocation(IAFDispatch.MODID, "lightning_dragonsteel"), Ingredient.of(IAFProxy.get().ingotLightningSteel().get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 400) + .addStat(GolemTypes.STAT_ATTACK.get(), 40) + .addModifier(IAFCompatRegistry.LIGHTNING_ATK.get(), 1) + .addModifier(GolemModifiers.THUNDER_IMMUNE.get(), 1) + .end() + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFDispatch.java new file mode 100644 index 000000000..87a4763a8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/IAFDispatch.java @@ -0,0 +1,36 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import net.minecraft.data.DataGenerator; +import org.jetbrains.annotations.Nullable; + +public class IAFDispatch extends ModDispatch { + + public static final String MODID = "iceandfire"; + + public IAFDispatch() { + IAFCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".fire_dragonsteel", "Fire Dragonsteel"); + pvd.add("golem_material." + MODID + ".ice_dragonsteel", "Ice Dragonsteel"); + pvd.add("golem_material." + MODID + ".lightning_dragonsteel", "Lightning Dragonsteel"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + + } + + @Nullable + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new IAFConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/FireDragonAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/FireDragonAttackModifier.java new file mode 100644 index 000000000..60705ef9f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/FireDragonAttackModifier.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers; + +import dev.xkmc.modulargolems.compat.materials.iceandfire.proxy.IAFProxy; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class FireDragonAttackModifier extends GolemModifier { + + public FireDragonAttackModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + IAFProxy.get().fireHit(event.getEntity(), entity, level); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonAttackModifier.java new file mode 100644 index 000000000..73a53fe86 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonAttackModifier.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers; + +import dev.xkmc.modulargolems.compat.materials.iceandfire.proxy.IAFProxy; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class IceDragonAttackModifier extends GolemModifier { + + public IceDragonAttackModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + IAFProxy.get().iceHit(event.getEntity(), entity, level); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonDefenseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonDefenseModifier.java new file mode 100644 index 000000000..1bad6be6e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/IceDragonDefenseModifier.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers; + +import dev.xkmc.modulargolems.compat.materials.iceandfire.proxy.IAFProxy; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +public class IceDragonDefenseModifier extends GolemModifier { + + public IceDragonDefenseModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + if (event.getSource().getEntity() instanceof LivingEntity le && le.distanceTo(entity) < 6) + IAFProxy.get().iceHit(le, entity, level); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/LightningDragonAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/LightningDragonAttackModifier.java new file mode 100644 index 000000000..9de6bde60 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/LightningDragonAttackModifier.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers; + +import dev.xkmc.modulargolems.compat.materials.iceandfire.proxy.IAFProxy; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class LightningDragonAttackModifier extends GolemModifier { + + public LightningDragonAttackModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + IAFProxy.get().lightningHit(event.getEntity(), entity, level); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/package-info.java new file mode 100644 index 000000000..ce449fa2f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/modifiers/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.iceandfire.modifiers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/package-info.java new file mode 100644 index 000000000..3c2f528fa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.iceandfire; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxy.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxy.java new file mode 100644 index 000000000..c78427ba8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxy.java @@ -0,0 +1,52 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.proxy; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; + +import java.util.function.Supplier; + +public interface IAFProxy { + + class Provider { + + private static IAFProxy CACHE; + + private static IAFProxy get() { + if (CACHE != null) return CACHE; + try { + CACHE = new IAFProxyAlex(); + CACHE.ingotLightningSteel(); + return CACHE; + } catch (Throwable ignore) { + + } + try { + CACHE = new IAFProxyCE(); + CACHE.ingotLightningSteel(); + return CACHE; + } catch (Throwable ignore) { + } + throw new IllegalStateException("No valid IaF target"); + } + + } + + static IAFProxy get() { + return Provider.get(); + } + + String modid(); + + Supplier ingotIceSteel(); + + Supplier ingotFireSteel(); + + Supplier ingotLightningSteel(); + + void fireHit(LivingEntity target, LivingEntity user, int level); + + void iceHit(LivingEntity target, LivingEntity user, int level); + + void lightningHit(LivingEntity target, LivingEntity user, int level); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyAlex.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyAlex.java new file mode 100644 index 000000000..ebb060aae --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyAlex.java @@ -0,0 +1,91 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.proxy; + +import com.github.alexthe666.iceandfire.IafConfig; +import com.github.alexthe666.iceandfire.IceAndFire; +import com.github.alexthe666.iceandfire.entity.EntityFireDragon; +import com.github.alexthe666.iceandfire.entity.EntityIceDragon; +import com.github.alexthe666.iceandfire.entity.props.EntityDataProvider; +import com.github.alexthe666.iceandfire.item.IafItemRegistry; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; + +import java.util.function.Supplier; + +public class IAFProxyAlex implements IAFProxy { + + @Override + public void fireHit(LivingEntity target, LivingEntity user, int level) { + if (IafConfig.dragonWeaponFireAbility) { + if (target instanceof EntityIceDragon) { + target.hurt(user.level().damageSources().inFire(), 3.5F + 5 * level); + } + + target.setSecondsOnFire(5 * level); + target.knockback(1.0D, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } + + @Override + public void iceHit(LivingEntity target, LivingEntity user, int level) { + if (IafConfig.dragonWeaponIceAbility) { + if (target instanceof EntityFireDragon) { + target.hurt(user.level().damageSources().drown(), 3.5F + 5 * level); + } + EntityDataProvider.getCapability(target).ifPresent((data) -> data.frozenData.setFrozen(target, 100 * level)); + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 100, level)); + target.addEffect(new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 100, level)); + target.knockback(1.0D, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } + + @Override + public void lightningHit(LivingEntity target, LivingEntity user, int level) { + if (IafConfig.dragonWeaponLightningAbility) { + boolean flag = !(user instanceof Player) || !((double) user.attackAnim > 0.2D); + if (!user.level().isClientSide && flag) { + LightningBolt entity = EntityType.LIGHTNING_BOLT.create(target.level()); + assert entity != null; + entity.addTag("l2weaponry:lightning"); + entity.moveTo(target.position()); + entity.setDamage(3 + 2 * level); + if (user instanceof ServerPlayer sp) entity.setCause(sp); + if (!target.level().isClientSide) { + target.level().addFreshEntity(entity); + } + } + + if (target instanceof EntityFireDragon || target instanceof EntityIceDragon) { + target.hurt(user.level().damageSources().lightningBolt(), 1.5F + 4 * level); + } + + target.knockback(1.0D, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } + + @Override + public String modid() { + return IceAndFire.MODID; + } + + @Override + public Supplier ingotIceSteel() { + return IafItemRegistry.DRAGONSTEEL_ICE_INGOT; + } + + @Override + public Supplier ingotFireSteel() { + return IafItemRegistry.DRAGONSTEEL_FIRE_INGOT; + } + + @Override + public Supplier ingotLightningSteel() { + return IafItemRegistry.DRAGONSTEEL_LIGHTNING_INGOT; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyCE.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyCE.java new file mode 100644 index 000000000..faf1feae3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/IAFProxyCE.java @@ -0,0 +1,105 @@ +package dev.xkmc.modulargolems.compat.materials.iceandfire.proxy; + +import com.iafenvoy.iceandfire.IceAndFire; +import com.iafenvoy.iceandfire.config.IafCommonConfig; +import com.iafenvoy.iceandfire.data.component.IafEntityData; +import com.iafenvoy.iceandfire.entity.EntityFireDragon; +import com.iafenvoy.iceandfire.entity.EntityIceDragon; +import com.iafenvoy.iceandfire.registry.IafItems; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; + +import java.util.function.Supplier; + +public class IAFProxyCE implements IAFProxy { + + @Override + public void fireHit(LivingEntity target, LivingEntity user, int level) { + try { + if (IafCommonConfig.INSTANCE.armors.dragonFireAbility.getValue()) { + if (target instanceof EntityIceDragon) { + target.hurt(user.level().damageSources().inFire(), 3.5F + 5 * level); + } + target.setSecondsOnFire(5 * level); + target.knockback(1.0, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } catch (Throwable ignored) { + } + } + + @Override + public void iceHit(LivingEntity target, LivingEntity user, int level) { + try { + if (IafCommonConfig.INSTANCE.armors.dragonIceAbility.getValue()) { + if (target instanceof EntityFireDragon) { + target.hurt(user.level().damageSources().drown(), 3.5F + 5 * level); + } + + IafEntityData data = IafEntityData.get(target); + data.frozenData.setFrozen(target, 100 * level); + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 100, level)); + target.addEffect(new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 100, level)); + target.knockback(1.0, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } catch (Throwable ignored) { + } + } + + @Override + public void lightningHit(LivingEntity target, LivingEntity user, int level) { + try { + if (IafCommonConfig.INSTANCE.armors.dragonLightningAbility.getValue()) { + boolean flag = !(user instanceof Player) || !((double) user.attackAnim > 0.2); + + if (!user.level().isClientSide && flag) { + LightningBolt lightningboltentity = EntityType.LIGHTNING_BOLT.create(target.level()); + + assert lightningboltentity != null; + + lightningboltentity.getTags().add("iceandfire.bolt_skip_loot"); + lightningboltentity.getTags().add(user.getStringUUID()); + lightningboltentity.addTag("l2weaponry:lightning"); + lightningboltentity.setDamage(3 + 2 * level); + lightningboltentity.moveTo(target.position()); + if (!target.level().isClientSide) { + target.level().addFreshEntity(lightningboltentity); + } + } + + if (target instanceof EntityFireDragon || target instanceof EntityIceDragon) { + target.hurt(user.level().damageSources().lightningBolt(), 1.5F + 4 * level); + } + + target.knockback(1.0, user.getX() - target.getX(), user.getZ() - target.getZ()); + } + } catch (Throwable ignored) { + } + } + + @Override + public String modid() { + return IceAndFire.MOD_ID; + } + + @Override + public Supplier ingotIceSteel() { + return IafItems.DRAGONSTEEL_ICE_INGOT; + } + + @Override + public Supplier ingotFireSteel() { + return IafItems.DRAGONSTEEL_FIRE_INGOT; + } + + @Override + public Supplier ingotLightningSteel() { + return IafItems.DRAGONSTEEL_LIGHTNING_INGOT; + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/package-info.java new file mode 100644 index 000000000..41406b7a6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/iceandfire/proxy/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.iceandfire.proxy; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/CleanseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/CleanseModifier.java new file mode 100644 index 000000000..21d66cccc --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/CleanseModifier.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.compat.materials.l2complements; + +import dev.xkmc.l2complements.init.registrate.LCEffects; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.PotionDefenseModifier; + +import java.util.function.Consumer; + +public class CleanseModifier extends PotionDefenseModifier { + + public CleanseModifier() { + super(1, LCEffects.CLEANSE::get); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.EFFECT_IMMUNE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/EnderTeleportModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/EnderTeleportModifier.java index a54c6c0fb..68d032a3d 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/EnderTeleportModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/EnderTeleportModifier.java @@ -66,7 +66,7 @@ public void onAttacked(AbstractGolemEntity entity, LivingAttackEvent event public static boolean mayTeleport(AbstractGolemEntity entity) { long time = entity.getPersistentData().getLong(KEY); long current = entity.level().getGameTime(); - return current >= time + MGConfig.COMMON.teleportCooldown.get(); + return current < time || current >= time + MGConfig.COMMON.teleportCooldown.get(); } public static void resetCooldown(AbstractGolemEntity entity) { diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCClient.java new file mode 100644 index 000000000..801a23ee2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCClient.java @@ -0,0 +1,12 @@ +package dev.xkmc.modulargolems.compat.materials.l2complements; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; + +public class LCClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + ForceFieldLayer.registerLayer(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCCompatRegistry.java index 894d87a40..e7a5b2a7d 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCCompatRegistry.java @@ -23,7 +23,7 @@ public class LCCompatRegistry { public static final RegistryEntry FLAME; public static final RegistryEntry TELEPORT; public static final RegistryEntry CURSE, INCARCERATE; - public static final RegistryEntry CLEANSE; + public static final RegistryEntry CLEANSE; public static final RegistryEntry POSEIDITE, TOTEMIC_GOLD; public static final ItemEntry FORCE_FIELD, FREEZE_UP, FLAME_UP, TELEPORT_UP, ATK_UP, SPEED_UP, @@ -44,7 +44,7 @@ public class LCCompatRegistry { "Deal %s%% more damage to mobs sensitive to water or water based mobs"); TOTEMIC_GOLD = reg("totemic_gold", () -> new TargetBonusModifier(e -> e.getMobType() == MobType.UNDEAD), "Deal %s%% more damage to undead mobs"); - CLEANSE = reg("cleanse", () -> new PotionDefenseModifier(1, LCEffects.CLEANSE::get), "Potion Upgrade: Cleanse", null); + CLEANSE = reg("cleanse", CleanseModifier::new, "Potion Upgrade: Cleanse", null); FORCE_FIELD = regModUpgrade("force_field", () -> GolemModifiers.PROJECTILE_REJECT, LCDispatch.MODID).lang("Wither Armor Upgrade").register(); FREEZE_UP = regModUpgrade("freezing", () -> FREEZE, LCDispatch.MODID).lang("Potion Upgrade: Freezing").register(); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCDispatch.java index 658f55ed9..842d0c1fc 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2complements/LCDispatch.java @@ -26,6 +26,7 @@ public class LCDispatch extends ModDispatch { public static final String MODID = "l2complements"; public LCDispatch() { + super(() -> LCClient::new); LCCompatRegistry.register(); MinecraftForge.EVENT_BUS.register(LCDispatch.class); } @@ -111,11 +112,6 @@ public ConfigDataProvider getDataGen(DataGenerator gen) { return new LCConfigGen(gen); } - @Override - public void dispatchClientSetup() { - ForceFieldLayer.registerLayer(); - } - @SubscribeEvent(priority = EventPriority.LOW) public static void onGolemSweep(GolemSweepEvent event) { int lv = event.getStack().getEnchantmentLevel(LCEnchantments.WIND_SWEEP.get()); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/AdaptiveModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/AdaptiveModifier.java new file mode 100644 index 000000000..f89d36a6d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/AdaptiveModifier.java @@ -0,0 +1,86 @@ +package dev.xkmc.modulargolems.compat.materials.l2hostility; + +import dev.xkmc.l2hostility.content.capability.mob.CapStorageData; +import dev.xkmc.l2hostility.init.data.LHConfig; +import dev.xkmc.l2hostility.init.registrate.LHTraits; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.l2serial.serialization.codec.TagCodec; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class AdaptiveModifier extends GolemModifier { + + private static final String KEY = "LHGolemAdaptiveData"; + + public AdaptiveModifier() { + super(StatFilterType.HEALTH, 4); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + if (event.getSource().is(DamageTypeTags.BYPASSES_INVULNERABILITY) || event.getSource().is(DamageTypeTags.BYPASSES_EFFECTS)) + return; + + var root = entity.getPersistentData(); + Data data = new Data(); + if (root.contains(KEY, Tag.TAG_COMPOUND)) { + data = TagCodec.fromTag(root.getCompound(KEY), Data.class); + if (data == null) data = new Data(); + } + + String id = event.getSource().getMsgId(); + if (data.memory.contains(id)) { + data.memory.remove(id); + data.memory.add(0, id); + int val = data.adaption.compute(id, (k, oldx) -> oldx == null ? 1 : oldx + 1); + double factor = Math.pow(LHConfig.COMMON.adaptFactor.get(), val - 1); + event.setAmount((float) (event.getAmount() * factor)); + } else { + data.memory.add(0, id); + data.adaption.put(id, 1); + if (data.memory.size() > level) { + String old = data.memory.remove(data.memory.size() - 1); + data.adaption.remove(old); + } + } + var ans = TagCodec.toTag(new CompoundTag(), data); + if (ans != null) { + root.put(KEY, ans); + } + } + + @Override + public List getDetail(int v) { + List ans = new ArrayList<>(); + ans.add(Component.translatable(LHTraits.ADAPTIVE.get().getDescriptionId() + ".desc", + Component.literal("" + (int) Math.round(100 * (1 - LHConfig.COMMON.adaptFactor.get()))).withStyle(ChatFormatting.AQUA), + Component.literal("" + v).withStyle(ChatFormatting.AQUA) + ).withStyle(ChatFormatting.GREEN)); + return ans; + } + + + @SerialClass + public static class Data extends CapStorageData { + @SerialClass.SerialField + public final ArrayList memory = new ArrayList<>(); + @SerialClass.SerialField + public final HashMap adaption = new HashMap<>(); + + public Data() { + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/DispellModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/DispellModifier.java new file mode 100644 index 000000000..4403e118e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/DispellModifier.java @@ -0,0 +1,80 @@ +package dev.xkmc.modulargolems.compat.materials.l2hostility; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.CreateSourceEvent; +import dev.xkmc.l2damagetracker.contents.damage.DefaultDamageState; +import dev.xkmc.l2hostility.content.item.traits.EnchantmentDisabler; +import dev.xkmc.l2hostility.init.data.LHConfig; +import dev.xkmc.l2hostility.init.registrate.LHTraits; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +import java.util.ArrayList; +import java.util.List; + +public class DispellModifier extends GolemModifier { + + public DispellModifier() { + super(StatFilterType.ATTACK, 4); + } + + @Override + public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { + if (event.getResult() == null) return; + if (!event.getResult().validState(DefaultDamageState.BYPASS_MAGIC)) return; + event.enable(DefaultDamageState.BYPASS_MAGIC); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + var target = event.getEntity(); + List list = new ArrayList<>(); + + for (EquipmentSlot slot : EquipmentSlot.values()) { + ItemStack stack = target.getItemBySlot(slot); + if (stack.isEnchanted() && !stack.getOrCreateTag().contains("l2hostility_enchantment")) { + list.add(stack); + } + } + + if (!list.isEmpty()) { + int time = LHConfig.COMMON.dispellTime.get() * level; + int count = Math.min(level, list.size()); + + for (int i = 0; i < count; ++i) { + int index = entity.getRandom().nextInt(list.size()); + EnchantmentDisabler.disableEnchantment(entity.level(), list.remove(index), time); + } + + } + } + + @Override + public void onDamaged(AttackCache cache, AbstractGolemEntity entity, int level) { + LHTraits.DISPELL.get().onDamaged(level, entity, cache); + } + + @Override + public void onAttacked(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + LHTraits.DISPELL.get().onAttackedByOthers(level, entity, event); + } + + @Override + public List getDetail(int v) { + List ans = new ArrayList<>(); + ans.add(Component.translatable(LHTraits.DISPELL.get().getDescriptionId() + ".desc", + Component.literal("" + v).withStyle(ChatFormatting.AQUA), + Component.literal("" + LHConfig.COMMON.dispellTime.get() * v / 20).withStyle(ChatFormatting.AQUA) + ).withStyle(ChatFormatting.GREEN)); + return ans; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityCoreModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityCoreModifier.java index 174d11fe5..8f2bce4cf 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityCoreModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityCoreModifier.java @@ -1,6 +1,7 @@ package dev.xkmc.modulargolems.compat.materials.l2hostility; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; @@ -13,10 +14,10 @@ public HostilityCoreModifier(StatFilterType type, int maxLevel) { } @Override - public int addSlot(List upgrades, int lv) { + public int addSlot(List upgrades, int lv) { int ans = 0; for (var e : upgrades) { - if (e.getDefaultInstance().is(LHCompatRegistry.HOSTILITY_UPGRADE)) { + if (e.asItem().getDefaultInstance().is(LHCompatRegistry.HOSTILITY_UPGRADE)) { ans++; } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityPotionModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityPotionModifier.java index 008daa424..81c1dcb04 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityPotionModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/HostilityPotionModifier.java @@ -1,6 +1,7 @@ package dev.xkmc.modulargolems.compat.materials.l2hostility; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGTagGen; @@ -16,10 +17,10 @@ public HostilityPotionModifier(StatFilterType type, int maxLevel) { } @Override - public int addSlot(List upgrades, int lv) { - Set set = new HashSet<>(); + public int addSlot(List upgrades, int lv) { + Set set = new HashSet<>(); for (var e : upgrades) { - if (e.getDefaultInstance().is(MGTagGen.POTION_UPGRADES)) { + if (e.asItem().getDefaultInstance().is(MGTagGen.POTION_UPGRADES)) { set.add(e); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHCompatRegistry.java index 3011ef593..0e1c1547b 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHCompatRegistry.java @@ -28,6 +28,8 @@ public class LHCompatRegistry { public static final RegistryEntry LH_PROTECTION; public static final RegistryEntry LH_REGEN; public static final RegistryEntry LH_REFLECTIVE; + public static final RegistryEntry LH_ADAPTIVE; + public static final RegistryEntry LH_DISPELL; public static final ItemEntry CORE, POTION, TANK, SPEED, PROTECTION, REGEN, REFLECTIVE; @@ -44,20 +46,25 @@ public class LHCompatRegistry { new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_HEALTH_P, LHConfig.COMMON.tankHealth::get), new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_ARMOR, LHConfig.COMMON.tankArmor::get), new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_TOUGH, LHConfig.COMMON.tankTough::get)), - "Hostility Upgrade: Tanky", null); + "Hostility Modifier: Tanky", null); LH_SPEED = GolemModifiers.reg("hostility_speed", () -> new AttributeGolemModifier(5, new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_SPEED, LHConfig.COMMON.speedy::get)), - "Hostility Upgrade: Speedy", null); + "Hostility Modifier: Speedy", null); LH_PROTECTION = GolemModifiers.reg("hostility_protection", () -> new PotionDefenseModifier(4, () -> MobEffects.DAMAGE_RESISTANCE), - "Hostility Upgrade: Protection", null); + "Hostility Modifier: Protection", null); LH_REGEN = GolemModifiers.reg("hostility_regen", () -> new RegenModifier(StatFilterType.HEALTH, 5), - "Hostility Upgrade: Regeneration", null); + "Hostility Modifier: Regeneration", null); LH_REFLECTIVE = GolemModifiers.reg("hostility_reflect", () -> new ReflectiveModifier(StatFilterType.HEALTH, 5), - "Hostility Upgrade: Reflective", null); + "Hostility Modifier: Reflective", null); + + LH_ADAPTIVE = GolemModifiers.reg("hostility_adaptive", AdaptiveModifier::new, + "Hostility Modifier: Adaptive", null); + LH_DISPELL = GolemModifiers.reg("hostility_dispell", DispellModifier::new, + "Hostility Modifier: Dispell", null); CORE = GolemItems.regModUpgrade("hostility_core", () -> LH_CORE, L2Hostility.MODID).lang("Hostility Core").register(); POTION = GolemItems.regModUpgrade("hostility_potion", () -> LH_POTION, L2Hostility.MODID).lang("Hostility Upgrade: Potion").register(); diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHConfigGen.java index a8a09e99f..8b32b1bde 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHConfigGen.java @@ -1,7 +1,15 @@ package dev.xkmc.modulargolems.compat.materials.l2hostility; +import dev.xkmc.l2hostility.init.registrate.LHItems; import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.l2complements.LCDispatch; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; public class LHConfigGen extends ConfigDataProvider { @@ -11,7 +19,32 @@ public LHConfigGen(DataGenerator generator) { @Override public void add(Collector collector) { + collector.add(ModularGolems.MATERIALS, new ResourceLocation(LHDispatch.MODID, LHDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(LHDispatch.MODID, "chaotic"), Ingredient.of(LHItems.CHAOS_INGOT)) + .addStat(GolemTypes.STAT_HEALTH.get(), 400) + .addStat(GolemTypes.STAT_ATTACK.get(), 25) + .addStat(GolemTypes.STAT_REGEN.get(), 5) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addModifier(GolemModifiers.ADD_SLOT.get(), 1) + .addModifier(GolemModifiers.PLAYER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 1) + .addModifier(LHCompatRegistry.LH_CORE.get(), 1) + .end() + .addMaterial(new ResourceLocation(LHDispatch.MODID, "miraculous"), Ingredient.of(LHItems.MIRACLE_INGOT)) + .addStat(GolemTypes.STAT_HEALTH.get(), 600) + .addStat(GolemTypes.STAT_ATTACK.get(), 35) + .addStat(GolemTypes.STAT_REGEN.get(), 10) + .addStat(GolemTypes.STAT_SWEEP.get(), 3) + .addModifier(GolemModifiers.ADD_SLOT.get(), 2) + .addModifier(GolemModifiers.PLAYER_IMMUNE.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 2) + .addModifier(LHCompatRegistry.LH_CORE.get(), 1) + .addModifier(LHCompatRegistry.LH_ADAPTIVE.get(), 1) + .addModifier(LHCompatRegistry.LH_DISPELL.get(), 1) + .end() + + ); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHDispatch.java index 1419e1ecc..9c4bc0e37 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/LHDispatch.java @@ -25,6 +25,8 @@ public LHDispatch() { } public void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".chaotic", "Chaotic"); + pvd.add("golem_material." + MODID + ".miraculous", "Miraculous"); } @Override @@ -87,8 +89,4 @@ public ConfigDataProvider getDataGen(DataGenerator gen) { return new LHConfigGen(gen); } - @Override - public void dispatchClientSetup() { - } - } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/ReflectiveModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/ReflectiveModifier.java index d1d05e6f7..fb08c440e 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/ReflectiveModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/l2hostility/ReflectiveModifier.java @@ -28,7 +28,7 @@ public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int public List getDetail(int v) { List ans = new ArrayList<>(); ans.add(Component.translatable(LHTraits.REFLECT.get().getDescriptionId() + ".desc", - Component.literal((int) Math.round(100 * (1 + v * LHConfig.COMMON.reflectFactor.get())) + "") + Component.literal((int) Math.round(100 * v * LHConfig.COMMON.reflectFactor.get()) + "") .withStyle(ChatFormatting.AQUA)) .withStyle(ChatFormatting.GREEN)); return ans; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/AncientAnchorModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/AncientAnchorModifier.java new file mode 100644 index 000000000..39a1cfdcd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/AncientAnchorModifier.java @@ -0,0 +1,40 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; + +import java.util.function.Consumer; + +public class AncientAnchorModifier extends GolemModifier implements EarthquakeHelper.Modifier { + + public AncientAnchorModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.EARTH_QUAKE); + } + + @Override + public void performEarthQuake(AbstractGolemEntity golem, int level) { + LMProxy.shake(golem, golem.position()); + if (golem.level() instanceof ServerLevel sl) { + var list = LMProxy.stun(sl, golem.getX(), golem.getY(), golem.getZ(), golem, 5f, level); + for (var e : list) { + EarthquakeHelper.launch(golem, e, 1); + } + } + } + + @Override + public double getEarthquakeRangeSqr(AbstractGolemEntity golem, LivingEntity target, int lv) { + return 16; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMClient.java new file mode 100644 index 000000000..c204e9625 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMClient.java @@ -0,0 +1,16 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; +import dev.xkmc.modulargolems.content.client.override.ModelOverride; +import dev.xkmc.modulargolems.content.client.override.ModelOverrides; +import net.minecraft.resources.ResourceLocation; + +public class LMClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + ModelOverrides.registerOverride(new ResourceLocation(LMDispatch.MODID, "cloud"), + ModelOverride.texturePredicate((e) -> e.getHealth() <= e.getMaxHealth() / 2 ? "_dark" : "")); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMCompatRegistry.java new file mode 100644 index 000000000..199bf4db7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMCompatRegistry.java @@ -0,0 +1,40 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.world.item.Item; + +import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class LMCompatRegistry { + + public static final RegistryEntry ANCHOR; + public static final RegistryEntry THUNDER; + public static final RegistryEntry PERC; + public static final ItemEntry CLOUD_CUBE; + public static final RegistryEntry UPGRADE_THUNDER; + + static { + ANCHOR = reg("ancient_anchor", () -> new AncientAnchorModifier(StatFilterType.MASS, 4), + "Ancient Anchor", "Deal fall attack, cause shockwaves, and stun targets"); + + THUNDER = reg("thunderstorm", () -> new ThunderAttackModifier(StatFilterType.MASS, 4), + "Thunderstorm", "Summon thunderstorm to attack multiple targets. When attacked, summon electric bursts around the golem."); + + PERC = reg("cloud_forming", RootPercAttackModifier::new, + "Cloud Forming", "Deal more damage to targets with higher health"); + + UPGRADE_THUNDER = regModUpgrade("thunderstorm", () -> THUNDER, LMDispatch.MODID) + .lang("Thunderstorm Upgrade").register(); + + CLOUD_CUBE = GolemItems.item(LMDispatch.MODID, "cloud_cube", Item::new); + } + + public static void register() { + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMConfigGen.java new file mode 100644 index 000000000..daba06195 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMConfigGen.java @@ -0,0 +1,49 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.miauczel.legendary_monsters.item.ModItems; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class LMConfigGen extends ConfigDataProvider { + + public LMConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Legendary Monsters"); + } + + @Override + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(LMDispatch.MODID, LMDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(LMDispatch.MODID, "molten_metal"), + Ingredient.of(ModItems.MOLTEN_METAL_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 200) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_ATKKB.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 2) + .addModifier(LMCompatRegistry.ANCHOR.get(), 1) + .end() + + .addMaterial(new ResourceLocation(LMDispatch.MODID, "cloud"), + Ingredient.of(LMCompatRegistry.CLOUD_CUBE.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 600) + .addStat(GolemTypes.STAT_ATTACK.get(), 40) + .addStat(GolemTypes.STAT_SWEEP.get(), 2) + .addStat(GolemTypes.STAT_ATKKB.get(), 1) + .addModifier(GolemModifiers.ADD_SLOT.get(), 1) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.DAMAGE_CAP.get(), 2) + .addModifier(LMCompatRegistry.THUNDER.get(), 1) + .addModifier(LMCompatRegistry.PERC.get(), 1) + .end() + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMDispatch.java new file mode 100644 index 000000000..e6cd83f21 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMDispatch.java @@ -0,0 +1,42 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; +import net.miauczel.legendary_monsters.LegendaryMonsters; +import net.minecraft.data.DataGenerator; +import org.jetbrains.annotations.Nullable; + +public class LMDispatch extends ModDispatch { + + public static final String MODID = LegendaryMonsters.MOD_ID; + + public LMDispatch() { + super(() -> LMClient::new); + LMCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".molten_metal", "Molten Metal"); + pvd.add("golem_material." + MODID + ".cloud", "Cloud"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + LMProxy.genRecipe(pvd); + } + + @Override + public @Nullable ConfigDataProvider getDataGen(DataGenerator gen) { + return new LMConfigGen(gen); + } + + @Override + public void genLootModifier(MGGLMGen pvd) { + LMProxy.genLootModifier(pvd); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxy.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxy.java new file mode 100644 index 000000000..e07b21421 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxy.java @@ -0,0 +1,79 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.miauczel.legendary_monsters.entity.ModEntities; +import net.miauczel.legendary_monsters.item.ModItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.phys.Vec3; + +import java.util.ArrayList; +import java.util.List; + +public class LMProxy { + + public static void shake(LivingEntity user, Vec3 pos) { + try { + LMProxyImpl.shake(user, pos); + } catch (Throwable ignored) { + + } + } + + public static List stun(ServerLevel level, double x, double y, double z, LivingEntity golem, float reach, int lv) { + try { + return LMProxyImpl.stun(level, x, y, z, golem, reach, lv); + } catch (Throwable ignored) { + return new ArrayList<>(); + } + } + + public static void performThunderAttack(Mob e, LivingEntity target, int lv) { + try { + LMProxyImpl.performThunderAttack(e, target, lv); + } catch (Throwable ignored) { + + } + } + + public static void spawnElectricShock(Entity attacker, LivingEntity entity, float damage, int n) { + try { + LMProxyImpl.spawnElectricShock(attacker, entity, damage, n); + } catch (Throwable ignored) { + + } + } + + public static void genRecipe(RegistrateRecipeProvider pvd) { + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, LMCompatRegistry.CLOUD_CUBE, 9)::unlockedBy, + ModItems.AIR_RUNE.get()) + .pattern("RIR").pattern("IXI").pattern("RIR") + .define('I', GolemItems.GOLEM_TEMPLATE) + .define('R', ModItems.CLOUD_ROD.get()) + .define('X', Ingredient.of(ModItems.AIR_RUNE.get(), ModItems.ATMOSPHERIC_BOOTS.get())) + .save(ConditionalRecipeWrapper.mod(pvd, LMDispatch.MODID)); + + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, LMCompatRegistry.UPGRADE_THUNDER.get())::unlockedBy, + ModItems.AIR_RUNE.get()) + .pattern(" X ").pattern("ROR").pattern(" R ") + .define('R', ModItems.CLOUD_ROD.get()) + .define('X', ModItems.AIR_RUNE.get()) + .define('O', GolemItems.EMPTY_UPGRADE) + .save(ConditionalRecipeWrapper.mod(pvd, LMDispatch.MODID)); + } + + public static void genLootModifier(MGGLMGen pvd) { + pvd.drop(LMDispatch.MODID, ModEntities.Ancient_Guardian.get(), "molten_metal"); + pvd.drop(LMDispatch.MODID, ModEntities.Cloud_golem.get(), "cloud"); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxyImpl.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxyImpl.java new file mode 100644 index 000000000..5c165ba56 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/LMProxyImpl.java @@ -0,0 +1,133 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import net.miauczel.legendary_monsters.effect.ModEffects; +import net.miauczel.legendary_monsters.entity.AnimatedMonster.Effect.CameraShakeEntity; +import net.miauczel.legendary_monsters.entity.AnimatedMonster.Projectile.ElectricityEntity; +import net.miauczel.legendary_monsters.entity.AnimatedMonster.Projectile.LightningBoltEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class LMProxyImpl { + + public static void shake(LivingEntity user, Vec3 pos) { + CameraShakeEntity.cameraShake(user.level(), pos, 15.0F, 0.3F, 0, 15); + } + + public static List stun(ServerLevel level, double x, double y, double z, LivingEntity golem, float reach, int lv) { + List affected = new ArrayList<>(); + + int n = 128; + for (double i = 0; i < n; ++i) { + var a = (Math.PI * 2D) / n * i; + level.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, + x + 0.5F + Math.cos(a) * reach, + y, + z + 0.5F + Math.sin(a) * reach, + 0, 0.0F, 0.05, 0.0F, 1); + } + + level.playSound(null, BlockPos.containing(x, y, z), SoundEvents.IRON_GOLEM_REPAIR, SoundSource.NEUTRAL, 1.0F, 1.0F); + Vec3 cen = new Vec3(x, y, z); + for (LivingEntity le : level.getEntitiesOfClass(LivingEntity.class, (new AABB(cen, cen)).inflate(reach), e -> e != golem) + .stream().sorted(Comparator.comparingDouble(ec -> ec.distanceToSqr(cen))).toList()) { + if (golem.isAlliedTo(le)) continue; + le.addEffect(new MobEffectInstance(ModEffects.STUN.get(), 20 * lv, 255, false, false)); + le.hurt(golem.damageSources().mobAttack(golem), (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE) * lv * 0.4f); + affected.add(le); + } + + return affected; + } + + public static void performThunderAttack(Mob e, LivingEntity target, int lv) { + + spawnBoltStrip(e, target, 8 + 8 * lv, 4 + 3 * lv); + + } + + public static void spawnElectricShock(Entity attacker, LivingEntity entity, float damage, int n) { + + var dir = attacker.position().subtract(entity.position()).normalize(); + double val = (dir.x * dir.x + dir.z * dir.z); + Vec3 ax0 = val < 1e-4 ? new Vec3(1, 0, 0) : + new Vec3(-dir.x * dir.y, val, -dir.z * dir.y).normalize(); + Vec3 ax1 = dir.cross(ax0).normalize(); + for (int i = 0; i < n; i++) { + double rad = Math.PI * 2 / n * i; + var vec = ax1.scale(Math.sin(rad)).add(dir.scale(Math.cos(rad))); + float angle = (float) (Math.atan2(vec.z, vec.x) * Mth.RAD_TO_DEG); + var e = createElectricity(entity, vec, angle, damage); + Vec3 pos = entity.position().add(vec); + e.setPos(pos.x, pos.y, pos.z); + entity.level().addFreshEntity(e); + } + + } + + private static void spawnBoltStrip(Mob e, LivingEntity target, int step, int dmg) { + double d0 = Math.min(target.getY(), e.getY()); + double d1 = Math.max(target.getY(), e.getY()) + (double) 2.0F; + float angle = (float) Mth.atan2(target.getZ() - e.getZ(), target.getX() - e.getX()); + for (int l = 0; l < step; ++l) { + double len = (double) 1.25F * (double) (l + 1); + int delay = (int) (1.25F * (float) l); + var x = e.getX() + Mth.cos(angle) * len; + var z = e.getZ() + Mth.sin(angle) * len; + spawnSingleBolt(e, x, z, d0, d1, angle, delay, dmg); + } + + } + + private static void spawnSingleBolt(Mob e, double x, double z, double minY, double maxY, float rotation, int delay, int dmg) { + BlockPos pos = new BlockPos((int) x, (int) maxY, (int) z); + boolean flag = false; + double d0 = 0.0F; + + do { + BlockPos low = pos.below(); + BlockState state = e.level().getBlockState(low); + if (state.isFaceSturdy(e.level(), low, Direction.UP)) { + if (!e.level().isEmptyBlock(pos)) { + BlockState topState = e.level().getBlockState(pos); + VoxelShape topShape = topState.getCollisionShape(e.level(), pos); + if (!topShape.isEmpty()) { + d0 = topShape.max(Direction.Axis.Y); + } + } + + flag = true; + break; + } + + pos = pos.below(); + } while (pos.getY() >= Mth.floor(minY) - 1); + + if (flag) { + e.level().addFreshEntity(new LightningBoltEntity(e.level(), x, (double) pos.getY() + d0, z, rotation, delay, e, 20, dmg)); + } + + } + + private static Entity createElectricity(LivingEntity entity, Vec3 vec, float angle, float damage) { + return new ElectricityEntity(entity, vec.x, vec.y, vec.z, entity.level(), damage, angle, 20.0F); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/RootPercAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/RootPercAttackModifier.java new file mode 100644 index 000000000..3bf4ecd82 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/RootPercAttackModifier.java @@ -0,0 +1,26 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.util.GolemUtils; + +public class RootPercAttackModifier extends GolemModifier { + + public RootPercAttackModifier() { + super(StatFilterType.ATTACK, 2); + } + + @Override + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + float max = cache.getAttackTarget().getMaxHealth(); + cache.addHurtModifier(DamageModifier.nonlinearPre(173, d -> calc(d, max, level))); + } + + private float calc(float val, float max, int level) { + return GolemUtils.adjustedDamage(val, 0.01f * level * max); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackGoal.java new file mode 100644 index 000000000..bda3765e5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackGoal.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.modulargolems.compat.materials.goety.multi.MultiTargetRangedGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; + +public class ThunderAttackGoal extends MultiTargetRangedGoal { + + public ThunderAttackGoal(AbstractGolemEntity golem, int lv) { + super(100, 0, 35, golem, lv); + } + + @Override + protected int searchRange() { + return 8 + lv * 8; + } + + @Override + protected int getMaxTarget() { + return lv * 2; + } + + @Override + protected int cd() { + return 20; + } + + @Override + protected void performAttackImpl(LivingEntity target) { + LMProxy.performThunderAttack(golem, target, lv); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackModifier.java new file mode 100644 index 000000000..18d40fae4 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/ThunderAttackModifier.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +import java.util.function.BiConsumer; + +public class ThunderAttackModifier extends GolemModifier { + + public ThunderAttackModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { + addGoal.accept(5, new ThunderAttackGoal(entity, lv)); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + var attacker = event.getSource().getEntity(); + if (attacker == null) return; + float damage = (float) entity.getAttributeValue(Attributes.ATTACK_DAMAGE) * (0.2f + level * 0.2f); + int n = 4 + level; + LMProxy.spawnElectricShock(attacker, entity, damage, n); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/package-info.java new file mode 100644 index 000000000..b3f30a9fa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/legendarymonsters/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.legendarymonsters; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieCompatRegistry.java new file mode 100644 index 000000000..164012d39 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieCompatRegistry.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.compat.materials.mowziesmobs; + +import com.bobmowzie.mowziesmobs.server.item.ItemHandler; +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class MowzieCompatRegistry { + + public static final RegistryEntry AXE_SLAM; + public static final RegistryEntry UPGRADE_SLAM; + public static final ItemEntry WROUGHTNAUT_INGOT; + + public static final TagKey WROUGHTNAUT_ITEMS = ItemTags.create(ModularGolems.loc("wroughtnaut_items")); + + static { + WROUGHTNAUT_INGOT = GolemItems.item(MowzieDispatch.MODID, "wroughtnaut_ingot", Item::new); + AXE_SLAM = reg("wroughtnaut", () -> new SlamModifier(StatFilterType.HEAD, 1), + "Wroughtnaut Slamming", "Perform falling attack and create shockwave"); + UPGRADE_SLAM = regModUpgrade("wroughtnaut", () -> AXE_SLAM, MowzieDispatch.MODID) + .lang("Wroughtnaut Slamming Upgrade").register(); + } + + public static void register() { + MGTagGen.OPTIONAL_ITEM.add(pvd -> + pvd.addTag(WROUGHTNAUT_ITEMS) + .addOptional(ItemHandler.WROUGHT_AXE.getId()) + .addOptional(ItemHandler.WROUGHT_HELMET.getId()) + ); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieDispatch.java new file mode 100644 index 000000000..cd87c7fc7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowzieDispatch.java @@ -0,0 +1,61 @@ +package dev.xkmc.modulargolems.compat.materials.mowziesmobs; + +import com.bobmowzie.mowziesmobs.MowziesMobs; +import com.bobmowzie.mowziesmobs.server.entity.EntityHandler; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.world.item.Items; + +public class MowzieDispatch extends ModDispatch { + + public static final String MODID = MowziesMobs.MODID; + + public MowzieDispatch() { + MowzieCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".wroughtnaut", "Wroughtnaut"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + RecipeGen.unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, + MowzieCompatRegistry.WROUGHTNAUT_INGOT, 9)::unlockedBy, + Items.IRON_INGOT) + .pattern("ABA").pattern("BCB").pattern("ABA") + .define('A', GolemItems.GOLEM_TEMPLATE) + .define('B', Items.IRON_INGOT) + .define('C', MowzieCompatRegistry.WROUGHTNAUT_ITEMS) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + RecipeGen.unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, + MowzieCompatRegistry.UPGRADE_SLAM.get())::unlockedBy, + MowzieCompatRegistry.WROUGHTNAUT_INGOT.get()) + .requires(GolemItems.EMPTY_UPGRADE) + .requires(MowzieCompatRegistry.WROUGHTNAUT_ITEMS) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + } + + @Override + public void genLootModifier(MGGLMGen pvd) { + pvd.drop(MODID, EntityHandler.WROUGHTNAUT.get(), "wroughtnaut"); + } + + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new MowziesConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowziesConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowziesConfigGen.java new file mode 100644 index 000000000..4d50b54d5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/MowziesConfigGen.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.compat.materials.mowziesmobs; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class MowziesConfigGen extends ConfigDataProvider { + + public MowziesConfigGen(DataGenerator generator) { + super(generator, "Golem Config for Mowzie's Mobs"); + } + + @Override + public void add(Collector map) { + map.add(ModularGolems.MATERIALS, new ResourceLocation(MowzieDispatch.MODID, MowzieDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(MowzieDispatch.MODID, "wroughtnaut"), + Ingredient.of(MowzieCompatRegistry.WROUGHTNAUT_INGOT.get())) + .addStat(GolemTypes.STAT_HEALTH.get(), 360) + .addStat(GolemTypes.STAT_ATTACK.get(), 25) + .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) + .addModifier(GolemModifiers.MAGIC_IMMUNE.get(), 1) + .addModifier(GolemModifiers.PROJECTILE_REJECT.get(), 1) + .addModifier(GolemModifiers.ARMOR_BYPASS.get(), 1) + .addModifier(MowzieCompatRegistry.AXE_SLAM.get(), 1) + .end() + + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/SlamModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/SlamModifier.java new file mode 100644 index 000000000..b6158b2b2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/SlamModifier.java @@ -0,0 +1,40 @@ +package dev.xkmc.modulargolems.compat.materials.mowziesmobs; + +import com.bobmowzie.mowziesmobs.server.entity.EntityHandler; +import com.bobmowzie.mowziesmobs.server.entity.effects.EntityAxeAttack; +import com.bobmowzie.mowziesmobs.server.item.ItemHandler; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import net.minecraft.world.entity.LivingEntity; + +import java.util.function.Consumer; + +public class SlamModifier extends GolemModifier implements EarthquakeHelper.Modifier { + + public SlamModifier(StatFilterType type, int maxLevel) { + super(type, maxLevel); + } + + @Override + public void onRegisterFlag(Consumer cons) { + cons.accept(GolemFlags.EARTH_QUAKE); + } + + @Override + public void performEarthQuake(AbstractGolemEntity golem, int level) { + EntityAxeAttack axeAttack = new EntityAxeAttack(EntityHandler.AXE_ATTACK.get(), golem.level(), golem, true); + axeAttack.absMoveTo(golem.getX(), golem.getY(), golem.getZ(), golem.getYRot(), golem.getXRot()); + axeAttack.setAxeStack(ItemHandler.WROUGHT_AXE.get().getDefaultInstance()); + axeAttack.tickCount = 13; + golem.level().addFreshEntity(axeAttack); + } + + @Override + public double getEarthquakeRangeSqr(AbstractGolemEntity golem, LivingEntity target, int lv) { + return target.onGround() ? 144 : -100; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/package-info.java new file mode 100644 index 000000000..9b32d9045 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/mowziesmobs/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.mowziesmobs; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCCompatRegistry.java new file mode 100644 index 000000000..2a1a1f188 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCCompatRegistry.java @@ -0,0 +1,62 @@ +package dev.xkmc.modulargolems.compat.materials.tinker; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import dev.xkmc.l2complements.init.L2Complements; +import dev.xkmc.l2complements.init.data.TagGen; +import dev.xkmc.modulargolems.compat.materials.tinker.effect.HepatizonDefenseEffect; +import dev.xkmc.modulargolems.compat.materials.tinker.effect.ManyullynEffect; +import dev.xkmc.modulargolems.compat.materials.tinker.modifier.HepatizonDefenseModifier; +import dev.xkmc.modulargolems.compat.materials.tinker.modifier.ManyullynAttackModifier; +import dev.xkmc.modulargolems.compat.materials.tinker.modifier.ManyullynDefenseModifier; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraftforge.fml.ModList; + +import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; + +public class TCCompatRegistry { + + public static final RegistryEntry MANYULLYN_ATTACK; + public static final RegistryEntry MANYULLYN_DEFENSE; + public static final RegistryEntry HEPATIZON_DEFENSE; + + public static final RegistryEntry EFF_MANYULLYN; + public static final RegistryEntry EFF_HEPATIZON; + + static { + MANYULLYN_ATTACK = reg("manyullyn_attack", ManyullynAttackModifier::new, "Increase golem attack temporarily after inflicting damage"); + MANYULLYN_DEFENSE = reg("manyullyn_defense", ManyullynDefenseModifier::new, "Increase golem attack temporarily after taking damage"); + HEPATIZON_DEFENSE = reg("hepatizon_defense", HepatizonDefenseModifier::new, "Golem takes less damage temporarily after taking damage"); + + EFF_MANYULLYN = genEffect("manyullyn_effect", () -> new ManyullynEffect(MobEffectCategory.BENEFICIAL, 0xffffffff), + "Increase golem attack damage"); + EFF_HEPATIZON = genEffect("hepatizon_effect", () -> new HepatizonDefenseEffect(MobEffectCategory.BENEFICIAL, 0xffffffff), + "Golem takes less damage"); + + } + + private static RegistryEntry genEffect(String name, NonNullSupplier sup, String desc) { + return ModularGolems.REGISTRATE.effect(name, sup, desc).lang(MobEffect::getDescriptionId).register(); + } + + public static void register() { + MGTagGen.OPTIONAL_ITEM.add(e -> e.addTag(MGTagGen.SPECIAL_CRAFT) + .addOptionalTag(TCDispatch.AMETHYST_BRONZE.location()) + .addOptionalTag(TCDispatch.COBALT.location()) + .addOptionalTag(TCDispatch.MANYULLYN.location()) + .addOptionalTag(TCDispatch.HEPATIZON.location()) + .addOptionalTag(TCDispatch.ROSE_GOLD.location()) + ); + + if (ModList.get().isLoaded(L2Complements.MODID)) { + MGTagGen.OPTIONAL_EFF.add(e -> e.addTag(TagGen.SKILL_EFFECT) + .addOptional(EFF_MANYULLYN.getId()) + .addOptional(EFF_HEPATIZON.getId()) + ); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCDispatch.java new file mode 100644 index 000000000..7dd82c24e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TCDispatch.java @@ -0,0 +1,54 @@ +package dev.xkmc.modulargolems.compat.materials.tinker; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; +import dev.xkmc.modulargolems.compat.materials.tinker.automation.TinkerRecipeGen; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.TConstruct; + +public class TCDispatch extends ModDispatch { + + public static final String MODID = TConstruct.MOD_ID; + + public static final TagKey AMETHYST_BRONZE = tag("amethyst_bronze"); + public static final TagKey COBALT = tag("cobalt"); + public static final TagKey MANYULLYN = tag("manyullyn"); + public static final TagKey HEPATIZON = tag("hepatizon"); + public static final TagKey ROSE_GOLD = tag("rose_gold"); + + public static TagKey tag(String id) { + return ItemTags.create(new ResourceLocation("forge", "ingots/" + id)); + } + + public TCDispatch() { + TCCompatRegistry.register(); + } + + @Override + protected void genLang(RegistrateLangProvider pvd) { + pvd.add("golem_material." + MODID + ".amethyst_bronze", "Amethyst Bronze"); + pvd.add("golem_material." + MODID + ".manyullyn", "Manyullyn"); + pvd.add("golem_material." + MODID + ".hepatizon", "Hepatizon"); + pvd.add("golem_material." + MODID + ".cobalt", "Cobalt"); + pvd.add("golem_material." + MODID + ".rose_gold", "Rose Gold"); + } + + @Override + public void genRecipe(RegistrateRecipeProvider pvd) { + TinkerRecipeGen.genRecipe(pvd); + } + + @Nullable + @Override + public ConfigDataProvider getDataGen(DataGenerator gen) { + return new TinkerConfigGen(gen); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TinkerConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TinkerConfigGen.java new file mode 100644 index 000000000..8558fde9c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/TinkerConfigGen.java @@ -0,0 +1,53 @@ +package dev.xkmc.modulargolems.compat.materials.tinker; + +import dev.xkmc.l2library.serial.config.ConfigDataProvider; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +public class TinkerConfigGen extends ConfigDataProvider { + + public TinkerConfigGen(DataGenerator generator) { + super(generator, "Golem config for Tinker Construct"); + } + + @Override + public void add(Collector collector) { + + collector.add(ModularGolems.MATERIALS, new ResourceLocation(TCDispatch.MODID, TCDispatch.MODID), new GolemMaterialConfig() + .addMaterial(new ResourceLocation(TCDispatch.MODID, "amethyst_bronze"), Ingredient.of(TCDispatch.AMETHYST_BRONZE)) + .addStat(GolemTypes.STAT_HEALTH.get(), 200) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .end() + + .addMaterial(new ResourceLocation(TCDispatch.MODID, "manyullyn"), Ingredient.of(TCDispatch.MANYULLYN)) + .addStat(GolemTypes.STAT_HEALTH.get(), 300) + .addStat(GolemTypes.STAT_ATTACK.get(), 35) + .addModifier(TCCompatRegistry.MANYULLYN_ATTACK.get(), 1) + .addModifier(TCCompatRegistry.MANYULLYN_DEFENSE.get(), 1) + .end() + + .addMaterial(new ResourceLocation(TCDispatch.MODID, "hepatizon"), Ingredient.of(TCDispatch.HEPATIZON)) + .addStat(GolemTypes.STAT_HEALTH.get(), 250) + .addStat(GolemTypes.STAT_ATTACK.get(), 15) + .addModifier(TCCompatRegistry.HEPATIZON_DEFENSE.get(), 1) + .end() + + .addMaterial(new ResourceLocation(TCDispatch.MODID, "cobalt"), Ingredient.of(TCDispatch.COBALT)) + .addStat(GolemTypes.STAT_HEALTH.get(), 220) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_SPEED.get(), 0.3) + .end() + + .addMaterial(new ResourceLocation(TCDispatch.MODID, "rose_gold"), Ingredient.of(TCDispatch.ROSE_GOLD)) + .addStat(GolemTypes.STAT_HEALTH.get(), 40) + .addStat(GolemTypes.STAT_ATTACK.get(), 10) + .addModifier(GolemModifiers.ADD_SLOT.get(), 1) + .end() + ); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/TinkerRecipeGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/TinkerRecipeGen.java new file mode 100644 index 000000000..058574120 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/TinkerRecipeGen.java @@ -0,0 +1,172 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.automation; + +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import com.tterrag.registrate.util.entry.ItemEntry; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.common.CompatManager; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; +import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.registries.ForgeRegistries; +import slimeknights.mantle.recipe.helper.ItemOutput; +import slimeknights.mantle.registration.object.FlowingFluidObject; +import slimeknights.tconstruct.TConstruct; +import slimeknights.tconstruct.fluids.TinkerFluids; +import slimeknights.tconstruct.library.recipe.casting.ItemCastingRecipeBuilder; +import slimeknights.tconstruct.library.recipe.melting.MeltingRecipeBuilder; + +import java.util.function.Consumer; + +public class TinkerRecipeGen { + + public static void genRecipe(RegistrateRecipeProvider pvd) { + findAndTry(pvd, "iron", TinkerFluids.moltenIron, 90); + findAndTry(pvd, "copper", TinkerFluids.moltenCopper, 90); + findAndTry(pvd, "gold", TinkerFluids.moltenGold, 90); + findAndTry(pvd, "netherite", TinkerFluids.moltenNetherite, 90); + findAndTry(pvd, "zinc", TinkerFluids.moltenZinc, 90); + findAndTry(pvd, "cobalt", TinkerFluids.moltenCobalt, 90); + findAndTry(pvd, "amethyst_bronze", TinkerFluids.moltenAmethystBronze, 90); + findAndTry(pvd, "manyullyn", TinkerFluids.moltenManyullyn, 90); + findAndTry(pvd, "hepatizon", TinkerFluids.moltenHepatizon, 90); + findAndTry(pvd, "rose_gold", TinkerFluids.moltenRoseGold, 90); + + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.THUNDER_IMMUNE, TinkerFluids.moltenCopper, 810); + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.DIAMOND, TinkerFluids.moltenDiamond, 600); + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.NETHERITE, TinkerFluids.moltenNetherite, 360); + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.GOLD, TinkerFluids.moltenGold, 2430); + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.QUARTZ, TinkerFluids.moltenQuartz, 1200); + cast(pvd, GolemItems.EMPTY_UPGRADE, GolemItems.EMERALD, TinkerFluids.moltenEmerald, 2700); + + cast(pvd, Items.IRON_HELMET, GolemItems.GOLEMGUARD_HELMET, TinkerFluids.moltenIron, 16 * 90); + cast(pvd, Items.IRON_CHESTPLATE, GolemItems.GOLEMGUARD_CHESTPLATE, TinkerFluids.moltenIron, 32 * 90); + cast(pvd, Items.IRON_LEGGINGS, GolemItems.GOLEMGUARD_SHINGUARD, TinkerFluids.moltenIron, 11 * 90); + cast(pvd, Items.DIAMOND_HELMET, GolemItems.WINDSPIRIT_HELMET, TinkerFluids.moltenDiamond, 16 * 100); + cast(pvd, Items.DIAMOND_CHESTPLATE, GolemItems.WINDSPIRIT_CHESTPLATE, TinkerFluids.moltenDiamond, 32 * 100); + cast(pvd, Items.DIAMOND_LEGGINGS, GolemItems.WINDSPIRIT_SHINGUARD, TinkerFluids.moltenDiamond, 11 * 100); + cast(pvd, Items.DIAMOND_BOOTS, GolemItems.WINDSPIRIT_BOOTS, TinkerFluids.moltenDiamond, 3 * 100); + cast(pvd, GolemItems.WINDSPIRIT_HELMET, GolemItems.BARBARICFLAMEVANGUARD_HELMET, TinkerFluids.moltenNetherite, 5 * 90); + cast(pvd, GolemItems.WINDSPIRIT_CHESTPLATE, GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE, TinkerFluids.moltenNetherite, 6 * 90); + cast(pvd, GolemItems.WINDSPIRIT_SHINGUARD, GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD, TinkerFluids.moltenNetherite, 3 * 90); + + melt(pvd, GolemItems.BARBARICFLAMEVANGUARD_CHESTPLATE, TinkerFluids.moltenNetherite, 6 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(40 * 100))); + + melt(pvd, GolemItems.BARBARICFLAMEVANGUARD_HELMET, TinkerFluids.moltenNetherite, 5 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(20 * 100))); + + melt(pvd, GolemItems.BARBARICFLAMEVANGUARD_SHINGUARD, TinkerFluids.moltenNetherite, 3 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(18 * 100))); + + melt(pvd, GolemItems.WINDSPIRIT_CHESTPLATE, TinkerFluids.moltenDiamond, 40 * 100, + e -> { + }); + + melt(pvd, GolemItems.WINDSPIRIT_HELMET, TinkerFluids.moltenDiamond, 20 * 100, + e -> { + }); + + melt(pvd, GolemItems.WINDSPIRIT_SHINGUARD, TinkerFluids.moltenDiamond, 18 * 100, + e -> { + }); + + melt(pvd, GolemItems.WINDSPIRIT_BOOTS, TinkerFluids.moltenDiamond, 7 * 100, + e -> { + }); + + melt(pvd, GolemItems.GOLEMGUARD_CHESTPLATE, TinkerFluids.moltenIron, 40 * 90, + e -> { + }); + + melt(pvd, GolemItems.GOLEMGUARD_HELMET, TinkerFluids.moltenIron, 20 * 90, + e -> { + }); + + melt(pvd, GolemItems.GOLEMGUARD_SHINGUARD, TinkerFluids.moltenIron, 18 * 90, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()], TinkerFluids.moltenDebris, 4 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(4 * 100))); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()], TinkerFluids.moltenDebris, 4 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(5 * 100))); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.NETHERITE.ordinal()], TinkerFluids.moltenDebris, 4 * 90, + e -> e.addByproduct(TinkerFluids.moltenDiamond.result(3 * 100))); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()], TinkerFluids.moltenDiamond, 4 * 100, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()], TinkerFluids.moltenDiamond, 5 * 100, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()], TinkerFluids.moltenDiamond, 3 * 100, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()], TinkerFluids.moltenIron, 4 * 90, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SWORD.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()], TinkerFluids.moltenIron, 5 * 90, + e -> { + }); + + melt(pvd, GolemItems.METALGOLEM_WEAPON[GolemWeaponType.SPEAR.ordinal()][VanillaGolemWeaponMaterial.IRON.ordinal()], TinkerFluids.moltenIron, 3 * 90, + e -> { + }); + + } + + private static void findAndTry(RegistrateRecipeProvider pvd, String id, FlowingFluidObject fluid, int amount) { + var tag = fluid.getCommonTag(); + if (tag == null) return; + for (var e : CompatManager.gatherConfig().entrySet()) { + if (e.getKey().getPath().equals(id)) { + genCasting(pvd, e.getKey(), fluid, amount); + } + } + } + + private static void genCasting(RegistrateRecipeProvider pvd, ResourceLocation id, FlowingFluidObject fluid, int ingot) { + for (var part : GolemPart.LIST) { + var part_rl = ForgeRegistries.ITEMS.getKey(part); + assert part_rl != null; + String item_name = part_rl.getPath(); + var rl = new ResourceLocation(ModularGolems.MODID, "casting/" + id.getPath() + "_casting_" + item_name); + + ItemStack result = GolemPart.setMaterial(part.getDefaultInstance(), id); + RecipeGen.unlock(pvd, ItemCastingRecipeBuilder.basinRecipe(ItemOutput.fromStack(result))::unlockedBy, part) + .setCast(part, true).setFluidAndTime(fluid, ingot * part.count) + .save(ConditionalRecipeWrapper.mod(pvd, TConstruct.MOD_ID, id.getNamespace()), rl); + } + } + + private static void cast(RegistrateRecipeProvider pvd, ItemLike src, ItemEntry upgrade, FlowingFluidObject fluid, int amount) { + var rl = upgrade.getId().withPrefix("casting/"); + RecipeGen.unlock(pvd, ItemCastingRecipeBuilder.tableRecipe(ItemOutput.fromItem(upgrade))::unlockedBy, GolemItems.EMPTY_UPGRADE.get()) + .setCast(src, true).setFluidAndTime(fluid, amount) + .save(ConditionalRecipeWrapper.mod(pvd, TConstruct.MOD_ID), rl); + } + + private static void melt(RegistrateRecipeProvider pvd, ItemEntry src, FlowingFluidObject fluid, int amount, Consumer cons) { + var rl = src.getId().withPrefix("melting/"); + var recipe = RecipeGen.unlock(pvd, MeltingRecipeBuilder.melting(Ingredient.of(src), fluid, amount, 1)::unlockedBy, GolemItems.EMPTY_UPGRADE.get()); + cons.accept(recipe); + recipe.save(ConditionalRecipeWrapper.mod(pvd, TConstruct.MOD_ID), rl); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/package-info.java new file mode 100644 index 000000000..e44359e9f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/automation/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.tinker.automation; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/HepatizonDefenseEffect.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/HepatizonDefenseEffect.java new file mode 100644 index 000000000..086d17874 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/HepatizonDefenseEffect.java @@ -0,0 +1,13 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.effect; + +import dev.xkmc.l2library.base.effects.api.InherentEffect; +import dev.xkmc.modulargolems.compat.materials.common.StackableEffect; +import net.minecraft.world.effect.MobEffectCategory; + +public class HepatizonDefenseEffect extends InherentEffect implements StackableEffect { + + public HepatizonDefenseEffect(MobEffectCategory category, int color) { + super(category, color); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/ManyullynEffect.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/ManyullynEffect.java new file mode 100644 index 000000000..254a88b15 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/ManyullynEffect.java @@ -0,0 +1,18 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.effect; + +import dev.xkmc.l2library.base.effects.api.InherentEffect; +import dev.xkmc.l2library.util.math.MathHelper; +import dev.xkmc.modulargolems.compat.materials.common.StackableEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +public class ManyullynEffect extends InherentEffect implements StackableEffect { + + public ManyullynEffect(MobEffectCategory category, int color) { + super(category, color); + var uuid = MathHelper.getUUIDFromString("modulargolems:manyullyn"); + addAttributeModifier(Attributes.ATTACK_DAMAGE, uuid.toString(), 0.1, AttributeModifier.Operation.MULTIPLY_TOTAL); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/package-info.java new file mode 100644 index 000000000..82dbd1c4e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/effect/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.tinker.effect; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/HepatizonDefenseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/HepatizonDefenseModifier.java new file mode 100644 index 000000000..38b409ab2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/HepatizonDefenseModifier.java @@ -0,0 +1,42 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.modifier; + +import dev.xkmc.l2library.base.effects.EffectUtil; +import dev.xkmc.modulargolems.compat.materials.tinker.TCCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraftforge.event.entity.living.LivingDamageEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class HepatizonDefenseModifier extends GolemModifier { + + public HepatizonDefenseModifier() { + super(StatFilterType.HEALTH, 5); + } + + @Override + public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + if (event.getSource().is(DamageTypeTags.BYPASSES_EFFECTS) || + event.getSource().is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { + return; + } + var eff = TCCompatRegistry.EFF_HEPATIZON.get(); + var ins = entity.getEffect(eff); + if (ins == null) return; + int reduction = (ins.getAmplifier() + 1) * 2; + event.setAmount(Math.max(0, event.getAmount() - reduction)); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + var eff = TCCompatRegistry.EFF_HEPATIZON.get(); + var dur = 100; + int amp = Math.min(level * 2, (int) (event.getAmount() / 4)) - 1; + if (amp < 0) return; + MobEffectInstance ins = new MobEffectInstance(eff, dur, amp - 1); + EffectUtil.addEffect(entity, ins, EffectUtil.AddReason.SELF, entity); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynAttackModifier.java new file mode 100644 index 000000000..722978db7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynAttackModifier.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.modifier; + +import dev.xkmc.l2library.base.effects.EffectUtil; +import dev.xkmc.modulargolems.compat.materials.tinker.TCCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class ManyullynAttackModifier extends GolemModifier { + + public ManyullynAttackModifier() { + super(StatFilterType.ATTACK, 5); + } + + @Override + public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { + TCCompatRegistry.EFF_MANYULLYN.get().addTo(entity, 100, level - 1, EffectUtil.AddReason.SELF, entity); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynDefenseModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynDefenseModifier.java new file mode 100644 index 000000000..2c0bdf84c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/ManyullynDefenseModifier.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.compat.materials.tinker.modifier; + +import dev.xkmc.l2library.base.effects.EffectUtil; +import dev.xkmc.modulargolems.compat.materials.tinker.TCCompatRegistry; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraftforge.event.entity.living.LivingDamageEvent; + +public class ManyullynDefenseModifier extends GolemModifier { + + public ManyullynDefenseModifier() { + super(StatFilterType.HEALTH, 5); + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + TCCompatRegistry.EFF_MANYULLYN.get().addTo(entity, 100, level - 1, EffectUtil.AddReason.SELF, entity); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/package-info.java new file mode 100644 index 000000000..b2c18a541 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/modifier/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.tinker.modifier; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/package-info.java new file mode 100644 index 000000000..c628ed3cc --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/tinker/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.tinker; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFClient.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFClient.java new file mode 100644 index 000000000..708ab7b27 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFClient.java @@ -0,0 +1,39 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest; + +import dev.xkmc.modulargolems.compat.materials.common.ClientModDispatch; +import dev.xkmc.modulargolems.compat.materials.twilightforest.client.*; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.common.MinecraftForge; + +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.regAndAdd; + +public class TFClient extends ClientModDispatch { + + @Override + public void dispatchClientSetup() { + MinecraftForge.EVENT_BUS.register(TFClientEventHandler.class); + } + + @Override + public void dispatchEntityLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { + regAndAdd(event, IronwoodArmors.HELMET_LAYER, IronwoodArmors::createHelmet); + regAndAdd(event, IronwoodArmors.CHESTPLATE_LAYER, IronwoodArmors::createChestplate); + regAndAdd(event, IronwoodArmors.SHINGUARD_LAYER, IronwoodArmors::createLeggings); + regAndAdd(event, IronwoodArmors.BOOTS_LAYER, IronwoodArmors::createBoots); + + regAndAdd(event, NagaArmors.HELMET_LAYER, NagaArmors::createHelmet); + regAndAdd(event, NagaArmors.CHESTPLATE_LAYER, NagaArmors::createChestplate); + regAndAdd(event, NagaArmors.SHINGUARD_LAYER, NagaArmors::createLeggings); + regAndAdd(event, NagaArmors.BOOTS_LAYER, NagaArmors::createBoots); + + regAndAdd(event, KnightmetalArmors.HELMET_LAYER, KnightmetalArmors::createHelmet); + regAndAdd(event, KnightmetalArmors.CHESTPLATE_LAYER, KnightmetalArmors::createChestplate); + regAndAdd(event, KnightmetalArmors.SHINGUARD_LAYER, KnightmetalArmors::createLeggings); + regAndAdd(event, KnightmetalArmors.BOOTS_LAYER, KnightmetalArmors::createBoots); + + regAndAdd(event, FieryArmors.HELMET_LAYER, FieryArmors::createHelmet); + regAndAdd(event, FieryArmors.CHESTPLATE_LAYER, FieryArmors::createChestplate); + regAndAdd(event, FieryArmors.SHINGUARD_LAYER, FieryArmors::createLeggings); + regAndAdd(event, FieryArmors.BOOTS_LAYER, FieryArmors::createBoots); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFCompatRegistry.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFCompatRegistry.java index da3e4b629..8d5939eba 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFCompatRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFCompatRegistry.java @@ -1,16 +1,34 @@ package dev.xkmc.modulargolems.compat.materials.twilightforest; +import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.client.FieryModelTransformer; +import dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.*; +import dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers.CarminiteModifier; +import dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers.FieryModifier; +import dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers.TFDamageModifier; +import dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers.TFHealingModifier; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.AttributeGolemModifier; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ArmorItem; +import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; import static dev.xkmc.modulargolems.init.registrate.GolemItems.regModUpgrade; import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.THORN; import static dev.xkmc.modulargolems.init.registrate.GolemModifiers.reg; public class TFCompatRegistry { + public static final ItemEntry IRONWOOD_HELMET, IRONWOOD_CHESTPLATE, IRONWOOD_SHINGUARD, IRONWOOD_BOOTS; + public static final ItemEntry KNIGHTMETAL_HELMET, KNIGHTMETAL_CHESTPLATE, KNIGHTMETAL_SHINGUARD, KNIGHTMETAL_BOOTS; + public static final ItemEntry FIERY_HELMET, FIERY_CHESTPLATE, FIERY_SHINGUARD, FIERY_BOOTS; + public static final ItemEntry NAGA_HELMET, NAGA_CHESTPLATE, NAGA_SHINGUARD, NAGA_BOOTS; + public static final ItemEntry[][] TF_GOLEM_WEAPON; public static final RegistryEntry FIERY; public static final RegistryEntry TF_DAMAGE; public static final RegistryEntry TF_HEALING; @@ -20,7 +38,77 @@ public class TFCompatRegistry { public static final RegistryEntry UP_CARMINITE, UP_STEELEAF, UP_FIERY, UP_IRONWOOD, UP_KNIGHTMETAL, UP_NAGA; static { - FIERY = reg("fiery", FieryModifier::new, "Deal %s%% fire damage to mobs not immune to fire"); + IRONWOOD_HELMET = REGISTRATE.item("ironwood_helmet", p -> new IronwoodArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 8, 4, TFArmorPaths.IRONWOOD_HELMETS)) // 护甲值和韧性请根据设计调整 + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) // 注意:cataLoc 应替换为您第二个文件中的资源定位方法,例如 modLoc + .defaultLang().register(); + IRONWOOD_CHESTPLATE = REGISTRATE.item("ironwood_chestplate", p -> new IronwoodArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 10, 4, TFArmorPaths.IRONWOOD_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + IRONWOOD_SHINGUARD = REGISTRATE.item("ironwood_shinguard", p -> new IronwoodArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 6, 4, TFArmorPaths.IRONWOOD_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + IRONWOOD_BOOTS = REGISTRATE.item("ironwood_boots", p -> new IronwoodArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 4, 4, TFArmorPaths.IRONWOOD_BOOTS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + NAGA_HELMET = REGISTRATE.item("naga_helmet", p -> new NagaArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 10, 5, TFArmorPaths.NAGA_HELMETS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + NAGA_CHESTPLATE = REGISTRATE.item("naga_chestplate", p -> new NagaArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 13, 5, TFArmorPaths.NAGA_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + NAGA_SHINGUARD = REGISTRATE.item("naga_shinguard", p -> new NagaArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 7, 5, TFArmorPaths.NAGA_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + NAGA_BOOTS = REGISTRATE.item("naga_boots", p -> new NagaArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 5, 5, TFArmorPaths.NAGA_BOOTS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + KNIGHTMETAL_HELMET = REGISTRATE.item("knightmetal_helmet", p -> new KnightmetalArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 11, 6, TFArmorPaths.KNIGHTMETAL_HELMETS)) // 护甲值和韧性请根据设计调整 + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) // 注意:cataLoc 应替换为您第二个文件中的资源定位方法,例如 modLoc + .defaultLang().register(); + KNIGHTMETAL_CHESTPLATE = REGISTRATE.item("knightmetal_chestplate", p -> new KnightmetalArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 14, 6, TFArmorPaths.KNIGHTMETAL_CHESTPLATES)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + KNIGHTMETAL_SHINGUARD = REGISTRATE.item("knightmetal_shinguard", p -> new KnightmetalArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 8, 6, TFArmorPaths.KNIGHTMETAL_LEGGINGS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + KNIGHTMETAL_BOOTS = REGISTRATE.item("knightmetal_boots", p -> new KnightmetalArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 6, 6, TFArmorPaths.KNIGHTMETAL_BOOTS)) + .model((ctx, pvd) -> pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); + + FIERY_HELMET = REGISTRATE.item("fiery_helmet", p -> new FieryArmorItem(p.stacksTo(1), + ArmorItem.Type.HELMET, 11, 6, TFArmorPaths.FIERY_HELMETS)) // 护甲值和韧性请根据设计调整 + .model((ctx, pvd) -> fiery(pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName())))) + .defaultLang().register(); + FIERY_CHESTPLATE = REGISTRATE.item("fiery_chestplate", p -> new FieryArmorItem(p.stacksTo(1), + ArmorItem.Type.CHESTPLATE, 14, 6, TFArmorPaths.FIERY_CHESTPLATES)) + .model((ctx, pvd) -> fiery(pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName())))) + .defaultLang().register(); + FIERY_SHINGUARD = REGISTRATE.item("fiery_shinguard", p -> new FieryArmorItem(p.stacksTo(1), + ArmorItem.Type.LEGGINGS, 8, 6, TFArmorPaths.FIERY_LEGGINGS)) + .model((ctx, pvd) -> fiery(pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName())))) + .defaultLang().register(); + FIERY_BOOTS = REGISTRATE.item("fiery_boots", p -> new FieryArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 6, 6, TFArmorPaths.FIERY_BOOTS)) + .model((ctx, pvd) -> fiery(pvd.generated(ctx, tfLoc("item/equipments/" + ctx.getName())))) + .defaultLang().register(); + + TF_GOLEM_WEAPON = GolemWeaponType.build(TFGolemWeaponMaterial.values()); + + FIERY = reg("fiery", FieryModifier::new, "Deal +%s%% damage to mobs not immune to fire"); TF_DAMAGE = reg("tf_damage", TFDamageModifier::new, "TF Damage Bonus", "Deal %s%% extra damage in twilight forest"); TF_HEALING = reg("tf_healing", TFHealingModifier::new, "TF Healing Bonus", "Healing becomes %s%% more in twilight forest"); CARMINITE = reg("carminite", CarminiteModifier::new, "After being hurt, turn invisible and invinsible for %s seconds"); @@ -41,7 +129,19 @@ public class TFCompatRegistry { } public static void register() { + MGTagGen.OPTIONAL_ITEM.add(e -> e.addTag(MGTagGen.TOUGH_ITEM) + .addOptional(FIERY_HELMET.getId()) + .addOptional(FIERY_CHESTPLATE.getId()) + .addOptional(FIERY_SHINGUARD.getId()) + .addOptional(FIERY_BOOTS.getId()) + ); + } + private static void fiery(Object obj) { + FieryModelTransformer.transform(obj); } + public static ResourceLocation tfLoc(String id) { + return new ResourceLocation(TFDispatch.MODID, id); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFConfigGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFConfigGen.java index 75248c0b6..4446600a2 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFConfigGen.java @@ -26,8 +26,10 @@ public void add(Collector map) { .addModifier(TFCompatRegistry.TF_HEALING.get(), 1).end() .addMaterial(new ResourceLocation(TFDispatch.MODID, "steeleaf"), Ingredient.of(ItemTagGenerator.STEELEAF_INGOTS)) - .addStat(GolemTypes.STAT_HEALTH.get(), 20) - .addStat(GolemTypes.STAT_ATTACK.get(), 24) + .addStat(GolemTypes.STAT_HEALTH.get(), 60) + .addStat(GolemTypes.STAT_ATTACK.get(), 20) + .addStat(GolemTypes.STAT_WEIGHT.get(), 0.2) + .addStat(GolemTypes.STAT_REGEN.get(), 4) .addModifier(TFCompatRegistry.TF_DAMAGE.get(), 1) .addModifier(TFCompatRegistry.TF_HEALING.get(), 1).end() @@ -46,7 +48,7 @@ public void add(Collector map) { .addStat(GolemTypes.STAT_ATTACK.get(), 20) .addModifier(GolemModifiers.FIRE_IMMUNE.get(), 1) .addModifier(GolemModifiers.THORN.get(), 1) - .addModifier(TFCompatRegistry.FIERY.get(), 1) + .addModifier(TFCompatRegistry.FIERY.get(), 2) .addModifier(TFCompatRegistry.TF_DAMAGE.get(), 1) .addModifier(TFCompatRegistry.TF_HEALING.get(), 1) .end() diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDispatch.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDispatch.java index 001d8460c..be0f24289 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDispatch.java @@ -3,21 +3,15 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; import dev.xkmc.l2library.serial.config.ConfigDataProvider; -import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; import dev.xkmc.modulargolems.compat.materials.common.ModDispatch; -import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.world.item.Items; -import twilightforest.init.TFBlocks; -import twilightforest.init.TFItems; public class TFDispatch extends ModDispatch { public static final String MODID = "twilightforest"; public TFDispatch() { + super(() -> TFClient::new); TFCompatRegistry.register(); } @@ -30,44 +24,7 @@ public void genLang(RegistrateLangProvider pvd) { @Override public void genRecipe(RegistrateRecipeProvider pvd) { - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_CARMINITE.get())::unlockedBy, TFItems.CARMINITE.get()) - .pattern("CAC").pattern("ABA").pattern("CAC") - .define('A', TFItems.CARMINITE.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .define('C', TFBlocks.ENCASED_TOWERWOOD.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_FIERY.get())::unlockedBy, TFItems.FIERY_INGOT.get()) - .pattern("CAC").pattern("ABA").pattern("CAC") - .define('A', TFItems.FIERY_INGOT.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .define('C', Items.BLAZE_POWDER) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_KNIGHTMETAL.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) - .pattern("CAC").pattern("ABA").pattern("CAC") - .define('A', TFItems.KNIGHTMETAL_INGOT.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .define('C', TFBlocks.HEDGE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_STEELEAF.get())::unlockedBy, TFItems.STEELEAF_INGOT.get()) - .pattern(" A ").pattern("ABA").pattern(" A ") - .define('A', TFItems.STEELEAF_INGOT.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_IRONWOOD.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) - .pattern(" A ").pattern("ABA").pattern(" A ") - .define('A', TFItems.IRONWOOD_INGOT.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); - - safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_NAGA.get())::unlockedBy, TFItems.NAGA_SCALE.get()) - .pattern(" A ").pattern("ABA").pattern(" A ") - .define('A', TFItems.NAGA_SCALE.get()) - .define('B', GolemItems.EMPTY_UPGRADE.get()) - .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + TFRecipeGen.genRecipe(pvd); } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFRecipeGen.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFRecipeGen.java new file mode 100644 index 000000000..63e89f3a0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFRecipeGen.java @@ -0,0 +1,228 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest; + +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import dev.xkmc.l2library.serial.ingredients.EnchantmentIngredient; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; +import dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFGolemWeaponMaterial; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +import static dev.xkmc.modulargolems.compat.materials.common.ModDispatch.safeUpgrade; +import static dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch.MODID; +import static dev.xkmc.modulargolems.init.data.RecipeGen.unlock; + +public class TFRecipeGen { + + public static void genRecipe(RegistrateRecipeProvider pvd) { + + // upgrades + { + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_CARMINITE.get())::unlockedBy, TFItems.CARMINITE.get()) + .pattern("CAC").pattern("ABA").pattern("CAC") + .define('A', TFItems.CARMINITE.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('C', TFBlocks.ENCASED_TOWERWOOD.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_FIERY.get())::unlockedBy, TFItems.FIERY_INGOT.get()) + .pattern("CAC").pattern("ABA").pattern("CAC") + .define('A', TFItems.FIERY_INGOT.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('C', Items.BLAZE_POWDER) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_KNIGHTMETAL.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) + .pattern("CAC").pattern("ABA").pattern("CAC") + .define('A', TFItems.KNIGHTMETAL_INGOT.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('C', TFBlocks.HEDGE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_STEELEAF.get())::unlockedBy, TFItems.STEELEAF_INGOT.get()) + .pattern(" A ").pattern("ABA").pattern(" A ") + .define('A', TFItems.STEELEAF_INGOT.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_IRONWOOD.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) + .pattern(" A ").pattern("ABA").pattern(" A ") + .define('A', TFItems.IRONWOOD_INGOT.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFCompatRegistry.UP_NAGA.get())::unlockedBy, TFItems.NAGA_SCALE.get()) + .pattern(" A ").pattern("ABA").pattern(" A ") + .define('A', TFItems.NAGA_SCALE.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.RECYCLE.get())::unlockedBy, TFItems.CHARM_OF_LIFE_2.get()) + .pattern(" A ").pattern("EBE").pattern(" R ") + .define('A', Ingredient.of(TFItems.CHARM_OF_LIFE_1.get(), TFItems.CHARM_OF_LIFE_2.get())) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('E', Items.ENDER_PEARL) + .define('R', Blocks.RESPAWN_ANCHOR) + .save(ConditionalRecipeWrapper.mod(pvd, MODID), ModularGolems.loc("recycle_upgrade_from_life_charm")); + + safeUpgrade(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, GolemItems.RECYCLE.get())::unlockedBy, TFItems.CHARM_OF_KEEPING_3.get()) + .requires(GolemItems.EMPTY_UPGRADE.get()).requires(TFItems.CHARM_OF_KEEPING_3.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID), ModularGolems.loc("recycle_upgrade_from_lock_charm_3")); + + safeUpgrade(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.RECYCLE.get())::unlockedBy, TFItems.CHARM_OF_KEEPING_2.get()) + .pattern(" A ").pattern("1B2").pattern(" 3 ") + .define('A', TFItems.CHARM_OF_KEEPING_2.get()) + .define('B', GolemItems.EMPTY_UPGRADE.get()) + .define('1', new EnchantmentIngredient(Enchantments.INFINITY_ARROWS, 1)) + .define('2', new EnchantmentIngredient(Enchantments.MENDING, 1)) + .define('3', new EnchantmentIngredient(Enchantments.UNBREAKING, 3)) + .save(ConditionalRecipeWrapper.mod(pvd, MODID), ModularGolems.loc("recycle_upgrade_from_lock_charm_2")); + } + + // equipments + { + + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.IRONWOOD_HELMET.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) + .pattern(" B ").pattern("III").pattern("IAI") + .define('I', TFItems.IRONWOOD_HELMET.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.LIVEROOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.IRONWOOD_CHESTPLATE.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) + .pattern("IAI").pattern("III").pattern("BIB") + .define('I', TFItems.IRONWOOD_CHESTPLATE.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.LIVEROOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.IRONWOOD_SHINGUARD.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) + .pattern("BIB").pattern(" A ").pattern("I I") + .define('I', TFItems.IRONWOOD_LEGGINGS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.LIVEROOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.IRONWOOD_BOOTS.get())::unlockedBy, TFItems.IRONWOOD_INGOT.get()) + .pattern("I I").pattern("BAB") + .define('I', TFItems.IRONWOOD_BOOTS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.LIVEROOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.NAGA_HELMET.get())::unlockedBy, TFItems.NAGA_SCALE.get()) + .pattern("EBE").pattern("BIB").pattern("BAB") + .define('I', TFBlocks.NAGA_TROPHY.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.NAGA_SCALE.get()) + .define('E', TFItems.IRONWOOD_INGOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.NAGA_CHESTPLATE.get())::unlockedBy, TFItems.NAGA_SCALE.get()) + .pattern("EAE").pattern("BIB").pattern("BBB") + .define('I', TFItems.NAGA_CHESTPLATE.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.NAGA_SCALE.get()) + .define('E', TFItems.IRONWOOD_INGOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.NAGA_SHINGUARD.get())::unlockedBy, TFItems.NAGA_SCALE.get()) + .pattern("EIE").pattern("EAE").pattern("E E") + .define('I', TFItems.NAGA_LEGGINGS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('E', TFItems.IRONWOOD_INGOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.NAGA_BOOTS.get())::unlockedBy, TFItems.NAGA_SCALE.get()) + .pattern("B B").pattern("BAB").pattern("E E") + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.NAGA_SCALE.get()) + .define('E', TFItems.IRONWOOD_INGOT.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.KNIGHTMETAL_HELMET.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) + .pattern(" B ").pattern("III").pattern("IAI") + .define('I', TFItems.KNIGHTMETAL_HELMET.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.ARMOR_SHARD_CLUSTER.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.KNIGHTMETAL_CHESTPLATE.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) + .pattern("IAI").pattern("III").pattern("BIB") + .define('I', TFItems.KNIGHTMETAL_CHESTPLATE.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.ARMOR_SHARD_CLUSTER.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.KNIGHTMETAL_SHINGUARD.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) + .pattern("BIB").pattern(" A ").pattern("I I") + .define('I', TFItems.KNIGHTMETAL_LEGGINGS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.ARMOR_SHARD_CLUSTER.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.KNIGHTMETAL_BOOTS.get())::unlockedBy, TFItems.KNIGHTMETAL_INGOT.get()) + .pattern("I I").pattern("BAB") + .define('I', TFItems.KNIGHTMETAL_BOOTS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', TFItems.ARMOR_SHARD_CLUSTER.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.FIERY_HELMET.get())::unlockedBy, TFItems.FIERY_INGOT.get()) + .pattern(" B ").pattern("III").pattern("IAI") + .define('I', TFItems.FIERY_HELMET.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', ItemTagGenerator.FIERY_VIAL) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.FIERY_CHESTPLATE.get())::unlockedBy, TFItems.FIERY_INGOT.get()) + .pattern("IAI").pattern("III").pattern("BIB") + .define('I', TFItems.FIERY_CHESTPLATE.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', ItemTagGenerator.FIERY_VIAL) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.FIERY_SHINGUARD.get())::unlockedBy, TFItems.FIERY_INGOT.get()) + .pattern("BIB").pattern(" A ").pattern("I I") + .define('I', TFItems.FIERY_LEGGINGS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', ItemTagGenerator.FIERY_VIAL) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFCompatRegistry.FIERY_BOOTS.get())::unlockedBy, TFItems.FIERY_INGOT.get()) + .pattern("I I").pattern("BAB") + .define('I', TFItems.FIERY_BOOTS.get()) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', ItemTagGenerator.FIERY_VIAL) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + + + for (var type : GolemWeaponType.values()) { + for (var mat : TFGolemWeaponMaterial.values()) { + Item item = TFCompatRegistry.TF_GOLEM_WEAPON[type.ordinal()][mat.ordinal()].get(); + type.pattern(unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, item)::unlockedBy, mat.getIngot())) + .define('I', mat.getIngot()) + .define('S', mat.getHandle()) + .define('T', GolemItems.GOLEM_TEMPLATE.get()) + .save(ConditionalRecipeWrapper.mod(pvd, MODID)); + } + } + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryArmors.java new file mode 100644 index 000000000..c67e3e36c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryArmors.java @@ -0,0 +1,103 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class FieryArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "fiery_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "fiery_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "fiery_shinguard"), "main"); + public static final ModelLayerLocation BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "fiery_boots"), "main"); + + static { + GolemModelPath.register(FIERY_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(FIERY_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(FIERY_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + GolemModelPath.register(FIERY_BOOTS, + new GolemModelPath(BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots2") + ))); + } + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 0).addBox(-1.5F, -43.0F, -8.5F, 3.0F, 3.0F, 2.0F, new CubeDeformation(-0.2F)) + .texOffs(77, 90).addBox(-6.0F, -35.75F, -8.5F, 12.0F, 5.0F, 10.0F, new CubeDeformation(0.0F)) + .texOffs(108, 0).addBox(-4.5F, -39.5F, -8.75F, 9.0F, 4.0F, 1.0F, new CubeDeformation(-0.3F)) + .texOffs(27, 64).addBox(-5.0F, -44.0F, -8.0F, 10.0F, 10.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -7.0F, 19.0F, 13.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-1.5F, -29.5F, -7.5F, 3.0F, 3.0F, 2.0F, new CubeDeformation(0.1F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(0, 68).addBox(-13.5F, -34.0F, -3.5F, 3.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(70, 39).addBox(-13.5F, -17.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(0, 68).addBox(10.5F, -34.0F, -3.5F, 3.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(70, 39).addBox(8.5F, -17.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(0, 27).addBox(-5.5F, -21.0F, -5.0F, 11.0F, 6.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + PartDefinition leg2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create().texOffs(66, 64).addBox(-8.0F, -13.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + PartDefinition leg3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create().texOffs(65, 13).addBox(1.0F, -13.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition boots1 = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create().texOffs(0, 54).addBox(-8.0F, -5.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + PartDefinition boots2 = left_leg.addOrReplaceChild("boots2", CubeListBuilder.create().texOffs(41, 50).addBox(1.0F, -5.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryModelTransformer.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryModelTransformer.java new file mode 100644 index 000000000..9bbe76014 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/FieryModelTransformer.java @@ -0,0 +1,15 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.l2serial.util.Wrappers; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.loaders.ItemLayerModelBuilder; + +public class FieryModelTransformer { + + public static T transform(T model) { + return Wrappers.cast(((ItemModelBuilder) model) + .customLoader(ItemLayerModelBuilder::begin) + .emissive(15, 15, 0).end()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/IronwoodArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/IronwoodArmors.java new file mode 100644 index 000000000..8a1c46e62 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/IronwoodArmors.java @@ -0,0 +1,116 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; +import static dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFArmorPaths.*; + +public class IronwoodArmors { + + // 定义模型层位置,使用"ironwood"作为前缀 + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ironwood_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ironwood_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ironwood_shinguard"), "main"); + public static final ModelLayerLocation BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "ironwood_boots"), "main"); + + // 静态块注册模型路径(假设存在相应的GolemModelPaths常量,如IRONWOOD_HELMETS等) + static { + // 注:以下常量(如IRONWOOD_HELMETS)需要在实际项目中定义,这里仅为示例格式 + GolemModelPath.register(IRONWOOD_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(IRONWOOD_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(IRONWOOD_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + GolemModelPath.register(IRONWOOD_BOOTS, + new GolemModelPath(BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots2") + ))); + } + + // 创建头盔模型,使用iron_golem_iron_wood_armor_set中的head1定义 + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 49).addBox(-4.5F, -44.0F, -8.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + // 创建胸甲模型,使用iron_golem_iron_wood_armor_set中的body1、body2、body3定义 + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -7.0F, 19.0F, 13.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(52, 85).addBox(-13.5F, -34.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(76, 88).addBox(8.5F, -34.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + // 创建裤子模型,使用iron_golem_iron_wood_armor_set中的legs1、legs2、legs3定义 + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(58, 26).addBox(-5.5F, -20.0F, -5.0F, 11.0F, 4.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create() + .texOffs(76, 60).addBox(-8.0F, -15.5F, -3.5F, 7.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create() + .texOffs(76, 74).addBox(1.0F, -15.5F, -3.5F, 7.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition boots1 = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create() + .texOffs(0, 96).addBox(-4.0F, 6.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(58, 39).addBox(-3.5F, 11.0F, -5.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + + PartDefinition boots2 = left_leg.addOrReplaceChild("boots2", CubeListBuilder.create() + .texOffs(58, 42).addBox(-3.5F, 11.0F, -5.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(96, 0).addBox(-4.0F, 6.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/KnightmetalArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/KnightmetalArmors.java new file mode 100644 index 000000000..70845073c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/KnightmetalArmors.java @@ -0,0 +1,126 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class KnightmetalArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "knightmetal_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "knightmetal_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "knightmetal_shinguard"), "main"); + public static final ModelLayerLocation BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "knightmetal_boots"), "main"); + + static { + GolemModelPath.register(KNIGHTMETAL_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(KNIGHTMETAL_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(KNIGHTMETAL_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + GolemModelPath.register(KNIGHTMETAL_BOOTS, + new GolemModelPath(BOOTS_LAYER, List.of( + List.of("right_leg", "boot1"), + List.of("left_leg", "boot2") + ))); + } + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(0, 26).addBox(-4.5F, -44.0F, -8.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)) + .texOffs(36, 26).addBox(-5.0F, -38.0F, -8.5F, 10.0F, 5.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + PartDefinition cube_r1 = head1.addOrReplaceChild("head11", CubeListBuilder.create().texOffs(76, 48).addBox(-1.0F, -1.5F, -1.5F, 5.0F, 1.5F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -44.0F, -3.0F, 0.0F, 0.0F, -1.6581F)); + + PartDefinition cube_r2 = head1.addOrReplaceChild("head12", CubeListBuilder.create().texOffs(76, 44).addBox(-4.0F, -1.5F, -0.5F, 5.0F, 1.5F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-8.0F, -44.0F, -4.0F, 0.0F, 0.0F, 1.6581F)); + + PartDefinition cube_r3 = head1.addOrReplaceChild("head13", CubeListBuilder.create().texOffs(76, 32).addBox(-1.0F, -2.0F, -1.0F, 5.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(5.0F, -41.0F, -4.0F, 0.3491F, 0.0F, -0.6545F)); + + PartDefinition cube_r4 = head1.addOrReplaceChild("head14", CubeListBuilder.create().texOffs(76, 26).addBox(-4.0F, -2.0F, -1.0F, 5.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.0F, -41.0F, -4.0F, 0.3491F, 0.0F, 0.6545F)); + + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -7.0F, 19.0F, 13.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(62, 68).addBox(-13.5F, -17.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r5 = body2.addOrReplaceChild("body21", CubeListBuilder.create().texOffs(0, 75).addBox(-2.0F, -5.0F, -2.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-14.0F, -33.0F, 0.0F, 0.0F, 0.0F, -0.2618F)); + + PartDefinition right_arm_outline_r1 = body2.addOrReplaceChild("body22", CubeListBuilder.create().texOffs(0, 46).addBox(-4.5F, -3.0F, -3.5F, 8.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, -32.0F, 0.0F, 0.0F, 0.0F, -0.48F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(28, 69).addBox(8.5F, -17.0F, -3.5F, 5.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition cube_r6 = body3.addOrReplaceChild("body31", CubeListBuilder.create().texOffs(14, 75).addBox(-2.0F, -5.0F, -2.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(15.0F, -33.0F, 0.0F, 0.0F, 0.0F, 0.2618F)); + + PartDefinition left_arm_outline_r1 = body3.addOrReplaceChild("body32", CubeListBuilder.create().texOffs(32, 54).addBox(-1.5F, -3.0F, -3.5F, 8.0F, 8.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.0F, -33.0F, 0.0F, 0.0F, 0.0F, 0.48F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(36, 41).addBox(-5.5F, -20.0F, -5.0F, 11.0F, 4.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create() + .texOffs(64, 0).addBox(-8.0F, -14.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(4.0F, 13.0F, 0.0F)); + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create() + .texOffs(64, 13).addBox(1.0F, -14.5F, -3.5F, 7.0F, 6.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition boot1 = right_leg.addOrReplaceChild("boot1", CubeListBuilder.create() + .texOffs(62, 54).addBox(-8.0F, -6.5F, -3.5F, 7.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(76, 41).addBox(-7.5F, -1.0F, -4.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), + PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition boot2 = left_leg.addOrReplaceChild("boot2", CubeListBuilder.create() + .texOffs(76, 38).addBox(-3.5F, 12.0F, -4.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(0, 61).addBox(-4.0F, 6.5F, -3.5F, 7.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/NagaArmors.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/NagaArmors.java new file mode 100644 index 000000000..d9e916b7e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/NagaArmors.java @@ -0,0 +1,111 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.compat.materials.twilightforest.equipments.TFArmorPaths.*; +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; + +public class NagaArmors { + + public static final ModelLayerLocation HELMET_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "naga_helmet"), "main"); + public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "naga_chestplate"), "main"); + public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "naga_shinguard"), "main"); + public static final ModelLayerLocation BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "naga_boots"), "main"); + + static { + GolemModelPath.register(NAGA_HELMETS, + new GolemModelPath(HELMET_LAYER, List.of( + List.of("head", "head1") + ))); + + GolemModelPath.register(NAGA_CHESTPLATES, + new GolemModelPath(CHESTPLATE_LAYER, List.of( + List.of("body", "body1"), + List.of("right_arm", "body2"), + List.of("left_arm", "body3") + ))); + + GolemModelPath.register(NAGA_LEGGINGS, + new GolemModelPath(SHINGUARD_LAYER, List.of( + List.of("body", "legs1"), + List.of("right_leg", "legs2"), + List.of("left_leg", "legs3") + ))); + GolemModelPath.register(NAGA_BOOTS, + new GolemModelPath(BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots2") + ))); + } + + public static LayerDefinition createHelmet() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition head = mesh.getRoot().getChild("head"); + + PartDefinition head1 = head.addOrReplaceChild("head1", CubeListBuilder.create().texOffs(48, 49).addBox(-4.5F, -44.0F, -8.0F, 9.0F, 11.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 2.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createChestplate() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition body1 = body.addOrReplaceChild("body1", CubeListBuilder.create().texOffs(0, 0).addBox(-9.5F, -33.5F, -7.0F, 19.0F, 13.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body2 = right_arm.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(0, 49).addBox(-13.5F, -34.0F, -3.5F, 5.0F, 31.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition body3 = left_arm.addOrReplaceChild("body3", CubeListBuilder.create().texOffs(24, 49).addBox(8.5F, -34.0F, -3.5F, 5.0F, 31.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + // 创建裤子模型,使用iron_golem_iron_wood_armor_set中的legs1、legs2、legs3定义 + public static LayerDefinition createLeggings() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition legs1 = body.addOrReplaceChild("legs1", CubeListBuilder.create().texOffs(58, 36).addBox(-5.5F, -20.0F, -5.0F, 11.0F, 4.0F, 9.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 31.0F, 0.0F)); + + PartDefinition legs2 = right_leg.addOrReplaceChild("legs2", CubeListBuilder.create() + .texOffs(68, 96).addBox(-8.1F, -17.5F, -3.4F, 7.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition legs3 = left_leg.addOrReplaceChild("legs3", CubeListBuilder.create() + .texOffs(96, 73).addBox(1.1F, -17.5F, -3.4F, 7.0F, 10.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + public static LayerDefinition createBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition body = mesh.getRoot().getChild("body"); + PartDefinition right_leg = mesh.getRoot().getChild("right_leg"); + PartDefinition left_leg = mesh.getRoot().getChild("left_leg"); + + PartDefinition boots1 = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create() + .texOffs(68, 69).addBox(-4.0F, -4.5F, -3.5F, 7.0F, 17.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(68, 93).addBox(-3.5F, 11.0F, -5.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition boots2 = left_leg.addOrReplaceChild("boots2", CubeListBuilder.create() + .texOffs(84, 93).addBox(-3.5F, 11.0F, -5.5F, 6.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(84, 0).addBox(-4.0F, -4.5F, -3.5F, 7.0F, 17.0F, 7.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/TFClientEventHandler.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/TFClientEventHandler.java new file mode 100644 index 000000000..3518f5fcf --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/TFClientEventHandler.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import dev.xkmc.modulargolems.events.event.GolemRenderItemInHandEvent; +import net.minecraft.world.item.BlockItem; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import twilightforest.block.GiantBlock; +import twilightforest.item.GiantItem; + +public class TFClientEventHandler { + + @SubscribeEvent + public static void onGolemItemRender(GolemRenderItemInHandEvent event) { + if (event.stack.getItem() instanceof GiantItem || + event.stack.getItem() instanceof BlockItem block && block.getBlock() instanceof GiantBlock) { + float r = 1f / event.entity.getScale(); + event.pose.scale(r, r, r); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/package-info.java new file mode 100644 index 000000000..74ea25193 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/client/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.twilightforest.client; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryArmorItem.java new file mode 100644 index 000000000..0848c4240 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryArmorItem.java @@ -0,0 +1,61 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FieryArmorItem extends MetalGolemArmorItem implements IGolemModifierItem { + + public FieryArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of( + new ModifierInstance(GolemModifiers.THORN.get(), 1), + new ModifierInstance(TFCompatRegistry.FIERY.get(), 1) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + + @Override + public boolean emissive(LivingEntity user, ItemStack stack) { + return true; + } + + @Override + protected String namespace(String def) { + return TFDispatch.MODID; + } + + @Override + public ResourceLocation getModelTexture(LivingEntity user) { + return new ResourceLocation(TFDispatch.MODID, "textures/equipments/fiery.png"); + } + + @Override + public ResourceLocation getEmissiveModelTexture(LivingEntity user) { + return new ResourceLocation(TFDispatch.MODID, "textures/equipments/fiery_emissive.png"); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryMetalGolemWeaponItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryMetalGolemWeaponItem.java new file mode 100644 index 000000000..779eb868e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/FieryMetalGolemWeaponItem.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FieryMetalGolemWeaponItem extends MetalGolemWeaponItem implements IGolemModifierItem { + + public FieryMetalGolemWeaponItem(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { + super(properties, attackDamage, percentAttack, range, sweep); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of(new ModifierInstance(TFCompatRegistry.FIERY.get(), 2)); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/IronwoodArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/IronwoodArmorItem.java new file mode 100644 index 000000000..831ce90c3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/IronwoodArmorItem.java @@ -0,0 +1,63 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class IronwoodArmorItem extends MetalGolemArmorItem implements IGolemModifierItem { + + public IronwoodArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of( + new ModifierInstance(TFCompatRegistry.TF_HEALING.get(), 1) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + + @Override + protected String namespace(String def) { + return TFDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + + builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Ironwood Armor", 0.5, AttributeModifier.Operation.ADDITION)); + + } + + @Override + public ResourceLocation getModelTexture(LivingEntity user) { + return new ResourceLocation(TFDispatch.MODID, "textures/equipments/ironwood.png"); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalArmorItem.java new file mode 100644 index 000000000..3cf7d47f8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalArmorItem.java @@ -0,0 +1,50 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class KnightmetalArmorItem extends MetalGolemArmorItem implements IGolemModifierItem { + + public KnightmetalArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of( + new ModifierInstance(TFCompatRegistry.TF_DAMAGE.get(), 1), + new ModifierInstance(GolemModifiers.THORN.get(), 1) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + + @Override + protected String namespace(String def) { + return TFDispatch.MODID; + } + + @Override + public ResourceLocation getModelTexture(LivingEntity user) { + return new ResourceLocation(TFDispatch.MODID, "textures/equipments/knightmetal.png"); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalMetalGolemWeaponItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalMetalGolemWeaponItem.java new file mode 100644 index 000000000..044c858b5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/KnightmetalMetalGolemWeaponItem.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class KnightmetalMetalGolemWeaponItem extends MetalGolemWeaponItem implements IGolemModifierItem { + + public KnightmetalMetalGolemWeaponItem(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { + super(properties, attackDamage, percentAttack, range, sweep); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of( + new ModifierInstance(TFCompatRegistry.TF_DAMAGE.get(), 2), + new ModifierInstance(GolemModifiers.ARMOR_BYPASS.get(), 2) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/NagaArmorItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/NagaArmorItem.java new file mode 100644 index 000000000..4757a4a68 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/NagaArmorItem.java @@ -0,0 +1,78 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFDispatch; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.init.registrate.GolemModifiers; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class NagaArmorItem extends MetalGolemArmorItem implements IGolemModifierItem { + + public NagaArmorItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + if (getSlot() == EquipmentSlot.HEAD) return List.of( + new ModifierInstance(GolemModifiers.ARMOR_BYPASS.get(), 1), + new ModifierInstance(TFCompatRegistry.TF_HEALING.get(), 1), + new ModifierInstance(TFCompatRegistry.TF_DAMAGE.get(), 1) + ); + return List.of( + new ModifierInstance(TFCompatRegistry.TF_HEALING.get(), 1), + new ModifierInstance(TFCompatRegistry.TF_DAMAGE.get(), 1) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + + @Override + protected String namespace(String def) { + return TFDispatch.MODID; + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(GolemTypes.GOLEM_REGEN.get(), new AttributeModifier(uuid, + "Naga Armor", 0.5, AttributeModifier.Operation.ADDITION)); + switch (getSlot()) { + case CHEST -> builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(uuid, + "Naga Armor", 1, AttributeModifier.Operation.ADDITION)); + case LEGS, FEET -> builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, + "Naga Armor", 0.2, AttributeModifier.Operation.MULTIPLY_BASE)); + } + + } + + @Override + public ResourceLocation getModelTexture(LivingEntity user) { + return new ResourceLocation(TFDispatch.MODID, "textures/equipments/naga.png"); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFArmorPaths.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFArmorPaths.java new file mode 100644 index 000000000..8a562fad4 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFArmorPaths.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; + +public class TFArmorPaths { + + public static final ResourceLocation + IRONWOOD_HELMETS = ModularGolems.loc("ironwood/helmet"), + IRONWOOD_CHESTPLATES = ModularGolems.loc("ironwood/chestplate"), + IRONWOOD_LEGGINGS = ModularGolems.loc("ironwood/shinguard"), + IRONWOOD_BOOTS = ModularGolems.loc("ironwood/boots"); + + public static final ResourceLocation + NAGA_HELMETS = ModularGolems.loc("naga/helmet"), + NAGA_CHESTPLATES = ModularGolems.loc("naga/chestplate"), + NAGA_LEGGINGS = ModularGolems.loc("naga/shinguard"), + NAGA_BOOTS = ModularGolems.loc("naga/boots"); + + public static final ResourceLocation + KNIGHTMETAL_HELMETS = ModularGolems.loc("knightmetal/helmet"), + KNIGHTMETAL_CHESTPLATES = ModularGolems.loc("knightmetal/chestplate"), + KNIGHTMETAL_LEGGINGS = ModularGolems.loc("knightmetal/shinguard"), + KNIGHTMETAL_BOOTS = ModularGolems.loc("knightmetal/boots"); + + public static final ResourceLocation + FIERY_HELMETS = ModularGolems.loc("fiery/helmet"), + FIERY_CHESTPLATES = ModularGolems.loc("fiery/chestplate"), + FIERY_LEGGINGS = ModularGolems.loc("fiery/shinguard"), + FIERY_BOOTS = ModularGolems.loc("fiery/boots"); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFGolemWeaponMaterial.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFGolemWeaponMaterial.java new file mode 100644 index 000000000..5ce2bd8da --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFGolemWeaponMaterial.java @@ -0,0 +1,78 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.compat.materials.twilightforest.client.FieryModelTransformer; +import dev.xkmc.modulargolems.init.material.IGolemWeaponFactory; +import dev.xkmc.modulargolems.init.material.IGolemWeaponMaterial; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import twilightforest.init.TFItems; + +import java.util.Locale; + +public enum TFGolemWeaponMaterial implements IGolemWeaponMaterial { + IRONWOOD(6, false, TFItems.IRONWOOD_INGOT::get), + STEELEAF(8, false, TFItems.STEELEAF_INGOT::get), + KNIGHTMETAL(8, false, TFItems.KNIGHTMETAL_INGOT::get), + FIERY(10, true, TFItems.FIERY_INGOT::get); + + private final int damage; + private final boolean fireResistant; + private final ItemLike ingot; + + TFGolemWeaponMaterial(int damage, boolean fireResistant, ItemLike ingot) { + this.damage = damage; + this.fireResistant = fireResistant; + this.ingot = ingot; + } + + @Override + public int getDamage() { + return damage; + } + + @Override + public String getName() { + return name().toLowerCase(Locale.ROOT); + } + + @Override + public boolean fireResistant() { + return fireResistant; + } + + public Item getIngot() { + return ingot.asItem(); + } + + public ResourceLocation modLoc(String s) { + return TFCompatRegistry.tfLoc(s); + } + + @Override + public IGolemWeaponFactory factory() { + return switch (this) { + case FIERY -> FieryMetalGolemWeaponItem::new; + case KNIGHTMETAL -> KnightmetalMetalGolemWeaponItem::new; + default -> TFMetalGolemWeaponItem::new; + }; + } + + @Override + public T model(T model) { + if (this != FIERY) return model; + return FieryModelTransformer.transform(model); + } + + public Item getHandle() { + return switch (this) { + case STEELEAF -> TFItems.LIVEROOT.get(); + case FIERY -> Items.BLAZE_ROD; + default -> Items.STICK; + }; + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFMetalGolemWeaponItem.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFMetalGolemWeaponItem.java new file mode 100644 index 000000000..0fcdc628e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/TFMetalGolemWeaponItem.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import dev.xkmc.modulargolems.compat.materials.twilightforest.TFCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class TFMetalGolemWeaponItem extends MetalGolemWeaponItem implements IGolemModifierItem { + + public TFMetalGolemWeaponItem(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { + super(properties, attackDamage, percentAttack, range, sweep); + } + + @Override + public List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem) { + return List.of( + new ModifierInstance(TFCompatRegistry.TF_DAMAGE.get(), 1) + ); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + appendModifierText(stack, list); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/package-info.java new file mode 100644 index 000000000..ea41c4e12 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/equipments/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.twilightforest.equipments; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/CarminiteModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/CarminiteModifier.java similarity index 96% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/CarminiteModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/CarminiteModifier.java index 3445f7d81..d69187824 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/CarminiteModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/CarminiteModifier.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.compat.materials.twilightforest; +package dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/FieryModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/FieryModifier.java similarity index 54% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/FieryModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/FieryModifier.java index bba08d13d..fc4a5706b 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/FieryModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/FieryModifier.java @@ -1,5 +1,7 @@ -package dev.xkmc.modulargolems.compat.materials.twilightforest; +package dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; @@ -7,14 +9,13 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; import java.util.List; public class FieryModifier extends GolemModifier { private static float getPercent() { - return (float) (double) MGConfig.COMMON.fiery.get(); + return (float) (double) MGConfig.COMMON.fieryDamageFactor.get(); } public FieryModifier() { @@ -22,15 +23,16 @@ public FieryModifier() { } public List getDetail(int v) { - int reflect = Math.round((1 + getPercent() * v) * 100); + int reflect = Math.round(getPercent() * v * 100); return List.of(Component.translatable(getDescriptionId() + ".desc", reflect).withStyle(ChatFormatting.GREEN)); } @Override - public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event, int level) { - if (!event.getEntity().fireImmune()) { - event.getEntity().setSecondsOnFire(10); - event.setAmount(event.getAmount() * (1 + getPercent() * level)); + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + super.modifyDamage(cache, entity, level); + if (!cache.getAttackTarget().fireImmune()) { + cache.getAttackTarget().setSecondsOnFire(10); + cache.addHurtModifier(DamageModifier.multTotal(1 + getPercent() * level)); } } diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDamageModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFDamageModifier.java similarity index 94% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDamageModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFDamageModifier.java index 1947de54e..f9b9c5691 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFDamageModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFDamageModifier.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.compat.materials.twilightforest; +package dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers; import dev.xkmc.l2damagetracker.contents.attack.AttackCache; import dev.xkmc.l2damagetracker.contents.attack.DamageModifier; @@ -25,7 +25,6 @@ public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, in double dmg = MGConfig.COMMON.compatTFDamage.get() * level; cache.addHurtModifier(DamageModifier.multTotal(1 + (float) dmg)); } - } public List getDetail(int v) { diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFHealingModifier.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFHealingModifier.java similarity index 93% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFHealingModifier.java rename to src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFHealingModifier.java index 7a961dff5..c55e4615a 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/TFHealingModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/TFHealingModifier.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.compat.materials.twilightforest; +package dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/package-info.java new file mode 100644 index 000000000..74286a575 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/materials/twilightforest/modifiers/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.materials.twilightforest.modifiers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/misc/MaidCompat.java b/src/main/java/dev/xkmc/modulargolems/compat/misc/MaidCompat.java deleted file mode 100644 index c688fbdeb..000000000 --- a/src/main/java/dev/xkmc/modulargolems/compat/misc/MaidCompat.java +++ /dev/null @@ -1,71 +0,0 @@ -package dev.xkmc.modulargolems.compat.misc; - -import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; -import com.github.tartaricacid.touhoulittlemaid.api.event.ConvertMaidEvent; -import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.EntityMaidRenderer; -import com.github.tartaricacid.touhoulittlemaid.init.InitItems; -import com.github.tartaricacid.touhoulittlemaid.item.ItemGarageKit; -import com.mojang.blaze3d.vertex.PoseStack; -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import dev.xkmc.modulargolems.content.entity.humanoid.skin.ClientSkinDispatch; -import dev.xkmc.modulargolems.content.entity.humanoid.skin.SpecialRenderSkin; -import dev.xkmc.modulargolems.events.event.HumanoidSkinEvent; -import dev.xkmc.modulargolems.init.ModularGolems; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -public class MaidCompat { - - private static EntityMaidRenderer RENDERER; - - @SubscribeEvent - public static void onMaidConvert(ConvertMaidEvent event) { - if (!(event.getEntity() instanceof HumanoidGolemEntity golem)) return; - if (ClientSkinDispatch.get(golem) instanceof MaidSkin skin) - event.setMaid(new MaidWrapper(golem, skin.id)); - } - - @SubscribeEvent - public static void onHumanoidSkin(HumanoidSkinEvent event) { - ItemStack stack = event.getStack(); - if (stack.is(InitItems.GARAGE_KIT.get())) { - var id = ItemGarageKit.getMaidData(stack).getString("ModelId"); - event.setSkin(new MaidSkin(id)); - } - } - - public static void addLayers(EntityRenderersEvent.AddLayers event) { - RENDERER = new EntityMaidRenderer(event.getContext()); - } - - private record MaidSkin(String id) implements SpecialRenderSkin { - - @Override - public void render(HumanoidGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { - if (RENDERER == null) return; - try { - RENDERER.render(entity, f1, f2, stack, source, i); - } catch (Exception e) { - ModularGolems.LOGGER.debug("Error rendering golem with TLM skin", e); - } - } - } - - private record MaidWrapper(Mob mob, String id) implements IMaid { - - @Override - public String getModelId() { - return id; - } - - @Override - public Mob asEntity() { - return mob; - } - - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/misc/PatchouliFlagHelper.java b/src/main/java/dev/xkmc/modulargolems/compat/misc/PatchouliFlagHelper.java new file mode 100644 index 000000000..9da12b412 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/misc/PatchouliFlagHelper.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.misc; + +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraftforge.fml.loading.FMLLoader; +import vazkii.patchouli.common.base.PatchouliConfig; + +public class PatchouliFlagHelper { + + public static void setFlag(String s, boolean flag) { + try { + PatchouliConfig.setFlag(s, flag); + } catch (Exception e) { + if (!FMLLoader.isProduction()) { + ModularGolems.LOGGER.throwing(e); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketCompat.java b/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketCompat.java new file mode 100644 index 000000000..d41132f1b --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketCompat.java @@ -0,0 +1,19 @@ +package dev.xkmc.modulargolems.compat.musket; + +import dev.xkmc.mob_weapon_api.registry.WeaponStatus; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; +import ewewukek.musketmod.GunItem; +import ewewukek.musketmod.MusketMod; +import net.minecraft.resources.ResourceLocation; + +public class GolemMusketCompat { + + public static void init() { + GolemWeaponRegistry.HUMANOID.register( + new ResourceLocation(MusketMod.MODID, "musket"), + (golem, stack, hand) -> WeaponStatus.RANGED.of(stack.getItem() instanceof GunItem item && item.canUseFrom(golem, hand)), + (golem, melee) -> new GolemMusketGoal(golem) + ); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketGoal.java new file mode 100644 index 000000000..5ffffabef --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/musket/GolemMusketGoal.java @@ -0,0 +1,122 @@ +package dev.xkmc.modulargolems.compat.musket; + +import dev.xkmc.mob_weapon_api.api.goals.IWeaponGoal; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.ItemStack; + +public class GolemMusketGoal extends RangedGunAttackGoal + implements IWeaponGoal { + private static final double speedModifier = 1.0; + private static final float attackRadius = 15.0F; + private int seeTime; + private int attackDelay; + private boolean strafingClockwise; + private boolean strafingBackwards; + private int strafingTime = -1; + + public GolemMusketGoal(HumanoidGolemEntity mob) { + super(mob); + } + + public boolean canContinueToUse() { + return (this.isTargetValid() || !this.mob.getNavigation().isDone()) && this.canUseGun(); + } + + @Override + public double range(ItemStack stack) { + return attackRadius; + } + + public void start() { + super.start(); + mob.setAggressive(true); + mob.setInRangeAttack(true); + } + + public void stop() { + super.stop(); + this.seeTime = 0; + this.attackDelay = 0; + mob.setInRangeAttack(false); + } + + public void tick() { + super.tick(); + LivingEntity target = mob.getTarget(); + if (target != null) { + boolean canSee = mob.getSensing().hasLineOfSight(target); + boolean wasSeeing = this.seeTime > 0; + if (canSee != wasSeeing) { + this.seeTime = 0; + } + + if (canSee) { + ++this.seeTime; + } else { + --this.seeTime; + } + + float dist = mob.distanceTo(target); + if (dist < 15.0F && this.seeTime >= 20) { + mob.getNavigation().stop(); + ++this.strafingTime; + } else { + mob.getNavigation().moveTo(target, 1.0); + this.strafingTime = -1; + } + + if (this.strafingTime >= 20) { + if (mob.getRandom().nextFloat() < 0.3F) { + this.strafingClockwise = !this.strafingClockwise; + } + + if (mob.getRandom().nextFloat() < 0.3F) { + this.strafingBackwards = !this.strafingBackwards; + } + + this.strafingTime = 0; + } + + if (this.strafingTime > -1) { + if (dist > attackRadius * 0.75) { + this.strafingBackwards = false; + } else if (dist < attackRadius * 0.25) { + this.strafingBackwards = true; + } + + mob.getMoveControl().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F); + Entity var6 = mob.getControlledVehicle(); + if (var6 instanceof Mob vehicle) { + vehicle.lookAt(target, 30.0F, 30.0F); + } + + mob.lookAt(target, 30.0F, 30.0F); + } else { + mob.getLookControl().setLookAt(target, 30.0F, 30.0F); + } + + if (this.seeTime < -60) { + this.attackDelay = Math.max(20, this.attackDelay); + } + + if (this.attackDelay > 0) { + --this.attackDelay; + } else if (this.isReady()) { + if (canSee) { + this.fire(0); + this.attackDelay = 10; + } + } else { + this.reload(); + } + + } + } + + public void onReady() { + this.attackDelay = Math.max(20, this.attackDelay); + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/musket/RangedGunAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/compat/musket/RangedGunAttackGoal.java new file mode 100644 index 000000000..334569885 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/musket/RangedGunAttackGoal.java @@ -0,0 +1,110 @@ +package dev.xkmc.modulargolems.compat.musket; + +import ewewukek.musketmod.GunItem; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +import java.util.EnumSet; + +public class RangedGunAttackGoal extends Goal { + public final T mob; + private boolean isLoading; + + public RangedGunAttackGoal(T mob) { + this(mob, EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + public RangedGunAttackGoal(T mob, EnumSet flags) { + this.mob = mob; + this.setFlags(flags); + } + + public boolean canUse() { + return this.isTargetValid() && this.canUseGun(); + } + + public boolean isTargetValid() { + return this.mob.getTarget() != null && this.mob.getTarget().isAlive(); + } + + public boolean canUseGun() { + return GunItem.isHoldingGun(this.mob) && GunItem.canUse(this.mob); + } + + public boolean isReady() { + InteractionHand hand = GunItem.getHoldingHand(this.mob); + if (hand == null) { + return false; + } else { + ItemStack stack = this.mob.getItemInHand(hand); + return GunItem.isReady(stack); + } + } + + public boolean isLoading() { + return this.isLoading; + } + + public void onReady() { + } + + public void reload() { + InteractionHand hand = GunItem.getHoldingHand(this.mob); + if (hand != null) { + ItemStack stack = this.mob.getItemInHand(hand); + if (!this.isLoading && !GunItem.isLoaded(stack)) { + GunItem.setLoadingStage(stack, 1); + this.mob.startUsingItem(hand); + this.isLoading = true; + } + + } + } + + public void fire(float spread) { + InteractionHand hand = GunItem.getHoldingHand(this.mob); + if (hand != null) { + ItemStack stack = this.mob.getItemInHand(hand); + GunItem gun = (GunItem) stack.getItem(); + Vec3 direction = gun.aimAt(this.mob, this.mob.getTarget()); + if (spread > 0.0F) { + direction = GunItem.addUniformSpread(direction, this.mob.getRandom(), spread); + } + + gun.mobUse(this.mob, hand, direction); + } + } + + public boolean requiresUpdateEveryTick() { + return true; + } + + public void tick() { + if (this.isLoading) { + if (this.mob.isUsingItem()) { + if (GunItem.isLoaded(this.mob.getUseItem())) { + this.mob.releaseUsingItem(); + this.isLoading = false; + this.onReady(); + } + } else { + this.isLoading = false; + } + } + + } + + public void stop() { + super.stop(); + this.mob.setAggressive(false); + this.mob.setTarget(null); + this.isLoading = false; + if (this.mob.isUsingItem()) { + this.mob.stopUsingItem(); + } + + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/compat/musket/package-info.java b/src/main/java/dev/xkmc/modulargolems/compat/musket/package-info.java new file mode 100644 index 000000000..04bde95f2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/compat/musket/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.compat.musket; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/block/TableBlock.java b/src/main/java/dev/xkmc/modulargolems/content/block/TableBlock.java new file mode 100644 index 000000000..735a16f55 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/block/TableBlock.java @@ -0,0 +1,52 @@ +package dev.xkmc.modulargolems.content.block; + +import dev.xkmc.modulargolems.content.menu.table.GolemUpgradeMenu; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class TableBlock extends Block { + + public static final VoxelShape SHAPE = Shapes.or( + Block.box(0, 0, 0, 16, 4, 16), + Block.box(1, 4, 1, 15, 10, 15), + Block.box(0, 9, 0, 16, 16, 16) + ); + + public TableBlock(Properties prop) { + super(prop); + } + + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (level.isClientSide) { + return InteractionResult.SUCCESS; + } else { + player.openMenu(state.getMenuProvider(level, pos)); + return InteractionResult.CONSUME; + } + } + + public MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { + return new SimpleMenuProvider((wid, inv, player) -> + new GolemUpgradeMenu(GolemMiscs.UPGRADES.get(), wid, inv), MGLangData.TAB_UPGRADES.get()); + } + + @Override + public VoxelShape getShape(BlockState p_60555_, BlockGetter p_60556_, BlockPos p_60557_, CollisionContext p_60558_) { + return SHAPE; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/block/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/block/package-info.java new file mode 100644 index 000000000..f8db75893 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/block/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.block; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/ClientDataHandler.java b/src/main/java/dev/xkmc/modulargolems/content/capability/ClientDataHandler.java index 6e404ba78..fe7beef12 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/capability/ClientDataHandler.java +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/ClientDataHandler.java @@ -3,6 +3,8 @@ import dev.xkmc.l2library.util.Proxy; import net.minecraft.client.multiplayer.ClientLevel; +import java.util.UUID; + public class ClientDataHandler { public static void handleUpdate(GolemConfigEntry init) { @@ -12,4 +14,11 @@ public static void handleUpdate(GolemConfigEntry init) { storage.replaceStorage(init); } + public static void handleTracked(UUID id, GolemTracker data) { + ClientLevel level = Proxy.getClientWorld(); + if (level == null) return; + GolemConfigStorage storage = GolemConfigStorage.get(level); + storage.replaceTracker(id, data); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigEditor.java b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigEditor.java index f373b832f..5abb37eb5 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigEditor.java +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigEditor.java @@ -15,7 +15,7 @@ public interface GolemConfigEditor { @OnlyIn(Dist.CLIENT) static GolemConfigEditor readable(UUID id, int color) { - return new Readable(Proxy.getClientWorld(), id, color); + return new Readable(Proxy.getWorld(), id, color); } Level level(); diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigStorage.java b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigStorage.java index 84b67bb29..7bf95a8fc 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigStorage.java +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemConfigStorage.java @@ -18,10 +18,18 @@ public class GolemConfigStorage { public static Capability CAPABILITY = CapabilityManager.get(new CapabilityToken<>() { }); + private static ServerLevel LAST_LEVEL = null; + private static GolemConfigStorage LAST_CACHE = null; + public static GolemConfigStorage get(Level level) { - if (level instanceof ServerLevel sl) - return sl.getServer().overworld().getCapability(CAPABILITY).resolve().get(); - else return getClientCache(level); + if (level instanceof ServerLevel sl) { + if (LAST_LEVEL == sl.getServer().overworld() && LAST_CACHE != null) { + return LAST_CACHE; + } + LAST_LEVEL = sl.getServer().overworld(); + LAST_CACHE = LAST_LEVEL.getCapability(CAPABILITY).resolve().get(); + return LAST_CACHE; + } else return getClientCache(level); } private static GolemConfigStorage CACHE = null; @@ -37,6 +45,8 @@ private static GolemConfigStorage getClientCache(Level level) { @SerialClass.SerialField private final HashMap storage = new HashMap<>(); + @SerialClass.SerialField + private final HashMap tracker = new HashMap<>(); public GolemConfigStorage(Level level) { this.level = level; @@ -51,6 +61,10 @@ public GolemConfigEntry getOrCreateStorage(UUID id, int color, Component comp) { return entries[color].init(id, color); } + public GolemTracker getTracker(UUID id) { + return tracker.computeIfAbsent(id, k -> new GolemTracker()); + } + @Nullable public GolemConfigEntry getStorage(UUID id, int color) { if (color < 0 || color > 15) return null; @@ -66,6 +80,10 @@ public void replaceStorage(GolemConfigEntry entry) { entries[entry.getColor()] = entry.copyFrom(entries[entry.getColor()]); } + public void replaceTracker(UUID id, GolemTracker data) { + tracker.put(id, data); + } + public void init() { } diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/GolemTracker.java b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemTracker.java new file mode 100644 index 000000000..11157cf81 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/GolemTracker.java @@ -0,0 +1,113 @@ +package dev.xkmc.modulargolems.content.capability; + +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.core.GolemType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.UUID; + +@SerialClass +public class GolemTracker { + + public enum Status { + ALIVE, RETRIEVED, OTHER_RETRIEVED, DEATH, DEATH_RECYCLE; + + public boolean isDeath() { + return this == DEATH || this == DEATH_RECYCLE; + } + } + + public enum RetrieveTarget { + INVENTORY, ENDER, DIMENSIONAL + } + + @SerialClass.SerialField + public final LinkedHashMap data = new LinkedHashMap<>(); + + public void track(AbstractGolemEntity e) { + if (!e.isAddedToWorld()) return; + if (e.isDeadOrDying()) return; + data.computeIfAbsent(e.getUUID(), k -> new TrackedData()).update(e); + } + + public void trackPos(UUID id, double x, double y, double z) { + var rec = data.get(id); + if (rec != null) rec.updatePos(x, y, z); + } + + public boolean isUntracked(AbstractGolemEntity e) { + var rec = data.get(e.getUUID()); + if (rec == null) return true; + return rec.status != Status.ALIVE; + } + + public void untrack(AbstractGolemEntity e, Status type, @Nullable Entity cause) { + data.computeIfAbsent(e.getUUID(), k -> new TrackedData()).untrack(e, type, cause); + } + + @SerialClass + public static class TrackedData { + + @SerialClass.SerialField + public Status status = Status.ALIVE; + @SerialClass.SerialField + public ResourceLocation lastDim; + @SerialClass.SerialField + public BlockPos lastPos; + @SerialClass.SerialField + public long timestamp; + @SerialClass.SerialField + public String name, cause; + @SerialClass.SerialField + public float mhp, hp; + @SerialClass.SerialField + public GolemType golemType; + @SerialClass.SerialField + public List materials = new ArrayList<>(); + @SerialClass.SerialField + public RetrieveTarget target = null; + + public void update(AbstractGolemEntity e) { + status = Status.ALIVE; + target = null; + lastDim = e.level().dimension().location(); + lastPos = e.blockPosition(); + timestamp = e.level().getGameTime(); + cause = null; + mhp = e.getMaxHealth(); + hp = e.getGuardedDataImpl(); + if (name == null || e.tickCount % 20 == 10) { + name = Component.Serializer.toJson(e.getName()); + golemType = GolemType.getGolemType(e.getType()); + materials.clear(); + for (var m : e.getMaterials()) { + materials.add(m.id()); + } + } + } + + public void updatePos(double x, double y, double z) { + lastPos = BlockPos.containing(x, y, z); + } + + public void untrack(AbstractGolemEntity e, Status type, @Nullable Entity cause) { + if (lastDim == null) + update(e); + if (!type.isDeath() || !status.isDeath()) + status = type; + hp = e.getGuardedDataImpl(); + if (cause != null) + this.cause = Component.Serializer.toJson(cause.getName()); + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/PathConfig.java b/src/main/java/dev/xkmc/modulargolems/content/capability/PathConfig.java index 5ab72f44a..c7ee1c895 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/capability/PathConfig.java +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/PathConfig.java @@ -1,9 +1,14 @@ package dev.xkmc.modulargolems.content.capability; import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.hostile.HostileGolemRegistry; import dev.xkmc.modulargolems.content.item.card.PathRecordCard; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.ModList; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -13,7 +18,23 @@ public class PathConfig { @SerialClass.SerialField protected final ArrayList path = new ArrayList<>(); - public List getList() { + @Nullable + public static List getPath(AbstractGolemEntity e) { + var faction = HostileGolemRegistry.tryGetFaction(e); + if (faction.isPresent()) return faction.get().getPath(e, e.getConfigColor()); + if (ModList.get().isLoaded("curios")) { + var opt = CurioCompatRegistry.getItem(e, "golem_route") + .map(PathRecordCard::getList); + if (opt.isPresent()) return opt.get(); + } + var config = e.getConfigEntry(null); + if (config != null) { + return config.pathConfig.getList(); + } + return null; + } + + private List getList() { for (var e : path) { if (e.getItem() instanceof PathRecordCard) { return PathRecordCard.getList(e); diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/TargetFilterConfig.java b/src/main/java/dev/xkmc/modulargolems/content/capability/TargetFilterConfig.java index 494bd5dd4..b7836d8cc 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/capability/TargetFilterConfig.java +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/TargetFilterConfig.java @@ -3,6 +3,7 @@ import dev.xkmc.l2serial.serialization.SerialClass; import dev.xkmc.modulargolems.content.item.card.NameFilterCard; import dev.xkmc.modulargolems.content.item.card.TargetFilterCard; +import dev.xkmc.modulargolems.content.item.card.UuidFilterCard; import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; @@ -32,6 +33,13 @@ public boolean internalMatch(ArrayList list, ItemStack stack) { } public boolean aggressiveToward(LivingEntity le) { + for (var e : friendlyTo) { + if (e.getItem() instanceof UuidFilterCard card) { + if (card.mayTarget(e).test(le)) { + return false; + } + } + } for (var e : hostileTo) { if (e.getItem() instanceof TargetFilterCard card) { if (card.mayTarget(e).test(le)) { @@ -43,6 +51,13 @@ public boolean aggressiveToward(LivingEntity le) { } public boolean friendlyToward(LivingEntity le) { + for (var e : hostileTo) { + if (e.getItem() instanceof UuidFilterCard card) { + if (card.mayTarget(e).test(le)) { + return false; + } + } + } for (var e : friendlyTo) { if (e.getItem() instanceof TargetFilterCard card) { if (card.mayTarget(e).test(le)) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerDeleteToServer.java b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerDeleteToServer.java new file mode 100644 index 000000000..5b2f5e55e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerDeleteToServer.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.content.capability; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraftforge.network.NetworkEvent; + +import java.util.UUID; + +@SerialClass +public class TrackerDeleteToServer extends SerialPacketBase { + + @SerialClass.SerialField + public UUID owner, golem; + + @Deprecated + public TrackerDeleteToServer() { + + } + + public TrackerDeleteToServer(UUID owner, UUID golem) { + this.owner = owner; + this.golem = golem; + } + + @Override + public void handle(NetworkEvent.Context context) { + var sp = context.getSender(); + if (sp == null || !sp.getUUID().equals(owner)) return; + var tracker = GolemConfigStorage.get(sp.level()).getTracker(owner); + tracker.data.remove(golem); + ModularGolems.HANDLER.toClientPlayer(new TrackerSyncToClient(owner, tracker), sp); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerHeartBeatToServer.java b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerHeartBeatToServer.java new file mode 100644 index 000000000..175d7a67c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerHeartBeatToServer.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.content.capability; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; + +import java.util.UUID; + +@SerialClass +public class TrackerHeartBeatToServer extends SerialPacketBase { + + @SerialClass.SerialField + public UUID id; + + @Deprecated + public TrackerHeartBeatToServer() { + + } + + public TrackerHeartBeatToServer(UUID id) { + this.id = id; + } + + @Override + public void handle(NetworkEvent.Context context) { + ServerPlayer player = context.getSender(); + if (player == null) return; + var entry = GolemConfigStorage.get(player.level()).getTracker(id); + ModularGolems.HANDLER.toClientPlayer(new TrackerSyncToClient(player.getUUID(), entry), player); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerSyncToClient.java b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerSyncToClient.java new file mode 100644 index 000000000..1b4acbb8c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/capability/TrackerSyncToClient.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.content.capability; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import net.minecraftforge.network.NetworkEvent; + +import java.util.UUID; + +@SerialClass +public class TrackerSyncToClient extends SerialPacketBase { + + @SerialClass.SerialField + public UUID id; + @SerialClass.SerialField + public GolemTracker entry; + + @Deprecated + public TrackerSyncToClient() { + + } + + public TrackerSyncToClient(UUID id, GolemTracker entry) { + this.entry = entry; + this.id = id; + } + + @Override + public void handle(NetworkEvent.Context context) { + ClientDataHandler.handleTracked(id, entry); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemBoots.java b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemBoots.java new file mode 100644 index 000000000..60ecf0431 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemBoots.java @@ -0,0 +1,116 @@ +package dev.xkmc.modulargolems.content.client.armor; + +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +import static dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels.buildGolemBaseLayers; +import static dev.xkmc.modulargolems.content.client.armor.GolemModelPaths.*; + +public class GolemBoots { + + public static final ModelLayerLocation DIAMOND_BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "wind_spirit_boots"), "main"); + public static final ModelLayerLocation BEACON_BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "beacon_boots"), "main"); + public static final ModelLayerLocation NETHERITE_BOOTS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "barbaric_vanguard_boots"), "main"); + + static { + GolemModelPath.register(BOOTS_DIAMOND, + new GolemModelPath(DIAMOND_BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots5") + ))); + + GolemModelPath.register(BOOTS_NETHERITE, + new GolemModelPath(NETHERITE_BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots3") + ))); + + GolemModelPath.register(BOOTS_BEACON, + new GolemModelPath(BEACON_BOOTS_LAYER, List.of( + List.of("right_leg", "boots1"), + List.of("left_leg", "boots2") + ))); + + } + + + public static LayerDefinition createDiamondBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition partdefinition = mesh.getRoot(); + + PartDefinition right_leg = partdefinition.getChild("right_leg"); + + PartDefinition left_leg = partdefinition.getChild("left_leg"); + + PartDefinition bone = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -4.9F, -3.5F, 7.0F, 5.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(0, 22).addBox(-7.5F, -1.9F, -4.5F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition boots5_r1 = bone.addOrReplaceChild("boots2", CubeListBuilder.create().texOffs(26, 0).addBox(-1.0F, -0.9F, -1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-8.0F, -3.0F, 3.0F, 0.3491F, 0.0F, 0.0F)); + + PartDefinition boots4_r1 = bone.addOrReplaceChild("boots3", CubeListBuilder.create().texOffs(0, 25).addBox(-1.0F, -1.0F, -1.0F, 1.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-8.0F, -4.0F, 2.0F, 1.1345F, 0.0F, 0.0F)); + + PartDefinition boots3_r1 = bone.addOrReplaceChild("boots4", CubeListBuilder.create().texOffs(16, 25).addBox(-1.0F, -2.0F, -1.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-8.0F, -2.0F, 2.0F, 0.829F, 0.0F, 0.0F)); + + PartDefinition bone2 = left_leg.addOrReplaceChild("boots5", CubeListBuilder.create().texOffs(0, 11).addBox(1.0F, -4.9F, -3.5F, 7.0F, 5.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(14, 22).addBox(1.5F, -1.9F, -4.5F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + PartDefinition boots10_r1 = bone2.addOrReplaceChild("boots6", CubeListBuilder.create().texOffs(26, 3).addBox(0.0F, -0.8F, -1.1F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -3.0F, 3.0F, 0.3491F, 0.0F, 0.0F)); + + PartDefinition boots9_r1 = bone2.addOrReplaceChild("boots7", CubeListBuilder.create().texOffs(8, 25).addBox(0.0F, -1.0F, -1.0F, 1.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -4.0F, 2.0F, 1.1781F, 0.0F, 0.0F)); + + PartDefinition boots8_r1 = bone2.addOrReplaceChild("boots8", CubeListBuilder.create().texOffs(22, 25).addBox(-2.0F, -4.0F, 1.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(10.0F, 1.0F, 2.0F, 0.829F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + public static LayerDefinition createNetheriteBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition partdefinition = mesh.getRoot(); + + PartDefinition right_leg = partdefinition.getChild("right_leg"); + + PartDefinition bone = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -4.9F, -3.5F, 7.0F, 5.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(20, 22).addBox(-7.5F, -1.9F, -4.5F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition boots2_r1 = bone.addOrReplaceChild("boots2", CubeListBuilder.create().texOffs(0, 22).addBox(0.0F, -4.5F, -2.0F, 1.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.0F, -1.0F, 2.0F, 0.7854F, 0.0F, 0.0F)); + + PartDefinition left_leg = partdefinition.getChild("left_leg"); + + PartDefinition bone2 = left_leg.addOrReplaceChild("boots3", CubeListBuilder.create().texOffs(0, 11).addBox(1.0F, -4.9F, -3.5F, 7.0F, 5.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(20, 25).addBox(1.5F, -1.9F, -4.5F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + PartDefinition boots4_r1 = bone2.addOrReplaceChild("boots4", CubeListBuilder.create().texOffs(10, 22).addBox(-1.0F, -2.0F, -1.0F, 1.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.0F, -2.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + + public static LayerDefinition createBeaconBoots() { + MeshDefinition mesh = buildGolemBaseLayers(); + PartDefinition partdefinition = mesh.getRoot(); + + PartDefinition right_leg = partdefinition.getChild("right_leg"); + + PartDefinition left_leg = partdefinition.getChild("left_leg"); + + + PartDefinition bone = right_leg.addOrReplaceChild("boots1", CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -5.9F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(26, 7).addBox(-8.5F, -2.8F, 0.0F, 8.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 24).addBox(-8.5F, -0.8F, -6.0F, 8.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(28, 19).addBox(-7.0F, -3.0F, -5.6F, 5.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, 13.0F, 0.0F)); + + PartDefinition bone2 = left_leg.addOrReplaceChild("boots2", CubeListBuilder.create().texOffs(0, 12).addBox(1.0F, -5.9F, -3.5F, 7.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(26, 13).addBox(0.5F, -2.8F, 0.0F, 8.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(26, 0).addBox(0.5F, -0.8F, -6.0F, 8.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(28, 25).addBox(2.0F, -3.0F, -5.6F, 5.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemEquipmentModels.java b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemEquipmentModels.java index b11533d9e..1fe531119 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemEquipmentModels.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemEquipmentModels.java @@ -1,6 +1,11 @@ package dev.xkmc.modulargolems.content.client.armor; +import dev.xkmc.modulargolems.content.client.weapon.BeaconCannonModel; +import dev.xkmc.modulargolems.content.client.weapon.FlameThrowerModel; +import dev.xkmc.modulargolems.content.client.weapon.GolemBows; +import dev.xkmc.modulargolems.content.client.weapon.SonicCannonModel; import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; @@ -9,6 +14,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public class GolemEquipmentModels { @@ -18,15 +24,34 @@ public class GolemEquipmentModels { public static final ModelLayerLocation CHESTPLATE_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "golem_chestplate"), "main"); public static final ModelLayerLocation SHINGUARD_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "golem_shinguard"), "main"); public static final ModelLayerLocation METALGOLEM = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "metalgolem"), "model"); + public static final ModelLayerLocation HUMANOID = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "humanoid"), "model"); + public static final ModelLayerLocation DOGGOLEM = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "dog"), "model"); + public static final ModelLayerLocation DOG_ARMOR = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "dog_armor"), "main"); public static MeshDefinition buildGolemBaseLayers() { MeshDefinition mesh = new MeshDefinition(); PartDefinition partdefinition = mesh.getRoot(); - partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -12.0F, -5.5F, 8.0F, 10.0F, 8.0F).texOffs(24, 0).addBox(-1.0F, -5.0F, -7.5F, 2.0F, 4.0F, 2.0F), PartPose.offset(0.0F, -7.0F, -2.0F)); - partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 40).addBox(-9.0F, -2.0F, -6.0F, 18.0F, 12.0F, 11.0F).texOffs(0, 70).addBox(-4.5F, 10.0F, -3.0F, 9.0F, 5.0F, 6.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, -7.0F, 0.0F)); - partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(60, 21).addBox(-13.0F, -2.5F, -3.0F, 4.0F, 14.0F, 6.0F), PartPose.offset(0.0F, -7.0F, 0.0F)); - partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(60, 58).addBox(9.0F, -2.5F, -3.0F, 4.0F, 14.0F, 6.0F), PartPose.offset(0.0F, -7.0F, 0.0F)); - partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(37, 0).addBox(-3.5F, -3.0F, -3.0F, 6.0F, 16.0F, 5.0F), PartPose.offset(-4.0F, 11.0F, 0.0F)); + + partdefinition.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0).addBox(-4.0F, -12.0F, -5.5F, 8.0F, 10.0F, 8.0F) + .texOffs(24, 0).addBox(-1.0F, -5.0F, -7.5F, 2.0F, 4.0F, 2.0F), + PartPose.offset(0.0F, -7.0F, -2.0F)); + + partdefinition.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 40).addBox(-9.0F, -2.0F, -6.0F, 18.0F, 12.0F, 11.0F) + .texOffs(0, 70).addBox(-4.5F, 10.0F, -3.0F, 9.0F, 5.0F, 6.0F, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, -7.0F, 0.0F)); + + partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(60, 21).addBox(-13.0F, -2.5F, -3.0F, 4.0F, 14.0F, 6.0F), + PartPose.offset(0.0F, -7.0F, 0.0F)); + + partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(60, 58).addBox(9.0F, -2.5F, -3.0F, 4.0F, 14.0F, 6.0F), + PartPose.offset(0.0F, -7.0F, 0.0F)); + + partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(37, 0).addBox(-3.5F, -3.0F, -3.0F, 6.0F, 16.0F, 5.0F), PartPose.offset(-4.0F, 11.0F, 0.0F)); partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(60, 0).mirror().addBox(-3.5F, -3.0F, -3.0F, 6.0F, 16.0F, 5.0F), PartPose.offset(5.0F, 11.0F, 0.0F)); PartDefinition root1 = mesh.getRoot().getChild("right_arm"); root1.addOrReplaceChild("right_forearm", CubeListBuilder.create().texOffs(60, 35).addBox(-12.99F, 0F, -6.0F, 4.0F, 16.0F, 6.0F), PartPose.offsetAndRotation(0.0F, 11.5F, 3.0F, 0.0F, 0.0F, 0.0F)); @@ -108,14 +133,83 @@ public static LayerDefinition createGolemLayer() { return LayerDefinition.create(mesh, 128, 128); } + public static MeshDefinition createPlayerMesh(CubeDeformation p_170826_, boolean p_170827_) { + MeshDefinition meshdefinition = HumanoidModel.createMesh(p_170826_, 0.0F); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("ear", CubeListBuilder.create().texOffs(24, 0).addBox(-3.0F, -6.0F, -1.0F, 6.0F, 6.0F, 1.0F, p_170826_), PartPose.ZERO); + partdefinition.addOrReplaceChild("cloak", CubeListBuilder.create().texOffs(0, 0).addBox(-5.0F, 0.0F, -1.0F, 10.0F, 16.0F, 1.0F, p_170826_, 1.0F, 0.5F), PartPose.offset(0.0F, 0.0F, 0.0F)); + float f = 0.25F; + if (p_170827_) { + partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, p_170826_), PartPose.offset(5.0F, 2.5F, 0.0F)); + partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(40, 16).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, p_170826_), PartPose.offset(-5.0F, 2.5F, 0.0F)); + partdefinition.addOrReplaceChild("left_sleeve", CubeListBuilder.create().texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(5.0F, 2.5F, 0.0F)); + partdefinition.addOrReplaceChild("right_sleeve", CubeListBuilder.create().texOffs(40, 32).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(-5.0F, 2.5F, 0.0F)); + } else { + partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_), PartPose.offset(5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_sleeve", CubeListBuilder.create().texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(5.0F, 2.0F, 0.0F)); + partdefinition.addOrReplaceChild("right_sleeve", CubeListBuilder.create().texOffs(40, 32).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(-5.0F, 2.0F, 0.0F)); + } + + partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(16, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_), PartPose.offset(1.9F, 12.0F, 0.0F)); + partdefinition.addOrReplaceChild("left_pants", CubeListBuilder.create().texOffs(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(1.9F, 12.0F, 0.0F)); + partdefinition.addOrReplaceChild("right_pants", CubeListBuilder.create().texOffs(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.offset(-1.9F, 12.0F, 0.0F)); + partdefinition.addOrReplaceChild("jacket", CubeListBuilder.create().texOffs(16, 32).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, p_170826_.extend(0.25F)), PartPose.ZERO); + return meshdefinition; + } + + public static LayerDefinition createHumanoidLayer() { + return LayerDefinition.create(createPlayerMesh(CubeDeformation.NONE, false), 64, 64); + } + + public static LayerDefinition createDogLayer(CubeDeformation deform) { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + PartDefinition partdefinition1 = partdefinition.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.offset(-1.0F, 13.5F, -7.0F)); + partdefinition1.addOrReplaceChild("real_head", CubeListBuilder.create().texOffs(0, 0).addBox(-2.0F, -3.0F, -2.0F, 6.0F, 6.0F, 4.0F, deform).texOffs(16, 14).addBox(-2.0F, -5.0F, 0.0F, 2.0F, 2.0F, 1.0F, deform).texOffs(16, 14).addBox(2.0F, -5.0F, 0.0F, 2.0F, 2.0F, 1.0F, deform).texOffs(0, 10).addBox(-0.5F, -0.001F, -5.0F, 3.0F, 3.0F, 4.0F, deform), PartPose.ZERO); + partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(18, 14).addBox(-3.0F, -2.0F, -3.0F, 6.0F, 9.0F, 6.0F, deform), PartPose.offsetAndRotation(0.0F, 14.0F, 2.0F, ((float) Math.PI / 2F), 0.0F, 0.0F)); + partdefinition.addOrReplaceChild("upper_body", CubeListBuilder.create().texOffs(21, 0).addBox(-3.0F, -3.0F, -3.0F, 8.0F, 6.0F, 7.0F, deform), PartPose.offsetAndRotation(-1.0F, 14.0F, -3.0F, ((float) Math.PI / 2F), 0.0F, 0.0F)); + CubeListBuilder cubelistbuilder = CubeListBuilder.create().texOffs(0, 18).addBox(0.0F, 0.0F, -1.0F, 2.0F, 8.0F, 2.0F, deform); + partdefinition.addOrReplaceChild("right_hind_leg", cubelistbuilder, PartPose.offset(-2.5F, 16.0F, 7.0F)); + partdefinition.addOrReplaceChild("left_hind_leg", cubelistbuilder, PartPose.offset(0.5F, 16.0F, 7.0F)); + partdefinition.addOrReplaceChild("right_front_leg", cubelistbuilder, PartPose.offset(-2.5F, 16.0F, -4.0F)); + partdefinition.addOrReplaceChild("left_front_leg", cubelistbuilder, PartPose.offset(0.5F, 16.0F, -4.0F)); + PartDefinition partdefinition2 = partdefinition.addOrReplaceChild("tail", CubeListBuilder.create(), PartPose.offsetAndRotation(-1.0F, 12.0F, 8.0F, ((float) Math.PI / 5F), 0.0F, 0.0F)); + partdefinition2.addOrReplaceChild("real_tail", CubeListBuilder.create().texOffs(9, 18).addBox(0.0F, 0.0F, -1.0F, 2.0F, 8.0F, 2.0F, deform), PartPose.ZERO); + return LayerDefinition.create(meshdefinition, 64, 32); + } + + public static void registerArmorLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { - LIST.add(HELMET_LAYER); - event.registerLayerDefinition(HELMET_LAYER, GolemEquipmentModels::createHelmetLayer); - LIST.add(CHESTPLATE_LAYER); - event.registerLayerDefinition(CHESTPLATE_LAYER, GolemEquipmentModels::createChestplateLayer); - LIST.add(SHINGUARD_LAYER); - event.registerLayerDefinition(SHINGUARD_LAYER, GolemEquipmentModels::createShinGuard); event.registerLayerDefinition(METALGOLEM, GolemEquipmentModels::createGolemLayer); + event.registerLayerDefinition(HUMANOID, GolemEquipmentModels::createHumanoidLayer); + event.registerLayerDefinition(DOGGOLEM, () -> GolemEquipmentModels.createDogLayer(new CubeDeformation(0))); + event.registerLayerDefinition(DOG_ARMOR, () -> GolemEquipmentModels.createDogLayer(new CubeDeformation(0.2f))); + + regAndAdd(event, HELMET_LAYER, GolemEquipmentModels::createHelmetLayer); + regAndAdd(event, CHESTPLATE_LAYER, GolemEquipmentModels::createChestplateLayer); + regAndAdd(event, SHINGUARD_LAYER, GolemEquipmentModels::createShinGuard); + + regAndAdd(event, GolemBoots.DIAMOND_BOOTS_LAYER, GolemBoots::createDiamondBoots); + regAndAdd(event, GolemBoots.BEACON_BOOTS_LAYER, GolemBoots::createBeaconBoots); + regAndAdd(event, GolemBoots.NETHERITE_BOOTS_LAYER, GolemBoots::createNetheriteBoots); + + regAndAdd(event, GolemBows.BOW_MAINHAND, GolemBows::createMainHand); + regAndAdd(event, GolemBows.BOW_OFFHAND, GolemBows::createOffhand); + + regAndAdd(event, BeaconCannonModel.BEACON_RIGHT, BeaconCannonModel::rightLayer); + regAndAdd(event, BeaconCannonModel.BEACON_LEFT, BeaconCannonModel::leftLayer); + + regAndAdd(event, SonicCannonModel.SONIC_MAINHAND, SonicCannonModel::createMainHand); + regAndAdd(event, SonicCannonModel.SONIC_OFFHAND, SonicCannonModel::createOffhand); + + regAndAdd(event, FlameThrowerModel.FLAME_RIGHT, FlameThrowerModel::rightLayer); + regAndAdd(event, FlameThrowerModel.FLAME_LEFT, FlameThrowerModel::leftLayer); + + } + + public static synchronized void regAndAdd(EntityRenderersEvent.RegisterLayerDefinitions event, ModelLayerLocation layer, Supplier factory) { + event.registerLayerDefinition(layer, factory); + LIST.add(layer); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPath.java b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPath.java index 41239c7bc..5f953c495 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPath.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPath.java @@ -48,7 +48,7 @@ public record GolemModelPath(ModelLayerLocation models, List> paths ))); } - public static GolemModelPath register(ResourceLocation id, GolemModelPath path) { + public synchronized static GolemModelPath register(ResourceLocation id, GolemModelPath path) { MAP.put(id, path); return path; } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPaths.java b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPaths.java index b2735c2b7..9b175258b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPaths.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/armor/GolemModelPaths.java @@ -6,12 +6,28 @@ public class GolemModelPaths { public static final ResourceLocation - HELMETS = modLoc("helmet"), - CHESTPLATES = modLoc("chestplate"), - LEGGINGS = modLoc("shinguard"); + HELMETS = ModularGolems.loc("helmet"), + CHESTPLATES = ModularGolems.loc("chestplate"), + LEGGINGS = ModularGolems.loc("shinguard"); - public static ResourceLocation modLoc(String str) { - return new ResourceLocation(ModularGolems.MODID, str); - } + public static final ResourceLocation + BOOTS_DIAMOND = ModularGolems.loc("wind_spirit_boots"), + BOOTS_BEACON = ModularGolems.loc("beacon_boots"), + BOOTS_NETHERITE = ModularGolems.loc("barbaric_vanguard_boots"); + + public static final ResourceLocation + BOW_MAINHAND = ModularGolems.loc("bow_mainhand"), + BOW_OFFHAND = ModularGolems.loc("bow_offhand"); + + public static final ResourceLocation + BEACON_RIGHT = ModularGolems.loc("beacon_right"), + BEACON_LEFT = ModularGolems.loc("beacon_left"); + + public static final ResourceLocation + SONIC_MAINHAND = ModularGolems.loc("sonic_mainhand"), + SONIC_OFFHAND = ModularGolems.loc("sonic_offhand"); + public static final ResourceLocation + FLAME_RIGHT = ModularGolems.loc("flame_thrower_right"), + FLAME_LEFT = ModularGolems.loc("flame_thrower_left"); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/outline/BlockOutliner.java b/src/main/java/dev/xkmc/modulargolems/content/client/outline/BlockOutliner.java index f4cf64fa6..29d5da011 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/outline/BlockOutliner.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/outline/BlockOutliner.java @@ -1,42 +1,125 @@ package dev.xkmc.modulargolems.content.client.outline; -import com.simibubi.create.CreateClient; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import dev.xkmc.modulargolems.content.item.card.PathRecordCard; -import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3f; -import java.util.Collection; +import java.util.List; public class BlockOutliner { - public static void drawOutlines(Player player, Collection selection) { + private static Level world; + private static int time = 0; + private static List selection; + + public static void drawOutlines(Player player, List list) { Level level = Minecraft.getInstance().level; if (level == null) return; if (Minecraft.getInstance().player != player) return; + time = player.tickCount; + selection = list; + world = level; + } + + public static void renderOutline(PoseStack pose, Vec3 camera) { + Level level = Minecraft.getInstance().level; + Player player = Minecraft.getInstance().player; + if (selection == null || level == null || player == null || level != world || time + 3 < player.tickCount) { + selection = null; + return; + } + var buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + var vc = buffer.getBuffer(RenderType.lines()); + BlockPos pre = null, first = null; - float time = (level.getGameTime() + Minecraft.getInstance().getPartialTick()) / 40f % 2 - 1; - for (var point : selection) { - var id = point.level(); - if (!level.dimension().location().equals(id)) continue; - BlockPos pos = point.pos(); - VoxelShape shape = Shapes.block(); - CreateClient.OUTLINER.showAABB(point, shape.bounds().move(pos)).colored(pre == null ? 0x7fff7f : 8375776).lineWidth(0.0625F); + float time = (level.getGameTime() + Minecraft.getInstance().getPartialTick()) / 40f % 1; + for (var pos : selection) { + renderBox(pose, vc, pos.pos(), camera.toVector3f(), pre == null ? 0xff7fff7f : 0xFF7FCDE0); if (pre != null) { - line(pre, pos, time); - } else first = pos; - pre = pos; + line(pose, vc, pre, pos.pos(), camera.toVector3f(), time); + } else first = pos.pos(); + pre = pos.pos(); + } + if (pre != null) line(pose, vc, pre, first, camera.toVector3f(), time); + } + + private static void line(PoseStack pose, VertexConsumer vc, BlockPos a, BlockPos b, Vector3f pos, float time) { + Vec3 c0 = a.getCenter(); + Vec3 c1 = b.getCenter(); + int color = a.distSqr(b) < 256 ? 0xFF7FCDE0 : 0xFFFF3F3F; + { + Vec3 v1 = c0.lerp(c1, time); + Vec3 v0 = c0; + if (time >= 0.5) { + v0 = c0.lerp(c1, time - 0.5); + } + var p0 = v0.toVector3f(); + var p1 = v1.toVector3f(); + renderLine(pose, vc, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, pos, color); + + } + if (time < 0.5) { + Vec3 v1 = c1; + Vec3 v0 = c0.lerp(c1, time + 0.5); + var p0 = v0.toVector3f(); + var p1 = v1.toVector3f(); + renderLine(pose, vc, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, pos, color); } - if (pre != null) line(pre, first, time); } - private static void line(BlockPos a, BlockPos b, float time) { - CreateClient.OUTLINER.endChasingLine(Pair.of(a, b), (time > 0 ? a : b).getCenter(), (time > 0 ? b : a).getCenter(), Math.abs(time), false) - .colored(8375776).lineWidth(0.0625F); + private static void renderBox( + PoseStack pose, VertexConsumer vc, BlockPos box, + Vector3f pos, int color + ) { + float offset = 1f / 32; + renderCube(pose, vc, + box.getX() + offset, box.getY() + offset, box.getZ() + offset, + box.getX() + 1 - offset, box.getY() + 1 - offset, box.getZ() + 1 - offset, + pos, color); } + public static void renderCube( + PoseStack pose, VertexConsumer vc, + float x0, float y0, float z0, + float x1, float y1, float z1, + Vector3f pos, int color) { + renderLine(pose, vc, x0, y0, z0, x1, y0, z0, pos, color); + renderLine(pose, vc, x0, y0, z0, x0, y1, z0, pos, color); + renderLine(pose, vc, x0, y0, z0, x0, y0, z1, pos, color); + renderLine(pose, vc, x1, y0, z0, x1, y1, z0, pos, color); + renderLine(pose, vc, x1, y0, z0, x1, y0, z1, pos, color); + renderLine(pose, vc, x0, y1, z0, x1, y1, z0, pos, color); + renderLine(pose, vc, x0, y1, z0, x0, y1, z1, pos, color); + renderLine(pose, vc, x0, y0, z1, x1, y0, z1, pos, color); + renderLine(pose, vc, x0, y0, z1, x0, y1, z1, pos, color); + renderLine(pose, vc, x1, y1, z0, x1, y1, z1, pos, color); + renderLine(pose, vc, x1, y0, z1, x1, y1, z1, pos, color); + renderLine(pose, vc, x0, y1, z1, x1, y1, z1, pos, color); + } + + private static void renderLine( + PoseStack pose, VertexConsumer vc, + float x0, float y0, float z0, + float x1, float y1, float z1, + Vector3f pos, int color + ) { + PoseStack.Pose mat = pose.last(); + float rx = x1 - x0; + float ry = y1 - y0; + float rz = z1 - z0; + float len = Mth.sqrt(rx * rx + ry * ry + rz * rz); + rx /= len; + ry /= len; + rz /= len; + vc.vertex(mat.pose(), x0 - pos.x, y0 - pos.y, z0 - pos.z).color(color).normal(mat.normal(), rx, ry, rz).endVertex(); + vc.vertex(mat.pose(), x1 - pos.x, y1 - pos.y, z1 - pos.z).color(color).normal(mat.normal(), rx, ry, rz).endVertex(); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/overlay/GolemStatusOverlay.java b/src/main/java/dev/xkmc/modulargolems/content/client/overlay/GolemStatusOverlay.java index 22e0bafca..1dccc295d 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/overlay/GolemStatusOverlay.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/overlay/GolemStatusOverlay.java @@ -1,15 +1,19 @@ package dev.xkmc.modulargolems.content.client.overlay; import dev.xkmc.l2itemselector.select.item.ItemSelectionOverlay; +import dev.xkmc.l2itemselector.wheel.WheelHandler; +import dev.xkmc.l2library.base.menu.base.SpriteManager; import dev.xkmc.l2library.base.overlay.OverlayUtil; import dev.xkmc.l2library.util.Proxy; import dev.xkmc.l2library.util.raytrace.IGlowingTarget; import dev.xkmc.l2library.util.raytrace.RayTraceUtil; -import dev.xkmc.modulargolems.compat.materials.botania.BotUtils; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.common.GolemFlags; -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.item.wand.GolemInteractItem; +import dev.xkmc.modulargolems.events.event.GolemInfoEvent; +import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.data.MGLangData; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -17,18 +21,18 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.EntityHitResult; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; +import net.minecraftforge.common.MinecraftForge; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -37,6 +41,7 @@ public class GolemStatusOverlay implements IGuiOverlay { @Override public void render(ForgeGui gui, GuiGraphics g, float partialTick, int screenWidth, int screenHeight) { if (Minecraft.getInstance().screen != null) return; + if (WheelHandler.wheel != null) return; boolean offset = ItemSelectionOverlay.INSTANCE.isRendering(); LocalPlayer player = Proxy.getClientPlayer(); if (player == null) return; @@ -50,12 +55,16 @@ public void render(ForgeGui gui, GuiGraphics g, float partialTick, int screenWid target = entityHit.getEntity(); } if (!(target instanceof AbstractGolemEntity golem)) return; - gui.setupOverlayRenderState(true, false); + if (golem.isHostile()) return; List text = new ArrayList<>(); text.add(golem.getName()); - if (golem.hasFlag(GolemFlags.BOTANIA)) { - text.add(BotUtils.getDesc(golem)); - } + var max = golem.getMaxHealth(); + float health = Math.min(max, golem.getGuardedDataImpl()); + MutableComponent hc = hsbText(health, max); + var baseline = golem.getDynamicBaseline(); + if (baseline > 0) hc = hc.append("|").append(hsbText(baseline, max)); + text.add(MGLangData.HEALTH.get(hc, Math.round(max)).withStyle(ChatFormatting.AQUA)); + MinecraftForge.EVENT_BUS.post(new GolemInfoEvent(golem, text)); text.add(golem.getMode().getDesc(golem)); var config = golem.getConfigEntry(MGLangData.LOADING.get()); if (config != null) { @@ -65,57 +74,88 @@ public void render(ForgeGui gui, GuiGraphics g, float partialTick, int screenWid text.add(MGLangData.CONFIG_LOCK.get().withStyle(ChatFormatting.RED)); } } - golem.getModifiers().forEach((k, v) -> text.add(k.getTooltip(v))); + if (golem.getModifiers().size() > 8) { + text.add(MGLangData.UPGRADE_COUNT.get(golem.getModifiers().size(), golem.getUpgrades().size())); + } else { + golem.getModifiers().forEach((k, v) -> text.add(k.getTooltip(v))); + } int textPos = offset ? Math.round(screenWidth * 3 / 4f) : Math.round(screenWidth / 8f); new OverlayUtil(g, textPos, -1, -1) .renderLongText(gui.getFont(), text); - if (!(golem instanceof HumanoidGolemEntity humanoid)) return; OverlayUtil util = new OverlayUtil(g, (int) (screenWidth * 0.6), -1, -1); util.bg = 0xffc6c6c6; - List list = List.of(new GolemEquipmentTooltip(humanoid)); + List list = List.of(new GolemEquipmentTooltip(golem)); util.renderTooltipInternal(gui.getFont(), list); } - private record GolemEquipmentTooltip(HumanoidGolemEntity golem) implements ClientTooltipComponent { + private static MutableComponent hsbText(float v, float max) { + float perc = Mth.clamp(v / max, 0f, 1f); + int col = Mth.hsvToRgb(perc / 3F, 1F, 1F); + return Component.literal("" + Math.round(v)).setStyle(Style.EMPTY.withColor(col)); + } - public static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation("textures/gui/container/bundle.png"); + private record GolemEquipmentTooltip(AbstractGolemEntity golem) implements ClientTooltipComponent { + + public static final SpriteManager SPRITE = new SpriteManager(ModularGolems.MODID, "equipments"); @Override public int getHeight() { - return 72; + if (golem instanceof DogGolemEntity) return 38; + return 74; } @Override public int getWidth(Font pFont) { - return 36; + if (golem instanceof DogGolemEntity) return 18; + return 54; } @Override public void renderImage(Font font, int mx, int my, GuiGraphics g) { - renderSlot(font, mx, my + 18, g, golem.getItemBySlot(EquipmentSlot.MAINHAND), null); - renderSlot(font, mx, my + 36, g, golem.getItemBySlot(EquipmentSlot.OFFHAND), InventoryMenu.EMPTY_ARMOR_SLOT_SHIELD); - renderSlot(font, mx + 18, my, g, golem.getItemBySlot(EquipmentSlot.HEAD), InventoryMenu.EMPTY_ARMOR_SLOT_HELMET); - renderSlot(font, mx + 18, my + 18, g, golem.getItemBySlot(EquipmentSlot.CHEST), InventoryMenu.EMPTY_ARMOR_SLOT_CHESTPLATE); - renderSlot(font, mx + 18, my + 36, g, golem.getItemBySlot(EquipmentSlot.LEGS), InventoryMenu.EMPTY_ARMOR_SLOT_LEGGINGS); - renderSlot(font, mx + 18, my + 54, g, golem.getItemBySlot(EquipmentSlot.FEET), InventoryMenu.EMPTY_ARMOR_SLOT_BOOTS); + if (golem instanceof DogGolemEntity) { + renderSlot(g, mx, my, golem.getItemBySlot(EquipmentSlot.HEAD), "altas_helmet"); + renderSlot(g, mx, my + 18, golem.getItemBySlot(EquipmentSlot.CHEST), "slotbg_dog_armor"); + return; + } + renderSlot(g, mx + 18, my, golem.getItemBySlot(EquipmentSlot.HEAD), "altas_helmet"); + renderSlot(g, mx + 18, my + 18, golem.getItemBySlot(EquipmentSlot.CHEST), "altas_chestplate"); + renderSlot(g, mx + 18, my + 36, golem.getItemBySlot(EquipmentSlot.LEGS), "altas_leggings"); + renderSlot(g, mx + 18, my + 54, golem.getItemBySlot(EquipmentSlot.FEET), "altas_boots"); + + renderSlot(g, mx, my + 18, golem.getItemBySlot(EquipmentSlot.MAINHAND), "slotbg_sword"); + renderSlot(g, mx + 36, my + 18, golem.getItemBySlot(EquipmentSlot.OFFHAND), "altas_shield"); + + if (golem instanceof SweepGolemEntity h) { + renderSlot(g, mx, my + 36, h.getBackupHand().getItem(), "slotbg_bow"); + renderSlot(g, mx + 36, my + 36, h.getArrowSlot().getItem(), "slotbg_arrow"); + } + + if (golem instanceof MetalGolemEntity e) { + renderSlot(g, mx, my, e.getRightShoulder().getItem(), "slotbg_shoulder"); + renderSlot(g, mx + 36, my, e.getLeftShoulder().getItem(), "slotbg_shoulder"); + } } - private void renderSlot(Font font, int x, int y, GuiGraphics g, ItemStack stack, @Nullable ResourceLocation atlasID) { - this.blit(g, x, y); + private void renderSlot(GuiGraphics g, int x, int y, ItemStack stack, String bgName) { + if (bgName.startsWith("altas_")) { + blitSlotBg(g, x, y, "slot"); + if (stack.isEmpty()) + blitSlotBg(g, x + 1, y + 1, bgName); + } else { + if (stack.isEmpty()) blitSlotBg(g, x, y, bgName); + else blitSlotBg(g, x, y, "slot"); + } if (stack.isEmpty()) { - if (atlasID != null) { - TextureAtlasSprite atlas = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS) - .apply(atlasID); - g.blit(x + 1, y + 1, 100, 16, 16, atlas); - } return; } g.renderItem(stack, x + 1, y + 1, 0); - g.renderItemDecorations(font, stack, x + 1, y + 1); + g.renderItemDecorations(Minecraft.getInstance().font, stack, x + 1, y + 1); } - private void blit(GuiGraphics g, int x, int y) { - g.blit(TEXTURE_LOCATION, x, y, 0, 0, 0, 18, 18, 128, 128); + private void blitSlotBg(GuiGraphics g, int x, int y, String bgName) { + var tex = SPRITE.get().getTexture(); + var side = SPRITE.get().getSide(bgName); + g.blit(tex, x, y, side.x, side.y, side.w, side.h); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverride.java b/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverride.java index 2dc981501..0df49506a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverride.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverride.java @@ -1,14 +1,23 @@ package dev.xkmc.modulargolems.content.client.override; +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemRenderer; +import dev.xkmc.modulargolems.content.entity.common.IGolemModel; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; import java.util.function.Function; public class ModelOverride { - public static final ModelOverride DEFAULT = new ModelOverride(); - public static ModelOverride texturePredicate(Function, String> modifier) { return new ModelOverride() { @@ -21,8 +30,43 @@ public ResourceLocation getTexture(AbstractGolemEntity golem, ResourceLoca } + public ModelOverride() { + } + public ResourceLocation getTexture(AbstractGolemEntity golem, ResourceLocation id) { return id; } + public synchronized & IGolemModel, T extends AbstractGolemEntity, P extends IGolemPart

> void renderAll( + AbstractGolemRenderer renderer, T entity, P part, PoseStack pose, MultiBufferSource buffer, ResourceLocation mat, + int light, float pTick, boolean visible, boolean ghost, boolean glowing + ) { + var camera = Minecraft.getInstance().getCameraEntity(); + if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && + camera != null && camera.getVehicle() == entity && entity.getBbWidth() >= 2) + ghost = true; + var model = renderer.getModel(); + ResourceLocation tex = getTexture(entity, mat); + RenderType rt = getRenderType(model, model.getTextureLocationInternal(tex), visible, ghost, glowing); + if (rt != null) { + renderer.renderPartModel(entity, part, pose, buffer.getBuffer(rt), light, pTick, ghost); + } + var etex = model.getTextureLocationInternal(tex.withSuffix("_emissive")); + if (ModelOverrides.isValid(etex)) { + rt = getRenderType(renderer.getModel(), etex, visible, ghost, glowing); + if (rt != null) { + renderer.renderPartModel(entity, part, pose, buffer.getBuffer(rt), LightTexture.FULL_BRIGHT, pTick, ghost); + } + } + } + + @Nullable + protected & IGolemModel> RenderType getRenderType( + M model, ResourceLocation tex, boolean visible, boolean ghost, boolean glowing + ) { + if (ghost) return RenderType.itemEntityTranslucentCull(tex); + if (visible) return model.renderType(tex); + return glowing ? RenderType.outline(tex) : null; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverrides.java b/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverrides.java index 15b7f7c33..650147f37 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverrides.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/override/ModelOverrides.java @@ -1,5 +1,8 @@ package dev.xkmc.modulargolems.content.client.override; +import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import java.util.HashMap; @@ -7,13 +10,32 @@ public class ModelOverrides { private static final HashMap OVERRIDES = new HashMap<>(); + private static final Object2BooleanMap EMISSIVE = new Object2BooleanLinkedOpenHashMap<>(); public static synchronized void registerOverride(ResourceLocation id, ModelOverride override) { OVERRIDES.put(id, override); } - public static ModelOverride getOverride(ResourceLocation id) { - return OVERRIDES.getOrDefault(id, ModelOverride.DEFAULT); + public static synchronized void reload() { + EMISSIVE.clear(); + } + + public static synchronized boolean isValid(ResourceLocation id) { + if (!EMISSIVE.containsKey(id)) { + boolean present = Minecraft.getInstance().getResourceManager().getResource(id).isPresent(); + EMISSIVE.put(id, present); + return present; + } + return EMISSIVE.getBoolean(id); + } + + public static synchronized ModelOverride getOverride(ResourceLocation id) { + var ans = OVERRIDES.get(id); + if (ans == null) { + ans = new ModelOverride(); + registerOverride(id, ans); + } + return ans; } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/pose/BeaconConnonPose.java b/src/main/java/dev/xkmc/modulargolems/content/client/pose/BeaconConnonPose.java new file mode 100644 index 000000000..9911dab53 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/pose/BeaconConnonPose.java @@ -0,0 +1,49 @@ +package dev.xkmc.modulargolems.content.client.pose; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import dev.xkmc.modulargolems.content.item.ranged.CannonPoseUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; + +import static dev.xkmc.modulargolems.content.item.ranged.CannonPoseUtil.MAX_DEGREE; + +public record BeaconConnonPose( + CannonPoseUtil transform, String id, float x, float y, float z +) implements GolemShoulderPose { + + @Deprecated + public BeaconConnonPose(String id, float x, float y, float z) { + this(CannonPoseUtil.BEACON, id, x, y, z); + } + + @Override + public void setup(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, float pTick) { + if (entity.animState.getStartingAnim() < 5) return; + var part = model.root().getChild("body").getChild(id); + + var angles = transform.getAngle(entity, hand); + var diff = Mth.wrapDegrees(angles[0] * Mth.RAD_TO_DEG + entity.yBodyRot); + if (diff > MAX_DEGREE) { + angles[0] = (MAX_DEGREE - entity.yBodyRot) * Mth.DEG_TO_RAD; + } + if (diff < -MAX_DEGREE) { + angles[0] = (-MAX_DEGREE - entity.yBodyRot) * Mth.DEG_TO_RAD; + } + part.yRot -= angles[0] + entity.yBodyRot * Mth.DEG_TO_RAD; + part.xRot += angles[1]; + + } + + @Override + public void render(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, PoseStack pose, MultiBufferSource source, int light, float pTick) { + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/pose/BowPose.java b/src/main/java/dev/xkmc/modulargolems/content/client/pose/BowPose.java new file mode 100644 index 000000000..d4c3f366e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/pose/BowPose.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.content.client.pose; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import dev.xkmc.modulargolems.content.item.ranged.BowPoseUtil; +import net.minecraft.client.model.AnimationUtils; + +public class BowPose extends MetalGolemPose { + + public static final MetalGolemPose BOW = new BowPose(); + + @Override + public void attackModel(MetalGolemEntity entity, MetalGolemModel model, float atkTick) { + AnimationUtils.swingWeaponDown(model.rightArm, model.leftArm, entity, model.attackTime, atkTick); + model.leftArm.xRot = 0; + model.rightForeArm.xRot = 0; + model.leftForeArm.xRot = 0; + } + + @Override + public void aggressive(MetalGolemEntity entity, MetalGolemModel model, float walkTick, float speed, float pTick) { + model.rightArm.xRot = BowPoseUtil.getAngle(entity); + model.leftArm.xRot = 0; + model.rightForeArm.xRot = 0; + model.leftForeArm.xRot = 0; + } + + public void walking(MetalGolemEntity entity, MetalGolemModel model, float walkTick, float speed, float pTick) { + super.walking(entity, model, walkTick, speed, pTick); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/pose/GolemShoulderPose.java b/src/main/java/dev/xkmc/modulargolems/content/client/pose/GolemShoulderPose.java new file mode 100644 index 000000000..d384902fe --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/pose/GolemShoulderPose.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.content.client.pose; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; + +import java.util.LinkedHashMap; + +public interface GolemShoulderPose { + + LinkedHashMap MAP = new LinkedHashMap<>(); + + static void register(ResourceLocation id, GolemShoulderPose pose) { + synchronized (MAP) { + MAP.put(id, pose); + } + } + + void setup(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, float pTick); + + void render(MetalGolemEntity entity, MetalGolemModel model, ItemStack stack, InteractionHand hand, PoseStack pose, MultiBufferSource source, int light, float pTick); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/pose/MetalGolemPose.java b/src/main/java/dev/xkmc/modulargolems/content/client/pose/MetalGolemPose.java index 008581c21..736705413 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/client/pose/MetalGolemPose.java +++ b/src/main/java/dev/xkmc/modulargolems/content/client/pose/MetalGolemPose.java @@ -2,12 +2,21 @@ import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import java.util.LinkedHashMap; + public class MetalGolemPose { public static final MetalGolemPose DEFAULT = new MetalGolemPose(); + public static final LinkedHashMap MAP = new LinkedHashMap<>(); + + public static synchronized void register(ResourceLocation id, MetalGolemPose pose) { + MAP.put(id, pose); + } + public void attackModel(MetalGolemEntity entity, MetalGolemModel model, float atkTick) { model.rightArm.xRot = -2.0F + 1.5F * Mth.triangleWave(atkTick, 10.0F); model.leftArm.xRot = -2.0F + 1.5F * Mth.triangleWave(atkTick, 10.0F); diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/AliveGolemPage.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/AliveGolemPage.java new file mode 100644 index 000000000..8c94ab748 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/AliveGolemPage.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import com.mojang.datafixers.util.Pair; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; +import dev.xkmc.modulargolems.content.menu.registry.TrackerGroup; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabManager; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.UUID; + +public class AliveGolemPage extends GolemInfoScreen { + + protected AliveGolemPage(Component title) { + super(title); + } + + @Override + public List> getData() { + return getData(e -> e.status == GolemTracker.Status.ALIVE); + } + + @Override + public void init() { + super.init(); + new GolemTabManager<>(this, new TrackerGroup()) + .init(this::addRenderableWidget, GolemTabRegistry.TRACKER_ALIVE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/DeadGolemPage.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/DeadGolemPage.java new file mode 100644 index 000000000..d96064349 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/DeadGolemPage.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import com.mojang.datafixers.util.Pair; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; +import dev.xkmc.modulargolems.content.menu.registry.TrackerGroup; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabManager; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.UUID; + +public class DeadGolemPage extends GolemInfoScreen { + + protected DeadGolemPage(Component title) { + super(title); + } + + @Override + public List> getData() { + return getData(e -> e.status.isDeath()); + } + + @Override + public void init() { + super.init(); + new GolemTabManager<>(this, new TrackerGroup()) + .init(this::addRenderableWidget, GolemTabRegistry.TRACKER_DEAD); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInfoScreen.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInfoScreen.java new file mode 100644 index 000000000..41e89e699 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInfoScreen.java @@ -0,0 +1,193 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import com.mojang.datafixers.util.Pair; +import dev.xkmc.l2tabs.tabs.contents.BaseTextScreen; +import dev.xkmc.l2tabs.tabs.core.TabManager; +import dev.xkmc.modulargolems.content.capability.GolemConfigStorage; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.capability.TrackerDeleteToServer; +import dev.xkmc.modulargolems.content.capability.TrackerHeartBeatToServer; +import dev.xkmc.modulargolems.content.menu.tabs.ITabScreen; +import dev.xkmc.modulargolems.init.GolemClient; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.lwjgl.glfw.GLFW; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; +import java.util.function.Predicate; + +public abstract class GolemInfoScreen extends BaseTextScreen implements ITabScreen { + + private static int linePerPage() { + return 14; + } + + private int page = 0, size = 0; + private Button left, right; + private boolean leftAdded, rightAdded; + private UUID delId = null; + + protected GolemInfoScreen(Component title) { + super(title, new ResourceLocation("l2tabs:textures/gui/empty.png")); + } + + public List> getData(Predicate status) { + var player = Minecraft.getInstance().player; + if (player == null) return List.of(); + var tracker = GolemConfigStorage.get(player.level()).getTracker(player.getUUID()); + List> ans = new ArrayList<>(); + for (var e : tracker.data.entrySet()) { + if (status.test(e.getValue())) { + ans.add(Pair.of(e.getKey(), e.getValue())); + } + } + ans.sort(Comparator.comparingLong(e -> -e.getSecond().timestamp)); + return ans; + } + + public abstract List> getData(); + + @Override + public void init() { + super.init(); + int x = (this.width + this.imageWidth) / 2 - 16; + int y = (this.height - this.imageHeight) / 2 + 4; + int w = 10; + int h = 11; + left = Button.builder(Component.literal("<"), + (e) -> this.click(-1)).pos(x - w - 1, y).size(w, h).build(); + right = Button.builder(Component.literal(">"), + (e) -> this.click(1)).pos(x, y).size(w, h).build(); + + new TabManager(this).init(this::addRenderableWidget, GolemClient.TAB); + } + + private void click(int offset) { + page = page + offset; + if (page < 0) page = 0; + if (page >= (size - 1) / linePerPage() + 1) { + page--; + } + } + + @Override + public void render(GuiGraphics g, int mx, int my, float ptick) { + var player = Minecraft.getInstance().player; + if (player == null) return; + long time = player.level().getGameTime(); + var data = getData(); + size = data.size(); + updateButtons(); + super.render(g, mx, my, ptick); + int start = page * linePerPage(); + int max = Math.min((page + 1) * linePerPage(), size); + int x = this.leftPos + 8; + int y = this.topPos + 6; + g.drawString(this.font, title, x, y, 0, false); + y += 15; + GolemTracker.TrackedData focus = null; + int delLine = -1; + delId = null; + for (int i = 0; i < max - start; i++) { + var ent = data.get(i + start); + Component comp = TrackerInfo.getDesc(ent.getSecond()); + g.drawString(this.font, comp, x, y, 0, false); + int w = Math.min(font.width(comp), imageWidth - 30); + if (my > y && my < y + 10) { + if (mx > x && mx < x + w) { + focus = ent.getSecond(); + } else if (mx > x + imageWidth - 20 && mx < x + imageWidth - 8) { + delLine = start + i; + delId = ent.getFirst(); + } + } + var del = Component.literal("X").withStyle(delLine == start + i ? ChatFormatting.RED : ChatFormatting.BLACK); + g.drawString(this.font, del, x + imageWidth - 20, y, 0, false); + y += 10; + } + if (focus != null) { + g.renderComponentTooltip(this.font, TrackerInfo.getDetail(focus, player, time), mx, my); + } + } + + @Override + public void tick() { + var player = Minecraft.getInstance().player; + if (player == null) return; + if (player.level().getGameTime() % 10 == 0) { + ModularGolems.HANDLER.toServer(new TrackerHeartBeatToServer(player.getUUID())); + } + } + + @Override + public boolean mouseClicked(double x, double y, int btn) { + if (super.mouseClicked(x, y, btn)) return true; + var player = Minecraft.getInstance().player; + if (player == null) return false; + if (delId != null && btn == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + ModularGolems.HANDLER.toServer(new TrackerDeleteToServer(player.getUUID(), delId)); + return true; + } + return false; + } + + private void updateButtons() { + int pageNum = (size - 1) / linePerPage() + 1; + if (page > 0 && !leftAdded) { + leftAdded = true; + addRenderableWidget(left); + } + if (page <= 0 && leftAdded) { + leftAdded = false; + removeWidget(left); + } + if (page < pageNum - 1 && !rightAdded) { + rightAdded = true; + addRenderableWidget(right); + } + if (page >= pageNum - 1 && rightAdded) { + rightAdded = false; + removeWidget(right); + } + } + + + @Override + public int getGuiLeft() { + return leftPos; + } + + @Override + public int getGuiTop() { + return topPos; + } + + @Override + public int screenWidth() { + return width; + } + + @Override + public int screenHeight() { + return height; + } + + @Override + public int getXSize() { + return imageWidth; + } + + @Override + public int getYSize() { + return imageHeight; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInvTab.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInvTab.java new file mode 100644 index 000000000..5ff896a76 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/GolemInvTab.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import dev.xkmc.l2tabs.tabs.core.BaseTab; +import dev.xkmc.l2tabs.tabs.core.TabManager; +import dev.xkmc.l2tabs.tabs.core.TabToken; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +public class GolemInvTab extends BaseTab { + + public GolemInvTab(TabToken token, TabManager manager, ItemStack stack, Component title) { + super(token, manager, stack, title); + } + + public void onTabClicked() { + Minecraft.getInstance().setScreen(TrackerTab.Type.ALIVE.createScreen()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/RetrivedGolemPage.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/RetrivedGolemPage.java new file mode 100644 index 000000000..9d583c8f3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/RetrivedGolemPage.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import com.mojang.datafixers.util.Pair; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; +import dev.xkmc.modulargolems.content.menu.registry.TrackerGroup; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabManager; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.UUID; + +public class RetrivedGolemPage extends GolemInfoScreen { + + protected RetrivedGolemPage(Component title) { + super(title); + } + + @Override + public List> getData() { + return getData(e -> e.status == GolemTracker.Status.RETRIEVED && e.target != null); + } + + @Override + public void init() { + super.init(); + new GolemTabManager<>(this, new TrackerGroup()) + .init(this::addRenderableWidget, GolemTabRegistry.TRACKER_RETRIEVE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerInfo.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerInfo.java new file mode 100644 index 000000000..439301b1f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerInfo.java @@ -0,0 +1,82 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +import java.util.ArrayList; +import java.util.List; + +public class TrackerInfo { + + public static Component getDesc(GolemTracker.TrackedData data) { + float f = Mth.clamp(data.hp / data.mhp, 0f, 1f); + int color = Mth.hsvToRgb(f / 3.0F, 1.0F, 0.5f); + MutableComponent hc = Component.literal("" + Math.round(data.hp)).setStyle(Style.EMPTY.withColor(color)); + var hpText = hc.append(Component.literal("/" + Math.round(data.mhp)) + .withStyle(data.hp <= 0 ? ChatFormatting.DARK_RED : ChatFormatting.DARK_AQUA)); + return data.name == null ? hpText : Component.Serializer.fromJson(data.name).append(": ").append(hpText); + } + + public static List getDetail(GolemTracker.TrackedData data, Player player, long time) { + List ans = new ArrayList<>(); + if (data.name != null) ans.add(Component.Serializer.fromJson(data.name)); + if (data.status == GolemTracker.Status.RETRIEVED) { + var ret = switch (data.target) { + case DIMENSIONAL -> MGLangData.TRACKER_DIMENSIONAL.get(); + case ENDER -> MGLangData.TRACKER_ENDER.get(); + default -> MGLangData.TRACKER_INVENTORY.get(); + }; + ans.add(ret.withStyle(ChatFormatting.GRAY)); + } else { + float f = Mth.clamp(data.hp / data.mhp, 0f, 1f); + int color = Mth.hsvToRgb(f / 3.0F, 1.0F, 0.5f); + MutableComponent hc = Component.literal("" + Math.round(data.hp)).setStyle(Style.EMPTY.withColor(color)); + ans.add(MGLangData.HEALTH.get(hc, Math.round(data.mhp)).withStyle(data.hp <= 0 ? ChatFormatting.DARK_RED : ChatFormatting.DARK_AQUA)); + if (data.hp > 0) { + long diff = (time - data.timestamp) / 20; + ans.add(diff < 2 ? + MGLangData.TRACKER_PRESENT.get().withStyle(ChatFormatting.DARK_GREEN) : + MGLangData.TRACKER_TIME.get().withStyle(ChatFormatting.RED)); + } + boolean diffDim = !data.lastDim.equals(player.level().dimension().location()); + var p = data.lastPos; + boolean tooFar = diffDim || p.distSqr(player.blockPosition()) > 128 * 128; + ans.add(MGLangData.TRACKER_DIM.get(data.lastDim.toString()).withStyle(diffDim ? ChatFormatting.RED : ChatFormatting.GRAY)); + ans.add(MGLangData.TRACKER_POS.get(p.getX(), p.getY(), p.getZ()).withStyle(tooFar ? ChatFormatting.RED : ChatFormatting.GRAY)); + ans.add(getStatusDesc(data)); + } + if (data.golemType != null) { + var parts = data.golemType.values(); + if (data.materials.size() == parts.length) { + for (int i = 0; i < parts.length; i++) { + var id = data.materials.get(i); + ans.add(parts[i].getDesc(Component.translatable("golem_material." + id.getNamespace() + "." + id.getPath()).withStyle(ChatFormatting.GOLD))); + } + } + } + return ans; + } + + private static MutableComponent getStatusDesc(GolemTracker.TrackedData data) { + return switch (data.status) { + case ALIVE -> MGLangData.TRACKER_ALIVE.get().withStyle(ChatFormatting.GRAY); + case RETRIEVED -> MGLangData.TRACKER_RETRIEVED.get().withStyle(ChatFormatting.GRAY); + case OTHER_RETRIEVED -> data.cause == null ? + MGLangData.TRACKER_RETRIEVED.get().withStyle(ChatFormatting.GRAY) : + MGLangData.TRACKER_RETRIEVED_OTHER.get(Component.Serializer.fromJson(data.cause)).withStyle(ChatFormatting.GRAY); + case DEATH -> data.cause == null ? + MGLangData.TRACKER_DIED.get().withStyle(ChatFormatting.RED) : + MGLangData.TRACKER_KILLED.get(Component.Serializer.fromJson(data.cause)).withStyle(ChatFormatting.RED); + case DEATH_RECYCLE -> data.cause == null ? + MGLangData.TRACKER_RECYCLE_DIED.get().withStyle(ChatFormatting.RED) : + MGLangData.TRACKER_RECYCLE_KILLED.get(Component.Serializer.fromJson(data.cause)).withStyle(ChatFormatting.RED); + }; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerTab.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerTab.java new file mode 100644 index 000000000..8729f3929 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/TrackerTab.java @@ -0,0 +1,50 @@ +package dev.xkmc.modulargolems.content.client.tracker; + +import dev.xkmc.modulargolems.content.menu.registry.TrackerGroup; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabBase; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabManager; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabToken; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import java.util.function.Supplier; + +public class TrackerTab extends GolemTabBase { + + public enum Type { + ALIVE(() -> new AliveGolemPage(MGLangData.TAB_ALIVE.get())), + DEAD(() -> new DeadGolemPage(MGLangData.TAB_DEAD.get())), + RETRIEVE(() -> new RetrivedGolemPage(MGLangData.TAB_RETRIEVE.get())); + + private final Supplier factory; + + Type(Supplier factory) { + this.factory = factory; + } + + public TrackerTab create(int index, GolemTabToken token, GolemTabManager manager, ItemStack stack, Component title) { + return new TrackerTab(this, index, token, manager, stack, title); + } + + public Screen createScreen() { + return factory.get(); + } + + } + + private final Type tab; + + public TrackerTab(Type tab, int index, GolemTabToken token, GolemTabManager manager, ItemStack stack, Component title) { + super(index, token, manager, stack, title); + this.tab = tab; + } + + @Override + public void onTabClicked() { + Minecraft.getInstance().setScreen(tab.createScreen()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/tracker/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/package-info.java new file mode 100644 index 000000000..df6278847 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/tracker/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.client.tracker; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/BeaconCannonModel.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/BeaconCannonModel.java new file mode 100644 index 000000000..745fd5c3e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/BeaconCannonModel.java @@ -0,0 +1,145 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.pose.BeaconConnonPose; +import dev.xkmc.modulargolems.content.client.pose.GolemShoulderPose; +import dev.xkmc.modulargolems.content.item.ranged.CannonPoseUtil; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.animation.AnimationChannel; +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.client.animation.Keyframe; +import net.minecraft.client.animation.KeyframeAnimations; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +import java.util.List; + +public class BeaconCannonModel { + + public static final ModelLayerLocation BEACON_RIGHT = new ModelLayerLocation(ModularGolems.loc("beacon_cannon"), "right"); + public static final ModelLayerLocation BEACON_LEFT = new ModelLayerLocation(ModularGolems.loc("beacon_cannon"), "left"); + + public static final AnimationDefinition RIGHT_START, RIGHT_ACTIVE, RIGHT_END, + LEFT_START, LEFT_ACTIVE, LEFT_END; + + static { + RIGHT_START = AnimationDefinition.Builder.withLength(0.25F) + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(90F, -0, 0), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.posVec(-1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR) + )).build(); + LEFT_START = AnimationDefinition.Builder.withLength(0.25F) + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(90F, -0, 0), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.posVec(1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + RIGHT_ACTIVE = AnimationDefinition.Builder.withLength(0.0F).looping() + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(90F, -0, 0), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(-1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR) + )).build(); + LEFT_ACTIVE = AnimationDefinition.Builder.withLength(0.0F).looping() + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(90F, -0, 0), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + RIGHT_END = AnimationDefinition.Builder.withLength(0.25F) + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(99.9904F, -0.0379F, 0.434F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(-1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )).build(); + LEFT_END = AnimationDefinition.Builder.withLength(0.25F) + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(99.9904F, -0.0379F, 0.434F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("flamethrower2", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(1.0F, 7.0F, -1.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.25F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + } + + static { + GolemModelPath.register(GolemModelPaths.BEACON_RIGHT, + new GolemModelPath(BEACON_RIGHT, List.of(List.of("body", "flamethrower")))); + + GolemModelPath.register(GolemModelPaths.BEACON_LEFT, + new GolemModelPath(BEACON_LEFT, List.of(List.of("body", "flamethrower2")))); + + GolemModelAnimations.register(GolemModelPaths.BEACON_RIGHT.withSuffix("_start"), RIGHT_START); + GolemModelAnimations.register(GolemModelPaths.BEACON_RIGHT.withSuffix("_active"), RIGHT_ACTIVE); + GolemModelAnimations.register(GolemModelPaths.BEACON_RIGHT.withSuffix("_end"), RIGHT_END); + GolemModelAnimations.register(GolemModelPaths.BEACON_LEFT.withSuffix("_start"), LEFT_START); + GolemModelAnimations.register(GolemModelPaths.BEACON_LEFT.withSuffix("_active"), LEFT_ACTIVE); + GolemModelAnimations.register(GolemModelPaths.BEACON_LEFT.withSuffix("_end"), LEFT_END); + + GolemShoulderPose.register(GolemModelPaths.BEACON_RIGHT, new BeaconConnonPose(CannonPoseUtil.BEACON_CANNON, "flamethrower", -1, 0, 0)); + GolemShoulderPose.register(GolemModelPaths.BEACON_LEFT, new BeaconConnonPose(CannonPoseUtil.BEACON_CANNON, "flamethrower2", 1, 0, 0)); + } + + public static LayerDefinition leftLayer() { + MeshDefinition meshdefinition = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.getChild("body"); + + PartDefinition Gatling2 = body.addOrReplaceChild("flamethrower2", CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, -5.0F, 1.5F, 6.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-3.0F, 0.0F, 1.5F, 6.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(12, 42).addBox(-2.0F, -5.0F, 0.0F, 4.0F, 11.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(26, 0).addBox(-2.5F, 0.5F, 2.0F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(6.0F, 5.0F, 4.0F)); + + PartDefinition bone2 = Gatling2.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(0, 28).addBox(-1.0F, -15.5F, -2.0F, 2.0F, 14.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(26, 14).addBox(-1.5F, -16.0F, -2.5F, 3.0F, 14.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(32, 33).addBox(-2.0F, -6.0F, -3.0F, 4.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(32, 40).addBox(-2.0F, -4.0F, -3.0F, 4.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -7.0F, 5.0F)); + + PartDefinition cube_r2 = bone2.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(12, 33).addBox(-2.5F, -2.0F, -2.5F, 5.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.7854F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + public static LayerDefinition rightLayer() { + MeshDefinition meshdefinition = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.getChild("body"); + + PartDefinition Gatling = body.addOrReplaceChild("flamethrower", CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, -5.0F, 1.5F, 6.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-3.0F, 0.0F, 1.5F, 6.0F, 9.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(12, 42).addBox(-2.0F, -5.0F, 0.0F, 4.0F, 11.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(26, 0).addBox(-2.5F, 0.5F, 2.0F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-6.0F, 5.0F, 4.0F)); + + PartDefinition bone = Gatling.addOrReplaceChild("bone", CubeListBuilder.create().texOffs(0, 28).addBox(-1.0F, -15.5F, -2.0F, 2.0F, 14.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(26, 14).addBox(-1.5F, -16.0F, -2.5F, 3.0F, 14.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(32, 33).addBox(-2.0F, -6.0F, -3.0F, 4.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(32, 40).addBox(-2.0F, -4.0F, -3.0F, 4.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -7.0F, 5.0F)); + + PartDefinition cube_r1 = bone.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(12, 33).addBox(-2.5F, -2.0F, -2.5F, 5.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.7854F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/FlameThrowerModel.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/FlameThrowerModel.java new file mode 100644 index 000000000..e934872fa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/FlameThrowerModel.java @@ -0,0 +1,69 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.pose.BeaconConnonPose; +import dev.xkmc.modulargolems.content.client.pose.GolemShoulderPose; +import dev.xkmc.modulargolems.content.item.ranged.CannonPoseUtil; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +import java.util.List; + +public class FlameThrowerModel { + + public static final ModelLayerLocation FLAME_RIGHT = new ModelLayerLocation(ModularGolems.loc("flame_thrower"), "right"); + public static final ModelLayerLocation FLAME_LEFT = new ModelLayerLocation(ModularGolems.loc("flame_thrower"), "left"); + + static { + GolemModelPath.register(GolemModelPaths.FLAME_RIGHT, + new GolemModelPath(FLAME_RIGHT, List.of(List.of("body", "flamethrower")))); + + GolemModelPath.register(GolemModelPaths.FLAME_LEFT, + new GolemModelPath(FLAME_LEFT, List.of(List.of("body", "flamethrower2")))); + + GolemShoulderPose.register(GolemModelPaths.FLAME_RIGHT, new BeaconConnonPose(CannonPoseUtil.FLAME_THROWER, "flamethrower", -1, 0, 0)); + GolemShoulderPose.register(GolemModelPaths.FLAME_LEFT, new BeaconConnonPose(CannonPoseUtil.FLAME_THROWER, "flamethrower2", 1, 0, 0)); + } + + + public static LayerDefinition leftLayer() { + MeshDefinition meshdefinition = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.getChild("body"); + + PartDefinition flamethrower2 = body.addOrReplaceChild("flamethrower2", CubeListBuilder.create().texOffs(0, 14).addBox(-4.0F, -7.0F, 2.0F, 4.0F, 7.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(28, 27).addBox(-3.0F, -14.0F, 4.0F, 2.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(0, 26).addBox(-3.5F, -11.0F, 2.5F, 3.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 26).addBox(-3.5F, -9.0F, 2.5F, 3.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(18, 14).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 11.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-4.5F, 0.0F, 2.0F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(6.0F, 5.0F, 4.0F)); + + PartDefinition cube_r2 = flamethrower2.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(22, 0).addBox(-1.5F, -8.0F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -13.0F, 5.0F, 0.0F, 0.7854F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + public static LayerDefinition rightLayer() { + MeshDefinition meshdefinition = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.getChild("body"); + + PartDefinition flamethrower = body.addOrReplaceChild("flamethrower", CubeListBuilder.create().texOffs(0, 14).addBox(-1.0F, -7.0F, 2.0F, 4.0F, 7.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(28, 27).addBox(0.0F, -14.0F, 4.0F, 2.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(0, 26).addBox(-0.5F, -11.0F, 2.5F, 3.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 26).addBox(-0.5F, -9.0F, 2.5F, 3.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(18, 14).addBox(-1.0F, -4.0F, 0.0F, 4.0F, 11.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-1.5F, 0.0F, 2.0F, 5.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-6.0F, 5.0F, 4.0F)); + + PartDefinition cube_r1 = flamethrower.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(22, 0).addBox(-1.5F, -8.0F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -13.0F, 5.0F, 0.0F, 0.7854F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemBows.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemBows.java new file mode 100644 index 000000000..8273475cb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemBows.java @@ -0,0 +1,150 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.pose.BowPose; +import dev.xkmc.modulargolems.content.client.pose.MetalGolemPose; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.animation.AnimationChannel; +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.client.animation.Keyframe; +import net.minecraft.client.animation.KeyframeAnimations; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +public class GolemBows { + + public static final ModelLayerLocation BOW_MAINHAND = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "bow"), "mainhand"); + public static final ModelLayerLocation BOW_OFFHAND = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "bow"), "offhand"); + + public static final AnimationDefinition PULL_MAINHAND; + + static { + PULL_MAINHAND = AnimationDefinition.Builder.withLength(0.5F) + .addAnimation("bone", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(32.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-32.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone3", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(32.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone4", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-32.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone4", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, -1.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone5", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 4.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone5", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 0.6F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone6", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 4.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("bone6", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 0.6F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + } + + static { + GolemModelPath.register(GolemModelPaths.BOW_MAINHAND, + new GolemModelPath(BOW_MAINHAND, List.of(List.of("right_arm", "crossbow")))); + + GolemModelPath.register(GolemModelPaths.BOW_OFFHAND, + new GolemModelPath(BOW_OFFHAND, List.of(List.of("left_arm", "crossbow")))); + + GolemModelAnimations.register(GolemModelPaths.BOW_MAINHAND, PULL_MAINHAND); + MetalGolemPose.register(GolemModelPaths.BOW_MAINHAND, BowPose.BOW); + } + + public static LayerDefinition createMainHand() { + MeshDefinition mesh = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = mesh.getRoot(); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + PartDefinition crossbow = right_arm.addOrReplaceChild("crossbow", CubeListBuilder.create().texOffs(0, 44).addBox(-12.0F, -2.0F, -5.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 27.0F, 0.0F)); + + PartDefinition cube_r1 = crossbow.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(44, 34).mirror().addBox(-1.0F, -8.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-11.0F, 4.0F, 3.0F, -2.7053F, 0.0F, 3.1416F)); + + PartDefinition cube_r2 = crossbow.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(24, 44).addBox(-1.0F, -1.0F, -3.5F, 2.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 5.0F, 0.0F, 2.7053F, 0.0F, 3.1416F)); + + PartDefinition cube_r3 = crossbow.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(44, 34).addBox(-1.0F, -8.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 4.0F, -3.0F, 0.4363F, 0.0F, 0.0F)); + + PartDefinition cube_r4 = crossbow.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(24, 44).addBox(-1.0F, -1.0F, -3.5F, 2.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 5.0F, 0.0F, -0.4363F, 0.0F, 0.0F)); + + PartDefinition cube_r5 = crossbow.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(24, 50).addBox(0.5F, -2.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-12.0F, 6.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + PartDefinition bone = crossbow.addOrReplaceChild("bone", CubeListBuilder.create(), PartPose.offset(-11.0F, -1.0F, 6.0F)); + + PartDefinition cube_r6 = bone.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(44, 9).addBox(-1.5F, -1.0F, -3.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, -2.618F, 0.0F, 0.0F)); + + PartDefinition cube_r7 = bone.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(44, 44).addBox(-1.0F, -7.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 4.0F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition bone2 = crossbow.addOrReplaceChild("bone2", CubeListBuilder.create(), PartPose.offset(-11.0F, -1.0F, -6.0F)); + + PartDefinition cube_r8 = bone2.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(44, 44).addBox(-1.0F, -7.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, 2.618F, 0.0F, -3.1416F)); + + PartDefinition cube_r9 = bone2.addOrReplaceChild("cube_r9", CubeListBuilder.create().texOffs(44, 9).addBox(-2.5F, -1.0F, -3.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -1.0F, -1.0F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition bone5 = crossbow.addOrReplaceChild("bone5", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition cube_r10 = bone5.addOrReplaceChild("cube_r10", CubeListBuilder.create().texOffs(0, 0).addBox(1.0F, -10.0F, -12.0F, 0.0F, 22.0F, 22.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-12.0F, -6.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + public static LayerDefinition createOffhand() { + MeshDefinition mesh = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition partdefinition = mesh.getRoot(); + PartDefinition left_arm = partdefinition.getChild("left_arm"); + + PartDefinition crossbow2 = left_arm.addOrReplaceChild("crossbow", CubeListBuilder.create().texOffs(0, 44).addBox(-12.0F, -2.0F, -5.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(22.0F, 27.0F, 0.0F)); + + PartDefinition cube_r11 = crossbow2.addOrReplaceChild("cube_r11", CubeListBuilder.create().texOffs(44, 34).mirror().addBox(-1.0F, -8.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-11.0F, 4.0F, 3.0F, -2.7053F, 0.0F, 3.1416F)); + + PartDefinition cube_r12 = crossbow2.addOrReplaceChild("cube_r12", CubeListBuilder.create().texOffs(24, 44).addBox(-1.0F, -1.0F, -3.5F, 2.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 5.0F, 0.0F, 2.7053F, 0.0F, 3.1416F)); + + PartDefinition cube_r13 = crossbow2.addOrReplaceChild("cube_r13", CubeListBuilder.create().texOffs(44, 34).addBox(-1.0F, -8.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 4.0F, -3.0F, 0.4363F, 0.0F, 0.0F)); + + PartDefinition cube_r14 = crossbow2.addOrReplaceChild("cube_r14", CubeListBuilder.create().texOffs(24, 44).addBox(-1.0F, -1.0F, -3.5F, 2.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-11.0F, 5.0F, 0.0F, -0.4363F, 0.0F, 0.0F)); + + PartDefinition cube_r15 = crossbow2.addOrReplaceChild("cube_r15", CubeListBuilder.create().texOffs(24, 50).addBox(0.5F, -2.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-12.0F, 6.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + PartDefinition bone3 = crossbow2.addOrReplaceChild("bone3", CubeListBuilder.create(), PartPose.offset(-11.0F, -1.0F, 7.0F)); + + PartDefinition cube_r16 = bone3.addOrReplaceChild("cube_r16", CubeListBuilder.create().texOffs(44, 9).addBox(-1.5F, -1.0F, -3.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 1.0F, -2.618F, 0.0F, 0.0F)); + + PartDefinition cube_r17 = bone3.addOrReplaceChild("cube_r17", CubeListBuilder.create().texOffs(44, 44).addBox(-1.0F, -7.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 3.0F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition bone4 = crossbow2.addOrReplaceChild("bone4", CubeListBuilder.create(), PartPose.offset(-11.0F, -1.0F, -6.0F)); + + PartDefinition cube_r18 = bone4.addOrReplaceChild("cube_r18", CubeListBuilder.create().texOffs(44, 44).addBox(-1.0F, -7.0F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, 2.618F, 0.0F, -3.1416F)); + + PartDefinition cube_r19 = bone4.addOrReplaceChild("cube_r19", CubeListBuilder.create().texOffs(44, 9).addBox(-2.5F, -1.0F, -3.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -1.0F, -1.0F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition bone6 = crossbow2.addOrReplaceChild("bone6", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition cube_r20 = bone6.addOrReplaceChild("cube_r20", CubeListBuilder.create().texOffs(0, 0).addBox(1.0F, -10.0F, -12.0F, 0.0F, 22.0F, 22.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-12.0F, -6.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemModelAnimations.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemModelAnimations.java new file mode 100644 index 000000000..b0b134623 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/GolemModelAnimations.java @@ -0,0 +1,17 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.Map; + +public class GolemModelAnimations { + + public static final Map MAP = new HashMap<>(); + + public synchronized static void register(ResourceLocation id, AnimationDefinition path) { + MAP.put(id, path); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/IEntityModelWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/IEntityModelWeapon.java new file mode 100644 index 000000000..1313a5e3d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/IEntityModelWeapon.java @@ -0,0 +1,40 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +public interface IEntityModelWeapon { + + @Nullable ResourceLocation getModelForHand(InteractionHand hand); + + default boolean shouldPlayAnimation(LivingEntity user, ItemStack stack, InteractionHand hand) { + return false; + } + + default float getAnimationSpeed(LivingEntity user, ItemStack stack, InteractionHand hand) { + return 1; + } + + default float getAnimationTick(LivingEntity user, ItemStack stack, InteractionHand hand) { + return 0; + } + + ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand); + + default boolean emissive() { + return false; + } + + default ResourceLocation getEmissiveTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + return getModelTexture(entity, stack, hand); + } + + default @Nullable ResourceLocation getPoseId() { + return getModelForHand(InteractionHand.MAIN_HAND); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/ShoulderAnimData.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/ShoulderAnimData.java new file mode 100644 index 000000000..a87b3e176 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/ShoulderAnimData.java @@ -0,0 +1,6 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import net.minecraft.resources.ResourceLocation; + +public record ShoulderAnimData(ResourceLocation id, float speed, float tick) { +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/SonicCannonModel.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/SonicCannonModel.java new file mode 100644 index 000000000..1633128d6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/SonicCannonModel.java @@ -0,0 +1,60 @@ +package dev.xkmc.modulargolems.content.client.weapon; + +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.pose.BowPose; +import dev.xkmc.modulargolems.content.client.pose.MetalGolemPose; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +import java.util.List; + +public class SonicCannonModel { + + public static final ModelLayerLocation SONIC_MAINHAND = new ModelLayerLocation(ModularGolems.loc("sonic_cannon"), "mainhand"); + public static final ModelLayerLocation SONIC_OFFHAND = new ModelLayerLocation(ModularGolems.loc("sonic_cannon"), "offhand"); + + static { + GolemModelPath.register(GolemModelPaths.SONIC_MAINHAND, + new GolemModelPath(SONIC_MAINHAND, List.of(List.of("right_arm", "bone")))); + + GolemModelPath.register(GolemModelPaths.SONIC_OFFHAND, + new GolemModelPath(SONIC_OFFHAND, List.of(List.of("left_arm", "bone2")))); + + MetalGolemPose.register(GolemModelPaths.SONIC_OFFHAND, BowPose.BOW); + } + + public static LayerDefinition createMainHand() { + MeshDefinition mesh = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition right_arm = mesh.getRoot().getChild("right_arm"); + + PartDefinition bone = right_arm.addOrReplaceChild("bone", CubeListBuilder.create().texOffs(0, 0).addBox(-13.5F, -24.0F, -9.0F, 5.0F, 21.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(22, 17).addBox(-14.5F, -3.0F, -10.0F, 7.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 30).addBox(-14.0F, 2.0F, -9.5F, 6.0F, 4.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(22, 0).addBox(-14.0F, -33.0F, -10.0F, 6.0F, 9.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(26, 30).addBox(-13.0F, -4.0F, -3.0F, 4.0F, 1.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(26, 39).addBox(-12.0F, -9.0F, -3.0F, 2.0F, 2.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 42).addBox(-12.0F, -13.0F, -3.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 32.0F, -1.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + public static LayerDefinition createOffhand() { + MeshDefinition mesh = GolemEquipmentModels.buildGolemBaseLayers(); + PartDefinition left_arm = mesh.getRoot().getChild("left_arm"); + + PartDefinition bone2 = left_arm.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(0, 0).addBox(-13.5F, -24.0F, -9.0F, 5.0F, 21.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(22, 17).addBox(-14.5F, -3.0F, -10.0F, 7.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 30).addBox(-14.0F, 2.0F, -9.5F, 6.0F, 4.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(22, 0).addBox(-14.0F, -33.0F, -10.0F, 6.0F, 9.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(26, 30).addBox(-13.0F, -4.0F, -3.0F, 4.0F, 1.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(26, 39).addBox(-12.0F, -9.0F, -3.0F, 2.0F, 2.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 42).addBox(-12.0F, -13.0F, -3.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(22.0F, 32.0F, -1.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/client/weapon/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/package-info.java new file mode 100644 index 000000000..d2c1993f2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/client/weapon/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.client.weapon; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterial.java b/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterial.java index dd349d047..3e6378d2b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterial.java +++ b/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterial.java @@ -6,7 +6,7 @@ import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.item.golem.GolemPart; -import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.AttributeGolemModifier; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.ModularGolems; @@ -28,9 +28,9 @@ public record GolemMaterial(HashMap stats, HashMap> collectAttributes(List list, List upgrades) { + public static Map> collectAttributes(List list, List upgrades) { HashMap> values = new LinkedHashMap<>(); - for (GolemStatType type : GolemTypes.STAT_TYPES.get().getValues()) { + for (GolemStatType type : new TreeSet<>(GolemTypes.STAT_TYPES.get().getValues())) { appendStat(values, type, 0); } for (GolemMaterial stats : list) { @@ -49,7 +49,7 @@ public static Map> collectAttributes(List for (var entry : ent.getValue().entrySet()) { sorted.compute(entry.getKey().kind, (k, old) -> Pair.of(entry.getKey(), (old == null ? 0 : old.getSecond()) + entry.getValue())); } - if (sorted.size() == 0) { + if (sorted.isEmpty()) { continue; } if (sorted.size() == 1) { @@ -57,7 +57,23 @@ public static Map> collectAttributes(List continue; } if (!sorted.containsKey(GolemStatType.Kind.BASE)) { - throw new IllegalStateException("Only attributes with BASE modification allows multi-operation. Attribute: " + ent.getKey().getDescriptionId()); + if (sorted.containsKey(GolemStatType.Kind.ADD)) { + var pair = sorted.get(GolemStatType.Kind.ADD); + double val = pair.getSecond(); + if (val != 0) { + ans.put(ent.getKey(), pair); + continue; + } + } + if (sorted.containsKey(GolemStatType.Kind.PERCENT)) { + var pair = sorted.get(GolemStatType.Kind.PERCENT); + double val = pair.getSecond(); + if (val != 0) { + ans.put(ent.getKey(), pair); + continue; + } + } + continue; } Pair candidate = sorted.get(GolemStatType.Kind.BASE); GolemStatType type = candidate.getFirst(); @@ -78,7 +94,7 @@ private static void appendStat(Map> values .compute(k, (e, old) -> (old == null ? 0 : old) + v); } - public static HashMap collectModifiers(Collection list, Collection upgrades) { + public static HashMap collectModifiers(Collection list, Collection upgrades) { HashMap values = new LinkedHashMap<>(); for (GolemMaterial stats : list) { stats.modifiers.forEach((k, v) -> values.compute(k, (a, old) -> Math.min(a.maxLevel, (old == null ? 0 : old) + v))); @@ -87,7 +103,7 @@ public static HashMap collectModifiers(Collection, P extends IGolemPart

> void addAttributes(List list, List upgrades, T entity) { + public static , P extends IGolemPart

> void addAttributes(List list, List upgrades, T entity) { var map = DefaultAttributes.getSupplier(Wrappers.cast(entity.getType())); var attrs = collectAttributes(list, upgrades); attrs.keySet().forEach(e -> { @@ -108,6 +124,15 @@ public static Optional getMaterial(ItemStack stack) { return Optional.empty(); } + public static Optional getRepairMaterial(ItemStack stack) { + for (Map.Entry ent : GolemMaterialConfig.get().repairIngredients.entrySet()) { + if (ent.getValue().test(stack)) { + return Optional.of(ent.getKey()); + } + } + return Optional.empty(); + } + public MutableComponent getDesc() { return Component.translatable("golem_material." + id.getNamespace() + "." + id.getPath()).withStyle(ChatFormatting.GOLD); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterialConfig.java b/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterialConfig.java index 752454f33..2621ea12b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterialConfig.java +++ b/src/main/java/dev/xkmc/modulargolems/content/config/GolemMaterialConfig.java @@ -10,12 +10,12 @@ import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.fml.loading.FMLLoader; import org.apache.http.util.Asserts; -import java.util.HashMap; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; @SerialClass public class GolemMaterialConfig extends BaseConfig { @@ -36,11 +36,38 @@ public static GolemMaterialConfig get() { @SerialClass.SerialField public HashMap ingredients = new HashMap<>(); - public Set getAllMaterials() { + @ConfigCollect(CollectType.MAP_OVERWRITE) + @SerialClass.SerialField + public HashMap repairIngredients = new HashMap<>(); + + public List getAllMaterials() { TreeSet set = new TreeSet<>(stats.keySet()); set.retainAll(modifiers.keySet()); set.retainAll(ingredients.keySet()); - return set; + if (FMLLoader.isProduction()) + set.removeIf(e -> isEmpty(ingredients.get(e))); + List ans = new ArrayList<>(set); + ans.sort(Comparator.comparing(rl -> rl.getNamespace().equals(ModularGolems.MODID) ? 0 : 1) + .thenComparing(ResourceLocation::getNamespace) + .thenComparing(ResourceLocation::getPath)); + return ans; + } + + public Ingredient getCraftIngredient(ResourceLocation id) { + var ans = ingredients.get(id); + return ans == null ? Ingredient.EMPTY : ans; + } + + public Ingredient getRepairIngredient(ResourceLocation id) { + var rep = repairIngredients.get(id); + if (rep != null) return rep; + var ans = ingredients.get(id); + return ans == null ? Ingredient.EMPTY : ans; + } + + private static boolean isEmpty(Ingredient ing) { + var items = ing.getItems(); + return items.length == 0 || items[0].is(Items.BARRIER); } @DataGenOnly @@ -48,12 +75,18 @@ public Builder addMaterial(ResourceLocation id, Ingredient ingredient) { return new Builder(this, id, ingredient); } + @DataGenOnly + public Builder addMaterial(ResourceLocation id, Ingredient ingredient, Ingredient repair) { + return new Builder(this, id, ingredient, repair); + } + @DataGenOnly public static class Builder { private final GolemMaterialConfig parent; private final ResourceLocation id; private final Ingredient ingredient; + private final Ingredient repairIngredient; private final HashMap stats = new HashMap<>(); private final HashMap modifiers = new HashMap<>(); @@ -62,6 +95,14 @@ private Builder(GolemMaterialConfig parent, ResourceLocation id, Ingredient ingr this.parent = parent; this.id = id; this.ingredient = ingredient; + this.repairIngredient = ingredient; + } + + private Builder(GolemMaterialConfig parent, ResourceLocation id, Ingredient ingredient, Ingredient repair) { + this.parent = parent; + this.id = id; + this.ingredient = ingredient; + this.repairIngredient = repair; } public Builder addStat(GolemStatType type, double val) { @@ -79,6 +120,7 @@ public GolemMaterialConfig end() { parent.stats.put(id, stats); parent.modifiers.put(id, modifiers); parent.ingredients.put(id, ingredient); + parent.repairIngredients.put(id, repairIngredient); return parent; } diff --git a/src/main/java/dev/xkmc/modulargolems/content/core/GolemStatType.java b/src/main/java/dev/xkmc/modulargolems/content/core/GolemStatType.java index a1a9f4815..a8dfdac76 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/core/GolemStatType.java +++ b/src/main/java/dev/xkmc/modulargolems/content/core/GolemStatType.java @@ -8,12 +8,15 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import org.jetbrains.annotations.NotNull; +import java.util.LinkedHashSet; +import java.util.Set; import java.util.function.Supplier; import static net.minecraft.world.item.ItemStack.ATTRIBUTE_MODIFIER_FORMAT; -public class GolemStatType extends NamedEntry { +public class GolemStatType extends NamedEntry implements Comparable { public enum Kind { BASE, ADD, PERCENT @@ -23,12 +26,22 @@ public enum Kind { public final Kind kind; public final StatFilterType type; + private final boolean showAsPercent; public GolemStatType(Supplier attribute, Kind kind, StatFilterType type) { + this(attribute, kind, type, false); + } + + public GolemStatType(Supplier attribute, Kind kind, StatFilterType type, boolean showAsPercent) { super(GolemTypes.STAT_TYPES); this.attribute = attribute; this.kind = kind; this.type = type; + this.showAsPercent = showAsPercent; + } + + public boolean percentDisplay() { + return kind == Kind.PERCENT || showAsPercent; } public Attribute getAttribute() { @@ -36,25 +49,35 @@ public Attribute getAttribute() { } public MutableComponent getAdderTooltip(double val) { - if (kind == Kind.PERCENT) { + if (percentDisplay()) { val = val * 100; } - String key = "attribute.modifier." + (val < 0 ? "take." : "plus.") + (kind == Kind.PERCENT ? 1 : 0); + String key = "attribute.modifier." + (val < 0 ? "take." : "plus.") + (percentDisplay() ? 1 : 0); return Component.translatable(key, ATTRIBUTE_MODIFIER_FORMAT.format(Math.abs(val)), Component.translatable(attribute.get().getDescriptionId())).withStyle(ChatFormatting.BLUE); } public MutableComponent getTotalTooltip(double val) { - if (kind == Kind.PERCENT) { + if (percentDisplay()) { val = val * 100; } - String key = "attribute.modifier." + (val < 0 ? "take." : kind == Kind.BASE ? "equals." : "plus.") + (kind == Kind.PERCENT ? 1 : 0); + String key = "attribute.modifier." + (val < 0 ? "take." : kind == Kind.BASE ? "equals." : "plus.") + (percentDisplay() ? 1 : 0); return Component.translatable(key, ATTRIBUTE_MODIFIER_FORMAT.format(Math.abs(val)), Component.translatable(attribute.get().getDescriptionId())).withStyle(ChatFormatting.BLUE); } + public MutableComponent getDiffTooltip(double val) { + if (percentDisplay()) { + val = val * 100; + } + String key = "attribute.modifier." + (val < 0 ? "take." : "plus.") + (percentDisplay() ? 1 : 0); + return Component.translatable(key, + ATTRIBUTE_MODIFIER_FORMAT.format(Math.abs(val)), + Component.translatable(attribute.get().getDescriptionId())).withStyle(val > 0 ? ChatFormatting.BLUE : ChatFormatting.RED); + } + /** * collected value, will only call once per stat */ @@ -68,4 +91,31 @@ public void applyToEntity(LivingEntity e, double v) { } } + private Set conflicting; + + public Set hasConflict() { + if (kind == Kind.BASE) return Set.of(); + if (conflicting == null) { + conflicting = new LinkedHashSet<>(); + for (var e : GolemTypes.STAT_TYPES.get()) { + if (e == this) continue; + if (e.attribute.get() == attribute.get()) { + if (e.kind == Kind.BASE) { + conflicting.clear(); + return Set.of(); + } + if (e.kind != kind) { + conflicting.add(e); + } + } + } + } + return conflicting; + } + + @Override + public int compareTo(@NotNull GolemStatType other) { + return getRegistryName().compareTo(other.getRegistryName()); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/core/GolemType.java b/src/main/java/dev/xkmc/modulargolems/content/core/GolemType.java index 86e5d794b..0b9e86efa 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/core/GolemType.java +++ b/src/main/java/dev/xkmc/modulargolems/content/core/GolemType.java @@ -57,7 +57,7 @@ public T create(Level level) { return Objects.requireNonNull(type.get().create(level)); } - public T create(ServerLevel level, CompoundTag tag) { + public T create(Level level, CompoundTag tag) { return Wrappers.cast(EntityType.create(tag, level).get()); } @@ -67,11 +67,12 @@ public T createForDisplay(CompoundTag tag) { var ans = EntityType.create(tag, Proxy.getClientWorld()).orElse(null); if (ans == null) return null; T golem = Wrappers.cast(ans); + golem.addTag("ClientOnly"); if (tag.contains("Attributes", 9)) { golem.getAttributes().load(tag.getList("Attributes", 10)); } if (tag.contains("Health", Tag.TAG_FLOAT)) { - golem.setHealth(tag.getFloat("Health")); + golem.setGuardedDataImpl(tag.getFloat("Health")); } golem.yHeadRot = 0; golem.yHeadRotO = 0; diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemEntity.java index 20b77c3d8..76007d019 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemEntity.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemEntity.java @@ -1,34 +1,48 @@ package dev.xkmc.modulargolems.content.entity.common; import dev.xkmc.l2library.util.annotation.ServerOnly; +import dev.xkmc.l2library.util.math.MathHelper; import dev.xkmc.l2serial.serialization.SerialClass; import dev.xkmc.l2serial.serialization.codec.PacketCodec; import dev.xkmc.l2serial.serialization.codec.TagCodec; import dev.xkmc.l2serial.util.Wrappers; +import dev.xkmc.mob_weapon_api.api.ai.ItemWrapper; import dev.xkmc.modulargolems.content.capability.GolemConfigEntry; import dev.xkmc.modulargolems.content.capability.GolemConfigStorage; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.capability.PathConfig; import dev.xkmc.modulargolems.content.config.GolemMaterial; import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.core.GolemType; import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.goals.*; -import dev.xkmc.modulargolems.content.entity.humanoid.ItemWrapper; +import dev.xkmc.modulargolems.content.entity.hostile.HostileGolemRegistry; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.entity.mode.GolemMode; import dev.xkmc.modulargolems.content.entity.mode.GolemModes; -import dev.xkmc.modulargolems.content.entity.sync.SyncedData; -import dev.xkmc.modulargolems.content.item.card.DefaultFilterCard; +import dev.xkmc.modulargolems.content.entity.targeting.Golem3DTargetGoal; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import dev.xkmc.modulargolems.content.item.card.ConfigCard; import dev.xkmc.modulargolems.content.item.card.PathRecordCard; -import dev.xkmc.modulargolems.content.item.equipments.GolemEquipmentItem; +import dev.xkmc.modulargolems.content.item.equipments.CustomDropGolemWeapon; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; +import dev.xkmc.modulargolems.content.item.equipments.IGolemModifierItem; import dev.xkmc.modulargolems.content.item.equipments.TickEquipmentItem; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; -import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.item.wand.GolemTransportHandler; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.events.event.GolemCollectInventoryEvent; +import dev.xkmc.modulargolems.events.event.GolemToOwnerEvent; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.advancement.GolemTriggers; import dev.xkmc.modulargolems.init.data.MGConfig; import dev.xkmc.modulargolems.init.data.MGLangData; import dev.xkmc.modulargolems.init.data.MGTagGen; import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -36,46 +50,62 @@ import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializer; +import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.tags.DamageTypeTags; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; import net.minecraft.util.TimeUtil; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.DefaultAttributes; +import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; -import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.goal.target.ResetUniversalAngerTargetGoal; import net.minecraft.world.entity.ai.goal.target.TargetGoal; import net.minecraft.world.entity.ai.navigation.AmphibiousPathNavigation; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.animal.AbstractGolem; -import net.minecraft.world.entity.monster.Creeper; -import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Team; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ITeleporter; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.minecraftforge.items.wrapper.EntityArmorInvWrapper; +import net.minecraftforge.items.wrapper.EntityHandsInvWrapper; import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.*; @SerialClass -public class AbstractGolemEntity, P extends IGolemPart

> extends AbstractGolem +public class AbstractGolemEntity, P extends IGolemPart

> extends GuardedEntity implements IEntityAdditionalSpawnData, NeutralMob, OwnableEntity, PowerableMob { private static EntityDataAccessor defineId(EntityDataSerializer ser) { @@ -83,11 +113,13 @@ private static EntityDataAccessor defineId(EntityDataSerializer ser) { } private static final SyncedData GOLEM_DATA = new SyncedData(AbstractGolemEntity::defineId); + private static final EntityDataAccessor> OWNER_ID = GOLEM_DATA.define(SyncedData.UUID, Optional.empty(), null); protected AbstractGolemEntity(EntityType type, Level level) { super(type, level); this.waterNavigation = new AmphibiousPathNavigation(this, level); - this.groundNavigation = new GroundPathNavigation(this, level); + this.groundNavigation = new FastGroundPathNavigation(this, level); + navigation = groundNavigation; } // ------ materials @@ -98,7 +130,7 @@ protected AbstractGolemEntity(EntityType type, Level level) { private ArrayList upgrades = new ArrayList<>(); @SerialClass.SerialField(toClient = true) @Nullable - private UUID owner; + private UUID owner, leader; @SerialClass.SerialField(toClient = true) private HashMap modifiers = new LinkedHashMap<>(); @SerialClass.SerialField(toClient = true) @@ -110,19 +142,30 @@ protected AbstractGolemEntity(EntityType type, Level level) { // marks opened inventory public int inventoryTick = 0; + public int specialAttackCoolDown = 0; protected final PathNavigation waterNavigation; protected final GroundPathNavigation groundNavigation; - public void onCreate(ArrayList materials, ArrayList upgrades, @Nullable UUID owner) { + public final Set effectImmunity = new HashSet<>(); + + private final List modifierGoals = new ArrayList<>(); + + private Golem3DTargetGoal targeter; + public LivingEntity forcedTarget; + public GolemMeleeGoal meleeGoal; + + public void onCreate(ArrayList materials, ArrayList upgrades, @Nullable UUID owner) { updateAttributes(materials, upgrades, owner); - this.setHealth(this.getMaxHealth()); + if (!level().isClientSide()) { + applyData(GuardedData.start(this, getMaxHealth())); + } } - public void updateAttributes(ArrayList materials, ArrayList upgrades, @Nullable UUID owner) { + public void updateAttributes(ArrayList materials, ArrayList upgrades, @Nullable UUID owner) { this.materials = materials; this.upgrades = Wrappers.cast(upgrades); - this.owner = owner; + setOwnerUUID(owner); this.modifiers = GolemMaterial.collectModifiers(materials, upgrades); this.golemFlags.clear(); this.setMaxUpStep(1); @@ -134,7 +177,19 @@ public void updateAttributes(ArrayList materials, ArrayList m.onRegisterGoals(this, i, this.goalSelector::addGoal)); + modifierGoals.forEach(goalSelector::removeGoal); + modifierGoals.clear(); + getModifiers().forEach((m, i) -> + m.onRegisterGoals(this, i, (priority, goal) -> { + modifierGoals.add(goal); + goalSelector.addGoal(priority, goal); + })); + } + var sup = DefaultAttributes.getSupplier(getType()); + for (var e : ForgeRegistries.ATTRIBUTES) { + var ins = getAttribute(e); + if (ins == null | !sup.hasAttribute(e)) continue; + ins.setBaseValue(sup.getBaseValue(e)); } GolemMaterial.addAttributes(materials, upgrades, getThis()); refreshDimensions(); @@ -156,7 +211,21 @@ public HashMap getModifiers() { return modifiers; } + public HashMap getModifiersExtended() { + HashMap ans = new HashMap<>(modifiers); + for (var e : EquipmentSlot.values()) { + ItemStack stack = getItemBySlot(e); + if (stack.getItem() instanceof IGolemModifierItem item) { + for (var ins : item.getModifier(stack, this)) { + ans.compute(ins.mod(), (k, v) -> (v == null ? 0 : v) + ins.level()); + } + } + } + return ans; + } + public boolean hasFlag(GolemFlags flag) { + if (golemFlags == null) return false; return golemFlags.contains(flag); } @@ -164,7 +233,7 @@ public boolean hasFlag(GolemFlags flag) { protected final InteractionResult mobInteract(Player player, InteractionHand hand) { if (player.getItemInHand(hand).is(MGTagGen.GOLEM_INTERACT)) return InteractionResult.PASS; for (var ent : modifiers.entrySet()) { - var result = ent.getKey().interact(player, this, hand); + var result = ent.getKey().interact(player, this, hand, ent.getValue()); if (result != InteractionResult.PASS) { return result; } @@ -177,12 +246,14 @@ protected InteractionResult mobInteractImpl(Player player, InteractionHand hand) if (player.getMainHandItem().isEmpty()) { if (!level().isClientSide()) { this.unRide(); - player.setItemSlot(EquipmentSlot.MAINHAND, toItem()); + + player.setItemSlot(EquipmentSlot.MAINHAND, toItem(player)); + setRetrivedTo(GolemTracker.RetrieveTarget.INVENTORY); } return InteractionResult.SUCCESS; } else { ItemStack stack = player.getItemInHand(hand); - if (stack.getItem() instanceof GolemEquipmentItem item) { + if (stack.getItem() instanceof IGolemEquipmentItem item) { if (item.isFor(getType()) && getItemBySlot(item.getSlot()).isEmpty()) { if (!level().isClientSide()) { setItemSlot(item.getSlot(), stack.split(1)); @@ -194,10 +265,34 @@ protected InteractionResult mobInteractImpl(Player player, InteractionHand hand) return InteractionResult.PASS; } + @Nullable + public GolemTracker getTracker() { + var id = getOwnerUUID(); + if (id == null || id.equals(Util.NIL_UUID) || isHostile()) return null; + if (getOwner() instanceof FakePlayer) return null; + return GolemConfigStorage.get(level()).getTracker(id); + } + + public void setRetrivedTo(GolemTracker.RetrieveTarget target) { + var tracker = getTracker(); + if (tracker == null) return; + var data = tracker.data.get(getUUID()); + if (data == null) return; + data.target = target; + } + + public void untrack(GolemTracker.Status type, @Nullable Entity cause) { + var tracker = getTracker(); + if (tracker != null) tracker.untrack(this, type, cause); + } + @ServerOnly - public ItemStack toItem() { + public ItemStack toItem(LivingEntity player) { recordedPosition = position(); recordedGuardPos = getGuardPos(); + leader = null; + untrack(player == getOwner() ? GolemTracker.Status.RETRIEVED : GolemTracker.Status.OTHER_RETRIEVED, player); + unRide(); var ans = GolemHolder.setEntity(getThis()); level().broadcastEntityEvent(this, EntityEvent.POOF); this.discard(); @@ -210,34 +305,74 @@ public boolean fireImmune() { } @Override - protected void actuallyHurt(DamageSource source, float damage) { - if (source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) damage *= 1000; - super.actuallyHurt(source, damage); - if (getHealth() <= 0 && hasFlag(GolemFlags.RECYCLE)) { - Player player = getOwner(); + public boolean hurt(DamageSource source, float amount) { + if (level().isClientSide()) return false; + if (source.is(DamageTypes.FELL_OUT_OF_WORLD) && source.getEntity() == null && getY() < level().getMinBuildHeight() - 64) { unRide(); - ItemStack stack = GolemHolder.setEntity(getThis()); - if (player != null && player.isAlive()) { - player.getInventory().placeItemBackInInventory(stack); + if (hasFlag(GolemFlags.RECYCLE)) { + untrack(GolemTracker.Status.DEATH_RECYCLE, null); + returnToInventory(); } else { - spawnAtLocation(stack); + untrack(GolemTracker.Status.DEATH, null); } + this.discard(); + return true; + } + return super.hurt(source, amount); + } + + protected void postHurt(DamageSource source) { + if (getGuardedDataImpl() <= 0 && hasFlag(GolemFlags.RECYCLE)) { + unRide(); + untrack(GolemTracker.Status.DEATH_RECYCLE, source.getEntity()); + returnToInventory(); level().broadcastEntityEvent(this, EntityEvent.POOF); this.discard(); } + if (source.getEntity() instanceof LivingEntity le) { + setTargetOnHurt(le); + } + } + + protected void setTargetOnHurt(LivingEntity le) { + if (isAlive() && predicateTarget(le)) { + if (isWithinMeleeAttackRange(le)) { + targeter.findTarget(); + setTarget(targeter.getTarget()); + } + } + if (getControllingPassenger() instanceof AbstractGolemEntity golem) { + golem.setTargetOnHurt(le); + } + meleeGoal.clearDelay(); + } + + public double getMeleeAttackRangeSqr(LivingEntity e) { + double val = getAttributeValue(ForgeMod.ENTITY_REACH.get()); + return val * val + e.getBbWidth(); } @Override protected void dropCustomDeathLoot(DamageSource source, int i, boolean b) { - Map drop = new HashMap<>(); - for (GolemMaterial mat : getMaterials()) { - Item item = GolemMaterialConfig.get().ingredients.get(mat.id()).getItems()[0].getItem(); - drop.compute(item, (e, old) -> (old == null ? 0 : old) + 1); + boolean skip = false; + if (source.getDirectEntity() instanceof MetalGolemEntity golem && + golem.getMainHandItem().getItem() instanceof CustomDropGolemWeapon item) { + skip = item.dropCustomDeathLoot(this, golem, golem.getMainHandItem(), source); } - drop.forEach((k, v) -> spawnAtLocation(new ItemStack(k, v))); - for (EquipmentSlot slot : EquipmentSlot.values()) { - dropSlot(slot, true); + if (!skip) { + Map drop = new HashMap<>(); + for (GolemMaterial mat : getMaterials()) { + Item item = GolemMaterialConfig.get().getCraftIngredient(mat.id()).getItems()[0].getItem(); + drop.compute(item, (e, old) -> (old == null ? 0 : old) + 1); + } + drop.forEach((k, v) -> spawnAtLocation(new ItemStack(k, v))); + } + if (!isHostile()) { + for (EquipmentSlot slot : EquipmentSlot.values()) { + dropSlot(slot, true); + } } + super.dropCustomDeathLoot(source, i, b); } protected void dropSlot(EquipmentSlot slot, boolean isDeath) { @@ -249,12 +384,46 @@ protected void dropSlot(EquipmentSlot slot, boolean isDeath) { this.setItemSlot(slot, ItemStack.EMPTY); } + private double lastSize = 0; + private boolean sizeDirty = false; + + private double getScaleImpl() { + int reforge = getReforgeBase(); + double rate = Math.pow(1d * (reforge - getReforgeCount()) / reforge, 1d / 3); + return getAttributeValue(GolemTypes.GOLEM_SIZE.get()) * rate; + } + + public void checkSize() { + if (!sizeDirty && tickCount > 5 && tickCount % 10 != 0) return; + sizeDirty = false; + double cur = getScaleImpl(); + if (lastSize != cur) { + refreshDimensions(); + } + } + + @Override + public void refreshDimensions() { + lastSize = getScaleImpl(); + super.refreshDimensions(); + } + + @Override + public float maxUpStep() { + return super.maxUpStep() * getScale(); + } public float getScale() { - if (materials == null || materials.isEmpty() || getTags().contains("ClientOnly")) { + if (materials == null || materials.isEmpty() || level().isClientSide() && !isAddedToWorld() || getTags().contains("ClientOnly")) { return 1; } - return (float) (getAttributeValue(GolemTypes.GOLEM_SIZE.get()) / DefaultAttributes.getSupplier(getType()).getValue(GolemTypes.GOLEM_SIZE.get())); + var def = DefaultAttributes.getSupplier(getType()).getValue(GolemTypes.GOLEM_SIZE.get()); + return (float) (getScaleImpl() / def); + } + + public void calculateEntityAnimation(boolean hasY) { + float f = (float) Mth.length(this.getX() - this.xo, hasY ? this.getY() - this.yo : 0.0D, this.getZ() - this.zo); + this.updateWalkAnimation(f / getScale()); } // ------ swim @@ -263,8 +432,12 @@ public boolean canSwim() { return hasFlag(GolemFlags.SWIM); } + public boolean isMovable() { + return getMode().isMovable() && !isInSittingPose(); + } + public void travel(Vec3 pTravelVector) { - if (!getMode().isMovable()) { + if (!isMovable()) { pTravelVector = Vec3.ZERO; } if ((this.isControlledByLocalInstance() || this.isEffectiveAi()) && this.isInWater() && canSwim()) { @@ -288,17 +461,27 @@ public void updateSwimming() { @Override public boolean isPushable() { - return getMode().isMovable(); + return isMovable(); } + @Deprecated public boolean isPushedByFluid() { - return !this.isSwimming() && getMode().isMovable(); + return !this.isSwimming() && isMovable(); } // ------ ownable entity + public void setOwnerUUID(@Nullable UUID id) { + owner = id; + entityData.set(OWNER_ID, Optional.ofNullable(owner)); + + } + @Nullable - public UUID getOwnerUUID() { + public final UUID getOwnerUUID() { + if (level().isClientSide()) { + return entityData.get(OWNER_ID).orElse(null); + } return owner; } @@ -307,11 +490,38 @@ public Player getOwner() { try { UUID uuid = this.getOwnerUUID(); return uuid == null ? null : this.level().getPlayerByUUID(uuid); - } catch (IllegalArgumentException illegalargumentexception) { + } catch (IllegalArgumentException ignored) { return null; } } + @Nullable + public LivingEntity getLeader() { + try { + UUID uuid = this.getLeaderUUID(); + if (uuid == null) return null; + if (!(level() instanceof ServerLevel sl)) return null; + var e = sl.getEntity(uuid); + if (!(e instanceof LivingEntity le)) return null; + return le; + } catch (IllegalArgumentException ignored) { + return null; + } + } + + @Nullable + public UUID getLeaderUUID() { + return leader; + } + + public void setLeader(LivingEntity le) { + leader = le.getUUID(); + } + + public final boolean isHostile() { + return HostileGolemRegistry.isHostile(getOwnerUUID()); + } + // ------ addition golem behavior public void addAdditionalSaveData(CompoundTag tag) { @@ -340,11 +550,15 @@ public Packet getAddEntityPacket() { public void writeSpawnData(FriendlyByteBuf buffer) { PacketCodec.to(buffer, this); + buffer.writeInt(getReforgeCount()); } public void readSpawnData(FriendlyByteBuf data) { PacketCodec.from(data, Wrappers.cast(this.getClass()), getThis()); updateAttributes(materials, Wrappers.cast(upgrades), owner); + int reforge = data.readInt(); + if (reforge > 0) + updateReforge(reforge); } public T getThis() { @@ -381,12 +595,24 @@ public boolean canBeSeenAsEnemy() { return !hasFlag(GolemFlags.PASSIVE) && super.canBeSeenAsEnemy(); } - @Override - public void setTarget(@Nullable LivingEntity target) { + protected boolean setTargetRaw(@Nullable LivingEntity target) { if (target != null && !canAttack(target)) { - return; + return false; } super.setTarget(target); + return true; + } + + @Override + public void setTarget(@Nullable LivingEntity target) { + if (!setTargetRaw(target)) return; + if (getVehicle() instanceof AbstractGolemEntity veh) { + veh.setTargetRaw(target); + } + if (getControllingPassenger() != null) return; + if (target != null) { + TargetManager.get(this).onSetTarget(this, target); + } if (target instanceof Mob mob) { if (mob.getTarget() == null && mob.canAttack(this)) { mob.setTarget(this); @@ -394,7 +620,6 @@ public void setTarget(@Nullable LivingEntity target) { for (var entry : getModifiers().entrySet()) { entry.getKey().onSetTarget(this, mob, entry.getValue()); } - } } @@ -405,14 +630,28 @@ public boolean canAttackType(EntityType type) { @Override public boolean canAttack(LivingEntity target) { - if (target == getOwner()) { + var owner = getOwner(); + var leader = getLeader(); + if (target == owner || target == leader) return false; - } if (target instanceof OwnableEntity own) { - if (getOwner() == own.getOwner()) { + var parent = own.getOwner(); + if (parent != null && (owner == parent || leader == parent)) { + return false; + } + } + if (!target.canBeSeenAsEnemy()) return false; + if (!target.isAlive()) return false; + if (target instanceof AbstractGolemEntity other) { + if (isHostile() != other.isHostile()) return true; + if (isHostile() && other.isHostile() && getOwnerUUID() == other.getOwnerUUID()) { return false; } } + var faction = HostileGolemRegistry.tryGetFaction(this); + if (faction.isPresent() && faction.get().hostileGolemAttacks(this, target)) { + return true; + } var config = getConfigEntry(null); if (config == null) { if (target.getType().is(MGTagGen.GOLEM_FRIENDLY)) { @@ -436,42 +675,130 @@ public void tick() { if (this.inventoryTick > 0) { this.inventoryTick--; } + if (this.specialAttackCoolDown > 0) { + this.specialAttackCoolDown--; + } + checkSize(); if (this.level().isClientSide) { for (var entry : getModifiers().entrySet()) { entry.getKey().onClientTick(this, entry.getValue()); } } - for (var slot: EquipmentSlot.values()) { + for (var slot : EquipmentSlot.values()) { var stack = this.getItemBySlot(slot); if (stack.getItem() instanceof TickEquipmentItem tickItem) { tickItem.tick(stack, this.level(), this); } } + var tracker = getTracker(); + if (tracker != null) + tracker.track(this); + } + + public void repair(float amount) { + setGuardedDataImpl(Math.min(getMaxHealth(), getGuardedDataImpl() + amount), true, true); + } + + public static final UUID REFORGE_ID = MathHelper.getUUIDFromString("GolemReforge"); + + protected int getMaxReforge() { + return GolemType.getGolemType(getType()).getBodyPart().toItem().count - 1; + } + + protected int getReforgeBase() { + int total = 0; + for (var e : GolemType.getGolemType(getType()).values()) { + total += e.toItem().count; + } + return total; + } + + public void updateReforge(int reforge) { + getPersistentData().putInt("GolemReforge", reforge); + if (!level().isClientSide()) { + var ins = getAttribute(Attributes.MAX_HEALTH); + assert ins != null; + ins.removeModifier(REFORGE_ID); + ins.addPermanentModifier(new AttributeModifier( + REFORGE_ID, "Golem Reforge " + reforge, + -1d * reforge / getReforgeBase(), + AttributeModifier.Operation.MULTIPLY_TOTAL + )); + } + sizeDirty = true; + checkSize(); + if (!level().isClientSide()) { + ModularGolems.HANDLER.toTrackingPlayers(ReforgeUpdatePacket.of(this, reforge), this); + } + } + + public void checkReforge() { + if (isAlive() && getGuardedDataImpl() <= getMaxHealth() / 2) { + int reforge = getPersistentData().getInt("GolemReforge"); + if (reforge < getMaxReforge()) { + reforge++; + updateReforge(reforge); + repair(getMaxHealth() / 4); + } + } + } + + public boolean isReforged() { + return getPersistentData().getInt("GolemReforge") > 0; + } + + public int getReforgeCount() { + return getPersistentData().getInt("GolemReforge"); + } + + public void repairWithItem() { + int reforge = getPersistentData().getInt("GolemReforge"); + if (getGuardedDataImpl() > 0.75 * getMaxHealth() && reforge > 0) + updateReforge(reforge - 1); + else repair(getMaxHealth() / 4); + + float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; + this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f1); } @Override public void aiStep() { this.updateSwingTime(); super.aiStep(); - if (this.tickCount % 20 == 0) { - double heal = this.getAttributeValue(GolemTypes.GOLEM_REGEN.get()); - for (var entry : getModifiers().entrySet()) { - heal = entry.getKey().onHealTick(heal, this, entry.getValue()); - } - if (heal > 0) { - this.heal((float) heal); + if (!this.level().isClientSide && getGuardedDataImpl() > 0) { + if (this.tickCount % 20 == 0) { + double heal = this.getAttributeValue(GolemTypes.GOLEM_REGEN.get()); + for (var entry : getModifiersExtended().entrySet()) { + heal = entry.getKey().onHealTick(heal, this, entry.getValue()); + } + if (heal > 0) { + this.heal((float) heal); + } + if (hasFlag(GolemFlags.REFORGE)) { + checkReforge(); + } } - } - if (!this.level().isClientSide) { - for (var entry : getModifiers().entrySet()) { + for (var entry : getModifiersExtended().entrySet()) { entry.getKey().onAiStep(this, entry.getValue()); } this.updatePersistentAnger((ServerLevel) this.level(), true); + if (getControllingPassenger() == null) { + var target = getTarget(); + if (target != null && target.isAlive()) { + TargetManager.get(this).tickTarget(this, target); + } + } } for (EquipmentSlot slot : EquipmentSlot.values()) { ItemStack stack = getItemBySlot(slot); if (!stack.isEmpty()) { - stack.inventoryTick(level(), this, slot.ordinal(), slot == EquipmentSlot.MAINHAND); + try { + stack.inventoryTick(level(), this, slot.ordinal(), slot == EquipmentSlot.MAINHAND); + } catch (Exception e) { + ModularGolems.LOGGER.warn("Golem cannot use item " + stack, e); + spawnAtLocation(stack); + setItemSlot(slot, ItemStack.EMPTY); + } } } } @@ -484,6 +811,10 @@ protected int decreaseAirSupply(int air) { public boolean killedEntity(ServerLevel level, LivingEntity target) { Player player = getOwner(); if (player != null) GolemTriggers.KILL.trigger((ServerPlayer) player, target); + if (target == getTarget()) { + targeter.findTarget(); + setTarget(targeter.getTarget()); + } return super.killedEntity(level, target); } @@ -533,6 +864,8 @@ public boolean initMode(@Nullable Player player) { } setMode(mode, mode == 0 ? BlockPos.ZERO : guard); moveTo(pos); + setTarget(null); + setPersistentAngerTarget(null); return true; } @@ -545,10 +878,18 @@ public boolean canChangeDimensions() { private static final EntityDataAccessor CONFIG_COLOR = GOLEM_DATA.define(SyncedData.INT, 0, "config_color"); private static final EntityDataAccessor PATROL_STAGE = GOLEM_DATA.define(SyncedData.INT, 0, "patrol_stage"); + public int getConfigColor() { + return entityData.get(CONFIG_COLOR); + } + @Nullable public GolemConfigEntry getConfigEntry(@Nullable Component dummy) { + int configColor = getConfigColor(); + var opt = HostileGolemRegistry.tryGetFaction(this); + if (opt.isPresent()) { + return opt.get().getConfig(this, configColor); + } UUID configOwner = entityData.get(CONFIG_ID).orElse(null); - int configColor = entityData.get(CONFIG_COLOR); if (configColor < 0 || configOwner == null) return null; var storage = GolemConfigStorage.get(level()); if (dummy == null) { @@ -572,9 +913,8 @@ public int getPatrolStage() { } public void advancePatrolStage() { - var config = getConfigEntry(null); - if (config == null) return; - var list = config.pathConfig.getList(); + var list = PathConfig.getPath(this); + if (list == null) return; int stage = getPatrolStage(); stage++; if (stage >= list.size()) { @@ -584,9 +924,8 @@ public void advancePatrolStage() { } public List getPatrolList() { - var config = getConfigEntry(null); - if (config == null) return List.of(); - var list = config.pathConfig.getList(); + var list = PathConfig.getPath(this); + if (list == null) return List.of(); int stage = getPatrolStage(); if (stage > 0 && stage < list.size()) { var first = list.subList(stage, list.size()); @@ -609,6 +948,7 @@ public List getPatrolList() { protected void defineSynchedData() { super.defineSynchedData(); GOLEM_DATA.register(this.entityData); + entityData.define(IS_IN_RANGE_ATTACK, false); } public void startPersistentAngerTimer() { @@ -634,6 +974,7 @@ public UUID getPersistentAngerTarget() { // ------ tamable + @Nullable public Team getTeam() { LivingEntity owner = this.getOwner(); if (owner != null) { @@ -643,14 +984,23 @@ public Team getTeam() { } public boolean canModify(Player player) { + return canModify(player, true); + } + + public boolean canWandModify(Player player) { + boolean bypass = MGConfig.COMMON.wandBypassConfig.get() || ConfigCard.filterMatch(player, this); + return canModify(player, !bypass); + } + + public boolean canModify(Player player, boolean checkLock) { var entry = getConfigEntry(null); - if (entry != null && entry.locked) + if (checkLock && entry != null && entry.locked) return false; LivingEntity owner = this.getOwner(); if (player == owner) { return true; } - if (player.getAbilities().instabuild || getOwnerUUID() == null && !predicateSecondaryTarget(player)) + if (player.getAbilities().instabuild || getOwnerUUID() == null && !predicateTarget(player)) return true; if (MGConfig.COMMON.ownerPickupOnly.get()) { return false; @@ -667,14 +1017,11 @@ public boolean isAlliedTo(Entity other) { if (owner != null) { return owner.isAlliedTo(other) || other.isAlliedTo(owner); } - return super.isAlliedTo(other); - } - - protected void doPush(Entity entity) { - if (entity instanceof Enemy && !(entity instanceof Creeper)) { - this.setTarget((LivingEntity) entity); + var opt = HostileGolemRegistry.tryGetFaction(this); + if (opt.isPresent() && opt.get().isAlliedTo(this, other)) { + return true; } - super.doPush(entity); + return super.isAlliedTo(other); } @Override @@ -685,43 +1032,26 @@ public boolean doHurtTarget(Entity target) { return super.doHurtTarget(target); } + public int aiHurtTarget(Entity target) { + boolean ans = doHurtTarget(target); + return ans ? -1 : 0; + } + protected void registerGoals() { + meleeGoal = new GolemMeleeGoal(this); this.goalSelector.addGoal(0, new GolemFloatGoal(this)); this.goalSelector.addGoal(1, new TeleportToOwnerGoal(this)); - this.goalSelector.addGoal(3, new FollowOwnerGoal(this)); + this.goalSelector.addGoal(4, new FollowOwnerGoal(this)); this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(8, new GolemRandomStrollGoal(this)); this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Mob.class, 5, false, false, this::predicatePriorityTarget)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 5, false, false, this::predicateSecondaryTarget)); - this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); - } - - protected boolean predicatePriorityTarget(LivingEntity e) { - if (e instanceof Mob mob) { - for (var target : List.of( - Optional.ofNullable(mob.getLastHurtMob()), - Optional.ofNullable(mob.getTarget()), - Optional.ofNullable(mob.getLastHurtByMob()) - )) { - if (target.isPresent()) { - Player owner = getOwner(); - if (target.get() == owner) return true; - if (target.get().isAlliedTo(this)) return true; - } - } - } - return false; + this.targetSelector.addGoal(3, targeter = new Golem3DTargetGoal(this, 5)); + this.targetSelector.addGoal(6, new ResetUniversalAngerTargetGoal<>(this, false)); } - protected boolean predicateSecondaryTarget(LivingEntity e) { - var config = getConfigEntry(null); - if (config == null) { - return DefaultFilterCard.defaultPredicate(e); - } else { - return config.targetFilter.aggressiveToward(e); - } + public boolean predicateTarget(LivingEntity e) { + return TargetManager.predicateTarget(this, e) != null; } public boolean isInSittingPose() { @@ -733,6 +1063,8 @@ public LivingEntity getFollowTarget() { if (getMode() == GolemModes.SQUAD) { return getCaptain(); } + var leader = getLeader(); + if (leader != null) return leader; return getOwner(); } @@ -754,9 +1086,8 @@ public LivingEntity getCaptain() { public Vec3 getTargetPos() { if (getMode() == GolemModes.ROUTE) { - var config = getConfigEntry(null); - if (config != null) { - var list = config.pathConfig.getList(); + var list = PathConfig.getPath(this); + if (list != null) { int target = getPatrolStage(); if (!list.isEmpty()) { return list.get(Math.min(target, list.size() - 1)) @@ -784,16 +1115,6 @@ public boolean isInvulnerable() { return hasFlag(GolemFlags.IMMUNITY); } - @Override - public void die(DamageSource source) { - ModularGolems.LOGGER.info("Golem {} died, message: '{}'", this, source.getLocalizedDeathMessage(this).getString()); - Player owner = getOwner(); - if (owner != null && !level().isClientSide) { - owner.sendSystemMessage(source.getLocalizedDeathMessage(this)); - } - super.die(source); - } - public double getPerceivedTargetDistanceSquareForMeleeAttack(LivingEntity target) { return GolemMeleeGoal.calculateDistSqr(this, target); } @@ -809,6 +1130,7 @@ public void resetTarget(@Nullable LivingEntity le) { } if (le != null) { setLastHurtByMob(le); + forcedTarget = le; } } @@ -816,4 +1138,217 @@ public ItemWrapper getWrapperOfHand(EquipmentSlot slot) { return ItemWrapper.simple(() -> this.getItemBySlot(slot), e -> super.setItemSlot(slot, e)); } + @Nullable + @Override + public Entity changeDimension(ServerLevel level, ITeleporter teleporter) { + if (!MGConfig.COMMON.allowDimensionChange.get()) { + return null; + } + return super.changeDimension(level, teleporter); + } + + private static final EntityDataAccessor IS_IN_RANGE_ATTACK = SynchedEntityData.defineId(AbstractGolemEntity.class, EntityDataSerializers.BOOLEAN); + + public boolean isInRangedMode() { + return getMode() == GolemModes.STAND || getEntityData().get(IS_IN_RANGE_ATTACK); + } + + public void setInRangeAttack(boolean flag) { + getEntityData().set(IS_IN_RANGE_ATTACK, flag); + } + + public boolean canSweep() { + return false; + } + + @Override + public boolean canBeAffected(MobEffectInstance ins) { + if (effectImmunity.contains(ins.getEffect())) + return false; + for (var ent : modifiers.entrySet()) { + if (ent.getKey().isImmuneTo(this, ins, ent.getValue())) { + return false; + } + } + return super.canBeAffected(ins); + } + + @Override + protected boolean isEffectImmune() { + return hasFlag(GolemFlags.EFFECT_IMMUNE); + } + + @Override + public void makeStuckInBlock(BlockState state, Vec3 vec) { + if (hasFlag(GolemFlags.FREE_MOVE)) return; + super.makeStuckInBlock(state, vec); + } + + @Override + public void onRemove(RemovalReason reason) { + if (reason.shouldDestroy()) + untrackRemoved(null); + } + + @Override + public boolean specialDeath(DamageSource source) { + if (untrackRemoved(source)) { + dead = true; + discard(); + return true; + } + return false; + } + + @Override + protected void tickDeath() { + if (getGuardedDataImpl() > 0) return; + if (untrackRemoved(null)) { + discard(); + } + super.tickDeath(); + } + + private boolean untrackRemoved(@Nullable DamageSource source) { + if (level().isClientSide()) return false; + var tracker = getTracker(); + if (tracker == null || tracker.isUntracked(this)) return false; + Player owner = getOwner(); + Entity cause = null; + boolean sendMessages = MGConfig.COMMON.sendForceRemovalMessage.get(); + if (source != null) { + ModularGolems.LOGGER.info("Golem {} died, message: '{}'", this, source.getLocalizedDeathMessage(this).getString()); + if (owner != null && sendMessages) { + owner.sendSystemMessage(source.getLocalizedDeathMessage(this)); + } + cause = source.getEntity(); + } else { + ModularGolems.LOGGER.info("Golem {} is forcefully removed ", this); + if (owner != null && sendMessages) { + owner.sendSystemMessage(Component.literal("Golem " + this + " is forcefully removed")); + } + if (getLastHurtByMobTimestamp() == tickCount) { + cause = getLastHurtByMob(); + } + } + if (getGuardedDataImpl() <= 0 && hasFlag(GolemFlags.RECYCLE)) { + tracker.untrack(this, GolemTracker.Status.DEATH_RECYCLE, cause); + returnToInventory(); + level().broadcastEntityEvent(this, EntityEvent.POOF); + return true; + } else { + tracker.untrack(this, GolemTracker.Status.DEATH, cause); + return false; + } + } + + public void speedUpUseItem(int tick) { + if (useItemRemaining > 0) { + useItemRemaining -= tick; + } + } + + @Override + public void setPosRaw(double x, double y, double z) { + trackPos(x, y, z); + super.setPosRaw(x, y, z); + } + + public void trackPos(double x, double y, double z) { + if (level().isClientSide() || !isAddedToWorld()) return; + var tracker = getTracker(); + if (tracker != null) + tracker.trackPos(getUUID(), x, y, z); + } + + public void returnToInventory() { + var leader = getLeader(); + unRide(); + ItemStack stack = GolemHolder.setEntity(getThis()); + if (leader != null && leader.isAlive()) { + if (MinecraftForge.EVENT_BUS.post(new GolemToOwnerEvent(leader, stack))) { + return; + } + } + Player player = getOwner(); + if (player != null && player.isAlive()) { + if (MinecraftForge.EVENT_BUS.post(new GolemToOwnerEvent(player, stack))) { + return; + } + if (player instanceof ServerPlayer sp) + GolemTransportHandler.addGolemToPlayer(sp, stack, this); + } else { + spawnAtLocation(stack); + } + } + + protected List aggregateInventories() { + var ans = new ArrayList(); + ans.add(new EntityHandsInvWrapper(this)); + ans.add(new EntityArmorInvWrapper(this)); + MinecraftForge.EVENT_BUS.post(new GolemCollectInventoryEvent(this, ans)); + return ans; + } + + @Override + public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { + if (capability == ForgeCapabilities.ITEM_HANDLER) { + return LazyOptional.of(() -> new CombinedInvWrapper(aggregateInventories().toArray(new IItemHandlerModifiable[0]))).cast(); + } + return super.getCapability(capability, facing); + } + + public boolean hasRangeAttack() { + return false; + } + + @Override + public void onHeal(float heal) { + for (var entry : getModifiers().entrySet()) { + entry.getKey().onHealPost(heal, this, entry.getValue()); + } + } + + @Override + public void heal(float heal) { + for (var entry : getModifiers().entrySet()) { + heal = entry.getKey().onHealPre(heal, this, entry.getValue()); + } + super.heal(heal); + } + + public void addItemsToList(List list) { + for (var e : EquipmentSlot.values()) { + var item = getItemBySlot(e); + if (!item.isEmpty()) + list.add(item); + } + } + + @Override + public void lookAt(Entity e, float x, float y) { + if (!getMode().isMovable()) + getLookControl().setLookAt(e, x, y); + else super.lookAt(e, x, y); + } + + public void saveToItem(CompoundTag tag) { + super.save(tag); + tag.remove("AngryAt"); + } + + @Override + protected float getSoundVolume() { + return super.getSoundVolume() * (isHostile() ? + MGConfig.COMMON.hostileGolemSoundVolumeFactor.get().floatValue() : + MGConfig.COMMON.golemSoundVolumeFactor.get().floatValue() + ); + } + + @Override + protected float dynamicReductionRate() { + if (!hasFlag(GolemFlags.DYNAMIC_REDUCTION)) return 0; + return (float) getAttributeValue(GolemTypes.DYNAMIC_REDUCTION.get()) * 20; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemRenderer.java index e3f24bec5..5a4f41109 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/AbstractGolemRenderer.java @@ -4,9 +4,13 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import dev.xkmc.l2library.util.Proxy; import dev.xkmc.l2serial.util.Wrappers; +import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.content.client.override.ModelOverride; import dev.xkmc.modulargolems.content.client.override.ModelOverrides; import dev.xkmc.modulargolems.content.config.GolemMaterial; import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.item.golem.GolemFacade; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -16,6 +20,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.ModList; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -30,12 +35,12 @@ public abstract class AbstractGolemRenderer, private static final ResourceLocation GOLEM_LOCATION = new ResourceLocation("textures/entity/iron_golem/iron_golem.png"); - private final ThreadLocal> handle = new ThreadLocal<>(); private final Supplier list; public AbstractGolemRenderer(EntityRendererProvider.Context ctx, M model, float f, Supplier list) { super(ctx, model, f); this.list = list; + addLayer(new GolemDefaultLayer<>(this)); LIST.forEach(e -> this.addLayer(Wrappers.cast(e.apply(this)))); } @@ -55,52 +60,55 @@ protected boolean delegated(T entity) { @Override public void render(T entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { - this.handle.set(new RenderHandle<>(entity, f1, f2, stack, source, i)); + entity.validateData(); + if (model instanceof IHeadedModel headed) headed.getHead().visible = true; super.render(entity, f1, f2, stack, source, i); - this.handle.remove(); } @Nullable @Override protected RenderType getRenderType(T entity, boolean b1, boolean b2, boolean b3) { - if (delegated(entity)) { + if (delegated(entity)) return super.getRenderType(entity, b1, b2, b3); - } - if (this.handle.get() == null) return null; - boolean flag = this.isBodyVisible(entity); - boolean flag1 = !flag && !entity.isInvisibleTo(Proxy.getClientPlayer()); - PoseStack pose = handle.get().stack(); - pose.pushPose(); - for (P p : list.get()) { - renderPart(p, entity, b1, b2, b3, flag1); - } - pose.popPose(); return null; } - private void renderPart(P type, T entity, boolean b1, boolean b2, boolean b3, boolean flag1) { - RenderType rendertype = this.getRenderTypeInternal(type, entity, b1, b2, b3); - RenderHandle hand = handle.get(); - if (rendertype != null) { - VertexConsumer vertexconsumer = hand.source().getBuffer(rendertype); - int i = getOverlayCoords(entity, this.getWhiteOverlayProgress(entity, hand.f2())); - this.model.renderToBufferInternal(type, hand.stack(), vertexconsumer, hand.i(), i, 1.0F, 1.0F, 1.0F, flag1 ? 0.15F : 1.0F); - } + @Override + protected void setupRotations(T e, PoseStack p_115318_, float p_115319_, float p_115320_, float p_115321_) { + e.validateData(); + super.setupRotations(e, p_115318_, p_115319_, p_115320_, p_115321_); } - @Nullable - private RenderType getRenderTypeInternal(P type, T entity, boolean b1, boolean b2, boolean b3) { + protected void renderAllParts(PoseStack pose, MultiBufferSource buffer, int light, T entity, float pTick) { + if (delegated(entity)) return; + var player = Proxy.getClientPlayer(); + boolean visible = isBodyVisible(entity); + boolean ghost = !visible && player != null && !entity.isInvisibleTo(player); + boolean glowing = Minecraft.getInstance().shouldEntityAppearGlowing(entity); + pose.pushPose(); + ResourceLocation facade = null; + if (ModList.get().isLoaded("curios")) { + var opt = CurioCompatRegistry.getItem(entity, "golem_skin"); + if (opt.isPresent() && opt.get().getItem() instanceof GolemFacade) + facade = GolemFacade.getMaterial(opt.get()); + } var materials = entity.getMaterials(); - int index = type.ordinal(); - ResourceLocation rl = materials.size() > index ? materials.get(index).id() : GolemMaterial.EMPTY; - ResourceLocation resourcelocation = model.getTextureLocationInternal(ModelOverrides.getOverride(rl).getTexture(entity, rl)); - if (b2) { - return RenderType.itemEntityTranslucentCull(resourcelocation); - } else if (b1) { - return this.model.renderType(resourcelocation); - } else { - return b3 ? RenderType.outline(resourcelocation) : null; + for (P part : list.get()) { + ResourceLocation rl = facade; + if (rl == null) { + int index = part.ordinal(); + rl = materials.size() > index ? materials.get(index).id() : GolemMaterial.EMPTY; + } + ModelOverride override = ModelOverrides.getOverride(rl); + override.renderAll(this, entity, part, pose, buffer, rl, light, pTick, visible, ghost, glowing); } + pose.popPose(); + } + + public void renderPartModel(T entity, P part, PoseStack pose, VertexConsumer vc, int light, float pTick, boolean ghost) { + int overlay = getOverlayCoords(entity, this.getWhiteOverlayProgress(entity, pTick)); + this.model.renderToBufferInternal(part, pose, vc, light, overlay, 1.0F, 1.0F, 1.0F, ghost ? 0.15F : 1.0F); + } } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/FastGroundPathNavigation.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/FastGroundPathNavigation.java new file mode 100644 index 000000000..e634b0767 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/FastGroundPathNavigation.java @@ -0,0 +1,64 @@ +package dev.xkmc.modulargolems.content.entity.common; + +import net.minecraft.core.Vec3i; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class FastGroundPathNavigation extends GroundPathNavigation { + + public FastGroundPathNavigation(Mob p_26448_, Level p_26449_) { + super(p_26448_, p_26449_); + } + + protected void followThePath() { + Vec3 vec3 = this.getTempMobPos(); + this.maxDistanceToWaypoint = this.mob.getBbWidth() > 0.75F ? this.mob.getBbWidth() / 2.0F : 0.75F - this.mob.getBbWidth() / 2.0F; + Vec3i vec3i = this.path.getNextNodePos(); + double d0 = Math.abs(this.mob.getX() - ((double) vec3i.getX() + (this.mob.getBbWidth() + 1) / 2D)); //Forge: Fix MC-94054 + double d1 = Math.abs(this.mob.getY() - (double) vec3i.getY()); + double d2 = Math.abs(this.mob.getZ() - ((double) vec3i.getZ() + (this.mob.getBbWidth() + 1) / 2D)); //Forge: Fix MC-94054 + boolean flag = d0 <= (double) this.maxDistanceToWaypoint && d2 <= (double) this.maxDistanceToWaypoint && d1 < 1.0D; //Forge: Fix MC-94054 + if (flag || this.canCutCorner(this.path.getNextNode().type) && this.shouldTargetNextNodeInDirection(vec3)) { + this.path.advance(); + } + + this.doStuckDetection(vec3); + } + + private boolean shouldTargetNextNodeInDirection(Vec3 current) { + double s0 = mob.getAttributeValue(Attributes.MOVEMENT_SPEED); + double s1 = Math.max(2, s0 * 2 + 1); + double s2 = s0 * 2 + 0.5; + if (this.path.getNextNodeIndex() + 1 >= this.path.getNodeCount()) { + return false; + } else { + Vec3 next = Vec3.atBottomCenterOf(this.path.getNextNodePos()); + if (!current.closerThan(next, s1)) { + return false; + } else if (this.canMoveDirectly(current, this.path.getNextEntityPos(this.mob))) { + return true; + } else { + Vec3 far = Vec3.atBottomCenterOf(this.path.getNodePos(this.path.getNextNodeIndex() + 1)); + Vec3 step1 = next.subtract(current); + Vec3 step2 = far.subtract(current); + double dsq1 = step1.lengthSqr(); + double dsq2 = step2.lengthSqr(); + boolean near = dsq2 < dsq1; + if (dsq1 < s2 * s2) return true; + boolean close = dsq1 < 0.5; + if (!near && !close) { + return false; + } else { + Vec3 dir1 = step1.normalize(); + Vec3 dir2 = step2.normalize(); + return dir2.dot(dir1) < 0.0D; + } + } + } + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemBannerLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemBannerLayer.java index afeeda4e1..d9591fc6f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemBannerLayer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemBannerLayer.java @@ -1,9 +1,11 @@ package dev.xkmc.modulargolems.content.entity.common; import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.hostile.HostileGolemRegistry; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.ItemInHandRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -38,6 +40,9 @@ public GolemBannerLayer(RenderLayerParent parent, float sx, float sy, floa } public void render(PoseStack pose, MultiBufferSource buffer, int light, T entity, float f1, float f2, float f3, float f4, float f5, float f6) { + var mc = Minecraft.getInstance(); + var cam = mc.getCameraEntity(); + if (cam != null && entity.isPassengerOfSameVehicle(cam)) return; ItemStack stack = getBanner(entity); if (!renders(stack)) return; pose.pushPose(); @@ -54,6 +59,12 @@ public ItemStack getBanner(T entity) { if (entity instanceof HumanoidGolemEntity && renders(stack)) { return ItemStack.EMPTY; } + var selfFact = HostileGolemRegistry.tryGetFaction(entity); + if (selfFact.isPresent()) { + if (entity.hasPassenger(e -> e instanceof AbstractGolemEntity)) + return ItemStack.EMPTY; + return selfFact.get().getBanner(entity, entity.getConfigColor()); + } if (entity instanceof MetalGolemEntity && !renders(stack)) { stack = entity.getItemBySlot(EquipmentSlot.FEET); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemDefaultLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemDefaultLayer.java new file mode 100644 index 000000000..ebc381c4e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemDefaultLayer.java @@ -0,0 +1,30 @@ +package dev.xkmc.modulargolems.content.entity.common; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.core.IGolemPart; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.RenderLayer; + +public class GolemDefaultLayer< + T extends AbstractGolemEntity, + P extends IGolemPart

, + M extends EntityModel & IGolemModel + > extends RenderLayer { + + private final AbstractGolemRenderer parent; + + public GolemDefaultLayer(AbstractGolemRenderer parent) { + super(parent); + this.parent = parent; + } + + @Override + public void render( + PoseStack pose, MultiBufferSource buffer, int light, T e, + float legAngle, float legSwing, float bob, float pTick, float yRot, float xRot + ) { + parent.renderAllParts(pose, buffer, light, e, pTick); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemFlags.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemFlags.java index 401a37bd6..3fae20e6f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemFlags.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GolemFlags.java @@ -1,6 +1,9 @@ package dev.xkmc.modulargolems.content.entity.common; public enum GolemFlags { + //不灭,火免,冰免,雷免,透视,回收 IMMUNITY, FIRE_IMMUNE, FREEZE_IMMUNE, THUNDER_IMMUNE, SEE_THROUGH, RECYCLE, - FLOAT, SWIM, PICKUP, MENDING, NO_DESTROY, PASSIVE, EARTH_QUAKE, BOTANIA + //漂浮,游泳,拾取,拾取附属:经验修补,拾取附属:取消销毁,被动,地震升级,植物魔法, + FLOAT, SWIM, PICKUP, MENDING, NO_DESTROY, PASSIVE, EARTH_QUAKE, BOTANIA, FREE_MOVE, + EFFECT_IMMUNE, REVIVE, REFORGE, DYNAMIC_REDUCTION } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/GuardedEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GuardedEntity.java new file mode 100644 index 000000000..f3e20dfa0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/GuardedEntity.java @@ -0,0 +1,372 @@ +package dev.xkmc.modulargolems.content.entity.common; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.events.event.GolemDeathEvent; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.Minecraft; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.animal.AbstractGolem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.MustBeInvokedByOverriders; + +@SerialClass +public class GuardedEntity extends AbstractGolem { + + private long antiHealDisableTimestamp; + + protected GuardedEntity(EntityType type, Level level) { + super(type, level); + } + + protected boolean isProtected() { + return isInvulnerable(); + } + + protected boolean isEffectImmune() { + return false; + } + + protected void postHurt(DamageSource source) { + } + + public boolean isInvulnerableToExtra(DamageSource damage) { + return isInvulnerable() && !damage.is(DamageTypeTags.BYPASSES_INVULNERABILITY); + } + + @Override + protected final void actuallyHurt(DamageSource source, float amount) { + if (isInvulnerableTo(source)) return; + if (isInvulnerableToExtra(source)) return; + amount = ForgeHooks.onLivingHurt(this, source, amount); + if (amount <= 0) return; + amount = getDamageAfterArmorAbsorb(source, amount); + amount = getDamageAfterMagicAbsorb(source, amount); + amount = ForgeHooks.onLivingDamage(this, source, amount); + hurtFinal(source, amount); + } + + protected final void hurtFinal(DamageSource source, float amount) { + if (!Float.isFinite(amount)) return; + float abs = getAbsorptionAmount(); + if (!Float.isFinite(abs)) { + setAbsorptionAmount(0); + return; + } + float actual = Math.max(amount - Math.max(0, abs), 0); + float absorb = amount - actual; + setAbsorptionAmount(Math.max(0, getAbsorptionAmount() - absorb)); + if (absorb > 0.0F && absorb < 3.4028235E37F) { + Entity entity = source.getEntity(); + if (entity instanceof ServerPlayer serverplayer) { + serverplayer.awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(absorb * 10.0F)); + } + } + if (actual != 0.0F) { + getCombatTracker().recordDamage(source, actual); + hurtFinalImpl(source, actual); + setAbsorptionAmount(Math.max(0, getAbsorptionAmount() - actual)); + gameEvent(GameEvent.ENTITY_DAMAGE); + } + } + + protected final void hurtFinalImpl(DamageSource source, float amount) { + if (isInvulnerableToExtra(source)) return; + if (source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { + antiHealDisableTimestamp = level().getGameTime() + 100; + if (isInvulnerable()) + amount = Math.max(amount, Math.max(1, getMaxHealth() * 0.01f)); + } + takeDamage(source, amount); + postHurt(source); + } + + protected void takeDamage(DamageSource source, float amount) { + if (getGuardedDataImpl() < amount) { + if (MinecraftForge.EVENT_BUS.post(new GolemDeathEvent(this, source))) return; + } + setGuardedDataImpl(getGuardedDataImpl() - amount, false, false); + } + + public final void validateData() { + if (getGuardedDataImpl() > 0) { + if (deathTime > 0) deathTime = 0; + if (dead) dead = false; + } + } + + @Override + public final void setHealth(float amount) { + if (!Float.isFinite(amount)) return; + if (level().isClientSide()) { + setGuardedDataImpl(amount, false, false); + } + float health = getGuardedDataImpl(); + if (tickCount > 5 && amount <= health) return; + setGuardedDataImpl(amount, amount > health, false); + } + + public void heal(float original) { + if (level().isClientSide()) return; + var heal = ForgeEventFactory.onLivingHeal(this, original); + if (isEffectImmune() && level().getGameTime() > antiHealDisableTimestamp) { + heal = Math.max(original, heal); + if (heal <= 0) return; + } + float f = getGuardedDataImpl(); + float m = getMaxHealth(); + heal = Math.min(m - f, heal); + if (f > 0 && heal > 0) { + onHeal(heal); + setGuardedDataImpl(f + heal, true, false); + } + } + + public void onHeal(float heal) { + } + + @Override + public void die(DamageSource source) { + if (getGuardedDataImpl() > 0) return; + if (net.minecraftforge.common.ForgeHooks.onLivingDeath(this, source)) return; + if (specialDeath(source)) return; + if (isRemoved() || dead) return; + Entity entity = source.getEntity(); + LivingEntity livingentity = this.getKillCredit(); + if (this.deathScore >= 0 && livingentity != null) { + livingentity.awardKillScore(this, this.deathScore, source); + } + if (this.isSleeping()) { + this.stopSleeping(); + } + + this.dead = true; + this.getCombatTracker().recheckStatus(); + Level level = this.level(); + if (level instanceof ServerLevel) { + ServerLevel serverlevel = (ServerLevel) level; + if (entity == null || entity.killedEntity(serverlevel, this)) { + this.gameEvent(GameEvent.ENTITY_DIE); + this.dropAllDeathLoot(source); + this.createWitherRose(livingentity); + } + + this.level().broadcastEntityEvent(this, (byte) 3); + } + this.setPose(Pose.DYING); + } + + public boolean specialDeath(DamageSource source) { + return false; + } + + @MustBeInvokedByOverriders + @Override + public void tick() { + double maxSpeed = 1.5; + if (isProtected() && getDeltaMovement().length() > maxSpeed) { + setDeltaMovement(getDeltaMovement().normalize().scale(maxSpeed)); + } + validateData(); + super.tick(); + if (guardedData != null) + guardedData = guardedData.update(this); + if (tickCount % 20 == 13 && isAddedToWorld() && !level().isClientSide()) { + validateGuardedData(); + GuardedDataToClient.send(this); + } + } + + @Override + public void kill() { + if (dynamicReductionRate() > 0 && !level().isClientSide()) { + guardedData = new GuardedData(0, 0); + super.setHealth(0); + die(damageSources().genericKill()); + GuardedDataToClient.send(this); + return; + } + super.kill(); + } + + public void onRemove(RemovalReason reason) { + } + + @Override + protected void dropAllDeathLoot(DamageSource source) { + if (getGuardedDataImpl() > 0) return; + super.dropAllDeathLoot(source); + } + + @Override + public void setPose(Pose pose) { + if (getGuardedDataImpl() > 0 && pose == Pose.DYING) + return; + super.setPose(pose); + } + + @Override + public void handleEntityEvent(byte event) { + if (event == EntityEvent.DEATH && getGuardedDataImpl() > 0) + return; + super.handleEntityEvent(event); + } + + @Override + protected void tickDeath() { + if (getGuardedDataImpl() > 0) return; + super.tickDeath(); + } + + @SerialClass.SerialField + private GuardedData guardedData; + private boolean loopingSetHealth = false; + + public void setGuardedDataImpl(float amount) { + setGuardedDataImpl(amount, true, false); + } + + public void setGuardedDataImpl(float amount, boolean force, boolean repair) { + boolean update = guardedData == null || amount != guardedData.amount(); + if (guardedData == null) guardedData = GuardedData.start(this, amount); + else guardedData = guardedData.set(this, amount, force, repair); + if (!loopingSetHealth) { + loopingSetHealth = true; + super.setHealth(amount); + loopingSetHealth = false; + if (update && isAddedToWorld() && !level().isClientSide()) + GuardedDataToClient.send(this); + } + } + + public void applyData(GuardedData data) { + guardedData = data; + loopingSetHealth = true; + super.setHealth(data.amount()); + loopingSetHealth = false; + } + + public float getGuardedDataImpl() { + if (guardedData != null) + return Math.max(super.getHealth(), guardedData.amount()); + if (!level().isClientSide()) + validateGuardedData(); + return super.getHealth(); + } + + @Override + public float getHealth() { + return getGuardedDataImpl(); + } + + public float getDynamicBaseline() { + return dynamicReductionRate() == 0 || guardedData == null ? 0 : guardedData.baseline(); + } + + @Override + protected boolean isImmobile() { + return getGuardedDataImpl() <= 0; + } + + public void validateGuardedData() { + if (loopingSetHealth) return; + if (guardedData == null) { + guardedData = GuardedData.start(this, super.getHealth()); + } else { + if (super.getHealth() < guardedData.amount()) { + loopingSetHealth = true; + super.setHealth(guardedData.amount()); + loopingSetHealth = false; + } else guardedData = guardedData.set(this, super.getHealth(), true, false); + } + } + + protected float dynamicReductionRate() { + return 0; + } + + protected float dynamicReductionCap() { + return 0.2f; + } + + public record GuardedData(float amount, float baseline) { + + public static GuardedData start(GuardedEntity e, float amount) { + var rate = e.dynamicReductionRate(); + float base = rate == 0 ? 0 : amount - e.getMaxHealth() * e.dynamicReductionCap(); + return new GuardedData(amount, base); + } + + public GuardedData set(GuardedEntity e, float amount, boolean force, boolean boostBase) { + var rate = e.dynamicReductionRate(); + float ans = rate > 0 && !force ? Math.max(amount, baseline) : amount; + float base = rate > 0 && boostBase && ans > amount() ? + Math.max(baseline + ans - amount(), ans - e.getMaxHealth() * e.dynamicReductionCap()) : + Math.min(baseline, ans); + return new GuardedData(ans, base); + } + + public GuardedData update(GuardedEntity e) { + var rate = e.dynamicReductionRate(); + if (rate == 0) return this; + var max = e.getMaxHealth(); + var allowed = max * e.dynamicReductionCap(); + var minBase = Math.max(0, amount - allowed); + if (baseline <= minBase) { + if (e.isAggressive()) + return this; + var maxBase = Math.min(minBase, baseline + max / 1200f); + return new GuardedData(amount, maxBase); + } + return new GuardedData(amount, Math.max(minBase, baseline - allowed / rate)); + } + } + + @SerialClass + public static class GuardedDataToClient extends SerialPacketBase { + + public static void send(GuardedEntity e) { + var ans = new GuardedDataToClient(); + ans.id = e.getId(); + ans.data = e.guardedData; + ModularGolems.HANDLER.toTrackingPlayers(ans, e); + } + + @SerialClass.SerialField + public int id; + @SerialClass.SerialField + public GuardedData data; + + public GuardedDataToClient() { + + } + + @Override + public void handle(NetworkEvent.Context context) { + GuardedDataHandler.handle(this); + } + } + + public static class GuardedDataHandler { + + public static void handle(GuardedDataToClient packet) { + var level = Minecraft.getInstance().level; + if (level == null) return; + var e = level.getEntity(packet.id); + if (!(e instanceof GuardedEntity g)) return; + g.applyData(packet.data); + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/ModelProvider.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/ModelProvider.java deleted file mode 100644 index a80f85f82..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/ModelProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.common; - -public class ModelProvider { - - -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/ReforgeUpdatePacket.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/ReforgeUpdatePacket.java new file mode 100644 index 000000000..c03fefb88 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/ReforgeUpdatePacket.java @@ -0,0 +1,32 @@ +package dev.xkmc.modulargolems.content.entity.common; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.events.ClientPacketHandler; +import net.minecraftforge.network.NetworkEvent; + +@SerialClass +public class ReforgeUpdatePacket extends SerialPacketBase { + + public static ReforgeUpdatePacket of(AbstractGolemEntity golem, int reforge) { + var ans = new ReforgeUpdatePacket(); + ans.golem = golem.getId(); + ans.reforge = reforge; + return ans; + } + + @SerialClass.SerialField + public int golem; + @SerialClass.SerialField + public int reforge; + + public ReforgeUpdatePacket() { + + } + + @Override + public void handle(NetworkEvent.Context context) { + ClientPacketHandler.handleReforge(golem, reforge); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/RenderHandle.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/RenderHandle.java deleted file mode 100644 index 06b7a2c4e..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/RenderHandle.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.common; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.MultiBufferSource; - -public record RenderHandle(T entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/ResizedLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/ResizedLayer.java deleted file mode 100644 index 61f64fede..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/ResizedLayer.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.common; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.RenderLayerParent; -import net.minecraft.client.renderer.entity.layers.RenderLayer; - -public class ResizedLayer, M extends EntityModel> extends RenderLayer { - - private final RenderLayer actual; - - public ResizedLayer(RenderLayerParent pRenderer, RenderLayer actual) { - super(pRenderer); - this.actual = actual; - } - - @Override - public void render(PoseStack pose, MultiBufferSource source, int light, T entity, float f0, float f1, float f2, float f3, float f4, float f5) { - pose.pushPose(); - float r = entity.getScale(); - pose.translate(0, (1 - r) * 1.501, 0); - pose.scale(r, r, r); - actual.render(pose, source, light, entity, f0, f1, f2, f3, f4, f5); - pose.popPose(); - } -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/common/SweepGolemEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/SweepGolemEntity.java index 2903eb805..2767ce76f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/common/SweepGolemEntity.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/SweepGolemEntity.java @@ -1,29 +1,86 @@ package dev.xkmc.modulargolems.content.entity.common; import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.mob_weapon_api.api.ai.ISmartUser; +import dev.xkmc.mob_weapon_api.api.ai.IWeaponHolder; +import dev.xkmc.mob_weapon_api.api.ai.ItemWrapper; +import dev.xkmc.mob_weapon_api.util.ShootUtils; import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.entity.humanoid.SlotWrapper; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemUser; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponManager; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; +import dev.xkmc.modulargolems.events.event.GolemCollectInventoryEvent; import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.monster.Creeper; -import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.monster.CrossbowAttackMob; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.entity.projectile.ProjectileUtil; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ProjectileWeaponItem; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.EntityArmorInvWrapper; +import net.minecraftforge.items.wrapper.EntityHandsInvWrapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; @SerialClass -public abstract class SweepGolemEntity, P extends IGolemPart

> extends AbstractGolemEntity { +public abstract class SweepGolemEntity, P extends IGolemPart

> extends AbstractGolemEntity + implements RangedAttackMob, IWeaponHolder, CrossbowAttackMob { + + private static final EntityDataAccessor IS_CHARGING_CROSSBOW = SynchedEntityData.defineId(SweepGolemEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor BACKUP_SLOT = SynchedEntityData.defineId(SweepGolemEntity.class, EntityDataSerializers.ITEM_STACK); + private static final EntityDataAccessor ARROW_SLOT = SynchedEntityData.defineId(SweepGolemEntity.class, EntityDataSerializers.ITEM_STACK); + + public final GolemWeaponManager weaponManager; + + private boolean doReassessGoal = false; + + @SerialClass.SerialField + private ItemStack backupHand = ItemStack.EMPTY; + @SerialClass.SerialField + private ItemStack arrowSlot = ItemStack.EMPTY; - protected SweepGolemEntity(EntityType type, Level level) { + protected SweepGolemEntity(GolemWeaponRegistry reg, EntityType type, Level level) { super(type, level); + weaponManager = new GolemWeaponManager<>(reg, getThis(), meleeGoal); + if (!this.level().isClientSide) { + weaponManager.reassessWeaponGoal(); + } + } + + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(IS_CHARGING_CROSSBOW, false); + this.entityData.define(BACKUP_SLOT, ItemStack.EMPTY); + this.entityData.define(ARROW_SLOT, ItemStack.EMPTY); } protected boolean performRangedDamage(Entity target, float damage, double kb) { boolean flag = performDamageTarget(target, damage, kb); double range = getAttributeValue(GolemTypes.GOLEM_SWEEP.get()); - if (range > 0) { + if (range > 0 && canSweep()) { var list = level().getEntities(target, getAttackBoundingBox(target, range), - e -> e instanceof LivingEntity le && e instanceof Enemy && (!(e instanceof Creeper)) && this.canAttack(le)); + e -> e instanceof LivingEntity le && predicateTarget(le) && this.canAttack(le)); for (Entity t : list) { flag |= performDamageTarget(t, damage, kb); } @@ -40,4 +97,189 @@ protected AABB getAttackBoundingBox(Entity target, double range) { */ protected abstract boolean performDamageTarget(Entity target, float damage, double kb); + @Override + public boolean canSweep() { + return getAttributeValue(GolemTypes.GOLEM_SWEEP.get()) > 0; + } + + public void setItemSlot(EquipmentSlot pSlot, ItemStack pStack) { + super.setItemSlot(pSlot, pStack); + if (!this.level().isClientSide) { + doReassessGoal = true; + } + } + + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + weaponManager.reassessWeaponGoal(); + } + + public boolean canFireProjectileWeapon(ProjectileWeaponItem pProjectileWeapon) { + return true; + } + + @Override + public InteractionHand getWeaponHand() { + return InteractionHand.MAIN_HAND; + } + + @Override + public void performRangedAttack(LivingEntity target, float power) { + weaponManager.performRangedAttack(target, power); + } + + @Override + public ISmartUser toUser() { + return new GolemUser(this, getTarget()); + } + + public void switchWeapon(ItemWrapper mainhand, ItemWrapper offhand) { + LivingEntity target = getTarget(); + ItemStack main = mainhand.getItem(); + ItemStack off = offhand.getItem(); + if (weaponManager.checkSwitch(target, mainhand, offhand)) { + mainhand.setItem(off); + offhand.setItem(main); + doReassessGoal = true; + inventoryTick = 10; + } + } + + @Override + public void aiStep() { + if (doReassessGoal || tickCount % 100 == 0) { + weaponManager.reassessWeaponGoal(); + doReassessGoal = false; + } + super.aiStep(); + if (level().isClientSide()) return; + if (inventoryTick > 0) return; + inventoryTick = 4; + switchWeapon( + getWrapperOfHand(EquipmentSlot.MAINHAND), + getAltWeaponHand() + ); + } + + public void triggerReassess() { + doReassessGoal = true; + } + + @Override + public boolean hasRangeAttack() { + return weaponManager.isRangedModeAvailable(getMainHandItem()) || + weaponManager.isRangedModeAvailable(getAltWeaponHand().getItem()); + } + + public ItemStack getProjectile(ItemStack pShootable) { + ItemStack ans; + if (pShootable.getItem() instanceof ProjectileWeaponItem) { + Predicate predicate = ((ProjectileWeaponItem) pShootable.getItem()).getSupportedHeldProjectiles(); + ItemStack stack = ProjectileWeaponItem.getHeldProjectile(this, predicate); + if (stack.isEmpty() && !arrowSlot.isEmpty() && predicate.test(arrowSlot)) { + stack = arrowSlot; + } + ans = ForgeHooks.getProjectile(this, pShootable, stack); + } else { + ans = ForgeHooks.getProjectile(this, pShootable, ItemStack.EMPTY); + } + if (isHostile()) ans = ans.copy(); + return ans; + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + if (!ItemStack.matches(entityData.get(BACKUP_SLOT), backupHand)) { + entityData.set(BACKUP_SLOT, backupHand.copy()); + } + if (!ItemStack.matches(entityData.get(ARROW_SLOT), arrowSlot)) { + entityData.set(ARROW_SLOT, arrowSlot.copy()); + } + } + + // weapon switch + + protected ItemWrapper getAltWeaponHand() { + return !backupHand.isEmpty() ? getBackupHand() : + getWrapperOfHand(EquipmentSlot.OFFHAND); + } + + public ItemWrapper getBackupHand() { + if (level().isClientSide()) + return ItemWrapper.simple(() -> entityData.get(BACKUP_SLOT), e -> entityData.set(BACKUP_SLOT, e)); + return ItemWrapper.simple(() -> this.backupHand, e -> this.backupHand = e); + } + + public ItemWrapper getArrowSlot() { + if (level().isClientSide()) + return ItemWrapper.simple(() -> entityData.get(ARROW_SLOT), e -> entityData.set(ARROW_SLOT, e)); + return ItemWrapper.simple(() -> this.arrowSlot, e -> this.arrowSlot = e); + } + + // bow and crossbow + + public boolean isChargingCrossbow() { + return this.entityData.get(IS_CHARGING_CROSSBOW); + } + + public void setChargingCrossbow(boolean pIsCharging) { + this.entityData.set(IS_CHARGING_CROSSBOW, pIsCharging); + } + + @Override + public void onCrossbowAttackPerformed() { + noActionTime = 0; + } + + @Override + public void shootCrossbowProjectile(LivingEntity target, ItemStack stack, Projectile e, float a) { + shootCrossbowProjectile(this, target, e, a, 3); + } + + public void shootCrossbowProjectile(LivingEntity user, LivingEntity target, Projectile e, float a, float v) { + ShootUtils.getShootVector(target, e.position(), v, 0.05f, 0).shoot(e, a); + user.playSound(SoundEvents.CROSSBOW_SHOOT, 1.0F, 1.0F / (user.getRandom().nextFloat() * 0.4F + 0.8F)); + } + + public void performCrossbowAttack(LivingEntity pUser, float pVelocity) { + InteractionHand interactionhand = ProjectileUtil.getWeaponHoldingHand(pUser, item -> item instanceof CrossbowItem); + ItemStack itemstack = pUser.getItemInHand(interactionhand); + if (pUser.isHolding(is -> is.getItem() instanceof CrossbowItem)) { + CrossbowItem.performShooting(pUser.level(), pUser, interactionhand, itemstack, pVelocity, 0); + } + onCrossbowAttackPerformed(); + } + + // extra drops + + @Override + protected void dropCustomDeathLoot(DamageSource source, int i, boolean b) { + super.dropCustomDeathLoot(source, i, b); + if (!arrowSlot.isEmpty() && arrowSlot.getEnchantmentLevel(Enchantments.VANISHING_CURSE) <= 0) + spawnAtLocation(arrowSlot); + arrowSlot = ItemStack.EMPTY; + if (!backupHand.isEmpty() && backupHand.getEnchantmentLevel(Enchantments.VANISHING_CURSE) <= 0) + spawnAtLocation(backupHand); + backupHand = ItemStack.EMPTY; + } + + @Override + protected List aggregateInventories() { + var ans = new ArrayList(); + ans.add(new EntityHandsInvWrapper(this)); + ans.add(new EntityArmorInvWrapper(this)); + ans.add(new SlotWrapper(() -> arrowSlot, e -> arrowSlot = e)); + ans.add(new SlotWrapper(() -> backupHand, e -> backupHand = e)); + MinecraftForge.EVENT_BUS.post(new GolemCollectInventoryEvent(this, ans)); + return ans; + } + + @Override + public void addItemsToList(List list) { + super.addItemsToList(list); + if (!backupHand.isEmpty()) list.add(backupHand); + if (!arrowSlot.isEmpty()) list.add(arrowSlot); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/sync/SyncedData.java b/src/main/java/dev/xkmc/modulargolems/content/entity/common/SyncedData.java similarity index 98% rename from src/main/java/dev/xkmc/modulargolems/content/entity/sync/SyncedData.java rename to src/main/java/dev/xkmc/modulargolems/content/entity/common/SyncedData.java index 04d36c265..310af7dc0 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/sync/SyncedData.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/common/SyncedData.java @@ -1,4 +1,4 @@ -package dev.xkmc.modulargolems.content.entity.sync; +package dev.xkmc.modulargolems.content.entity.common; import dev.xkmc.l2library.util.nbt.NBTObj; import net.minecraft.core.BlockPos; diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogArmorRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogArmorRenderer.java new file mode 100644 index 000000000..050f85d03 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogArmorRenderer.java @@ -0,0 +1,52 @@ +package dev.xkmc.modulargolems.content.entity.dog; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; +import dev.xkmc.modulargolems.content.item.equipments.DogGolemArmorItem; +import dev.xkmc.modulargolems.content.item.equipments.DogGolemArmorSpecialRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class DogArmorRenderer extends RenderLayer { + + public DogGolemModel model; + + public DogArmorRenderer(RenderLayerParent r, EntityRendererProvider.Context e) { + super(r); + model = new DogGolemModel(e.bakeLayer(GolemEquipmentModels.DOG_ARMOR)); + } + + @Override + public void render(@NotNull PoseStack pose, MultiBufferSource source, int i, @NotNull DogGolemEntity entity, float f1, float f2, float f3, float f4, float f5, float f6) { + ItemStack stack = entity.getItemBySlot(EquipmentSlot.CHEST); + if (stack.getItem() instanceof DogGolemArmorSpecialRenderer.ProviderItem pvd) { + var opt = pvd.getSpecialRenderer(); + if (opt.isPresent()) { + getParentModel().copyPropertiesTo(model); + model.copyFrom(getParentModel()); + opt.get().render(entity, stack, pose, source, i, f3, model); + return; + } + } + if (stack.getItem() instanceof DogGolemArmorItem item) { + getParentModel().copyPropertiesTo(model); + model.copyFrom(getParentModel()); + var buffer = source.getBuffer(RenderType.armorCutoutNoCull(item.getModelTexture(entity, false))); + model.root().render(pose, buffer, i, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + buffer = source.getBuffer(RenderType.armorCutoutNoCull(item.getModelTexture(entity, true))); + int col = item.getColor(stack); + float r = ((col >> 16) & 0xFF) / 255f; + float g = ((col >> 8) & 0xFF) / 255f; + float b = (col & 0xFF) / 255f; + model.root().render(pose, buffer, i, OverlayTexture.NO_OVERLAY, r, g, b, 1); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemEntity.java index d51405d81..1b343d97f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemEntity.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemEntity.java @@ -2,9 +2,12 @@ import dev.xkmc.l2serial.serialization.SerialClass; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.goals.GolemRiddenMeleeGoal; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.data.MGConfig; -import dev.xkmc.modulargolems.init.registrate.GolemModifiers; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -32,11 +35,14 @@ import net.minecraftforge.common.ForgeHooks; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; + @SerialClass public class DogGolemEntity extends AbstractGolemEntity { public float getJumpStrength() { float ans = (float) getAttributeValue(GolemTypes.GOLEM_JUMP.get()); + ans *= getScale(); MobEffectInstance ins = getEffect(MobEffects.JUMP); if (ins != null) { int lv = ins.getAmplifier() + 1; @@ -54,7 +60,7 @@ public float getTailAngle() { if (this.isAngry()) { return 1.5393804F; } else { - float percentage = 1 - this.getHealth() / this.getMaxHealth(); + float percentage = 1 - this.getGuardedDataImpl() / this.getMaxHealth(); return (0.55F - percentage * 0.16F) * (float) Math.PI; } } @@ -109,21 +115,40 @@ protected float getRiddenSpeed(Player rider) { MGConfig.COMMON.riddenSpeedFactor.get()); } + EarthquakeHelper.Instance jumpAttack; + int jumpAttackDelay = 0; + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + if (jumpAttackDelay > 0) jumpAttackDelay--; + if (jumpAttackDelay <= 0 && jumpAttack != null && onGround()) { + jumpAttack.modifier().performEarthQuake(this, jumpAttack.lv()); + jumpAttack = null; + } + } + protected void executeRidersJump(Vec3 action) { Vec3 vec3 = this.getDeltaMovement(); float jump = getJumpStrength(); - this.setDeltaMovement(vec3.x, jump, vec3.z); this.hasImpulse = true; - ForgeHooks.onLivingJump(this); - if (action.z > 0.0D) { - float x0 = Mth.sin(this.getYRot() * ((float) Math.PI / 180F)); - float z0 = Mth.cos(this.getYRot() * ((float) Math.PI / 180F)); - this.setDeltaMovement(this.getDeltaMovement().add(-0.4F * x0 * jump, 0.0D, 0.4F * z0 * jump)); + var ins = EarthquakeHelper.findMountInstance(this); + if (ins != null) { + ins.modifier().performJump(this, ins.lv()); + ins.addCD(); + ModularGolems.HANDLER.toServer(DogSkillToServer.of(ins)); + return; } + this.setDeltaMovement(vec3.x, jump, vec3.z); + ForgeHooks.onLivingJump(this); + if (action.z <= 0.0D) return; + float x0 = Mth.sin(this.getYRot() * ((float) Math.PI / 180F)); + float z0 = Mth.cos(this.getYRot() * ((float) Math.PI / 180F)); + this.setDeltaMovement(this.getDeltaMovement().add(-0.4F * x0 * jump, 0.0D, 0.4F * z0 * jump)); } public double getPassengersRidingOffset() { - return this.getBbHeight() * 1.4 - 0.35; + return this.getBbHeight() * 0.9 - 0.25; } protected void positionRider(Entity rider, Entity.MoveFunction setPos) { @@ -131,7 +156,7 @@ protected void positionRider(Entity rider, Entity.MoveFunction setPos) { int total = this.getPassengers().size(); if (index < 0) return; float width = getBbWidth(); - float offset = index == 0 ? index + 0.7f : index + (getControllingPassenger() instanceof Player ? 1.7f : 1.2f); + float offset = index == 0 ? 0.7f : index + (getControllingPassenger() instanceof Player ? 1.7f : 1.2f); float pos = width / 2 - width / total * offset; double dy = rider.getMyRidingOffset() + getPassengersRidingOffset(); Vec3 vec3 = new Vec3(0, 0, pos).yRot(-this.yBodyRot * ((float) Math.PI / 180F)); @@ -159,7 +184,16 @@ private void clampRotation(Entity rider) { } protected boolean canAddPassenger(Entity entity) { - return this.getPassengers().size() <= getModifiers().getOrDefault(GolemModifiers.SIZE_UPGRADE.get(), 0); + float total = 0; + int count = 0; + var list = new ArrayList<>(getPassengers()); + list.add(entity); + for (var e : list) { + count++; + total += e.getBbWidth(); + } + double size = getAttributeValue(GolemTypes.GOLEM_SIZE.get()); + return count <= Math.min(size * 2 - 1, 3) && total <= getBbWidth() + 1e-3; } @Override @@ -192,6 +226,7 @@ public boolean isInSittingPose() { } public void setInSittingPose(boolean sit) { + if (isInSittingPose() == sit) return; byte b0 = this.entityData.get(DATA_FLAGS_ID); this.getNavigation().stop(); this.setTarget(null); @@ -206,18 +241,14 @@ public void setInSittingPose(boolean sit) { // ------ vanilla golem behavior protected void registerGoals() { - this.goalSelector.addGoal(2, new GolemMeleeGoal(this)); super.registerGoals(); + this.goalSelector.addGoal(2, meleeGoal); + this.goalSelector.addGoal(2, new GolemRiddenMeleeGoal(this)); } @Override - protected boolean predicatePriorityTarget(LivingEntity e) { - return !isInSittingPose() && super.predicatePriorityTarget(e); - } - - @Override - protected boolean predicateSecondaryTarget(LivingEntity e) { - return !isInSittingPose() && super.predicateSecondaryTarget(e); + public boolean canAttackType(EntityType type) { + return super.canAttackType(type) && !isInSittingPose(); } public boolean hurt(DamageSource source, float amount) { @@ -228,11 +259,21 @@ public boolean hurt(DamageSource source, float amount) { } protected SoundEvent getHurtSound(DamageSource p_28872_) { - return SoundEvents.WOLF_HURT; + return SoundEvents.IRON_GOLEM_HURT; } protected SoundEvent getDeathSound() { - return SoundEvents.WOLF_DEATH; + return SoundEvents.IRON_GOLEM_DEATH; + } + + @Override + protected float getSoundVolume() { + return 0.4f * super.getSoundVolume(); + } + + @Override + public float getVoicePitch() { + return super.getVoicePitch() * 1.5f; } protected void playStepSound(BlockPos p_28864_, BlockState p_28865_) { @@ -247,21 +288,42 @@ protected InteractionResult mobInteractImpl(Player player, InteractionHand hand) ItemStack itemstack = player.getItemInHand(hand); if (MGConfig.COMMON.strictInteract.get() && !itemstack.isEmpty()) return InteractionResult.PASS; - if (!player.isShiftKeyDown() && itemstack.isEmpty()) + if (!player.isShiftKeyDown() && (itemstack.isEmpty() || itemstack.getItem() instanceof IGolemEquipmentItem)) return super.mobInteractImpl(player, hand); else { - if (!this.level().isClientSide() && canModify(player)) + if (!this.level().isClientSide() && canModify(player)) { this.setInSittingPose(!this.isInSittingPose()); + } return InteractionResult.SUCCESS; } } @Override - public void setTarget(@Nullable LivingEntity target) { + public boolean setTargetRaw(@Nullable LivingEntity target) { if (target != null && isInSittingPose()) { - return; + return false; + } + return super.setTargetRaw(target); + } + + @Override + public boolean isInRangedMode() { + for (var e : getPassengers()) { + if (e instanceof SweepGolemEntity h) { + return h.isInRangedMode(); + } + } + return super.isInRangedMode() || isInSittingPose(); + } + + @Override + public boolean hasRangeAttack() { + for (var e : getPassengers()) { + if (e instanceof SweepGolemEntity h) { + return h.hasRangeAttack(); + } } - super.setTarget(target); + return super.hasRangeAttack(); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemModel.java b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemModel.java index 9d01b2df4..e3916c7fb 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemModel.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemModel.java @@ -3,7 +3,11 @@ import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.entity.common.IGolemModel; +import dev.xkmc.modulargolems.content.entity.common.IHeadedModel; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelLayers; @@ -11,7 +15,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -public class DogGolemModel extends AgeableListModel implements IGolemModel { +public class DogGolemModel extends AgeableListModel + implements IGolemModel, IHeadedModel { private final ModelPart root; private final ModelPart head; @@ -24,7 +29,7 @@ public class DogGolemModel extends AgeableListModel implements I private final ModelPart upperBody; public DogGolemModel(EntityModelSet set) { - this(set.bakeLayer(ModelLayers.WOLF)); + this(set.bakeLayer(GolemEquipmentModels.DOGGOLEM)); } public DogGolemModel(ModelPart part) { @@ -101,6 +106,18 @@ public void renderToBufferInternal(DogGolemPartType type, PoseStack stack, Verte } } + public void copyFrom(DogGolemModel other) { + root.copyFrom(other.root); + head.copyFrom(other.head); + body.copyFrom(other.body); + rightHindLeg.copyFrom(other.rightHindLeg); + leftHindLeg.copyFrom(other.leftHindLeg); + rightFrontLeg.copyFrom(other.rightFrontLeg); + leftFrontLeg.copyFrom(other.leftFrontLeg); + tail.copyFrom(other.tail); + upperBody.copyFrom(other.upperBody); + } + public ResourceLocation getTextureLocationInternal(ResourceLocation rl) { String id = rl.getNamespace(); String mat = rl.getPath(); @@ -116,4 +133,16 @@ protected Iterable bodyParts() { return ImmutableList.of(this.body, this.rightHindLeg, this.leftHindLeg, this.rightFrontLeg, this.leftFrontLeg, this.tail, this.upperBody); } + @Override + public void translateToHead(PoseStack pose) { + //head.translateAndRotate(pose); + pose.mulPose(Axis.YP.rotationDegrees(180.0F)); + pose.scale(0.625F, -0.625F, -0.625F); + } + + @Override + public ModelPart getHead() { + return head; + } + } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemRenderer.java index 22173883b..46e9cbf7f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogGolemRenderer.java @@ -2,8 +2,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemRenderer; -import net.minecraft.client.model.geom.ModelLayers; +import dev.xkmc.modulargolems.content.entity.common.GolemBannerLayer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.item.ItemDisplayContext; import net.minecraftforge.api.distmarker.Dist; @@ -41,6 +42,11 @@ protected static void transform(PoseStack stack, ItemDisplayContext transform, @ stack.translate(0, -0.5, 0); return; } + default: + stack.translate(0.1, 0, 0.5); + float size = 0.75F; + stack.scale(size, size, size); + break; } stack.mulPose(Axis.ZP.rotationDegrees(135)); stack.mulPose(Axis.YP.rotationDegrees(-155)); @@ -60,7 +66,9 @@ protected static void transform(PoseStack stack, ItemDisplayContext transform, @ } public DogGolemRenderer(EntityRendererProvider.Context ctx) { - super(ctx, new DogGolemModel(ctx.bakeLayer(ModelLayers.WOLF)), 1F, DogGolemPartType::values); + super(ctx, new DogGolemModel(ctx.bakeLayer(GolemEquipmentModels.DOGGOLEM)), 1F, DogGolemPartType::values); + this.addLayer(new GolemBannerLayer<>(this, ctx.getItemInHandRenderer())); + this.addLayer(new DogArmorRenderer(this, ctx)); } protected float getBob(DogGolemEntity dog, float pPartialTicks) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogSkillToServer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogSkillToServer.java new file mode 100644 index 000000000..f4654ea66 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/dog/DogSkillToServer.java @@ -0,0 +1,44 @@ +package dev.xkmc.modulargolems.content.entity.dog; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.network.NetworkEvent; + +@SerialClass +public class DogSkillToServer extends SerialPacketBase { + + @SerialClass.SerialField + public ResourceLocation modifier; + + public static DogSkillToServer of(EarthquakeHelper.Instance ins) { + var ans = new DogSkillToServer(); + ans.modifier = ((GolemModifier) ins.modifier()).getRegistryName(); + return ans; + } + + @Override + public void handle(NetworkEvent.Context context) { + var sp = context.getSender(); + if (sp == null) return; + if (!GolemTypes.MODIFIERS.get().containsKey(modifier)) return; + var mod = GolemTypes.MODIFIERS.get().getValue(modifier); + if (!(mod instanceof EarthquakeHelper.Modifier jump)) return; + var mount = sp.getVehicle(); + if (mount instanceof DogGolemEntity dog) { + var lv = dog.getModifiers().getOrDefault(mod, 0); + if (lv > 0) { + var ins = new EarthquakeHelper.Instance(dog, jump, lv); + if (ins.isValid()) { + dog.jumpAttack = ins; + ins.addCD(); + dog.jumpAttackDelay = 10; + } + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/FollowOwnerGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/FollowOwnerGoal.java index 00c9f0378..01159ea23 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/FollowOwnerGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/FollowOwnerGoal.java @@ -1,8 +1,10 @@ package dev.xkmc.modulargolems.content.entity.goals; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.mode.GolemModes; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; @@ -29,7 +31,9 @@ private FollowOwnerGoal(AbstractGolemEntity golem, double speed) { * method as well. */ public boolean canUse() { - if (this.golem.isInSittingPose() || !this.golem.getMode().isMovable()) + if (this.golem.isInSittingPose() || !this.golem.isMovable() || golem.getMode() == GolemModes.FREE_WANDER) + return false; + if (this.golem.getControllingPassenger() instanceof Player) return false; Vec3 target = this.golem.getTargetPos(); double startDistance = golem.getMode().getStartFollowDistance(golem); @@ -45,7 +49,7 @@ public boolean canContinueToUse() { if (golem.getNavigation().isDone()) return false; } - if (this.golem.isInSittingPose() || !this.golem.getMode().isMovable()) + if (!this.golem.isMovable()) return false; Vec3 target = this.golem.getTargetPos(); double stop = golem.getMode().getStopDistance(); diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemMeleeGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemMeleeGoal.java index fda89706c..3522cc370 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemMeleeGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemMeleeGoal.java @@ -1,17 +1,22 @@ package dev.xkmc.modulargolems.content.entity.goals; -import dev.xkmc.modulargolems.compat.materials.cataclysm.NetheriteMonstrosityEarthquakeModifier; +import dev.xkmc.mob_weapon_api.api.goals.IMeleeGoal; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.common.GolemFlags; import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.pathfinder.Node; +import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeMod; -public class GolemMeleeGoal extends MeleeAttackGoal { +import java.util.EnumSet; + +public class GolemMeleeGoal extends Goal implements IMeleeGoal { private static double getDistance(double a0, double a1, double b0, double b1) { if (a1 < b0) { @@ -39,43 +44,201 @@ public static double getTargetDistanceDelta() { return MGConfig.COMMON.targetResetNoMovementRange.get(); } + private final double speedModifier; + private final boolean pathingTarget; + private Path path; + private double pathedX; + private double pathedY; + private double pathedZ; + private int repathDelay; + private int ticksUntilNextAttack; + private long lastCanUseCheck; + private int failureDelay = 0; + private boolean canPenalize = false; + private final AbstractGolemEntity golem; private double lastDist; private double timeNoMovement; - private boolean earthQuake = false; + private final JumpAttackHelper jump; + + private int activeRepathTime = 0; public GolemMeleeGoal(AbstractGolemEntity entity) { - super(entity, 1, true); golem = entity; + speedModifier = 1; + pathingTarget = true; + jump = new JumpAttackHelper(entity); + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + public boolean canUse() { + long i = golem.level().getGameTime(); + if (i - this.lastCanUseCheck < 20L) { + return false; + } else { + this.lastCanUseCheck = i; + LivingEntity livingentity = golem.getTarget(); + if (livingentity == null) { + return false; + } else if (!livingentity.isAlive()) { + return false; + } else { + if (canPenalize) { + if (--this.repathDelay <= 0) { + this.path = golem.getNavigation().createPath(livingentity, 0); + this.repathDelay = 4 + golem.getRandom().nextInt(7); + return this.path != null; + } else { + return true; + } + } + this.path = golem.getNavigation().createPath(livingentity, 0); + if (this.path != null) { + return true; + } else { + return this.getAttackReachSqr(livingentity) >= golem.distanceToSqr(livingentity.getX(), livingentity.getY(), livingentity.getZ()); + } + } + } + } + + public boolean canContinueToUse() { + LivingEntity livingentity = golem.getTarget(); + if (livingentity == null) { + return false; + } else if (!livingentity.isAlive()) { + return false; + } else if (!this.pathingTarget) { + return !golem.getNavigation().isDone(); + } else if (!golem.isWithinRestriction(livingentity.blockPosition())) { + return false; + } else { + return !(livingentity instanceof Player) || !livingentity.isSpectator() && !((Player) livingentity).isCreative(); + } + } + + public void start() { + golem.getNavigation().moveTo(this.path, this.speedModifier); + golem.setAggressive(true); + this.repathDelay = 0; + this.ticksUntilNextAttack = 0; + } + + public void stop() { + LivingEntity livingentity = golem.getTarget(); + if (!EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(livingentity)) { + golem.setTarget(null); + } + golem.setAggressive(false); + golem.getNavigation().stop(); + } + + public boolean requiresUpdateEveryTick() { + return true; + } + + protected void resetAttackCooldown() { + this.ticksUntilNextAttack = getMeleeInterval(); + } + + public boolean isTimeToAttack() { + return this.ticksUntilNextAttack <= 0; } @Override - protected int adjustedTickDelay(int tick) { - double speed = mob.getAttributeValue(Attributes.ATTACK_SPEED); - return (int) Math.ceil(super.adjustedTickDelay(tick) / Math.min(1, speed)); + public int getMeleeInterval() { + double speed = golem.getAttributeValue(Attributes.ATTACK_SPEED); + return (int) Math.ceil(20 / Math.min(1, speed)); } - public double getAttackReachSqr(LivingEntity pAttackTarget) { - double val = mob.getAttributeValue(ForgeMod.ENTITY_REACH.get()); - return val * val; + public double getAttackReachSqr(LivingEntity target) { + double val = golem.getAttributeValue(ForgeMod.ENTITY_REACH.get()); + return val * val + target.getBbWidth(); } public boolean canReachTarget(LivingEntity le) { - return getAttackReachSqr(le) >= mob.getPerceivedTargetDistanceSquareForMeleeAttack(le); + return getAttackReachSqr(le) >= golem.getPerceivedTargetDistanceSquareForMeleeAttack(le); } @Override public void tick() { - if (isTimeToAttack() && golem.getTarget() != null) { + LivingEntity target = golem.getTarget(); + if (target == null) return; + if (isTimeToAttack()) { timeNoMovement++; } - super.tick(); + golem.lookAt(target, 30.0F, 30.0F); + double dist = golem.getPerceivedTargetDistanceSquareForMeleeAttack(target); + tickMove(target, dist); + checkAndPerformAttack(target, dist); + jump.tick(); + } + + protected void tickMove(LivingEntity target, double distSqr) { + double dist = Math.sqrt(distSqr); + double reach = getAttackReachSqr(target); + double end = Math.sqrt(reach); + double far = end - 0.5; + this.repathDelay = Math.max(this.repathDelay - 1, 0); + boolean hasRange = golem.hasRangeAttack() || jump.shouldRetreat(target, dist, end); + if (dist < far && end > 2.4 || hasRange) { + if (!golem.getNavigation().isDone()) + golem.getNavigation().stop(); + golem.getMoveControl().strafe(hasRange || dist < far - 1 ? -1f : -0.5F, 0); + } else if (dist > far) { + repath(target, distSqr); + } + } + + public void clearDelay() { + activeRepathTime = golem.tickCount + 10; + } + + protected void repath(LivingEntity target, double dist) { + boolean shouldPath = false; + if (activeRepathTime > golem.tickCount && golem.getNavigation().isDone() && (golem.isInWaterOrBubble() || golem.onGround())) { + repathDelay = failureDelay = 0; + shouldPath = true; + } + if (repathDelay > 0) return; + shouldPath |= pathedX == 0 && pathedY == 0 && pathedZ == 0; + shouldPath |= target.distanceToSqr(pathedX, pathedY, pathedZ) >= 1.0D; + shouldPath |= golem.getRandom().nextFloat() < 0.05F; + if (!shouldPath) return; + this.pathedX = target.getX(); + this.pathedY = target.getY(); + this.pathedZ = target.getZ(); + this.repathDelay = 4 + golem.getRandom().nextInt(7); + if (this.canPenalize) { + this.repathDelay += failureDelay; + if (golem.getNavigation().getPath() != null) { + Node end = golem.getNavigation().getPath().getEndNode(); + if (end != null && target.distanceToSqr(end.x, end.y, end.z) < 1) + failureDelay = 0; + else + failureDelay += 10; + } else { + failureDelay += 10; + } + } + if (dist > 1024.0D) { + this.repathDelay += 10; + } else if (dist > 256.0D) { + this.repathDelay += 5; + } + + if (!golem.getNavigation().moveTo(target, this.speedModifier)) { + this.repathDelay += 15; + } + if (activeRepathTime > 0) + repathDelay = Math.min(repathDelay, 2); + this.repathDelay = this.adjustedTickDelay(this.repathDelay); } - @Override protected void checkAndPerformAttack(LivingEntity target, double distSqr) { + this.ticksUntilNextAttack = Math.max(this.ticksUntilNextAttack - 1, 0); if (isTimeToAttack()) { double dist = Math.sqrt(distSqr); if (dist < lastDist - getTargetDistanceDelta()) { @@ -98,25 +261,15 @@ protected void checkAndPerformAttack(LivingEntity target, double distSqr) { protected void doRealAttack(LivingEntity target, double distSqr) { if (isTimeToAttack()) { - if (golem.hasFlag(GolemFlags.EARTH_QUAKE) && !golem.isInWater() && golem.onGround()) { - if (earthQuake) { - earthQuake = false; - resetAttackCooldown(); - NetheriteMonstrosityEarthquakeModifier.performEarthQuake(golem); - return; - } else { - double d0 = this.getAttackReachSqr(target); - if (d0 < distSqr && distSqr <= d0 + NetheriteMonstrosityEarthquakeModifier.RANGE) { - golem.addDeltaMovement(new Vec3(0, 1, 0)); - golem.hasImpulse = true; - earthQuake = true; - return; - } - } - } + if (jump.tryJumpAttack(this, target, distSqr)) return; + } + if (jump.preventAttack()) return; + double d0 = this.getAttackReachSqr(target); + if (distSqr <= d0 && this.ticksUntilNextAttack <= 0) { + this.resetAttackCooldown(); + golem.swing(InteractionHand.MAIN_HAND); + golem.doHurtTarget(target); } - if (earthQuake && !golem.onGround()) return; - super.checkAndPerformAttack(target, distSqr); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRandomStrollGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRandomStrollGoal.java index a18688fc0..bb550ac74 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRandomStrollGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRandomStrollGoal.java @@ -18,7 +18,7 @@ public GolemRandomStrollGoal(AbstractGolemEntity golem) { @Override public boolean canUse() { - return golem.getMode().couldRandomStroll() && super.canUse(); + return golem.getMode().couldRandomStroll() && golem.isMovable() && super.canUse(); } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRiddenMeleeGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRiddenMeleeGoal.java new file mode 100644 index 000000000..a59da0db0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/GolemRiddenMeleeGoal.java @@ -0,0 +1,166 @@ +package dev.xkmc.modulargolems.content.entity.goals; + +import dev.xkmc.mob_weapon_api.api.goals.IMeleeGoal; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.ForgeMod; + +import static dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal.getTargetDistanceDelta; +import static dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal.getTargetResetTime; + +public class GolemRiddenMeleeGoal extends Goal implements IMeleeGoal { + + private int ticksUntilNextAttack; + private long lastCanUseCheck; + + private final AbstractGolemEntity golem; + + private double lastDist; + private double timeNoMovement; + private LivingEntity target; + private int targetDelay = 0; + + public GolemRiddenMeleeGoal(AbstractGolemEntity entity) { + golem = entity; + } + + private LivingEntity getTarget() { + if (targetDelay > golem.tickCount) return target; + if (golem.getControllingPassenger() instanceof Player) { + var box = golem.getBoundingBox().inflate(golem.getAttributeValue(ForgeMod.ENTITY_REACH.get()) * 2 + 3); + var entities = golem.level().getEntitiesOfClass(LivingEntity.class, box); + for (var e : entities) { + var reason = TargetManager.predicateTarget(golem, e); + if (reason == null) continue; + if (canReachTarget(e)) { + target = e; + targetDelay = golem.tickCount + 3; + return target; + } + } + } + return target; + } + + public boolean canUse() { + if (!(golem.getControllingPassenger() instanceof Mob)) return false; + long i = golem.level().getGameTime(); + if (i - this.lastCanUseCheck < 20L) { + return false; + } else { + this.lastCanUseCheck = i; + LivingEntity livingentity = getTarget(); + if (livingentity == null) { + return false; + } else if (!livingentity.isAlive()) { + return false; + } else { + return this.getAttackReachSqr(livingentity) >= golem.distanceToSqr(livingentity.getX(), livingentity.getY(), livingentity.getZ()); + } + } + } + + public boolean canContinueToUse() { + if (!(golem.getControllingPassenger() instanceof Mob)) return false; + LivingEntity livingentity = getTarget(); + if (livingentity == null) { + return false; + } else if (!livingentity.isAlive()) { + return false; + } else if (!golem.isWithinRestriction(livingentity.blockPosition())) { + return false; + } else { + return !(livingentity instanceof Player) || !livingentity.isSpectator() && !((Player) livingentity).isCreative(); + } + } + + public void start() { + golem.setAggressive(true); + this.ticksUntilNextAttack = 0; + } + + public void stop() { + LivingEntity livingentity = golem.getTarget(); + if (!EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(livingentity)) { + golem.setTarget(null); + } + golem.setAggressive(false); + } + + public boolean requiresUpdateEveryTick() { + return true; + } + + protected void resetAttackCooldown() { + this.ticksUntilNextAttack = getMeleeInterval(); + } + + protected boolean isTimeToAttack() { + return this.ticksUntilNextAttack <= 0; + } + + @Override + public int getMeleeInterval() { + double speed = golem.getAttributeValue(Attributes.ATTACK_SPEED); + return (int) Math.ceil(20 / Math.min(1, speed)); + } + + public double getAttackReachSqr(LivingEntity target) { + double val = golem.getAttributeValue(ForgeMod.ENTITY_REACH.get()); + return val * val + target.getBbWidth(); + } + + public boolean canReachTarget(LivingEntity le) { + return getAttackReachSqr(le) >= golem.getPerceivedTargetDistanceSquareForMeleeAttack(le); + } + + @Override + public void tick() { + LivingEntity target = golem.getTarget(); + if (target == null) return; + if (isTimeToAttack()) { + timeNoMovement++; + } + double dist = golem.getPerceivedTargetDistanceSquareForMeleeAttack(target); + checkAndPerformAttack(target, dist); + } + + protected void checkAndPerformAttack(LivingEntity target, double distSqr) { + this.ticksUntilNextAttack = Math.max(this.ticksUntilNextAttack - 1, 0); + if (isTimeToAttack()) { + double dist = Math.sqrt(distSqr); + if (dist < lastDist - getTargetDistanceDelta()) { + lastDist = dist; + timeNoMovement = 0; + } + } + doRealAttack(target, distSqr); + if (!isTimeToAttack()) { + lastDist = 1000; + timeNoMovement = 0; + } else { + if (timeNoMovement > getTargetResetTime()) { + golem.resetTarget(null); + lastDist = 1000; + timeNoMovement = 0; + } + } + } + + protected void doRealAttack(LivingEntity target, double distSqr) { + double d0 = this.getAttackReachSqr(target); + if (distSqr <= d0 && this.ticksUntilNextAttack <= 0) { + this.resetAttackCooldown(); + golem.swing(InteractionHand.MAIN_HAND); + golem.doHurtTarget(target); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/JumpAttackHelper.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/JumpAttackHelper.java new file mode 100644 index 000000000..dc4a98610 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/JumpAttackHelper.java @@ -0,0 +1,71 @@ +package dev.xkmc.modulargolems.content.entity.goals; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.special.EarthquakeHelper; +import net.minecraft.world.entity.LivingEntity; + +public class JumpAttackHelper { + + private static final int JUMP_MAX_TIME = 60; + private static final float IMPACT_SPEED = 0.05f, THRESHOLD = 0.01f; + + private final AbstractGolemEntity golem; + private AbstractGolemEntity mover; + + private EarthquakeHelper.Instance ins = null; + private double wasFalling; + private int startJumpingTime = 0; + + public JumpAttackHelper(AbstractGolemEntity golem) { + this.golem = mover = golem; + } + + public void tick() { + mover = golem.getVehicle() instanceof AbstractGolemEntity dog ? dog : golem; + if (ins != null && ins.owner() != golem && ins.owner() != mover) ins = null; + wasFalling = ins != null && !mover.isInFluidType() && !mover.onGround() ? + Math.min(wasFalling, mover.getDeltaMovement().y) : 0; + } + + + public boolean tryJumpAttack(GolemMeleeGoal goal, LivingEntity target, double distSqr) { + if (!golem.hasFlag(GolemFlags.EARTH_QUAKE) && !mover.hasFlag(GolemFlags.EARTH_QUAKE)) return false; + boolean wet = mover.isInFluidType(); + boolean valid = !wet && mover.onGround(); + boolean hit = wasFalling < -IMPACT_SPEED && (wet || mover.getDeltaMovement().y > IMPACT_SPEED) || + mover.getBoundingBox().intersects(target.getBoundingBox()); + boolean stop = !valid && !hit && (golem.tickCount - startJumpingTime > JUMP_MAX_TIME || + wasFalling < -THRESHOLD && (wet || mover.getDeltaMovement().y > -THRESHOLD)); + if (ins != null && stop) + ins = null; + if (ins != null && (valid || hit)) { + goal.resetAttackCooldown(); + ins.modifier().performEarthQuake(ins.owner(), ins.lv()); + mover.level().broadcastEntityEvent(mover, (byte) 83); + ins = null; + return true; + } + if (ins == null && valid) { + double d0 = goal.getAttackReachSqr(target); + ins = EarthquakeHelper.findInstance(golem, target, distSqr - d0); + if (ins != null) { + ins.performJump(mover); + ins.addCD(); + mover.hasImpulse = true; + startJumpingTime = golem.tickCount; + return true; + } + } + return false; + } + + public boolean preventAttack() { + return ins != null && !mover.onGround() && golem.tickCount - startJumpingTime < JUMP_MAX_TIME; + } + + public boolean shouldRetreat(LivingEntity target, double dist, double end) { + return EarthquakeHelper.shouldRetreat(golem, target, dist, end); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/TeleportToOwnerGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/TeleportToOwnerGoal.java index ce92200a6..d7aa3b02e 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/goals/TeleportToOwnerGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/goals/TeleportToOwnerGoal.java @@ -2,12 +2,15 @@ import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.entity.mode.GolemModes; import dev.xkmc.modulargolems.init.data.MGConfig; import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.Entity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; @@ -37,14 +40,18 @@ private TeleportToOwnerGoal(AbstractGolemEntity golem, boolean fly) { * method as well. */ public boolean canUse() { - if (this.golem.isInSittingPose() || !this.golem.getMode().isMovable()) + if (!this.golem.isMovable()) return false; - if (this.golem.isLeashed()) { + if (this.golem.isInSittingPose() || this.golem.isLeashed()) { return false; } + if (golem.getMode() == GolemModes.FREE_WANDER) + return false; + if (this.golem.getControllingPassenger() instanceof Player) + return false; Vec3 target = this.golem.getTargetPos(); double maxDist = MGConfig.COMMON.maxWanderRadius.get(); - return this.golem.distanceToSqr(target) >= maxDist * maxDist; + return this.golem.distanceToSqr(target) >= maxDist * maxDist || this.golem.position().y < golem.level().getMinBuildHeight() - 32; } /** @@ -70,12 +77,12 @@ public void stop() { private void teleportToOwner() { BlockPos blockpos = BlockPos.containing(this.golem.getTargetPos()); - - for (int i = 0; i < 10; ++i) { + if (blockpos.getY() < golem.level().getMinBuildHeight() - 32) return; + for (int i = 0; i < 20; ++i) { int j = this.randomIntInclusive(-3, 3); int k = this.randomIntInclusive(-1, 1); int l = this.randomIntInclusive(-3, 3); - boolean flag = this.maybeTeleportTo(blockpos.getX() + j, blockpos.getY() + k, blockpos.getZ() + l); + boolean flag = this.maybeTeleportTo(blockpos.getX() + j, blockpos.getY() + k, blockpos.getZ() + l, i > 10); if (flag) { this.golem.setTarget(null); return; @@ -84,24 +91,31 @@ private void teleportToOwner() { } - private boolean maybeTeleportTo(int pX, int pY, int pZ) { + private boolean maybeTeleportTo(int pX, int pY, int pZ, boolean fly) { Vec3 target = this.golem.getTargetPos(); if (Math.abs((double) pX - target.x()) < 2.0D && Math.abs((double) pZ - target.z()) < 2.0D) { return false; - } else if (!this.canTeleportTo(new BlockPos(pX, pY, pZ))) { + } else if (!this.canTeleportTo(new BlockPos(pX, pY, pZ), fly)) { return false; } else { - Entity e = golem; + LivingEntity e = golem; while (e.getControlledVehicle() instanceof LivingEntity le) { e = le; } e.moveTo((double) pX + 0.5D, pY, (double) pZ + 0.5D, this.golem.getYRot(), this.golem.getXRot()); this.navigation.stop(); + if (fly) { + e.addEffect(new MobEffectInstance(MobEffects.SLOW_FALLING, 60)); + } return true; } } - private boolean canTeleportTo(BlockPos pPos) { + private boolean canTeleportTo(BlockPos pPos, boolean fly) { + if (fly) { + BlockPos blockpos = pPos.subtract(this.golem.blockPosition()); + return this.level.noCollision(this.golem, this.golem.getBoundingBox().move(blockpos)); + } BlockPathTypes blockpathtypes = WalkNodeEvaluator.getBlockPathTypeStatic(this.level, pPos.mutable()); boolean allow = blockpathtypes == BlockPathTypes.WALKABLE; if (golem.hasFlag(GolemFlags.FLOAT) || golem.hasFlag(GolemFlags.SWIM)) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/DefaultHostileFaction.java b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/DefaultHostileFaction.java new file mode 100644 index 000000000..0e51d0f96 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/DefaultHostileFaction.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.content.entity.hostile; + +import dev.xkmc.modulargolems.content.capability.GolemConfigEntry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.card.PathRecordCard; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.raid.Raid; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class DefaultHostileFaction extends HostileFaction { + + public DefaultHostileFaction(ResourceLocation id) { + super(id); + } + + @Override + public @Nullable GolemConfigEntry getConfig(AbstractGolemEntity e, int col) { + return super.getConfig(e, col); + } + + @Override + public @Nullable List getPath(AbstractGolemEntity e, int col) { + return super.getPath(e, col); + } + + @Override + public ItemStack getBanner(AbstractGolemEntity e, int col) { + return Raid.getLeaderBannerInstance(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileFaction.java b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileFaction.java new file mode 100644 index 000000000..0e86d7c6d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileFaction.java @@ -0,0 +1,71 @@ +package dev.xkmc.modulargolems.content.entity.hostile; + +import dev.xkmc.l2library.util.math.MathHelper; +import dev.xkmc.modulargolems.content.capability.GolemConfigEntry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.card.PathRecordCard; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.util.FakePlayer; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class HostileFaction { + + public final ResourceLocation id; + public final UUID uuid; + + public HostileFaction(ResourceLocation id) { + this.id = id; + uuid = MathHelper.getUUIDFromString(id.toString()); + } + + @Nullable + public GolemConfigEntry getConfig(AbstractGolemEntity e, int col) { + return null; + } + + @Nullable + public List getPath(AbstractGolemEntity e, int col) { + return null; + } + + public ItemStack getBanner(AbstractGolemEntity e, int col) { + return ItemStack.EMPTY; + } + + public boolean hostileGolemAttacks(AbstractGolemEntity e, LivingEntity target) { + return hostileGolemAttacks(target); + } + + protected boolean hostileGolemAttacks(LivingEntity target) { + if (target instanceof Player player && !(target instanceof FakePlayer)) { + return player.canBeSeenAsEnemy(); + } + if (target.getTags().contains("HostileGolemTarget")) + return true; + if (target instanceof OwnableEntity ownable) { + return ownable.getOwner() instanceof Player; + } + return false; + } + + + public boolean isAlliedTo(AbstractGolemEntity e, Entity other) { + return isAlliedTo(other); + } + + protected boolean isAlliedTo(Entity other) { + if (other instanceof AbstractGolemEntity golem) { + return golem.isHostile() && uuid.equals(golem.getOwnerUUID()); + } + return false; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileGolemRegistry.java b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileGolemRegistry.java new file mode 100644 index 000000000..d0899be15 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/HostileGolemRegistry.java @@ -0,0 +1,46 @@ +package dev.xkmc.modulargolems.content.entity.hostile; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class HostileGolemRegistry { + + private static final Map HOSTILE_MAP = new ConcurrentHashMap<>(); + + private static final Map UUID_MAP = new ConcurrentHashMap<>(); + + public static final HostileFaction DEFAULT = register(new DefaultHostileFaction(ModularGolems.loc("default"))); + + public static HostileFaction register(HostileFaction entry) { + HOSTILE_MAP.put(entry.id, entry); + UUID_MAP.put(entry.uuid, entry); + return entry; + } + + public static HostileFaction getFaction(ResourceLocation id) { + return HOSTILE_MAP.get(id); + } + + public static HostileFaction getFaction(UUID id) { + return UUID_MAP.get(id); + } + + public static Optional tryGetFaction(AbstractGolemEntity golem) { + var uuid = golem.getOwnerUUID(); + if (uuid == null) return Optional.empty(); + return Optional.ofNullable(UUID_MAP.get(uuid)); + } + + public static boolean isHostile(@Nullable UUID id) { + if (id == null) return false; + return UUID_MAP.containsKey(id); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/package-info.java new file mode 100644 index 000000000..1204f89fb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/hostile/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.hostile; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemEntity.java index e72c1ec09..c88cf8db2 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemEntity.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemEntity.java @@ -1,22 +1,25 @@ package dev.xkmc.modulargolems.content.entity.humanoid; +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import dev.xkmc.l2serial.serialization.SerialClass; import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; -import dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal; -import dev.xkmc.modulargolems.content.entity.ranged.GolemBowAttackGoal; -import dev.xkmc.modulargolems.content.entity.ranged.GolemCrossbowAttackGoal; -import dev.xkmc.modulargolems.content.entity.ranged.GolemShooterHelper; -import dev.xkmc.modulargolems.content.entity.ranged.GolemTridentAttackGoal; +import dev.xkmc.modulargolems.content.entity.humanoid.sound.MaidSoundManager; +import dev.xkmc.modulargolems.content.entity.humanoid.sound.MobSoundManager; +import dev.xkmc.modulargolems.content.entity.humanoid.sound.SoundManager; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; import dev.xkmc.modulargolems.events.event.*; import dev.xkmc.modulargolems.init.advancement.GolemTriggers; import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGTagGen; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; @@ -27,138 +30,97 @@ import net.minecraft.world.entity.animal.horse.AbstractHorse; import net.minecraft.world.entity.monster.CrossbowAttackMob; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.ToolActions; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.Arrays; -import java.util.function.Predicate; @SerialClass -public class HumanoidGolemEntity extends SweepGolemEntity implements CrossbowAttackMob { +public class HumanoidGolemEntity extends SweepGolemEntity implements CrossbowAttackMob { - private static final EntityDataAccessor IS_CHARGING_CROSSBOW = SynchedEntityData.defineId(HumanoidGolemEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor DATA_MAID_MODEL_ID = SynchedEntityData.defineId(HumanoidGolemEntity.class, EntityDataSerializers.STRING); + private static final EntityDataAccessor DATA_SOUND_PACK_ID = SynchedEntityData.defineId(HumanoidGolemEntity.class, EntityDataSerializers.STRING); + private static final EntityDataAccessor DATA_PLAYER_SKIN = SynchedEntityData.defineId(HumanoidGolemEntity.class, EntityDataSerializers.STRING); - private final GolemBowAttackGoal bowGoal = new GolemBowAttackGoal(this, 1.0D, 20, 15.0F); - private final GolemCrossbowAttackGoal crossbowGoal = new GolemCrossbowAttackGoal(this, 1.0D, 15.0F); - private final GolemMeleeGoal meleeGoal = new GolemMeleeGoal(this); - private final GolemTridentAttackGoal tridentGoal = new GolemTridentAttackGoal(this, 1, 40, 15, meleeGoal); @SerialClass.SerialField(toClient = true) public int shieldCooldown = 0; - @SerialClass.SerialField - private ItemStack backupHand = ItemStack.EMPTY; - @SerialClass.SerialField - private ItemStack arrowSlot = ItemStack.EMPTY; - public HumanoidGolemEntity(EntityType type, Level level) { - super(type, level); - if (!this.level().isClientSide) { - reassessWeaponGoal(); - this.groundNavigation.setCanOpenDoors(true); - } - } - - public void reassessWeaponGoal() { - if (!this.level().isClientSide) { - this.goalSelector.removeGoal(this.meleeGoal); - this.goalSelector.removeGoal(this.bowGoal); - this.goalSelector.removeGoal(this.crossbowGoal); - this.goalSelector.removeGoal(this.tridentGoal); - InteractionHand hand = getWeaponHand(); - ItemStack weapon = getItemInHand(hand); - if (!weapon.isEmpty() && GolemShooterHelper.isValidThrowableWeapon(this, weapon, hand).isThrowable()) { - this.goalSelector.addGoal(2, this.tridentGoal); - this.goalSelector.addGoal(3, this.meleeGoal); - return; - } - if (!weapon.isEmpty() && weapon.getItem() instanceof BowItem) { - this.bowGoal.setMinAttackInterval(20); - this.goalSelector.addGoal(2, this.bowGoal); - return; - } - if (!weapon.isEmpty() && weapon.getItem() instanceof CrossbowItem) { - this.goalSelector.addGoal(2, this.crossbowGoal); - return; - } - this.goalSelector.addGoal(2, this.meleeGoal); - } - } + public Object renderCompatData; - public ItemStack getProjectile(ItemStack pShootable) { - if (pShootable.getItem() instanceof ProjectileWeaponItem) { - Predicate predicate = ((ProjectileWeaponItem) pShootable.getItem()).getSupportedHeldProjectiles(); - ItemStack stack = ProjectileWeaponItem.getHeldProjectile(this, predicate); - if (stack.isEmpty() && !arrowSlot.isEmpty() && predicate.test(arrowSlot)) { - stack = arrowSlot; - } - return ForgeHooks.getProjectile(this, pShootable, stack); - } else { - return ForgeHooks.getProjectile(this, pShootable, ItemStack.EMPTY); - } - } - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.reassessWeaponGoal(); + public String getMaidModelId() { + return entityData.get(DATA_MAID_MODEL_ID); } - public void setItemSlot(EquipmentSlot pSlot, ItemStack pStack) { - super.setItemSlot(pSlot, pStack); - if (!this.level().isClientSide) { - this.reassessWeaponGoal(); + public void setMaidModelId(String id) { + entityData.set(DATA_MAID_MODEL_ID, id); + if (!id.isEmpty()) { + entityData.set(DATA_PLAYER_SKIN, ""); } } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(IS_CHARGING_CROSSBOW, false); + public String getSoundPackId() { + return entityData.get(DATA_SOUND_PACK_ID); } - protected AbstractArrow getArrow(ItemStack pArrowStack, float pVelocity) { - return ProjectileUtil.getMobArrow(this, pArrowStack, pVelocity); + public void setSoundPackId(String id) { + entityData.set(DATA_SOUND_PACK_ID, id); } - public boolean canFireProjectileWeapon(ProjectileWeaponItem pProjectileWeapon) { - return true; + public String getPlayerSkin() { + return entityData.get(DATA_PLAYER_SKIN); } - public boolean isChargingCrossbow() { - return this.entityData.get(IS_CHARGING_CROSSBOW); + public void setPlayerSkin(String skin) { + entityData.set(DATA_PLAYER_SKIN, skin); + if (!skin.isEmpty()) { + entityData.set(DATA_MAID_MODEL_ID, ""); + entityData.set(DATA_SOUND_PACK_ID, ""); + } } - public void setChargingCrossbow(boolean pIsCharging) { - this.entityData.set(IS_CHARGING_CROSSBOW, pIsCharging); + public HumanoidGolemEntity(EntityType type, Level level) { + super(GolemWeaponRegistry.HUMANOID, type, level); + if (!this.level().isClientSide) { + this.groundNavigation.setCanOpenDoors(true); + } } @Override - public void shootCrossbowProjectile(LivingEntity pTarget, ItemStack pCrossbowStack, Projectile pProjectile, float pProjectileAngle) { - shootCrossbowProjectile(this, pTarget, pProjectile, pProjectileAngle, 1.6F); - } - - public void shootCrossbowProjectile(LivingEntity pUser, LivingEntity pTarget, Projectile pProjectile, float pProjectileAngle, float pVelocity) { - GolemShooterHelper.shootAimHelper(pTarget, pProjectile); - pUser.playSound(SoundEvents.CROSSBOW_SHOOT, 1.0F, 1.0F / (pUser.getRandom().nextFloat() * 0.4F + 0.8F)); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_MAID_MODEL_ID, ""); + this.entityData.define(DATA_SOUND_PACK_ID, ""); + this.entityData.define(DATA_PLAYER_SKIN, ""); } @Override - public void onCrossbowAttackPerformed() { - noActionTime = 0; + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putString("maidModelId", getMaidModelId()); + tag.putString("soundPackId", getSoundPackId()); + tag.putString("playerSkin", getPlayerSkin()); } - public void performCrossbowAttack(LivingEntity pUser, float pVelocity) { - InteractionHand interactionhand = ProjectileUtil.getWeaponHoldingHand(pUser, item -> item instanceof CrossbowItem); - ItemStack itemstack = pUser.getItemInHand(interactionhand); - if (pUser.isHolding(is -> is.getItem() instanceof CrossbowItem)) { - CrossbowItem.performShooting(pUser.level(), pUser, interactionhand, itemstack, pVelocity, 0); + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("maidModelId")) { + setMaidModelId(tag.getString("maidModelId")); + } + if (tag.contains("soundPackId")) { + setSoundPackId(tag.getString("soundPackId")); + } + if (tag.contains("playerSkin")) { + setPlayerSkin(tag.getString("playerSkin")); } - this.onCrossbowAttackPerformed(); } public InteractionHand getWeaponHand() { @@ -170,49 +132,11 @@ public InteractionHand getWeaponHand() { return hand; } - @Override - public void performRangedAttack(LivingEntity pTarget, float dist) { - InteractionHand hand = getWeaponHand(); - ItemStack stack = getItemInHand(hand); - var throwable = GolemShooterHelper.isValidThrowableWeapon(this, stack, hand); - if (throwable.isThrowable()) { - Projectile projectile = throwable.createProjectile(level()); - GolemShooterHelper.shootAimHelper(pTarget, projectile); - this.playSound(SoundEvents.TRIDENT_THROW, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); - projectile.getPersistentData().putInt("DespawnFactor", 20); - this.level().addFreshEntity(projectile); - stack.hurtAndBreak(1, this, e -> e.broadcastBreakEvent(InteractionHand.MAIN_HAND)); - } else if (stack.getItem() instanceof CrossbowItem) { - performCrossbowAttack(this, 3); - } else if (stack.getItem() instanceof BowItem bow) { - ItemStack arrowStack = this.getProjectile(stack); - if (arrowStack.isEmpty()) return; - AbstractArrow arrowEntity = bow.customArrow(getArrow(arrowStack, dist)); - boolean infinite = GolemShooterHelper.arrowIsInfinite(arrowStack, stack); - GolemBowAttackEvent event = new GolemBowAttackEvent(this, stack, hand, arrowEntity, infinite); - MinecraftForge.EVENT_BUS.post(event); - arrowEntity = event.getArrow(); - if (event.isNoPickup()) { - arrowEntity.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; - } else { - arrowEntity.pickup = AbstractArrow.Pickup.ALLOWED; - } - if (!event.isNoConsume()) { - arrowStack.shrink(1); - } - GolemShooterHelper.shootAimHelper(pTarget, arrowEntity, event.speed(), event.gravity()); - this.playSound(SoundEvents.ARROW_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); - arrowEntity.getPersistentData().putInt("DespawnFactor", 20); - this.level().addFreshEntity(arrowEntity); - stack.hurtAndBreak(1, this, e -> e.broadcastBreakEvent(InteractionHand.MAIN_HAND)); - } - } - protected boolean rendering, render_trigger = false; @Override public boolean isBlocking() { - boolean ans = shieldCooldown == 0 && shieldSlot() != null; + boolean ans = shieldCooldown == 0 && isAggressive() && shieldSlot() != null; if (ans && rendering) { render_trigger = true; } @@ -314,9 +238,26 @@ protected InteractionResult mobInteractImpl(Player player, InteractionHand hand) return InteractionResult.FAIL; } + // ride + @Override public double getMyRidingOffset() { - return -0.35; + var event = new GolemRidingOffsetEvent(this); + event.setOffset(-getBbHeight() * 0.34 + 0.25); + MinecraftForge.EVENT_BUS.post(event); + return event.getOffset(); + } + + @Override + public void checkRide(LivingEntity target) { + if (target instanceof DogGolemEntity || target instanceof AbstractHorse) { + startRiding(target); + } + } + + @Override + public boolean canSweep() { + return getMainHandItem().canPerformAction(ToolActions.SWORD_SWEEP); } // ------ player equipment hurt @@ -337,11 +278,13 @@ protected void hurtArmor(DamageSource source, float damage) { } } + // shields + @Nullable public InteractionHand shieldSlot() { return getItemBySlot(EquipmentSlot.MAINHAND).canPerformAction(ToolActions.SHIELD_BLOCK) ? InteractionHand.MAIN_HAND : getItemBySlot(EquipmentSlot.OFFHAND).canPerformAction(ToolActions.SHIELD_BLOCK) ? InteractionHand.OFF_HAND : - null; + null; } protected void hurtCurrentlyUsedShield(float damage) { @@ -369,10 +312,15 @@ protected void blockUsingShield(LivingEntity source) { if (hand == null) return; ItemStack stack = getItemInHand(hand); boolean canDisable = source.canDisableShield() || source.getMainHandItem().canDisableShield(stack, this, source); + int cd = 100; + if (MGConfig.COMMON.bossBreakShield.get() && source.getType().is(MGTagGen.SHIELD_BREAKER)) { + canDisable = true; + cd *= 2; + } GolemDisableShieldEvent event = new GolemDisableShieldEvent(this, stack, hand, source, canDisable); MinecraftForge.EVENT_BUS.post(event); if (event.shouldDisable()) { - this.shieldCooldown = 100; + this.shieldCooldown = cd; this.level().broadcastEntityEvent(this, EntityEvent.SHIELD_DISABLED); } } @@ -391,72 +339,62 @@ public void tick() { shieldCooldown = Mth.clamp(shieldCooldown - 1, 0, 100); } + private boolean useMaidSounds() { + return !getSoundPackId().isEmpty() || !getMaidModelId().isEmpty(); + } + + private SoundManager getSoundManager() { + if (ModList.get().isLoaded(TouhouLittleMaid.MOD_ID)) { + if (useMaidSounds()) { + return MaidSoundManager.INS; + } + } + var playerSkin = getPlayerSkin(); + if (playerSkin.contains(":")) { + if (ResourceLocation.isValidResourceLocation(playerSkin)) { + var id = new ResourceLocation(playerSkin); + if (ForgeRegistries.ENTITY_TYPES.containsKey(id)) { + var type = ForgeRegistries.ENTITY_TYPES.getValue(id); + var mob = MobSoundManager.MAP.get(type); + if (mob != null) { + return mob; + } + } + } + } + return SoundManager.INS; + } + + @Nullable @Override - public void aiStep() { - super.aiStep(); - attackStep(); + protected SoundEvent getAmbientSound() { + return getSoundManager().getAmbientSound(); } - public void attackStep() { - if (level().isClientSide()) return; - if (inventoryTick > 0) return; - inventoryTick = 4; - switchWeapon( - getWrapperOfHand(EquipmentSlot.MAINHAND), - !backupHand.isEmpty() ? - getBackupHand() : - getWrapperOfHand(EquipmentSlot.OFFHAND) - ); + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return getSoundManager().getHurtSound(source); } - public ItemWrapper getBackupHand() { - return ItemWrapper.simple(() -> this.backupHand, e -> this.backupHand = e); + @Override + protected SoundEvent getDeathSound() { + return getSoundManager().getDeathSound(); } - public ItemWrapper getArrowSlot() { - return ItemWrapper.simple(() -> this.arrowSlot, e -> this.arrowSlot = e); + @Override + protected float getSoundVolume() { + return getSoundManager().getSoundVolume() * super.getSoundVolume(); } - private void switchWeapon(ItemWrapper mainhand, ItemWrapper offhand) { - LivingEntity target = getTarget(); - ItemStack main = mainhand.getItem(); - ItemStack off = offhand.getItem(); - if (main.getItem() instanceof ProjectileWeaponItem) { - if (!getProjectile(main).isEmpty()) { - if (off.canPerformAction(ToolActions.SHIELD_BLOCK)) { - return; - } - } - if (off.isEmpty() || - off.getItem() instanceof ProjectileWeaponItem || - off.getItem() instanceof ArrowItem) { - return; - } - if (target == null || !meleeGoal.canReachTarget(target)) { - return; - } - } else if (off.getItem() instanceof ProjectileWeaponItem) { - boolean noArrow = getProjectile(off).isEmpty(); - if (noArrow) { - return; - } - if (target != null && meleeGoal.canReachTarget(target)) { - return; - } - } else if (!main.isEmpty() || off.isEmpty()) { - return; - } - mainhand.setItem(off); - offhand.setItem(main); - reassessWeaponGoal(); - inventoryTick = 10; + @Override + public float getVoicePitch() { + return getSoundManager().getVoicePitch() * super.getVoicePitch(); } @Override - public void checkRide(LivingEntity target) { - if (target instanceof DogGolemEntity || target instanceof AbstractHorse) { - startRiding(target); - } + public void playSound(SoundEvent soundEvent, float volume, float pitch) { + if (getSoundManager().playSound(this, soundEvent, volume, pitch)) return; + super.playSound(soundEvent, volume, pitch); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemModel.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemModel.java index e5155fe3a..7997d8fac 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemModel.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemModel.java @@ -3,28 +3,27 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; +import dev.xkmc.mob_weapon_api.example.behavior.ThrowableBehavior; +import dev.xkmc.mob_weapon_api.registry.WeaponRegistry; +import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.entity.common.IGolemModel; import dev.xkmc.modulargolems.content.entity.common.IHeadedModel; -import dev.xkmc.modulargolems.content.entity.ranged.GolemShooterHelper; import net.minecraft.client.model.AnimationUtils; -import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.HumanoidArm; -import net.minecraft.world.item.BowItem; -import net.minecraft.world.item.CrossbowItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; import net.minecraftforge.common.ToolActions; public class HumanoidGolemModel extends PlayerModel implements - IGolemModel, IHeadedModel { + IGolemModel, IHeadedModel { public HumanoidGolemModel(EntityModelSet set) { - this(set.bakeLayer(ModelLayers.PLAYER), false); + this(set.bakeLayer(GolemEquipmentModels.HUMANOID), false); } public HumanoidGolemModel(ModelPart modelPart, boolean slim) { @@ -32,15 +31,15 @@ public HumanoidGolemModel(ModelPart modelPart, boolean slim) { } @Override - public void renderToBufferInternal(HumaniodGolemPartType type, PoseStack stack, VertexConsumer consumer, int i, int j, float f1, float f2, float f3, float f4) { - if (type == HumaniodGolemPartType.BODY) { + public void renderToBufferInternal(HumanoidGolemPartType type, PoseStack stack, VertexConsumer consumer, int i, int j, float f1, float f2, float f3, float f4) { + if (type == HumanoidGolemPartType.BODY) { this.body.render(stack, consumer, i, j, f1, f2, f3, f4); this.head.render(stack, consumer, i, j, f1, f2, f3, f4); this.hat.render(stack, consumer, i, j, f1, f2, f3, f4); - } else if (type == HumaniodGolemPartType.ARMS) { + } else if (type == HumanoidGolemPartType.ARMS) { this.leftArm.render(stack, consumer, i, j, f1, f2, f3, f4); this.rightArm.render(stack, consumer, i, j, f1, f2, f3, f4); - } else if (type == HumaniodGolemPartType.LEGS) { + } else if (type == HumanoidGolemPartType.LEGS) { this.leftLeg.render(stack, consumer, i, j, f1, f2, f3, f4); this.rightLeg.render(stack, consumer, i, j, f1, f2, f3, f4); } @@ -83,11 +82,12 @@ public void prepareMobModel(HumanoidGolemEntity entity, float pLimbSwing, float InteractionHand hand = entity.getWeaponHand(); ItemStack itemstack = entity.getItemInHand(hand); ArmPose pos = ArmPose.EMPTY; - if (entity.isAggressive() && GolemShooterHelper.isValidThrowableWeapon(entity, itemstack, hand).isThrowable() && entity.isUsingItem()) { + if (entity.isAggressive() && entity.isUsingItem() && WeaponRegistry.HOLD.get(entity, itemstack) + .orElse(null) instanceof ThrowableBehavior) { pos = ArmPose.THROW_SPEAR; - } else if (entity.isAggressive() && itemstack.getItem() instanceof BowItem) { + } else if (entity.isAggressive() && itemstack.getUseAnimation() == UseAnim.BOW) { pos = ArmPose.BOW_AND_ARROW; - } else if (itemstack.getItem() instanceof CrossbowItem) { + } else if (itemstack.getUseAnimation() == UseAnim.CROSSBOW) { if (entity.isChargingCrossbow()) { pos = ArmPose.CROSSBOW_CHARGE; } else if (entity.isAggressive()) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumaniodGolemPartType.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemPartType.java similarity index 86% rename from src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumaniodGolemPartType.java rename to src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemPartType.java index 9a294568f..08a2d986b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumaniodGolemPartType.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemPartType.java @@ -12,7 +12,7 @@ import java.util.Locale; -public enum HumaniodGolemPartType implements IGolemPart { +public enum HumanoidGolemPartType implements IGolemPart { BODY, ARMS, LEGS; @Override @@ -21,7 +21,7 @@ public MutableComponent getDesc(MutableComponent desc) { } @Override - public GolemPart toItem() { + public GolemPart toItem() { return switch (this) { case BODY -> GolemItems.HUMANOID_BODY.get(); case ARMS -> GolemItems.HUMANOID_ARMS.get(); @@ -30,7 +30,7 @@ public GolemPart toItem() { } @Override - public void setupItemRender(PoseStack stack, ItemDisplayContext transform, @Nullable HumaniodGolemPartType part) { + public void setupItemRender(PoseStack stack, ItemDisplayContext transform, @Nullable HumanoidGolemPartType part) { HumanoidGolemRenderer.transform(stack, transform, part); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemRenderer.java index 3efeaadc1..94cf892a6 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/HumanoidGolemRenderer.java @@ -2,6 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import dev.xkmc.modulargolems.compat.curio.CuriosClientRegistry; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemRenderer; import dev.xkmc.modulargolems.content.entity.common.GolemBannerLayer; import dev.xkmc.modulargolems.content.entity.humanoid.skin.ClientSkinDispatch; @@ -9,18 +10,19 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.layers.CustomHeadLayer; import net.minecraft.client.renderer.entity.layers.ElytraLayer; import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; -import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; import net.minecraft.world.item.ItemDisplayContext; +import net.minecraftforge.fml.ModList; import org.jetbrains.annotations.Nullable; -public class HumanoidGolemRenderer extends AbstractGolemRenderer { +public class HumanoidGolemRenderer extends AbstractGolemRenderer { - protected static void transform(PoseStack stack, ItemDisplayContext transform, @Nullable HumaniodGolemPartType part) { + protected static void transform(PoseStack stack, ItemDisplayContext transform, @Nullable HumanoidGolemPartType part) { switch (transform) { case GUI: case FIRST_PERSON_LEFT_HAND: @@ -48,6 +50,9 @@ protected static void transform(PoseStack stack, ItemDisplayContext transform, @ stack.translate(0, -0.5, 0); return; } + default: + stack.translate(0, 0, 0.5); + break; } stack.mulPose(Axis.ZP.rotationDegrees(135)); stack.mulPose(Axis.YP.rotationDegrees(-155)); @@ -55,15 +60,15 @@ protected static void transform(PoseStack stack, ItemDisplayContext transform, @ float size = 0.45f; stack.scale(size, size, size); stack.translate(0, -2, 0); - } else if (part == HumaniodGolemPartType.BODY) { + } else if (part == HumanoidGolemPartType.BODY) { float size = 0.65f; stack.scale(size, size, size); stack.translate(0, -1.2, 0); - } else if (part == HumaniodGolemPartType.LEGS) { + } else if (part == HumanoidGolemPartType.LEGS) { float size = 0.8f; stack.scale(size, size, size); stack.translate(0, -2, 0); - } else if (part == HumaniodGolemPartType.ARMS) { + } else if (part == HumanoidGolemPartType.ARMS) { float size = 0.6f; stack.scale(size, size, size); stack.translate(0, -1.5, 0); @@ -75,17 +80,30 @@ public HumanoidGolemRenderer(EntityRendererProvider.Context ctx) { } public HumanoidGolemRenderer(EntityRendererProvider.Context ctx, boolean slim) { - super(ctx, new HumanoidGolemModel(ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM : ModelLayers.PLAYER), slim), 0.5f, HumaniodGolemPartType::values); + this(ctx, ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM : ModelLayers.PLAYER), slim); + } + + public HumanoidGolemRenderer(EntityRendererProvider.Context ctx, ModelPart body, boolean slim) { + this(ctx, body, slim, + ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM_INNER_ARMOR : ModelLayers.PLAYER_INNER_ARMOR), + ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM_OUTER_ARMOR : ModelLayers.PLAYER_OUTER_ARMOR)); + } + + public HumanoidGolemRenderer(EntityRendererProvider.Context ctx, ModelPart body, boolean slim, ModelPart innerArmor, ModelPart outerArmor) { + super(ctx, new HumanoidGolemModel(body, slim), 0.5f, HumanoidGolemPartType::values); this.addLayer(new HumanoidArmorLayer<>(this, - new HumanoidModel<>(ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM_INNER_ARMOR : ModelLayers.PLAYER_INNER_ARMOR)), - new HumanoidModel<>(ctx.bakeLayer(slim ? ModelLayers.PLAYER_SLIM_OUTER_ARMOR : ModelLayers.PLAYER_OUTER_ARMOR)), + new HumanoidModel<>(innerArmor), + new HumanoidModel<>(outerArmor), ctx.getModelManager())); this.addLayer(new CustomHeadLayer<>(this, ctx.getModelSet(), 1, 1, 1, ctx.getItemInHandRenderer())); this.addLayer(new ElytraLayer<>(this, ctx.getModelSet())); this.addLayer(new LayerWrapper<>(this, - new ItemInHandLayer<>(this, ctx.getItemInHandRenderer()))); + new ItemInGolemHandLayer<>(this, ctx.getItemInHandRenderer()))); this.addLayer(new GolemBannerLayer<>(this, ctx.getItemInHandRenderer())); + if (ModList.get().isLoaded("curios")) { + CuriosClientRegistry.createLayer(this); + } } @Override @@ -107,4 +125,12 @@ public void renderImpl(HumanoidGolemEntity entity, float f1, float f2, PoseStack super.render(entity, f1, f2, stack, source, i); } + public static final ThreadLocal MODEL_DELEGATE = new ThreadLocal<>(); + + @Override + public HumanoidGolemModel getModel() { + var override = MODEL_DELEGATE.get(); + if (override != null) return override; + return super.getModel(); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemInGolemHandLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemInGolemHandLayer.java new file mode 100644 index 000000000..5b5be3eb5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemInGolemHandLayer.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.content.entity.humanoid; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import dev.xkmc.modulargolems.events.event.GolemRenderItemInHandEvent; +import net.minecraft.client.model.ArmedModel; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; + +public class ItemInGolemHandLayer & ArmedModel> extends ItemInHandLayer { + + private final ItemInHandRenderer itemInHandRenderer; + + public ItemInGolemHandLayer(RenderLayerParent parent, ItemInHandRenderer r) { + super(parent, r); + this.itemInHandRenderer = r; + } + + protected void renderArmWithItem(LivingEntity e, ItemStack stack, ItemDisplayContext ctx, HumanoidArm arm, PoseStack pose, MultiBufferSource buffer, int light) { + if (!stack.isEmpty()) { + pose.pushPose(); + this.getParentModel().translateToHand(arm, pose); + pose.mulPose(Axis.XP.rotationDegrees(-90.0F)); + pose.mulPose(Axis.YP.rotationDegrees(180.0F)); + boolean flag = arm == HumanoidArm.LEFT; + pose.translate((float) (flag ? -1 : 1) / 16.0F, 0.125F, -0.625F); + if (!MinecraftForge.EVENT_BUS.post(new GolemRenderItemInHandEvent(e, stack, ctx, arm, pose, buffer, light, itemInHandRenderer))) + this.itemInHandRenderer.renderItem(e, stack, ctx, flag, pose, buffer, light); + pose.popPose(); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemWrapper.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemWrapper.java deleted file mode 100644 index f3a905356..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/ItemWrapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.humanoid; - -import net.minecraft.world.item.ItemStack; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -public interface ItemWrapper { - - ItemWrapper EMPTY = simple(() -> ItemStack.EMPTY, e -> { - }); - - static ItemWrapper simple(Supplier getter, Consumer setter) { - return new Simple(getter, setter); - } - - ItemStack getItem(); - - void setItem(ItemStack stack); - - record Simple(Supplier getter, Consumer setter) implements ItemWrapper { - @Override - public ItemStack getItem() { - return getter.get(); - } - - @Override - public void setItem(ItemStack stack) { - setter.accept(stack); - } - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/SlotWrapper.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/SlotWrapper.java new file mode 100644 index 000000000..b1c3538a0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/SlotWrapper.java @@ -0,0 +1,75 @@ +package dev.xkmc.modulargolems.content.entity.humanoid; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public record SlotWrapper(Supplier getter, Consumer setter) implements IItemHandlerModifiable { + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + setter.accept(stack); + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public @NotNull ItemStack getStackInSlot(int slot) { + return getter.get(); + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + var old = getter.get(); + if (old.isEmpty()) { + if (!simulate) + setter.accept(stack.copy()); + return ItemStack.EMPTY; + } + if (ItemStack.isSameItemSameTags(old, stack)) { + int insert = Math.min(stack.getMaxStackSize(), stack.getCount()) - old.getCount(); + if (insert <= 0) return stack; + var ans = stack.copy(); + ans.shrink(insert); + if (!simulate) { + old.grow(insert); + setter.accept(old); + } + return ans; + } + return stack; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + var stack = getter.get(); + var ans = stack.copy(); + ans.setCount(Math.min(stack.getCount(), amount)); + if (!simulate) { + if (stack.getCount() <= amount) + setter.accept(ItemStack.EMPTY); + else { + stack.shrink(amount); + setter.accept(stack); + } + } + return ans; + } + + @Override + public int getSlotLimit(int slot) { + return 0; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return true; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientProfileManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientProfileManager.java index 7f8805e46..4db073b6f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientProfileManager.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientProfileManager.java @@ -2,8 +2,6 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; -import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.SkullBlockEntity; diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientSkinDispatch.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientSkinDispatch.java index 5605fc07b..562601d96 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientSkinDispatch.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/ClientSkinDispatch.java @@ -2,8 +2,12 @@ import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.mob.MobSkinDispatch; import dev.xkmc.modulargolems.events.event.HumanoidSkinEvent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; @@ -11,13 +15,29 @@ public class ClientSkinDispatch { @Nullable public static SpecialRenderSkin get(HumanoidGolemEntity entity) { + ItemStack name = ItemStack.EMPTY; var curio = CurioCompatRegistry.get(); - if (curio == null) return null; - var name = curio.getSkin(entity); - if (name.isEmpty()) return null; + if (curio != null) name = curio.getSkin(entity); var event = new HumanoidSkinEvent(entity, name); MinecraftForge.EVENT_BUS.post(event); - return event.getSkin(); + if (event.getSkin() != null) + return event.getSkin(); + var playerSkin = entity.getPlayerSkin(); + if (!playerSkin.isEmpty()) { + var profile = ClientProfileManager.get(playerSkin); + if (profile != null) return profile; + if (ResourceLocation.isValidResourceLocation(playerSkin)) { + var id = new ResourceLocation(playerSkin); + if (ForgeRegistries.ENTITY_TYPES.containsKey(id)) { + var type = ForgeRegistries.ENTITY_TYPES.getValue(id); + var mob = MobSkinDispatch.of(type); + if (mob != null) + return mob; + } + return new SpecialRenderProfile(false, id); + } + } + return null; } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinButton.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinButton.java new file mode 100644 index 000000000..4f30691f5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinButton.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +public class PlayerSkinButton extends Button { + + private static final ResourceLocation TEXTURE = new ResourceLocation(ModularGolems.MODID, "textures/gui/sprites/button/skin.png"); + + private final HumanoidGolemEntity golem; + + public PlayerSkinButton(int x, int y, HumanoidGolemEntity golem, OnPress onPress) { + super(x + 2, y, 9, 9, Component.empty(), onPress, DEFAULT_NARRATION); + this.golem = golem; + setTooltip(Tooltip.create(Component.translatable(ModularGolems.MODID + ".tooltip.player_skin_button"))); + } + + @Override + public void renderWidget(GuiGraphics g, int mx, int my, float pt) { + int v = isHoveredOrFocused() ? 9 : 0; + g.blit(TEXTURE, getX(), getY(), 0, v, 9, 9, 9, 18); + } + + @Override + public boolean mouseClicked(double mx, double my, int button) { + if (this.active && this.visible && this.clicked(mx, my)) { + if (button == 1) { + this.playDownSound(Minecraft.getInstance().getSoundManager()); + ModularGolems.HANDLER.toServer(SetPlayerSkinToServer.of(golem.getId(), "")); + golem.setPlayerSkin(""); + return true; + } + } + return super.mouseClicked(mx, my, button); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinInputScreen.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinInputScreen.java new file mode 100644 index 000000000..f8966a7c2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinInputScreen.java @@ -0,0 +1,106 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.menu.registry.OpenEquipmentMenuToServer; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.network.chat.Component; +import org.lwjgl.glfw.GLFW; + +public class PlayerSkinInputScreen extends Screen { + + private static final Component TITLE = Component.translatable(ModularGolems.MODID + ".gui.player_skin"); + private static final Component CONFIRM = Component.translatable(ModularGolems.MODID + ".gui.player_skin.confirm"); + private static final Component CANCEL = Component.translatable(ModularGolems.MODID + ".gui.player_skin.cancel"); + + private final HumanoidGolemEntity golem; + private final String prev; + private EditBox input; + + public PlayerSkinInputScreen(HumanoidGolemEntity golem) { + super(TITLE); + this.golem = golem; + prev = golem.getPlayerSkin(); + } + + @Override + protected void init() { + int cx = width / 2; + int cy = height / 2; + + input = new EditBox(font, cx - 120, cy - 20, 240, 20, Component.empty()); + input.setMaxLength(256); + input.setValue(golem.getPlayerSkin()); + addRenderableWidget(input); + setInitialFocus(input); + + addRenderableWidget(Button.builder(CONFIRM, e -> confirm()) + .bounds(cx - 120, cy + 10, 116, 20).build()); + addRenderableWidget(Button.builder(CANCEL, e -> cancel()) + .bounds(cx + 4, cy + 10, 116, 20).build()); + } + + private void cancel() { + ModularGolems.HANDLER.toServer(SetPlayerSkinToServer.of(golem.getId(), prev)); + golem.setPlayerSkin(prev); + onClose(); + } + + private void apply() { + String value = input.getValue().trim().replace('\\', '/'); + ModularGolems.HANDLER.toServer(SetPlayerSkinToServer.of(golem.getId(), value)); + golem.setPlayerSkin(value); + } + + private void confirm() { + apply(); + onClose(); + } + + @Override + public void onClose() { + ModularGolems.HANDLER.toServer(new OpenEquipmentMenuToServer(golem.getUUID(), OpenEquipmentMenuToServer.Type.EQUIPMENT)); + } + + @Override + public void render(GuiGraphics g, int mx, int my, float ptick) { + renderBackground(g); + super.render(g, mx, my, ptick); + g.drawCenteredString(font, TITLE, width / 2, height / 2 - 40, 0xFFFFFF); + g.drawCenteredString(font, Component.translatable(ModularGolems.MODID + ".gui.player_skin.hint"), width / 2, height / 2 + 40, 0x808080); + renderPreview(g, mx, my); + } + + private void renderPreview(GuiGraphics g, int mx, int my) { + int w = 40; + int h = 40; + + int x = width / 2 - 120 - w / 2; + int y = height / 2 + h / 2; + double lx = x - mx; + double ly = y - h - my; + int scale = 24; + float ax = (float) Math.atan(lx / 50.0); + float ay = (float) Math.atan(ly / 50.0); + scale = (int) (scale / golem.getScale()); + InventoryScreen.renderEntityInInventoryFollowsAngle(g, x, y, scale, ax, ay, golem); + } + + public boolean keyPressed(int key, int p_97879_, int p_97880_) { + if (key == 256) { + onClose(); + return true; + } + if (key == GLFW.GLFW_KEY_ENTER) { + apply(); + return true; + } + return !this.input.keyPressed(key, p_97879_, p_97880_) && !this.input.canConsumeInput() ? + super.keyPressed(key, p_97879_, p_97880_) : true; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinRenderer.java index 180cb3056..5ed9dfe94 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/PlayerSkinRenderer.java @@ -3,7 +3,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.xkmc.l2library.util.Proxy; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemModel; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemRenderer; +import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -18,6 +20,14 @@ public PlayerSkinRenderer(EntityRendererProvider.Context ctx, boolean slim) { super(ctx, slim); } + public PlayerSkinRenderer(EntityRendererProvider.Context ctx, ModelPart part, boolean slim) { + super(ctx, part, slim); + } + + public void setModel(HumanoidGolemModel model) { + this.model = model; + } + @Override protected boolean delegated(HumanoidGolemEntity entity) { return true; @@ -26,17 +36,17 @@ protected boolean delegated(HumanoidGolemEntity entity) { @Override public void render(HumanoidGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { stack.pushPose(); - float r = entity.getScale(); - stack.scale(r, r, r); + HumanoidGolemRenderer.MODEL_DELEGATE.set(getModel()); renderImpl(entity, f1, f2, stack, source, i); + HumanoidGolemRenderer.MODEL_DELEGATE.remove(); stack.popPose(); } @Override public ResourceLocation getTextureLocation(HumanoidGolemEntity entity) { var skin = ClientSkinDispatch.get(entity); - if (skin instanceof SpecialRenderProfile profile && profile.texture() != null) - return profile.texture(); + if ( skin.texture() != null) + return skin.texture(); AbstractClientPlayer player = Proxy.getClientPlayer(); assert player != null; return player.getSkinTextureLocation(); diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SetPlayerSkinToServer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SetPlayerSkinToServer.java new file mode 100644 index 000000000..63cdf6e71 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SetPlayerSkinToServer.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import net.minecraftforge.network.NetworkEvent; + +@SerialClass +public class SetPlayerSkinToServer extends SerialPacketBase { + + @SerialClass.SerialField + public int id; + @SerialClass.SerialField + public String skin; + + public static SetPlayerSkinToServer of(int id, String skin) { + var ans = new SetPlayerSkinToServer(); + ans.id = id; + ans.skin = skin; + return ans; + } + + @Override + public void handle(NetworkEvent.Context context) { + var sp = context.getSender(); + if (sp == null) return; + var entity = sp.level().getEntity(id); + if (entity instanceof HumanoidGolemEntity golem && golem.canModify(sp)) { + golem.setPlayerSkin(skin); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SpecialRenderSkin.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SpecialRenderSkin.java index a0f07a58c..d094cdfdd 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SpecialRenderSkin.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/SpecialRenderSkin.java @@ -3,9 +3,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; public interface SpecialRenderSkin { void render(HumanoidGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i); + @Nullable + default ResourceLocation texture() { + return null; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/DrownedOuterLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/DrownedOuterLayer.java new file mode 100644 index 000000000..de5cb8704 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/DrownedOuterLayer.java @@ -0,0 +1,24 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin.mob; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; + +public class DrownedOuterLayer extends RenderLayer { + + private static final ResourceLocation DROWNED_OUTER_LAYER_LOCATION = new ResourceLocation("textures/entity/zombie/drowned_outer_layer.png"); + private final HumanoidGolemModel model; + + public DrownedOuterLayer(RenderLayerParent parent, HumanoidGolemModel model) { + super(parent); + this.model = model; + } + + public void render(PoseStack p_116924_, MultiBufferSource p_116925_, int p_116926_, HumanoidGolemEntity p_116927_, float p_116928_, float p_116929_, float p_116930_, float p_116931_, float p_116932_, float p_116933_) { + coloredCutoutModelCopyLayerRender(this.getParentModel(), this.model, DROWNED_OUTER_LAYER_LOCATION, p_116924_, p_116925_, p_116926_, p_116927_, p_116928_, p_116929_, p_116931_, p_116932_, p_116933_, p_116930_, 1.0F, 1.0F, 1.0F); + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/MobSkinDispatch.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/MobSkinDispatch.java new file mode 100644 index 000000000..ced64de37 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/MobSkinDispatch.java @@ -0,0 +1,110 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin.mob; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemModel; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.PlayerSkinRenderer; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.SpecialRenderSkin; +import dev.xkmc.modulargolems.init.ModularGolems; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.fml.loading.FMLEnvironment; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +@SuppressWarnings("removal") +public record MobSkinDispatch(PlayerSkinRenderer renderer, ResourceLocation texture) implements SpecialRenderSkin { + + public static final Map, MobSkinDispatch> MAP = new LinkedHashMap<>(); + + @SafeVarargs + public synchronized static void register( + EntityRendererProvider.Context ctx, EntityType type, ModelPart part, ResourceLocation texture, + Function, RenderLayer>... layers) { + validatePart(part); + PlayerSkinRenderer ans = new PlayerSkinRenderer(ctx, part, false); + for (var e : layers) { + ans.addLayer(e.apply(ans)); + } + MAP.put(type, new MobSkinDispatch(ans, texture)); + } + + public static final ResourceLocation ZOMBIE = new ResourceLocation("textures/entity/zombie/zombie.png"); + public static final ResourceLocation HUSK = new ResourceLocation("textures/entity/zombie/husk.png"); + public static final ResourceLocation DROWNED = new ResourceLocation("textures/entity/zombie/drowned.png"); + public static final ResourceLocation SKELETON = new ResourceLocation("textures/entity/skeleton/skeleton.png"); + public static final ResourceLocation WITHER_SKELETON = new ResourceLocation("textures/entity/skeleton/wither_skeleton.png"); + public static final ResourceLocation STRAY = new ResourceLocation("textures/entity/skeleton/stray.png"); + public static final ResourceLocation PIGLIN = new ResourceLocation("textures/entity/piglin/piglin.png"); + public static final ResourceLocation PIGLIN_BRUTE = new ResourceLocation("textures/entity/piglin/piglin_brute.png"); + public static final ResourceLocation ZOMBIFIED_PIGLIN = new ResourceLocation("textures/entity/piglin/zombified_piglin.png"); + + public static void setup(EntityRendererProvider.Context ctx) { + register(ctx, EntityType.ZOMBIE, ctx.bakeLayer(ModelLayers.ZOMBIE), ZOMBIE); + register(ctx, EntityType.HUSK, ctx.bakeLayer(ModelLayers.HUSK), HUSK); + register(ctx, EntityType.DROWNED, ctx.bakeLayer(ModelLayers.DROWNED), DROWNED, r -> + new DrownedOuterLayer(r, make(ctx, ModelLayers.DROWNED_OUTER_LAYER))); + + register(ctx, EntityType.SKELETON, ctx.bakeLayer(ModelLayers.SKELETON), SKELETON); + register(ctx, EntityType.WITHER_SKELETON, ctx.bakeLayer(ModelLayers.WITHER_SKELETON), WITHER_SKELETON); + register(ctx, EntityType.STRAY, ctx.bakeLayer(ModelLayers.STRAY), STRAY, r -> + new StrayClothingLayer(r, make(ctx, ModelLayers.STRAY_OUTER_LAYER))); + + register(ctx, EntityType.PIGLIN, ctx.bakeLayer(ModelLayers.PIGLIN), PIGLIN); + register(ctx, EntityType.PIGLIN_BRUTE, ctx.bakeLayer(ModelLayers.PIGLIN_BRUTE), PIGLIN_BRUTE); + register(ctx, EntityType.ZOMBIFIED_PIGLIN, ctx.bakeLayer(ModelLayers.ZOMBIFIED_PIGLIN), ZOMBIFIED_PIGLIN); + + } + + public static @Nullable SpecialRenderSkin of(EntityType type) { + return MAP.get(type); + } + + private static ModelPart validatePart(ModelPart part) { + validateChild(part, "hat"); + validateChild(part, "ear"); + validateChild(part, "cloak"); + validateChild(part, "left_sleeve"); + validateChild(part, "right_sleeve"); + validateChild(part, "left_pants"); + validateChild(part, "right_pants"); + validateChild(part, "jacket"); + return part; + } + + private static void validateChild(ModelPart part, String child) { + if (part.hasChild(child)) return; + if (!(part.children instanceof Object2ObjectArrayMap)) { + part.children = new Object2ObjectArrayMap<>(part.children); + } + part.children.put(child, new ModelPart(List.of(), Map.of())); + } + + private static HumanoidGolemModel make(EntityRendererProvider.Context ctx, ModelLayerLocation layer) { + return new HumanoidGolemModel(validatePart(ctx.getModelSet().bakeLayer(layer)), false); + } + + @Override + public void render(HumanoidGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { + try { + renderer.render(entity, f1, f2, stack, source, i); + } catch (Throwable e) { + if (!FMLEnvironment.production) { + ModularGolems.LOGGER.throwing(e); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/StrayClothingLayer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/StrayClothingLayer.java new file mode 100644 index 000000000..f5ab2ae90 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/StrayClothingLayer.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.skin.mob; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; + +public class StrayClothingLayer extends RenderLayer { + + private static final ResourceLocation STRAY_CLOTHES_LOCATION = new ResourceLocation("textures/entity/skeleton/stray_overlay.png"); + private final HumanoidGolemModel layerModel; + + public StrayClothingLayer(RenderLayerParent p_174544_, HumanoidGolemModel p_174545_) { + super(p_174544_); + this.layerModel = p_174545_; + } + + public void render(PoseStack p_117553_, MultiBufferSource p_117554_, int p_117555_, HumanoidGolemEntity p_117556_, float p_117557_, float p_117558_, float p_117559_, float p_117560_, float p_117561_, float p_117562_) { + coloredCutoutModelCopyLayerRender(this.getParentModel(), this.layerModel, STRAY_CLOTHES_LOCATION, p_117553_, p_117554_, p_117555_, p_117556_, p_117557_, p_117558_, p_117560_, p_117561_, p_117562_, p_117559_, 1.0F, 1.0F, 1.0F); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/package-info.java new file mode 100644 index 000000000..618764eac --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/skin/mob/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.humanoid.skin.mob; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MaidSoundManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MaidSoundManager.java new file mode 100644 index 000000000..b6011879a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MaidSoundManager.java @@ -0,0 +1,50 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.sound; + +import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; +import com.github.tartaricacid.touhoulittlemaid.network.NetworkHandler; +import com.github.tartaricacid.touhoulittlemaid.network.message.PlayMaidSoundMessage; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; + +import javax.annotation.Nullable; + +public class MaidSoundManager extends SoundManager { + + public static final MaidSoundManager INS = new MaidSoundManager(); + + @Nullable + public SoundEvent getAmbientSound() { + return InitSounds.MAID_IDLE.get(); + + } + + public SoundEvent getHurtSound(DamageSource source) { + if (source.is(DamageTypeTags.IS_FIRE)) { + return InitSounds.MAID_HURT_FIRE.get(); + } + return InitSounds.MAID_HURT.get(); + } + + public SoundEvent getDeathSound() { + return InitSounds.MAID_DEATH.get(); + } + + public float getSoundVolume() { + return 1; + } + + public float getVoicePitch() { + return 1; + } + + public boolean playSound(HumanoidGolemEntity e, SoundEvent soundEvent, float volume, float pitch) { + if (soundEvent.getLocation().getPath().startsWith("maid") && !e.level().isClientSide) { + NetworkHandler.sendToNearby(e, new PlayMaidSoundMessage(soundEvent.getLocation(), e.getSoundPackId(), e.getId()), 16); + return true; + } + return false; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MobSoundManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MobSoundManager.java new file mode 100644 index 000000000..904425d82 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/MobSoundManager.java @@ -0,0 +1,61 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.sound; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class MobSoundManager extends SoundManager { + + public static final Map, MobSoundManager> MAP = new LinkedHashMap<>(); + + static { + MAP.put(EntityType.ZOMBIE, new MobSoundManager(SoundEvents.ZOMBIE_AMBIENT, SoundEvents.ZOMBIE_HURT, SoundEvents.ZOMBIE_DEATH)); + MAP.put(EntityType.HUSK, new MobSoundManager(SoundEvents.HUSK_AMBIENT, SoundEvents.HUSK_HURT, SoundEvents.HUSK_DEATH)); + MAP.put(EntityType.DROWNED, new MobSoundManager(SoundEvents.DROWNED_AMBIENT, SoundEvents.DROWNED_HURT, SoundEvents.DROWNED_DEATH)); + MAP.put(EntityType.SKELETON, new MobSoundManager(SoundEvents.SKELETON_AMBIENT, SoundEvents.SKELETON_HURT, SoundEvents.SKELETON_DEATH)); + MAP.put(EntityType.WITHER_SKELETON, new MobSoundManager(SoundEvents.WITHER_SKELETON_AMBIENT, SoundEvents.WITHER_SKELETON_HURT, SoundEvents.WITHER_SKELETON_DEATH)); + MAP.put(EntityType.STRAY, new MobSoundManager(SoundEvents.STRAY_AMBIENT, SoundEvents.STRAY_HURT, SoundEvents.STRAY_DEATH)); + MAP.put(EntityType.PIGLIN, new MobSoundManager(SoundEvents.PIGLIN_AMBIENT, SoundEvents.PIGLIN_HURT, SoundEvents.PIGLIN_DEATH)); + MAP.put(EntityType.PIGLIN_BRUTE, new MobSoundManager(SoundEvents.PIGLIN_BRUTE_AMBIENT, SoundEvents.PIGLIN_BRUTE_HURT, SoundEvents.PIGLIN_BRUTE_DEATH)); + MAP.put(EntityType.ZOMBIFIED_PIGLIN, new MobSoundManager(SoundEvents.ZOMBIFIED_PIGLIN_AMBIENT, SoundEvents.ZOMBIFIED_PIGLIN_HURT, SoundEvents.ZOMBIFIED_PIGLIN_DEATH)); + } + + private final SoundEvent ambient, hurt, death; + + public MobSoundManager(SoundEvent ambient, SoundEvent hurt, SoundEvent death) { + this.ambient = ambient; + this.hurt = hurt; + this.death = death; + } + + @Override + public @Nullable SoundEvent getAmbientSound() { + return ambient; + } + + @Override + public SoundEvent getHurtSound(DamageSource source) { + return hurt; + } + + @Override + public SoundEvent getDeathSound() { + return death; + } + + @Override + public float getSoundVolume() { + return 1; + } + + @Override + public float getVoicePitch() { + return 1; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/SoundManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/SoundManager.java new file mode 100644 index 000000000..f8e6ec753 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/SoundManager.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.sound; + +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; + +import javax.annotation.Nullable; + +public class SoundManager { + + public static final SoundManager INS = new SoundManager(); + + @Nullable + public SoundEvent getAmbientSound() { + return null; + } + + public SoundEvent getHurtSound(DamageSource source) { + return SoundEvents.IRON_GOLEM_HURT; + } + + public SoundEvent getDeathSound() { + + return SoundEvents.IRON_GOLEM_DEATH; + } + + public float getSoundVolume() { + return 0.6f; + } + + public float getVoicePitch() { + return 1.25f; + } + + public boolean playSound(HumanoidGolemEntity e, SoundEvent soundEvent, float volume, float pitch) { + return false; + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/package-info.java new file mode 100644 index 000000000..930787eea --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/sound/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.humanoid.sound; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemShooterHelper.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemShooterHelper.java new file mode 100644 index 000000000..643bbf439 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemShooterHelper.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.weapon; + +import dev.xkmc.mob_weapon_api.util.ShootUtils; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.events.event.GolemThrowableEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraftforge.common.MinecraftForge; +import org.jetbrains.annotations.Nullable; + +@Deprecated +public class GolemShooterHelper { + + @Deprecated + public static boolean isValidThrowableWeapon(LivingEntity user, ItemStack stack, @Nullable InteractionHand hand) { + if (hand == null) return false; + var ans = throwWeapon(user, stack, hand); + return ans != null && ans.isThrowable(); + } + + @Deprecated + public static @Nullable GolemThrowableEvent throwWeapon(LivingEntity user, ItemStack stack, InteractionHand hand) { + if (!(user instanceof HumanoidGolemEntity golem)) return null; + if (stack.getEnchantmentLevel(Enchantments.LOYALTY) > 0) { + stack = stack.copy(); + var map = stack.getAllEnchantments(); + map.remove(Enchantments.LOYALTY); + EnchantmentHelper.setEnchantments(map, stack); + }//TODO find a cleaner approach + GolemThrowableEvent event = new GolemThrowableEvent(golem, stack, hand); + MinecraftForge.EVENT_BUS.post(event); + return event; + } + + public static void shootAimHelper(LivingEntity target, Projectile arrow) { + ShootUtils.shootAimHelper(target, arrow, 3, 0.05f); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemUser.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemUser.java new file mode 100644 index 000000000..ba9f377a7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemUser.java @@ -0,0 +1,56 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.weapon; + +import dev.xkmc.mob_weapon_api.api.ai.ISmartUser; +import dev.xkmc.mob_weapon_api.util.ShootUtils; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public record GolemUser( + AbstractGolemEntity user, @Nullable LivingEntity target +) implements ISmartUser { + + @Override + public ItemStack getPreferredProjectile(ItemStack weapon, Predicate special, Predicate general) { + ItemStack ans = user.getProjectile(weapon); + if (!special.test(ans)) return ItemStack.EMPTY; + return ans; + } + + @Override + public boolean bypassAllConsumption() { + return user.isHostile(); + } + + @Override + public boolean hasInfiniteArrow(ItemStack weapon, ItemStack ammo) { + return ShootUtils.arrowIsInfinite(ammo, weapon); + } + + @Override + public float getInitialVelocityFactor() { + return 3; + } + + @Override + public float getInitialInaccuracy() { + return 0; + } + + @Override + public Vec3 viewVector() { + assert target != null; + return ShootUtils.getShootVector(target, user.getEyePosition(), 1, 0, 0).vec3(); + } + + @Override + public AimResult aim(Vec3 arrowOrigin, float velocity, float gravity, float inaccuracy) { + assert target != null; + return ShootUtils.getShootVector(target, arrowOrigin, velocity, gravity, inaccuracy); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponManager.java new file mode 100644 index 000000000..2257f5e67 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponManager.java @@ -0,0 +1,13 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.weapon; + +import dev.xkmc.mob_weapon_api.api.goals.AbstractWeaponManager; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal; + +public class GolemWeaponManager> extends AbstractWeaponManager { + + public GolemWeaponManager(GolemWeaponRegistry reg, T golem, GolemMeleeGoal goal) { + super(reg, golem, goal); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponRegistry.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponRegistry.java new file mode 100644 index 000000000..8e4465ca8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/GolemWeaponRegistry.java @@ -0,0 +1,54 @@ +package dev.xkmc.modulargolems.content.entity.humanoid.weapon; + +import dev.xkmc.mob_weapon_api.api.goals.WeaponGoalRegistry; +import dev.xkmc.mob_weapon_api.example.goal.SmartBowAttackGoal; +import dev.xkmc.mob_weapon_api.example.goal.SmartCrossbowAttackGoal; +import dev.xkmc.mob_weapon_api.example.goal.SmartHoldRangedAttackGoal; +import dev.xkmc.mob_weapon_api.example.goal.SmartInstantRangedAttackGoal; +import dev.xkmc.mob_weapon_api.registry.WeaponRegistry; +import dev.xkmc.mob_weapon_api.registry.WeaponStatus; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.ranged.GolemMechaBowBehavior; +import dev.xkmc.modulargolems.content.item.ranged.MetalGolemBowItem; +import dev.xkmc.modulargolems.content.item.ranged.SonicCannonBehavior; +import dev.xkmc.modulargolems.content.item.ranged.SonicCannonItem; +import dev.xkmc.modulargolems.init.ModularGolems; + +public class GolemWeaponRegistry> extends WeaponGoalRegistry { + + public static final GolemWeaponRegistry HUMANOID = new GolemWeaponRegistry<>(); + public static final GolemWeaponRegistry LARGE = new GolemWeaponRegistry<>(); + + private void initBasic() { + register(ModularGolems.loc("bow"), + (golem, stack, hand) -> WeaponRegistry.BOW.getProperties(stack), + (golem, melee) -> new SmartBowAttackGoal<>(golem, melee, 1.0D, 25) + ); + register(ModularGolems.loc("crossbow"), + (golem, stack, hand) -> WeaponRegistry.CROSSBOW.getProperties(stack), + (golem, melee) -> new SmartCrossbowAttackGoal<>(golem, melee, 1.0D, 25) + ); + register(ModularGolems.loc("instant"), + (golem, stack, hand) -> WeaponRegistry.INSTANT.getProperties(stack), + (golem, melee) -> new SmartInstantRangedAttackGoal<>(golem, melee, 1.0D) + ); + register(ModularGolems.loc("hold"), + (golem, stack, hand) -> WeaponRegistry.HOLD.getProperties(stack), + (golem, melee) -> new SmartHoldRangedAttackGoal<>(golem, melee, 1.0D) + ); + } + + public static void init() { + HUMANOID.initBasic(); + LARGE.initBasic(); + WeaponRegistry.BOW.register(ModularGolems.loc("golem_bow"), + e -> WeaponStatus.RANGED.of(e.getItem() instanceof MetalGolemBowItem), + (golem, stack) -> new GolemMechaBowBehavior(), 10); + WeaponRegistry.HOLD.register(ModularGolems.loc("sonic_cannon"), + e -> WeaponStatus.RANGED.of(e.getItem() instanceof SonicCannonItem), + (golem, stack) -> new SonicCannonBehavior(), 10); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/package-info.java new file mode 100644 index 000000000..80a01e963 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/humanoid/weapon/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.humanoid.weapon; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/BeaconRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/BeaconRenderer.java new file mode 100644 index 000000000..73d723671 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/BeaconRenderer.java @@ -0,0 +1,111 @@ +package dev.xkmc.modulargolems.content.entity.metalgolem; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemBeaconItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import org.joml.Matrix3f; +import org.joml.Matrix4f; + +public class BeaconRenderer { + + public static final ResourceLocation BEAM_LOCATION = new ResourceLocation("textures/entity/beacon_beam.png"); + + public static void renderGolemBeacon(MetalGolemEntity entity, PoseStack pose, MultiBufferSource source, float pTick) { + if (entity.isAddedToWorld() && entity.getItemBySlot(EquipmentSlot.FEET).getItem() instanceof MetalGolemBeaconItem) { + var color = DyeColor.values()[entity.getConfigColor()].getTextureDiffuseColors(); + float totalTick = entity.tickCount + pTick; + float entityScale = entity.getScale(); + float beaconScale = 0.5f * entityScale; + float radius = 1.2f * entityScale; + float rotationSpeed = 2.5f; + for (int i = 0; i < 3; i++) { + float angleOffset = i * 120f; + float angle = totalTick * rotationSpeed + angleOffset; + float beaconX = (float) Math.cos(Math.toRadians(angle)) * radius; + float beaconZ = (float) Math.sin(Math.toRadians(angle)) * radius; + float beaconY = entity.getBbHeight() * 0.1f; + pose.pushPose(); + pose.translate(beaconX, beaconY, beaconZ); + pose.scale(beaconScale, beaconScale, beaconScale); + pose.mulPose(Axis.YP.rotationDegrees(-angle)); + ItemStack beaconStack = new ItemStack(Blocks.BEACON); + Minecraft.getInstance().getItemRenderer().renderStatic( + beaconStack, + ItemDisplayContext.FIXED, + 15728880, + OverlayTexture.NO_OVERLAY, + pose, + source, + entity.level(), + 0 + ); + pose.popPose(); + pose.pushPose(); + pose.translate(beaconX, beaconY, beaconZ); + float beamScale = 0.25f * entityScale; + renderBeam(pose, source, totalTick + i * 10, beamScale, 1024, color); + pose.popPose(); + } + } + } + + public static void renderBeam(PoseStack pose, MultiBufferSource source, float pTick, float scale, float length, float[] color) { + float width1 = 0.2F * scale; + float width2 = 0.25F * scale; + + float accurateTick = pTick % 40; + float f2 = Mth.frac(accurateTick * 0.2F - (float) Mth.floor(accurateTick * 0.1F)); + float colorR = color[0]; + float colorG = color[1]; + float colorB = color[2]; + pose.pushPose(); + pose.mulPose(Axis.YP.rotationDegrees(accurateTick * 2.25F - 45.0F)); + float v1 = -1.0F + f2; + float v2 = length * scale * (0.5F / width1) + v1; + renderPart(pose, source.getBuffer(RenderType.beaconBeam(BEAM_LOCATION, false)), + colorR, colorG, colorB, 1.0F, + 0, length, 0.0F, width1, width1, 0.0F, -width1, 0.0F, 0.0F, -width1, + 0.0F, 1.0F, v2, v1); + pose.popPose(); + v1 = -1.0F + f2; + v2 = (float) length * scale + v1; + renderPart(pose, source.getBuffer(RenderType.beaconBeam(BEAM_LOCATION, true)), + colorR, colorG, colorB, 0.125F, + 0, length, -width2, -width2, width2, -width2, -width2, width2, width2, width2, + 0.0F, 1.0F, v2, v1); + } + + private static void renderPart(PoseStack pose, VertexConsumer buffer, float r, float g, float b, float a, float start, float end, float p_112164_, float p_112165_, float p_112166_, float p_112167_, float p_112168_, float p_112169_, float p_112170_, float p_112171_, float u1, float u2, float v1, float v2) { + PoseStack.Pose posestack$pose = pose.last(); + Matrix4f matrix4f = posestack$pose.pose(); + Matrix3f matrix3f = posestack$pose.normal(); + renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112164_, p_112165_, p_112166_, p_112167_, u1, u2, v1, v2); + renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112170_, p_112171_, p_112168_, p_112169_, u1, u2, v1, v2); + renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112166_, p_112167_, p_112170_, p_112171_, u1, u2, v1, v2); + renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112168_, p_112169_, p_112164_, p_112165_, u1, u2, v1, v2); + } + + private static void renderQuad(Matrix4f pose, Matrix3f normal, VertexConsumer buffer, float r, float g, float b, float a, float y1, float y2, float x1, float z1, float x2, float z2, float u1, float u2, float v1, float v2) { + addVertex(pose, normal, buffer, r, g, b, a, y2, x1, z1, u2, v1); + addVertex(pose, normal, buffer, r, g, b, a, y1, x1, z1, u2, v2); + addVertex(pose, normal, buffer, r, g, b, a, y1, x2, z2, u1, v2); + addVertex(pose, normal, buffer, r, g, b, a, y2, x2, z2, u1, v1); + } + + private static void addVertex(Matrix4f pose, Matrix3f normal, VertexConsumer buffer, float r, float g, float b, float a, float y, float x, float z, float u, float v) { + buffer.vertex(pose, x, y, z).color(r, g, b, a).uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(normal, 0.0F, 1.0F, 0.0F).endVertex(); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/GolemEquipmentRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/GolemEquipmentRenderer.java index 94195ff59..1f766c30b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/GolemEquipmentRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/GolemEquipmentRenderer.java @@ -4,27 +4,30 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; import dev.xkmc.modulargolems.content.client.armor.GolemModelPath; +import dev.xkmc.modulargolems.content.client.pose.GolemShoulderPose; +import dev.xkmc.modulargolems.content.client.weapon.GolemModelAnimations; +import dev.xkmc.modulargolems.content.client.weapon.IEntityModelWeapon; import dev.xkmc.modulargolems.content.item.equipments.GolemModelItem; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemBeaconItem; -import dev.xkmc.modulargolems.init.ModularGolems; -import net.minecraft.client.Minecraft; +import dev.xkmc.modulargolems.content.item.equipments.GolemItemSpecialRenderer; +import dev.xkmc.modulargolems.content.item.ranged.IShoulderWeapon; +import dev.xkmc.modulargolems.events.event.GolemRenderItemInHandEvent; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.AnimationState; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; import org.jetbrains.annotations.NotNull; -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Quaternionf; import java.util.HashMap; import java.util.List; @@ -35,47 +38,154 @@ public class GolemEquipmentRenderer extends RenderLayer map = new HashMap<>(); + public final ItemInHandRenderer itemInHandRenderer; + public GolemEquipmentRenderer(RenderLayerParent r, EntityRendererProvider.Context e) { super(r); for (var l : LIST) { map.put(l, new MetalGolemModel(e.bakeLayer(l))); } + itemInHandRenderer = e.getItemInHandRenderer(); } @Override public void render(@NotNull PoseStack pose, MultiBufferSource source, int i, @NotNull MetalGolemEntity entity, float f1, float f2, float f3, float f4, float f5, float f6) { for (var e : EquipmentSlot.values()) { ItemStack stack = entity.getItemBySlot(e); - if (stack.getItem() instanceof GolemModelItem mgaitem) { - GolemModelPath gmpath = GolemModelPath.get(mgaitem.getModelPath()); - for (List ls : gmpath.paths()) { - MetalGolemModel model = map.get(gmpath.models()); - model.copyFrom(getParentModel()); - ModelPart gemr = model.root(); - pose.pushPose(); - for (String s : ls) { - gemr.translateAndRotate(pose); - gemr = gemr.getChild(s); - } - gemr.render(pose, source.getBuffer(RenderType.armorCutoutNoCull(mgaitem.getModelTexture())), - i, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); - pose.popPose(); + if (stack.getItem() instanceof GolemItemSpecialRenderer.ProviderItem pvd) { + var opt = pvd.getSpecialRenderer(); + if (opt.isPresent()){ + opt.get().render(entity, stack, pose, source, i, f3, this); + continue; } - } else if (stack.getItem() instanceof MetalGolemBeaconItem beacon) { - if (!entity.isAddedToWorld()) - return; - var color = new float[]{1.0F, 1.0F, 1.0F}; - renderBeacon(pose, source, i, entity.level().getGameTime(), entity.getBbHeight()); - renderBeam(pose, source, i, 1F, entity.level().getGameTime(), entity.getBbHeight(), color); + } + if (stack.getItem() instanceof GolemModelItem mgaitem) { + renderArmor(entity, stack, mgaitem, pose, source, i); } else { - renderArmWithItem(entity, stack, e, pose, source, i); + renderArmWithItem(entity, stack, e, pose, source, i, f3); + } + } + renderShoulderWeapon(entity, entity.getRightShoulder().getItem(), InteractionHand.MAIN_HAND, pose, source, i, f3); + renderShoulderWeapon(entity, entity.getLeftShoulder().getItem(), InteractionHand.OFF_HAND, pose, source, i, f3); + } + + public void renderModel(MetalGolemModel model, GolemModelPath gmpath, PoseStack pose, VertexConsumer buffer, int light) { + for (List ls : gmpath.paths()) { + ModelPart gemr = model.root(); + pose.pushPose(); + for (String s : ls) { + gemr.translateAndRotate(pose); + gemr = gemr.getChild(s); + } + gemr.render(pose, buffer, light, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + pose.popPose(); + } + } + + public void renderArmor(MetalGolemEntity entity, ItemStack stack, GolemModelItem mgaitem, PoseStack pose, MultiBufferSource source, int light) { + GolemModelPath gmpath = GolemModelPath.get(mgaitem.getModelPath()); + MetalGolemModel model = map.get(gmpath.models()); + model.copyFrom(getParentModel()); + var buffer = source.getBuffer(RenderType.armorCutoutNoCull(mgaitem.getModelTexture(entity))); + renderModel(model, gmpath, pose, buffer, light); + if (mgaitem.emissive(entity, stack)) { + buffer = source.getBuffer(RenderType.armorCutoutNoCull(mgaitem.getEmissiveModelTexture(entity))); + renderModel(model, gmpath, pose, buffer, LightTexture.FULL_BRIGHT); + } + if (stack.hasFoil()) { + buffer = source.getBuffer(RenderType.armorEntityGlint()); + renderModel(model, gmpath, pose, buffer, light); + } + } + + public void renderShoulderWeapon( + MetalGolemEntity entity, ItemStack stack, InteractionHand hand, + PoseStack pose, MultiBufferSource source, int light, float pTick) { + if (!(stack.getItem() instanceof IShoulderWeapon weapon)) return; + var id = weapon.getModelForHand(hand); + if (id == null) return; + GolemModelPath gmpath = GolemModelPath.MAP.get(id); + if (gmpath == null) { + var sp = GolemShoulderPose.MAP.get(id); + if (sp != null) { + sp.render(entity, getParentModel(), stack, hand, pose, source, light, pTick); + } + return; + } + MetalGolemModel model = map.get(gmpath.models()); + model.root().getAllParts().forEach(ModelPart::resetPose); + model.copyFrom(getParentModel()); + var list = weapon.getAnimationData(entity, stack, hand); + for (var entry : list) { + if (GolemModelAnimations.MAP.containsKey(entry.id())) { + var anim = GolemModelAnimations.MAP.get(entry.id()); + if (anim != null) { + var state = new AnimationState(); + state.startIfStopped(0); + model.animate(state, anim, entry.tick() + entry.speed() * pTick); + } } } + var sp = GolemShoulderPose.MAP.get(id); + if (sp != null) { + sp.setup(entity, model, stack, hand, pTick); + sp.render(entity, model, stack, hand, pose, source, light, pTick); + } + var buffer = source.getBuffer(RenderType.armorCutoutNoCull(weapon.getModelTexture(entity, stack, hand))); + renderModel(model, gmpath, pose, buffer, light); + if (weapon.emissive()) { + buffer = source.getBuffer(RenderType.armorCutoutNoCull(weapon.getEmissiveTexture(entity, stack, hand))); + renderModel(model, gmpath, pose, buffer, LightTexture.FULL_BRIGHT); + } + if (stack.hasFoil()) { + buffer = source.getBuffer(RenderType.armorEntityGlint()); + renderModel(model, gmpath, pose, buffer, light); + } } - protected void renderArmWithItem(MetalGolemEntity entity, ItemStack stack, EquipmentSlot slot, - PoseStack pose, MultiBufferSource source, int light) { + public boolean renderWeaponModel( + MetalGolemEntity entity, IEntityModelWeapon weapon, ItemStack stack, InteractionHand hand, + PoseStack pose, MultiBufferSource source, int light, float pTick) { + var id = weapon.getModelForHand(hand); + if (id == null) return false; + GolemModelPath gmpath = GolemModelPath.get(id); + MetalGolemModel model = map.get(gmpath.models()); + model.root().getAllParts().forEach(ModelPart::resetPose); + model.copyFrom(getParentModel()); + if (weapon.shouldPlayAnimation(entity, stack, hand)) { + var anim = GolemModelAnimations.MAP.get(id); + if (anim != null) { + float speed = weapon.getAnimationSpeed(entity, stack, hand); + float tick = weapon.getAnimationTick(entity, stack, hand); + var state = new AnimationState(); + state.startIfStopped(0); + model.animate(state, anim, tick + speed * pTick); + } + } + var buffer = source.getBuffer(RenderType.armorCutoutNoCull(weapon.getModelTexture(entity, stack, hand))); + renderModel(model, gmpath, pose, buffer, light); + if (weapon.emissive()) { + buffer = source.getBuffer(RenderType.armorCutoutNoCull(weapon.getEmissiveTexture(entity, stack, hand))); + renderModel(model, gmpath, pose, buffer, LightTexture.FULL_BRIGHT); + } + if (stack.hasFoil()) { + buffer = source.getBuffer(RenderType.armorEntityGlint()); + renderModel(model, gmpath, pose, buffer, light); + } + return true; + } + + public void renderArmWithItem(MetalGolemEntity entity, ItemStack stack, EquipmentSlot slot, + PoseStack pose, MultiBufferSource source, int light, float pTick) { if (stack.isEmpty()) return; + if (stack.getItem() instanceof IEntityModelWeapon weapon) { + InteractionHand hand = slot == EquipmentSlot.MAINHAND ? InteractionHand.MAIN_HAND : + slot == EquipmentSlot.OFFHAND ? InteractionHand.OFF_HAND : null; + if (hand != null) { + if (renderWeaponModel(entity, weapon, stack, hand, pose, source, light, pTick)) + return; + } + } ItemDisplayContext ctx = null; if (slot == EquipmentSlot.MAINHAND) { ctx = ItemDisplayContext.THIRD_PERSON_RIGHT_HAND; @@ -83,93 +193,18 @@ protected void renderArmWithItem(MetalGolemEntity entity, ItemStack stack, Equip ctx = ItemDisplayContext.THIRD_PERSON_LEFT_HAND; } if (ctx == null) return; - + var arm = slot == EquipmentSlot.MAINHAND ? entity.getMainArm() : entity.getMainArm().getOpposite(); pose.pushPose(); getParentModel().transformToHand(slot, pose); boolean offhand = slot == EquipmentSlot.OFFHAND; pose.translate((offhand ? 1 : -1) * 0.7f, 0.8F, -0.25F); pose.mulPose(Axis.XP.rotationDegrees(-90)); pose.mulPose(Axis.YP.rotationDegrees(180)); - Minecraft.getInstance().getItemRenderer() - .renderStatic(entity, stack, ctx, offhand, - pose, source, entity.level(), light, OverlayTexture.NO_OVERLAY, - entity.getId() + slot.ordinal()); - pose.popPose(); - - } - - final ResourceLocation BEACON_LOCATION = new ResourceLocation(ModularGolems.MODID, "textures/equipments/beacon.png"); - protected void renderBeacon(PoseStack pose, MultiBufferSource source, float pTick, long gameTick, float height) { - float width = 3F; - - pose.pushPose(); - pose.scale(1, -1, 1); - pose.translate(0D, - height / 2, 0D); - float accurateTick = (float)Math.floorMod(gameTick, 90) + pTick; - pose.mulPose(Axis.YP.rotationDegrees(accurateTick - 45.0F)); - - var buffer = source.getBuffer(RenderType.armorCutoutNoCull(BEACON_LOCATION)); - PoseStack.Pose posestack$pose = pose.last(); - Matrix4f matrix4f = posestack$pose.pose(); - Matrix3f matrix3f = posestack$pose.normal(); - addVertex(matrix4f, matrix3f, buffer, 1.0F, 1.0F, 1.0F, 1.0F, 0, 0, width, 0, 0); - addVertex(matrix4f, matrix3f, buffer, 1.0F, 1.0F, 1.0F, 1.0F, 0, width, 0, 0, 1); - addVertex(matrix4f, matrix3f, buffer, 1.0F, 1.0F, 1.0F, 1.0F, 0, 0, -width, 1, 1); - addVertex(matrix4f, matrix3f, buffer, 1.0F, 1.0F, 1.0F, 1.0F, 0, -width, 0, 1, 0); + var r = itemInHandRenderer; + if (!MinecraftForge.EVENT_BUS.post(new GolemRenderItemInHandEvent(entity, stack, ctx, arm, pose, source, light, r))) + r.renderItem(entity, stack, ctx, offhand, pose, source, light); pose.popPose(); - } - - final ResourceLocation BEAM_LOCATION = new ResourceLocation("textures/entity/beacon_beam.png"); - protected void renderBeam(PoseStack pose, MultiBufferSource source, float pTick, float scale, long gameTick, float height, float[] color) { - float width1 = 0.2F; - float width2 = 0.25F; - int length = 1024; - - pose.pushPose(); - pose.scale(1, -1, 1); - pose.translate(0D, height / 2, 0D); - float accurateTick = (float)Math.floorMod(gameTick, 40) + pTick; - float f2 = Mth.frac(accurateTick * 0.2F - (float)Mth.floor(accurateTick * 0.1F)); - float colorR = color[0]; - float colorG = color[1]; - float colorB = color[2]; - pose.pushPose(); - pose.mulPose(Axis.YP.rotationDegrees(accurateTick * 2.25F - 45.0F)); - float v1 = -1.0F + f2; - float v2 = (float)length * scale * (0.5F / width1) + v1; - renderPart(pose, source.getBuffer(RenderType.beaconBeam(BEAM_LOCATION, false)), - colorR, colorG, colorB, 1.0F, - 0, length, 0.0F, width1, width1, 0.0F, -width1, 0.0F, 0.0F, -width1, - 0.0F, 1.0F, v2, v1); - pose.popPose(); - v1 = -1.0F + f2; - v2 = (float)length * scale + v1; - renderPart(pose, source.getBuffer(RenderType.beaconBeam(BEAM_LOCATION, true)), - colorR, colorG, colorB, 0.125F, - 0, length, -width2, -width2, width2, -width2, -width2, width2, width2, width2, - 0.0F, 1.0F, v2, v1); - pose.popPose(); - } - - private static void renderPart(PoseStack pose, VertexConsumer buffer, float r, float g, float b, float a, int start, int end, float p_112164_, float p_112165_, float p_112166_, float p_112167_, float p_112168_, float p_112169_, float p_112170_, float p_112171_, float u1, float u2, float v1, float v2) { - PoseStack.Pose posestack$pose = pose.last(); - Matrix4f matrix4f = posestack$pose.pose(); - Matrix3f matrix3f = posestack$pose.normal(); - renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112164_, p_112165_, p_112166_, p_112167_, u1, u2, v1, v2); - renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112170_, p_112171_, p_112168_, p_112169_, u1, u2, v1, v2); - renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112166_, p_112167_, p_112170_, p_112171_, u1, u2, v1, v2); - renderQuad(matrix4f, matrix3f, buffer, r, g, b, a, start, end, p_112168_, p_112169_, p_112164_, p_112165_, u1, u2, v1, v2); - } - - private static void renderQuad(Matrix4f pose, Matrix3f normal, VertexConsumer buffer, float r, float g, float b, float a, int y1, int y2, float x1, float z1, float x2, float z2, float u1, float u2, float v1, float v2) { - addVertex(pose, normal, buffer, r, g, b, a, y2, x1, z1, u2, v1); - addVertex(pose, normal, buffer, r, g, b, a, y1, x1, z1, u2, v2); - addVertex(pose, normal, buffer, r, g, b, a, y1, x2, z2, u1, v2); - addVertex(pose, normal, buffer, r, g, b, a, y2, x2, z2, u1, v1); - } - private static void addVertex(Matrix4f pose, Matrix3f normal, VertexConsumer buffer, float r, float g, float b, float a, int y, float x, float z, float u, float v) { - buffer.vertex(pose, x, (float)y, z).color(r, g, b, a).uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(normal, 0.0F, 1.0F, 0.0F).endVertex(); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemEntity.java index cc49a5e4f..4bd653a66 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemEntity.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemEntity.java @@ -1,15 +1,26 @@ package dev.xkmc.modulargolems.content.entity.metalgolem; import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.mob_weapon_api.api.ai.ItemWrapper; import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; -import dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal; -import dev.xkmc.modulargolems.content.item.wand.GolemInteractItem; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.SlotWrapper; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; +import dev.xkmc.modulargolems.content.item.equipments.CustomSweepBoxWeapon; +import dev.xkmc.modulargolems.content.item.equipments.ExtraAttackGolemWeapon; +import dev.xkmc.modulargolems.content.item.equipments.IAttackListenerWeapon; +import dev.xkmc.modulargolems.content.item.ranged.IShoulderWeapon; import dev.xkmc.modulargolems.init.advancement.GolemTriggers; import dev.xkmc.modulargolems.init.data.MGConfig; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; @@ -26,32 +37,85 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.NaturalSpawner; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.IItemHandlerModifiable; +import org.joml.Vector3f; + +import java.util.List; @SerialClass public class MetalGolemEntity extends SweepGolemEntity { + + private static final EntityDataAccessor TARGET = SynchedEntityData.defineId(MetalGolemEntity.class, EntityDataSerializers.VECTOR3); + private static final EntityDataAccessor LEFT_SHOULDER = SynchedEntityData.defineId(MetalGolemEntity.class, EntityDataSerializers.ITEM_STACK); + private static final EntityDataAccessor RIGHT_SHOULDER = SynchedEntityData.defineId(MetalGolemEntity.class, EntityDataSerializers.ITEM_STACK); + + @SerialClass.SerialField(toClient = true) + private ItemStack leftShoulder = ItemStack.EMPTY; + @SerialClass.SerialField(toClient = true) + private ItemStack rightShoulder = ItemStack.EMPTY; + + @SerialClass.SerialField(toClient = true) + public final TargetingAnimState animState = new TargetingAnimState(); + public MetalGolemEntity(EntityType type, Level level) { - super(type, level); + super(GolemWeaponRegistry.LARGE, type, level); this.setMaxUpStep(1); } - protected boolean performDamageTarget(Entity target, float damage, double kb) { + protected void defineSynchedData() { + super.defineSynchedData(); + entityData.define(TARGET, new Vector3f(0, 0, 0)); + entityData.define(LEFT_SHOULDER, ItemStack.EMPTY); + entityData.define(RIGHT_SHOULDER, ItemStack.EMPTY); + } + + protected AABB getAttackBoundingBox(Entity target, double range) { + if (getMainHandItem().getItem() instanceof CustomSweepBoxWeapon weapon) { + return weapon.getAttackBoundingBox(this, target, range, getMainHandItem()); + } + return target.getBoundingBox().inflate(range); + } + + protected boolean performDamageTarget(Entity target, float damage, double kbres) { + double dokb = getAttributeValue(Attributes.ATTACK_KNOCKBACK); if (target instanceof LivingEntity le) { le.setLastHurtByPlayer(getOwner()); damage += EnchantmentHelper.getDamageBonus(this.getMainHandItem(), le.getMobType()); - kb += (float) EnchantmentHelper.getKnockbackBonus(this); + float kbench = (float) EnchantmentHelper.getKnockbackBonus(this); + if (kbench > 0) dokb += Math.sqrt(kbench); } boolean succeed = target.hurt(level().damageSources().mobAttack(this), damage); + if (getMainHandItem().getItem() instanceof ExtraAttackGolemWeapon item) { + succeed |= item.repeatAttack(this, target, damage, succeed); + } if (succeed) { - double d1 = Math.max(0.0D, 1.0D - kb); - double dokb = getAttributeValue(Attributes.ATTACK_KNOCKBACK) * 0.4; - target.setDeltaMovement(target.getDeltaMovement().add(0.0D, dokb * d1, 0.0D)); + dokb = Math.max(0, dokb - kbres); + if (dokb > 0) { + var hor = Math.max(0, dokb - 1) * 0.4; + var ver = Math.sqrt(dokb); + ver = Math.min(ver * 2, ver + 1) * 0.4; + Vec3 kbVec = target.position().subtract(position()).normalize() + .multiply(1, 0, 1) + .scale(hor) + .add(0, ver, 0); + Vec3 vec = target.getDeltaMovement(); + vec = new Vec3(vec.x / 2 + kbVec.x, Math.max(kbVec.y, vec.y), vec.z / 2 + kbVec.z); + target.hasImpulse = true; + target.setDeltaMovement(vec); + } this.doEnchantDamageEffects(this, target); + int i = EnchantmentHelper.getFireAspect(this); + if (i > 0) { + target.setSecondsOnFire(i * 4); + } } return succeed; } @@ -60,13 +124,17 @@ protected boolean performDamageTarget(Entity target, float damage, double kb) { private int attackAnimationTick; - protected void registerGoals() { - this.goalSelector.addGoal(2, new GolemMeleeGoal(this)); - super.registerGoals(); - } - public void aiStep() { super.aiStep(); + animState.tick(this); + var right = getRightShoulder().getItem(); + if (!right.isEmpty() && right.getItem() instanceof IShoulderWeapon weapon) + weapon.onTick(this, right, InteractionHand.MAIN_HAND); + var left = getLeftShoulder().getItem(); + if (!left.isEmpty() && left.getItem() instanceof IShoulderWeapon weapon) + weapon.onTick(this, left, InteractionHand.OFF_HAND); + if (getMainHandItem().getItem() instanceof IAttackListenerWeapon weapon) + weapon.onTick(this, getMainHandItem(), InteractionHand.MAIN_HAND); if (this.attackAnimationTick > 0) { --this.attackAnimationTick; } @@ -107,7 +175,7 @@ public boolean hurt(DamageSource source, float amount) { } public IronGolem.Crackiness getCrackiness() { - return IronGolem.Crackiness.byFraction(this.getHealth() / this.getMaxHealth()); + return IronGolem.Crackiness.byFraction(this.getGuardedDataImpl() / this.getMaxHealth()); } public void handleEntityEvent(byte event) { @@ -164,28 +232,112 @@ protected InteractionResult mobInteractImpl(Player player, InteractionHand hand) if (getMaterials().size() != MetalGolemPartType.values().length) return super.mobInteractImpl(player, hand); var mat = getMaterials().get(MetalGolemPartType.BODY.ordinal()); - Ingredient ing = GolemMaterialConfig.get().ingredients.get(mat.id()); + Ingredient ing = GolemMaterialConfig.get().getRepairIngredient(mat.id()); if (!ing.test(itemstack)) { if (MGConfig.COMMON.strictInteract.get() && !itemstack.isEmpty()) return InteractionResult.PASS; return super.mobInteractImpl(player, hand); - } else { - float f = this.getHealth(); - this.heal(getMaxHealth() / 4f); - if (this.getHealth() == f) { - return InteractionResult.PASS; - } else { - float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; - this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f1); - if (!player.getAbilities().instabuild) { - itemstack.shrink(1); - } - if (!this.level().isClientSide()) { - GolemTriggers.HOT_FIX.trigger((ServerPlayer) player); - } - return InteractionResult.sidedSuccess(this.level().isClientSide); - } } + if (!player.getAbilities().instabuild && isHostile()) return InteractionResult.PASS; + if (getGuardedDataImpl() >= getMaxHealth() && !isReforged()) { + return InteractionResult.PASS; + } + repairWithItem(); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + if (!this.level().isClientSide()) { + GolemTriggers.HOT_FIX.trigger((ServerPlayer) player); + } + return InteractionResult.sidedSuccess(this.level().isClientSide); + } + + @Override + public double getMyRidingOffset() { + return -getBbHeight() * 0.26 + 0.27; + } + + @Override + public void checkRide(LivingEntity target) { + if (target instanceof DogGolemEntity dog && dog.getBbWidth() > getBbWidth()) { + startRiding(target); + } + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + var target = getTarget(); + if (target == null) entityData.set(TARGET, new Vector3f(0, 0, 0)); + else { + var center = target.position().add(0, target.getBbHeight() / 2, 0); + entityData.set(TARGET, center.subtract(position()).toVector3f()); + } + if (!ItemStack.matches(entityData.get(LEFT_SHOULDER), leftShoulder)) { + entityData.set(LEFT_SHOULDER, leftShoulder.copy()); + } + if (!ItemStack.matches(entityData.get(RIGHT_SHOULDER), rightShoulder)) { + entityData.set(RIGHT_SHOULDER, rightShoulder.copy()); + } + } + + public Vec3 getTargetAimPos() { + return new Vec3(entityData.get(TARGET)); + } + + @Override + protected void dropCustomDeathLoot(DamageSource source, int i, boolean b) { + super.dropCustomDeathLoot(source, i, b); + if (!leftShoulder.isEmpty() && leftShoulder.getEnchantmentLevel(Enchantments.VANISHING_CURSE) <= 0) + spawnAtLocation(leftShoulder); + leftShoulder = ItemStack.EMPTY; + if (!rightShoulder.isEmpty() && rightShoulder.getEnchantmentLevel(Enchantments.VANISHING_CURSE) <= 0) + spawnAtLocation(rightShoulder); + rightShoulder = ItemStack.EMPTY; + } + + @Override + protected List aggregateInventories() { + var ans = super.aggregateInventories(); + ans.add(new SlotWrapper(() -> entityData.get(LEFT_SHOULDER), e -> entityData.set(LEFT_SHOULDER, e))); + ans.add(new SlotWrapper(() -> entityData.get(RIGHT_SHOULDER), e -> entityData.set(RIGHT_SHOULDER, e))); + return ans; + } + + @Override + public void addItemsToList(List list) { + super.addItemsToList(list); + var left = leftShoulder; + if (!left.isEmpty()) + list.add(left); + var right = rightShoulder; + if (!right.isEmpty()) + list.add(right); + } + + @Deprecated(forRemoval = true) + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + // Legacy + if (tag.contains("left_shoulder", Tag.TAG_COMPOUND)) { + leftShoulder = ItemStack.of(tag.getCompound("left_shoulder")); + } + if (tag.contains("right_shoulder", Tag.TAG_COMPOUND)) { + rightShoulder = ItemStack.of(tag.getCompound("right_shoulder")); + } + } + + public ItemWrapper getLeftShoulder() { + if (isAddedToWorld() && level().isClientSide()) + return ItemWrapper.simple(() -> entityData.get(LEFT_SHOULDER), e -> entityData.set(LEFT_SHOULDER, e)); + return ItemWrapper.simple(() -> leftShoulder, e -> leftShoulder = e); + } + + public ItemWrapper getRightShoulder() { + if (isAddedToWorld() && level().isClientSide()) + return ItemWrapper.simple(() -> entityData.get(RIGHT_SHOULDER), e -> entityData.set(RIGHT_SHOULDER, e)); + return ItemWrapper.simple(() -> rightShoulder, e -> rightShoulder = e); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemModel.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemModel.java index cff397b49..05d5f412a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemModel.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemModel.java @@ -6,14 +6,18 @@ import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.client.pose.MetalGolemPose; import dev.xkmc.modulargolems.content.client.pose.WeaponPose; +import dev.xkmc.modulargolems.content.client.weapon.IEntityModelWeapon; import dev.xkmc.modulargolems.content.entity.common.IGolemModel; import dev.xkmc.modulargolems.content.entity.common.IHeadedModel; +import net.minecraft.client.animation.AnimationDefinition; import net.minecraft.client.model.HierarchicalModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.world.entity.AnimationState; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -63,18 +67,40 @@ public void copyFrom(MetalGolemModel other) { } public void setupAnim(MetalGolemEntity entity, float f1, float f2, float f3, float f4, float f5) { + root.resetPose(); this.head.yRot = f4 * ((float) Math.PI / 180F); this.head.xRot = f5 * ((float) Math.PI / 180F); this.rightLeg.xRot = -1.5F * Mth.triangleWave(f1, 13.0F) * f2; this.leftLeg.xRot = 1.5F * Mth.triangleWave(f1, 13.0F) * f2; this.rightLeg.yRot = 0.0F; this.leftLeg.yRot = 0.0F; + this.rightLeg.zRot = 0.0F; + this.leftLeg.zRot = 0.0F; + if (this.riding) { + this.rightLeg.xRot = -1.4137167F; + this.rightLeg.yRot = ((float) Math.PI / 10F); + this.rightLeg.zRot = 0.07853982F; + this.leftLeg.xRot = -1.4137167F; + this.leftLeg.yRot = (-(float) Math.PI / 10F); + this.leftLeg.zRot = -0.07853982F; + } + } + + @Override + public void animate(AnimationState state, AnimationDefinition def, float tick) { + super.animate(state, def, tick); } public void prepareMobModel(MetalGolemEntity entity, float bob, float speed, float pTick) { MetalGolemPose pose = MetalGolemPose.DEFAULT; - if (!entity.getMainHandItem().isEmpty()) { + ItemStack stack = entity.getMainHandItem(); + if (!stack.isEmpty()) { pose = WeaponPose.WEAPON; + if (stack.getItem() instanceof IEntityModelWeapon weapon) { + var id = weapon.getPoseId(); + if (id != null && MetalGolemPose.MAP.containsKey(id)) + pose = MetalGolemPose.MAP.get(id); + } } int atkTick = entity.getAttackAnimationTick(); if (atkTick > 0) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemRenderer.java index 7fad6ac67..31236c8a9 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemRenderer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/MetalGolemRenderer.java @@ -5,6 +5,7 @@ import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemRenderer; import dev.xkmc.modulargolems.content.entity.common.GolemBannerLayer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.item.ItemDisplayContext; import net.minecraftforge.api.distmarker.Dist; @@ -42,6 +43,9 @@ protected static void transform(PoseStack stack, ItemDisplayContext transform, @ stack.translate(0, -0.15, 0); return; } + default: + stack.translate(0, 0, 0.5); + break; } stack.mulPose(Axis.ZP.rotationDegrees(135)); stack.mulPose(Axis.YP.rotationDegrees(-155)); @@ -81,4 +85,9 @@ protected void setupRotations(MetalGolemEntity entity, PoseStack stack, float v1 } } + @Override + public void render(MetalGolemEntity entity, float f1, float f2, PoseStack stack, MultiBufferSource source, int i) { + super.render(entity, f1, f2, stack, source, i); + BeaconRenderer.renderGolemBeacon(entity, stack, source, f2); + } } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/TargetingAnimState.java b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/TargetingAnimState.java new file mode 100644 index 000000000..8fd3749c3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/metalgolem/TargetingAnimState.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.content.entity.metalgolem; + +import dev.xkmc.l2serial.serialization.SerialClass; + +@SerialClass +public class TargetingAnimState { + + @SerialClass.SerialField(toClient = true) + public int lastTargetTime, lastNoTargetTime, lastTick; + + @SerialClass.SerialField(toClient = true) + public boolean targeting = false; + + public void tick(MetalGolemEntity e) { + if (lastTick != e.tickCount + 1) { + int diff = e.tickCount - lastTick - 1; + lastTargetTime += diff; + lastNoTargetTime += diff; + } + lastTick = e.tickCount; + + var pos = e.getTargetAimPos(); + boolean prevTargeting = targeting; + targeting = pos.length() > 0; + if (!targeting && prevTargeting) { + lastTargetTime = lastTick - 1; + } + if (targeting && !prevTargeting) { + lastNoTargetTime = lastTick - 1; + } + } + + public int getStartingAnim() { + if (!targeting) return -1; + return lastTick - lastNoTargetTime; + } + + public int getEndingAnim() { + if (targeting) return -1; + return lastTick - lastTargetTime; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserEntity.java b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserEntity.java new file mode 100644 index 000000000..bb9a9e1f2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserEntity.java @@ -0,0 +1,144 @@ +package dev.xkmc.modulargolems.content.entity.misc; + +import dev.xkmc.l2library.base.BaseEntity; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.ranged.CannonPoseUtil; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGDamageTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +@SerialClass +public class BeaconLaserEntity extends BaseEntity implements OwnableEntity { + + public static final EntityDataAccessor OWNER_ID = SynchedEntityData.defineId(BeaconLaserEntity.class, EntityDataSerializers.INT); + + @SerialClass.SerialField + public UUID owner; + @SerialClass.SerialField + public int life; + @SerialClass.SerialField + public float len; + @SerialClass.SerialField + public boolean right; + @SerialClass.SerialField + private Vec3 lastTarget = Vec3.ZERO; + + public LivingEntity ownerCache; + + private Set hit = new HashSet<>(); + + + public BeaconLaserEntity(EntityType type, Level level) { + super(type, level); + } + + public BeaconLaserEntity(EntityType type, Level level, LivingEntity owner, int life, boolean right) { + super(type, level); + this.owner = owner.getUUID(); + ownerCache = owner; + entityData.set(OWNER_ID, owner.getId()); + this.life = life; + this.right = right; + setup(owner); + } + + public void setup(LivingEntity le) { + if (!(le instanceof MetalGolemEntity e)) return; + var hand = right ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + var pos = CannonPoseUtil.BEACON_CANNON.getOrigin(e, hand); + var rot = CannonPoseUtil.BEACON_CANNON.getAngle(e, hand); + var dst = e.getTargetAimPos().add(e.position()).subtract(pos).normalize().scale(35).add(pos); + var hit = e.level().clip(new ClipContext(pos, dst, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null)); + len = (float) hit.getLocation().subtract(pos).length(); + lastTarget = hit.getLocation(); + setPos(pos); + setYRot(rot[0] * Mth.RAD_TO_DEG); + setXRot(rot[1] * Mth.RAD_TO_DEG); + } + + @Override + protected void defineSynchedData() { + entityData.define(OWNER_ID, -1); + } + + @Override + public void tick() { + var owner = getOwner(); + if (!level().isClientSide() && (owner == null || !owner.isAlive() || tickCount > life)) { + discard(); + return; + } + if (owner != null && tickCount == 0) setup(owner); + super.tick(); + if (!level().isClientSide() && owner instanceof MetalGolemEntity e) { + var pos = position(); + var dst = lastTarget; + var list = getEntityHitResult(level(), e, pos, dst, e.getScale() * 0.2f); + var source = new DamageSource(level().registryAccess().lookupOrThrow(Registries.DAMAGE_TYPE).getOrThrow(MGDamageTypes.BEACON), this, owner); + float dmg = (float) e.getAttributeValue(Attributes.ATTACK_DAMAGE) * MGConfig.COMMON.beaconCannonDamageFactor.get().floatValue(); + for (var x : list) { + if (x.hurt(source, dmg)) { + hit.add(x); + } + } + } + } + + public List getEntityHitResult(Level level, MetalGolemEntity owner, Vec3 start, Vec3 end, float radius) { + var list = level.getEntities(EntityTypeTest.forClass(LivingEntity.class), + new AABB(start, end).inflate(radius), x -> !hit.contains(x) && owner.canAttack(x) && owner.predicateTarget(x)); + var ans = new ArrayList(); + for (var e : list) { + AABB aabb = e.getBoundingBox().inflate(radius); + if (aabb.intersects(start, end) || aabb.contains(start) || aabb.contains(end)) { + ans.add(e); + } + } + return ans; + } + + @Override + public @Nullable UUID getOwnerUUID() { + return owner; + } + + @Override + public @Nullable LivingEntity getOwner() { + if (ownerCache != null) return ownerCache; + var ans = level().getEntity(entityData.get(OWNER_ID)); + if (ans instanceof LivingEntity le) { + ownerCache = le; + } + return ownerCache; + } + + @Override + public boolean shouldRender(double p_20296_, double p_20297_, double p_20298_) { + return true; + } + + @Override + public boolean shouldRenderAtSqrDistance(double p_19883_) { + return true; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserRenderer.java new file mode 100644 index 000000000..6a10448ee --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/BeaconLaserRenderer.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.content.entity.misc; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import dev.xkmc.modulargolems.content.entity.metalgolem.BeaconRenderer; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; + +public class BeaconLaserRenderer extends EntityRenderer { + + public BeaconLaserRenderer(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public boolean shouldRender(BeaconLaserEntity p_114491_, Frustum p_114492_, double p_114493_, double p_114494_, double p_114495_) { + return true; + } + + @Override + public void render(BeaconLaserEntity e, float yrot, float pTick, PoseStack pose, MultiBufferSource source, int light) { + if (!(e.getOwner() instanceof MetalGolemEntity golem)) return; + pose.pushPose(); + pose.mulPose(Axis.YP.rotationDegrees(e.getYRot())); + pose.mulPose(Axis.XP.rotationDegrees(e.getXRot() + 90)); + var perc = Math.max(0, 1 - 1f * e.tickCount / e.life); + var r = golem.getScale() * 0.5f * perc * perc; + pose.scale(r, 1, r); + BeaconRenderer.renderBeam(pose, source, 0, 1, e.len, DyeColor.WHITE.getTextureDiffuseColors()); + pose.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(BeaconLaserEntity e) { + return BeaconRenderer.BEAM_LOCATION; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/misc/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/package-info.java new file mode 100644 index 000000000..df4170ae2 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/misc/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.misc; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemMode.java b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemMode.java index 5f01efc29..57353ec2a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemMode.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemMode.java @@ -7,11 +7,13 @@ public class GolemMode { + public final String key; private final int id; private final boolean positioned, movable, wander; private final MGLangData lang, name; - protected GolemMode(boolean positioned, boolean movable, boolean wander, MGLangData lang, MGLangData name) { + protected GolemMode(String key, boolean positioned, boolean movable, boolean wander, MGLangData lang, MGLangData name) { + this.key = key; this.positioned = positioned; this.movable = movable; this.wander = wander; diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemModes.java b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemModes.java index 4bb31a030..28e944963 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemModes.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/GolemModes.java @@ -9,22 +9,22 @@ public class GolemModes { public static final List LIST = new ArrayList<>(); - public static final GolemMode FOLLOW = new GolemMode(false, true, false, + public static final GolemMode FOLLOW = new GolemMode("follow", false, true, false, MGLangData.MODE_FOLLOWING, MGLangData.MODE_FOLLOW); - public static final GolemMode GUARD = new GolemMode(true, true, true, + public static final GolemMode GUARD = new GolemMode("guard", true, true, true, MGLangData.MODE_GUARDING, MGLangData.MODE_GUARD); - public static final GolemMode STAND = new GolemMode(true, false, false, + public static final GolemMode STAND = new GolemMode("stand", true, false, false, MGLangData.MODE_STANDING, MGLangData.MODE_STAND); - public static final GolemMode FREE_WANDER = new GolemMode(false, true, true, + public static final GolemMode FREE_WANDER = new GolemMode("wander", false, true, true, MGLangData.MODE_WANDERING, MGLangData.MODE_WANDER); - public static final GolemMode SQUAD = new GolemMode(false, true, false, + public static final GolemMode SQUAD = new GolemMode("squad", false, true, false, MGLangData.MODE_TEAMING, MGLangData.MODE_SQUAD); - public static final GolemMode ROUTE = new PatrolMode(false, true, false, + public static final GolemMode ROUTE = new PatrolMode("patrol", false, true, false, MGLangData.MODE_PATROLLING, MGLangData.MODE_PATROL); public static GolemMode get(int i) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/PatrolMode.java b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/PatrolMode.java index 7b6905f6a..124040457 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/mode/PatrolMode.java +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/mode/PatrolMode.java @@ -2,11 +2,12 @@ import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.world.entity.Entity; public class PatrolMode extends GolemMode { - protected PatrolMode(boolean positioned, boolean movable, boolean wander, MGLangData lang, MGLangData name) { - super(positioned, movable, wander, lang, name); + protected PatrolMode(String key, boolean positioned, boolean movable, boolean wander, MGLangData lang, MGLangData name) { + super(key, positioned, movable, wander, lang, name); } @Override @@ -16,7 +17,9 @@ public double getStartFollowDistance(AbstractGolemEntity golem) { @Override public void tick(AbstractGolemEntity golem) { - if (!golem.isInWater() && !golem.onGround()) return; + Entity e = golem; + if (e.isPassenger()) e = e.getRootVehicle(); + if (!e.isInWater() && !e.onGround()) return; if (golem.getNavigation().isDone()) { golem.advancePatrolStage(); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/Estimator.java b/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/Estimator.java deleted file mode 100644 index 6f9d386c8..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/Estimator.java +++ /dev/null @@ -1,305 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.ranged; - -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -import java.util.function.Function; - -public class Estimator { - - private static final double ERR = 1e-5; - private final double gk, k, vk, g, v, x; - private final int max; - private final Vec3 dp, ev; - - public Estimator(double G, double K, Vec3 pos, double V, int maxt, Vec3 ep, Vec3 eV) { - gk = G / K; - g = G; - k = K; - vk = V / K; - v = V; - max = maxt; - ev = eV; - Vec3 vdp = ep.subtract(pos); - dp = vdp.add(Math.abs(vdp.x) < ERR ? ERR : 0, 0, Math.abs(vdp.z) < ERR ? ERR : 0); - x = dis(dp.x, dp.z); - } - - public static SolResult solve(Function f, double v, double min, double max, double err) { - double x0 = min; - double x1 = max; - double v0 = f.apply(x0); - double v1 = f.apply(x1); - if (Math.abs(v0 - v) < err) - return new SucSolRes(x0); - if (Math.abs(v1 - v) < err) - return new SucSolRes(x1); - if (v0 > v && v1 > v) - return SolType.OVER; - if (v0 < v && v1 < v) - return SolType.BELOW; - boolean inc = v0 < v1; - while (Math.abs(x1 - x0) > err) { - double x = (x0 + x1) / 2; - double vm = f.apply(x); - if (Math.abs(vm - v) < err) - return new SucSolRes(x); - if (v < vm && inc || v > vm && !inc) - x1 = x; - else - x0 = x; - } - return new SucSolRes((x0 + x1) / 2); - } - - public static SolResult solve(Function f2, Function f1, double v, double x0, - double x1, double err) { - SolResult sr = solve(f1, 0, x0, x1, err); - if (sr.getType() == SolType.ZERO) { - double tip = sr.getVal(); - double max = f2.apply(tip); - double v0 = f2.apply(x0); - double v1 = f2.apply(x1); - if (v > max && max > v0 && max > v1) - return SolType.OVER; - if (v < max && max < v0 && max < v1) - return SolType.BELOW; - if ((v - v0) * (v - max) < 0) - return solve(f2, v, x0, tip, err); - return solve(f2, v, tip, x1, err); - } - return solve(f2, v, x0, x1, err); - } - - private static double dis(double a, double b) { - return Math.sqrt(a * a + b * b); - } - - public EstiResult getAnswer() { - if (v * v - 2 * g * dp.y < 0) - return EstiType.CLOSE; - EstiResult ans = getIdeal(); - double[] data = new double[]{ans.getA(), ans.getT()}; - if (estimate(data, 0.1, 0.2, 3)) - return EstiType.FAIL; - if (estimate(data, 0.01, 0.2, 0.3)) - return EstiType.FAIL; - return new SucEstiRes(data[0], data[1], this); - - } - - public EstiResult getIdeal() { - double xt0 = Math.abs((Math.sqrt(v * v - 2 * g * dp.y) + v) / g); - double xt1 = Math.abs((-Math.sqrt(v * v - 2 * g * dp.y) + v) / g); - double mint = Math.max(0, Math.min(xt0, xt1) + ERR); - double maxt = Math.min(max, Math.max(xt0, xt1) - ERR); - SolResult r0 = solve(this::get_0, 0, mint, maxt, ERR); - SolResult r1; - if (r0.getType() == SolType.ZERO) { - double bp = r0.getVal(); - SolResult dr0 = solve(this::get_1, 0, mint, bp, ERR); - SolResult dr1 = solve(this::get_1, 0, bp, maxt, ERR); - if (dr0.getType() == SolType.ZERO) - r1 = dr0; - else - r1 = dr1; - } else - r1 = solve(this::get_1, 0, mint, maxt, ERR); - if (r1.getType() != SolType.ZERO) - return EstiType.FAIL; - double t0 = r1.getVal(); - double a0 = Math.asin(dp.y / v / t0 + g * t0 / 2 / v); - return new SucEstiRes(a0, t0, this); - } - - public double getX0(double a, double t) { - double xt = dp.x + ev.x * t; - double zt = dp.z + ev.z * t; - return vk * Math.cos(a) * (1 - Math.exp(-k * t)) - Math.sqrt(xt * xt + zt * zt); - } - - public double getY0(double a, double t) { - return -gk * t + (vk * Math.sin(a) + gk / k) * (1 - Math.exp(-k * t)) - dp.y - ev.y * t; - } - - private boolean estimate(double[] data, double DA, double DT, double ER) { - double a0 = data[0]; - double t0 = data[1]; - double x0 = getX0(a0, t0); - double y0 = getY0(a0, t0); - double len; - int count = 0; - boolean out = false; - while ((len = dis(x0, y0)) > ER) { - count++; - double da = x0 * getXA(a0, t0) + y0 * getYA(a0, t0); - double dt = x0 * getXT(a0, t0) + y0 * getYT(a0, t0); - if (da > 0) - a0 -= DA; - if (da < 0) - a0 += DA; - if (dt > 0) - t0 -= DT; - if (dt < 0) - t0 += DT; - if (out |= (a0 < -Math.PI / 2 || a0 > Math.PI / 2)) - break; - if (out |= (t0 < 0 || t0 > max)) - break; - x0 = getX0(a0, t0); - y0 = getY0(a0, t0); - if (Math.abs(dis(x0, y0) - len) < ERR) - break; - if (count > 100) - break; - } - data[0] = Mth.clamp(a0, -Math.PI / 2, Math.PI / 2); - data[1] = Mth.clamp(t0, 0, max); - return out; - } - - private double get_0(double t) { - double mul = dp.y / v / t + g * t / 2 / v; - double m = Math.sqrt(1 - mul * mul); - return v * m - v * t * mul / m * (g / 2 / v - dp.y / v / t / t); - } - - private double get_1(double t) { - double mul = dp.y / v / t + g * t / 2 / v; - return v * t * Math.sqrt(1 - mul * mul) - x; - } - - private double getXA(double a, double t) { - return -vk * Math.sin(a) * (1 - Math.exp(-k * t)); - } - - private double getXT(double a, double t) { - double xt = dp.x + ev.x * t; - double zt = dp.z + ev.z * t; - double ext = ((ev.x * ev.x + ev.z * ev.z) * t + dp.x * ev.x + dp.z * ev.z) / Math.sqrt(xt * xt + zt * zt); - return Math.cos(a) * v * Math.exp(-k * t) - ext; - } - - private double getYA(double a, double t) { - return vk * Math.cos(a) * (1 - Math.exp(-k * t)); - } - - private double getYT(double a, double t) { - return (Math.sin(a) * v + gk) * Math.exp(-k * t) - gk - ev.y; - } - - public enum EstiType implements EstiResult { - ZERO, FAIL, CLOSE; - - @Override - public double getA() { - return 0; - } - - @Override - public double getT() { - return 0; - } - - @Override - public EstiType getType() { - return this; - } - - @Override - public Vec3 getVec() { - return Vec3.ZERO; - } - } - - public enum SolType implements SolResult { - OVER, BELOW, ZERO; - - @Override - public SolType getType() { - return this; - } - - @Override - public double getVal() { - return 0; - } - } - - public interface EstiResult { - - double getA(); - - double getT(); - - EstiType getType(); - - Vec3 getVec(); - - } - - public interface SolResult { - - SolType getType(); - - double getVal(); - - } - - private static class SucEstiRes implements EstiResult { - - private final double a, t; - private final Estimator mov; - - private SucEstiRes(double A, double T, Estimator m) { - a = A; - t = T; - mov = m; - } - - @Override - public double getA() { - return a; - } - - @Override - public double getT() { - return t; - } - - @Override - public EstiType getType() { - return EstiType.ZERO; - } - - @Override - public Vec3 getVec() { - Vec3 fin = mov.dp.add(mov.ev.scale(t)).multiply(1, 0, 1); - double l = fin.length(); - double c = Math.cos(a); - return new Vec3(mov.v * c * fin.x / l, mov.v * Math.sin(a), mov.v * c * fin.z / l); - } - - } - - private static class SucSolRes implements SolResult { - - private final double val; - - private SucSolRes(double value) { - val = value; - } - - @Override - public SolType getType() { - return SolType.ZERO; - } - - @Override - public double getVal() { - return val; - } - - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemBowAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemBowAttackGoal.java deleted file mode 100644 index 0cf56953f..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemBowAttackGoal.java +++ /dev/null @@ -1,146 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.ranged; - -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.BowItem; - -import java.util.EnumSet; - -public class GolemBowAttackGoal extends Goal { - private final HumanoidGolemEntity mob; - private final double speedModifier; - private int attackIntervalMin; - private final float attackRadiusSqr; - private int attackTime = -1; - private int seeTime; - private boolean strafingClockwise; - private boolean strafingBackwards; - private int strafingTime = -1; - - public GolemBowAttackGoal(HumanoidGolemEntity pMob, double pSpeedModifier, int pAttackIntervalMin, float pAttackRadius) { - this.mob = pMob; - this.speedModifier = pSpeedModifier; - this.attackIntervalMin = pAttackIntervalMin; - this.attackRadiusSqr = pAttackRadius * pAttackRadius; - this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); - } - - public void setMinAttackInterval(int pAttackCooldown) { - this.attackIntervalMin = pAttackCooldown; - } - - /** - * Returns whether execution should begin. You can also read and cache any state necessary for execution in this - * method as well. - */ - public boolean canUse() { - return this.mob.getTarget() != null && this.isHoldingBow() && !this.mob.getProjectile( - this.mob.getItemInHand(mob.getWeaponHand())).isEmpty(); - } - - protected boolean isHoldingBow() { - return this.mob.isHolding(is -> is.getItem() instanceof BowItem); - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean canContinueToUse() { - return (this.canUse() || !this.mob.getNavigation().isDone()) && this.isHoldingBow(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void start() { - super.start(); - this.mob.setAggressive(true); - } - - /** - * Reset the task's internal state. Called when this task is interrupted by another one - */ - public void stop() { - super.stop(); - this.mob.setAggressive(false); - this.seeTime = 0; - this.attackTime = -1; - this.mob.stopUsingItem(); - } - - public boolean requiresUpdateEveryTick() { - return true; - } - - /** - * Keep ticking a continuous task that has already been started - */ - public void tick() { - LivingEntity livingentity = this.mob.getTarget(); - if (livingentity != null) { - double d0 = this.mob.distanceToSqr(livingentity.getX(), livingentity.getY(), livingentity.getZ()); - boolean flag = this.mob.getSensing().hasLineOfSight(livingentity); - boolean flag1 = this.seeTime > 0; - if (flag != flag1) { - this.seeTime = 0; - } - - if (flag) { - ++this.seeTime; - } else { - --this.seeTime; - } - - if (!(d0 > (double) this.attackRadiusSqr) && this.seeTime >= 20) { - this.mob.getNavigation().stop(); - ++this.strafingTime; - } else { - this.mob.getNavigation().moveTo(livingentity, this.speedModifier); - this.strafingTime = -1; - } - - if (this.strafingTime >= 20) { - if ((double) this.mob.getRandom().nextFloat() < 0.3D) { - this.strafingClockwise = !this.strafingClockwise; - } - - if ((double) this.mob.getRandom().nextFloat() < 0.3D) { - this.strafingBackwards = !this.strafingBackwards; - } - - this.strafingTime = 0; - } - - if (this.strafingTime > -1) { - if (d0 > (double) (this.attackRadiusSqr * 0.75F)) { - this.strafingBackwards = false; - } else if (d0 < (double) (this.attackRadiusSqr * 0.25F)) { - this.strafingBackwards = true; - } - - this.mob.getMoveControl().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F); - this.mob.lookAt(livingentity, 30.0F, 30.0F); - } else { - this.mob.getLookControl().setLookAt(livingentity, 30.0F, 30.0F); - } - - if (this.mob.isUsingItem()) { - if (!flag && this.seeTime < -60) { - this.mob.stopUsingItem(); - } else if (flag) { - int i = this.mob.getTicksUsingItem(); - if (i >= 20) { - this.mob.stopUsingItem(); - this.mob.performRangedAttack(livingentity, BowItem.getPowerForTime(i)); - this.attackTime = this.attackIntervalMin; - } - } - } else if (--this.attackTime <= 0 && this.seeTime >= -60) { - this.mob.startUsingItem(ProjectileUtil.getWeaponHoldingHand(this.mob, item -> item instanceof BowItem)); - } - - } - } -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemCrossbowAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemCrossbowAttackGoal.java deleted file mode 100644 index e1a88cafa..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemCrossbowAttackGoal.java +++ /dev/null @@ -1,150 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.ranged; - -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import net.minecraft.util.TimeUtil; -import net.minecraft.util.valueproviders.UniformInt; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.CrossbowItem; -import net.minecraft.world.item.ItemStack; - -import java.util.EnumSet; - -public class GolemCrossbowAttackGoal extends Goal { - public static final UniformInt PATHFINDING_DELAY_RANGE = TimeUtil.rangeOfSeconds(1, 2); - private final HumanoidGolemEntity mob; - private GolemCrossbowAttackGoal.CrossbowState crossbowState = GolemCrossbowAttackGoal.CrossbowState.UNCHARGED; - private final double speedModifier; - private final float attackRadiusSqr; - private int seeTime; - private int attackDelay; - private int updatePathDelay; - - public GolemCrossbowAttackGoal(HumanoidGolemEntity pMob, double pSpeedModifier, float pAttackRadius) { - this.mob = pMob; - this.speedModifier = pSpeedModifier; - this.attackRadiusSqr = pAttackRadius * pAttackRadius; - this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); - } - - /** - * Returns whether execution should begin. You can also read and cache any state necessary for execution in this - * method as well. - */ - public boolean canUse() { - return this.isValidTarget() && this.isHoldingCrossbow(); - } - - private boolean isHoldingCrossbow() { - return this.mob.isHolding(is -> is.getItem() instanceof CrossbowItem); - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean canContinueToUse() { - return this.isValidTarget() && (this.canUse() || !this.mob.getNavigation().isDone()) && this.isHoldingCrossbow(); - } - - private boolean isValidTarget() { - return this.mob.getTarget() != null && this.mob.getTarget().isAlive(); - } - - /** - * Reset the task's internal state. Called when this task is interrupted by another one - */ - public void stop() { - super.stop(); - this.mob.setAggressive(false); - this.mob.setTarget(null); - this.seeTime = 0; - if (this.mob.isUsingItem()) { - this.mob.stopUsingItem(); - this.mob.setChargingCrossbow(false); - CrossbowItem.setCharged(this.mob.getUseItem(), false); - } - - } - - public boolean requiresUpdateEveryTick() { - return true; - } - - /** - * Keep ticking a continuous task that has already been started - */ - public void tick() { - LivingEntity livingentity = this.mob.getTarget(); - if (livingentity != null) { - boolean flag = this.mob.getSensing().hasLineOfSight(livingentity); - boolean flag1 = this.seeTime > 0; - if (flag != flag1) { - this.seeTime = 0; - } - - if (flag) { - ++this.seeTime; - } else { - --this.seeTime; - } - - double d0 = this.mob.distanceToSqr(livingentity); - boolean flag2 = (d0 > (double) this.attackRadiusSqr || this.seeTime < 5) && this.attackDelay == 0; - if (flag2) { - --this.updatePathDelay; - if (this.updatePathDelay <= 0) { - this.mob.getNavigation().moveTo(livingentity, this.canRun() ? this.speedModifier : this.speedModifier * 0.5D); - this.updatePathDelay = PATHFINDING_DELAY_RANGE.sample(this.mob.getRandom()); - } - } else { - this.updatePathDelay = 0; - this.mob.getNavigation().stop(); - } - - this.mob.getLookControl().setLookAt(livingentity, 30.0F, 30.0F); - if (this.crossbowState == GolemCrossbowAttackGoal.CrossbowState.UNCHARGED) { - if (!flag2 && !this.mob.getProjectile(this.mob.getItemInHand(mob.getWeaponHand())).isEmpty()) { - this.mob.startUsingItem(ProjectileUtil.getWeaponHoldingHand(this.mob, item -> item instanceof CrossbowItem)); - this.crossbowState = GolemCrossbowAttackGoal.CrossbowState.CHARGING; - this.mob.setChargingCrossbow(true); - } - } else if (this.crossbowState == GolemCrossbowAttackGoal.CrossbowState.CHARGING) { - if (!this.mob.isUsingItem()) { - this.crossbowState = GolemCrossbowAttackGoal.CrossbowState.UNCHARGED; - } - - int i = this.mob.getTicksUsingItem(); - ItemStack itemstack = this.mob.getUseItem(); - if (i >= CrossbowItem.getChargeDuration(itemstack)) { - this.mob.releaseUsingItem(); - this.crossbowState = GolemCrossbowAttackGoal.CrossbowState.CHARGED; - this.attackDelay = 20 + this.mob.getRandom().nextInt(20); - this.mob.setChargingCrossbow(false); - } - } else if (this.crossbowState == GolemCrossbowAttackGoal.CrossbowState.CHARGED) { - --this.attackDelay; - if (this.attackDelay == 0) { - this.crossbowState = GolemCrossbowAttackGoal.CrossbowState.READY_TO_ATTACK; - } - } else if (this.crossbowState == GolemCrossbowAttackGoal.CrossbowState.READY_TO_ATTACK && flag) { - this.mob.performRangedAttack(livingentity, 1.0F); - ItemStack itemstack1 = this.mob.getItemInHand(ProjectileUtil.getWeaponHoldingHand(this.mob, item -> item instanceof CrossbowItem)); - CrossbowItem.setCharged(itemstack1, false); - this.crossbowState = GolemCrossbowAttackGoal.CrossbowState.UNCHARGED; - } - - } - } - - private boolean canRun() { - return this.crossbowState == GolemCrossbowAttackGoal.CrossbowState.UNCHARGED; - } - - enum CrossbowState { - UNCHARGED, - CHARGING, - CHARGED, - READY_TO_ATTACK - } -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemShooterHelper.java b/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemShooterHelper.java deleted file mode 100644 index 9fe614752..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemShooterHelper.java +++ /dev/null @@ -1,98 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.ranged; - -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import dev.xkmc.modulargolems.events.event.GolemThrowableEvent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.monster.Slime; -import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.item.ArrowItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.phys.HitResult; -import net.minecraftforge.common.MinecraftForge; - -import java.util.HashSet; - -public class GolemShooterHelper { - - private static final HashSet> BLACKLIST = new HashSet<>(); - - public static GolemThrowableEvent isValidThrowableWeapon(HumanoidGolemEntity golem, ItemStack stack, InteractionHand hand) { - if (stack.getEnchantmentLevel(Enchantments.LOYALTY) > 0) { - stack = stack.copy(); - var map = stack.getAllEnchantments(); - map.remove(Enchantments.LOYALTY); - EnchantmentHelper.setEnchantments(map, stack); - }//TODO find a cleaner approach - GolemThrowableEvent event = new GolemThrowableEvent(golem, stack, hand); - MinecraftForge.EVENT_BUS.post(event); - return event; - } - - @SuppressWarnings("ConstantConditions") - public static boolean arrowIsInfinite(ItemStack arrow, ItemStack bow) { - if (!(arrow.getItem() instanceof ArrowItem item)) { - return false; - } - if (BLACKLIST.contains(item.getClass())) { - return false; - } - try { - return item.isInfinite(arrow, bow, null); - } catch (NullPointerException npe) { - BLACKLIST.add(item.getClass()); - } - return false; - } - - public static void shootAimHelper(LivingEntity target, Projectile arrow) { - shootAimHelper(target, arrow, 3, 0.05); - } - - public static void shootAimHelper(LivingEntity target, Projectile arrow, double v, double g) { - double dx = target.getX() - arrow.getX(); - double dy = target.getY(0.5) - arrow.getY(); - double dz = target.getZ() - arrow.getZ(); - - double c = dx * dx + dz * dz + dy * dy; - boolean completed = false; - if (target instanceof Slime) { - var clip = target.level().clip(new ClipContext(target.position(), target.position().add(0, -3, 0), - ClipContext.Block.COLLIDER, ClipContext.Fluid.ANY, target)); - if (clip.getType() == HitResult.Type.BLOCK) { - dy += clip.getLocation().y() - target.getY(); - completed = true; - } - } - if (!completed) { - double rt = Math.sqrt(c) / v; - var tv = target.getDeltaMovement(); - dx += tv.x * rt; - dy += tv.y * rt; - dz += tv.z * rt; - } - - c = dx * dx + dz * dz + dy * dy; - - if (g > 0 && c > v * v * 4) { - double a = g * g / 4; - double b = dy * g - v * v; - - double delta = b * b - 4 * a * c; - if (delta > 0) { - double t21 = (-b + Math.sqrt(delta)) / (2 * a); - double t22 = (-b - Math.sqrt(delta)) / (2 * a); - if (t21 > 0 || t22 > 0) { - double t2 = t21 > 0 ? t22 > 0 ? Math.min(t21, t22) : t21 : t22; - arrow.shoot(dx, dy + g * t2 / 2, dz, (float) v, 0); - return; - } - } - } - arrow.shoot(dx, dy, dz, (float) v, 0); - } - -} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemTridentAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemTridentAttackGoal.java deleted file mode 100644 index 0f272d5c6..000000000 --- a/src/main/java/dev/xkmc/modulargolems/content/entity/ranged/GolemTridentAttackGoal.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.xkmc.modulargolems.content.entity.ranged; - -import dev.xkmc.modulargolems.content.entity.goals.GolemMeleeGoal; -import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.RangedAttackGoal; - -public class GolemTridentAttackGoal extends RangedAttackGoal { - private final HumanoidGolemEntity golem; - private final GolemMeleeGoal melee; - - public GolemTridentAttackGoal(HumanoidGolemEntity pRangedAttackMob, double pSpeedModifier, int pAttackInterval, float pAttackRadius, GolemMeleeGoal melee) { - super(pRangedAttackMob, pSpeedModifier, pAttackInterval, pAttackRadius); - this.golem = pRangedAttackMob; - this.melee = melee; - } - - /** - * Returns whether execution should begin. You can also read and cache any state necessary for execution in this - * method as well. - */ - public boolean canUse() { - LivingEntity livingentity = golem.getTarget(); - if (livingentity == null || !super.canUse()) return false; - double d0 = golem.distanceToSqr(livingentity.getX(), livingentity.getY(), livingentity.getZ()); - if (melee.canReachTarget(livingentity)) return false; - InteractionHand hand = golem.getWeaponHand(); - return GolemShooterHelper.isValidThrowableWeapon(this.golem, this.golem.getItemInHand(hand), hand).isThrowable(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void start() { - super.start(); - this.golem.setAggressive(true); - this.golem.startUsingItem(golem.getWeaponHand()); - } - - /** - * Reset the task's internal state. Called when this task is interrupted by another one - */ - public void stop() { - super.stop(); - this.golem.stopUsingItem(); - this.golem.setAggressive(false); - } -} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/Golem3DTargetGoal.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/Golem3DTargetGoal.java new file mode 100644 index 000000000..859cc0d38 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/Golem3DTargetGoal.java @@ -0,0 +1,49 @@ +package dev.xkmc.modulargolems.content.entity.targeting; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; + +public class Golem3DTargetGoal extends NearestAttackableTargetGoal { + + private final AbstractGolemEntity self; + + public Golem3DTargetGoal(AbstractGolemEntity self, int interval) { + super(self, LivingEntity.class, interval, false, false, self::predicateTarget); + this.self = self; + } + + public @Nullable LivingEntity getTarget() { + return target; + } + + public void findTarget() { + if (self.getControllingPassenger() instanceof AbstractGolemEntity rider) { + target = rider.getTarget(); + return; + } + var entities = self.level().getEntitiesOfClass(this.targetType, this.getTargetSearchArea(this.getFollowDistance())); + var list = new ArrayList(); + var cen = self.getEyePosition(); + var box = self.getBoundingBox(); + for (var e : entities) { + if (!targetConditions.test(self, e)) continue; + var reason = TargetManager.predicateTarget(self, e); + if (reason == null) continue; + var ebox = e.getBoundingBox(); + double yDiff = Math.max(ebox.minY - box.maxY, box.minY - ebox.maxY); + list.add(new TargetingStatus(e, reason, TargetManager.get(self).getPrevCount(self, e), e.distanceToSqr(cen), yDiff)); + } + target = TargetManager.findBestTarget(self, list); + } + + @Override + protected AABB getTargetSearchArea(double r) { + return this.mob.getBoundingBox().inflate(r, r, r); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetEntry.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetEntry.java new file mode 100644 index 000000000..e6a766034 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetEntry.java @@ -0,0 +1,51 @@ +package dev.xkmc.modulargolems.content.entity.targeting; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; + +public class TargetEntry { + + private long gameTick; + private Set prevSet = new LinkedHashSet<>(), currentSet = new LinkedHashSet<>(); + + private void tick(long gameTime) { + if (gameTick == gameTime) return; + if (gameTick > gameTime) { + gameTick = gameTime; + return; + } + if (gameTime > gameTick + 1) { + prevSet = new LinkedHashSet<>(); + currentSet = new LinkedHashSet<>(); + } else { + prevSet = currentSet; + currentSet = new LinkedHashSet<>(); + } + gameTick = gameTime; + } + + public void put(long time, AbstractGolemEntity self) { + tick(time); + currentSet.add(self.getUUID()); + } + + public void tick(long time, AbstractGolemEntity self) { + tick(time); + currentSet.add(self.getUUID()); + } + + public int get(long time, AbstractGolemEntity self) { + tick(time); + int n = prevSet.size(); + if (prevSet.contains(self.getUUID())) n--; + return n; + } + + public long getLastTick() { + return gameTick; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetManager.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetManager.java new file mode 100644 index 000000000..8349df770 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetManager.java @@ -0,0 +1,106 @@ +package dev.xkmc.modulargolems.content.entity.targeting; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.hostile.HostileGolemRegistry; +import dev.xkmc.modulargolems.content.item.card.DefaultFilterCard; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import static dev.xkmc.modulargolems.content.entity.targeting.TargetingReason.*; + +public class TargetManager { + + private static final Map> MAP = new ConcurrentHashMap<>(); + private static final TargetManager DUMMY = new TargetManager(); + + public static TargetManager get(AbstractGolemEntity golem) { + var level = golem.level(); + if (!(level instanceof ServerLevel sl)) return DUMMY; + var id = golem.getOwnerUUID(); + if (id == null) return DUMMY; + return MAP.computeIfAbsent(sl, e -> new LinkedHashMap<>()) + .computeIfAbsent(id, e -> new TargetManager()); + } + + @Nullable + public static TargetingReason predicateTarget(AbstractGolemEntity self, LivingEntity e) { + if (!e.isAlive()) return null; + if (self.forcedTarget == e) return FORCED; + if (self.getLastHurtByMob() == e) return LAST_HURT; + if (isFriend(self, e.getLastHurtMob())) return HURT; + if (e instanceof Mob mob) { + if (isFriend(self, mob.getTarget())) return MALICE; + } + if (wantsToAttack(self, e)) return PREY; + if (isFriend(self, e.getLastHurtByMob())) return PREVIOUS; + return null; + } + + private static boolean isFriend(AbstractGolemEntity self, @Nullable Entity target) { + if (target == null) return false; + return target == self.getOwner() || target == self.getLeader() || target.isAlliedTo(self) || self.isAlliedTo(target); + } + + public static boolean wantsToAttack(AbstractGolemEntity self, LivingEntity e) { + var config = self.getConfigEntry(null); + if (config == null) { + var opt = HostileGolemRegistry.tryGetFaction(self); + if (opt.isPresent()) return opt.get().hostileGolemAttacks(self, e); + return DefaultFilterCard.defaultPredicate(e); + } else { + return config.targetFilter.aggressiveToward(e); + } + } + + @Nullable + public static LivingEntity findBestTarget(AbstractGolemEntity self, ArrayList list) { + double best = -100000; + LivingEntity ans = null; + for (var e : list) { + double score = e.eval(self); + if (score > best) { + best = score; + ans = e.target(); + } + } + return ans; + } + + private final LinkedHashMap map = new LinkedHashMap<>(); + private long prevTime; + + public void onSetTarget(AbstractGolemEntity self, LivingEntity target) { + if (self.getControllingPassenger() instanceof AbstractGolemEntity) + return; + map.computeIfAbsent(target.getUUID(), k -> new TargetEntry()) + .put(self.level().getGameTime(), self); + } + + public void tickTarget(AbstractGolemEntity self, LivingEntity target) { + long time = self.level().getGameTime(); + if (time > prevTime + 5) { + prevTime = time; + Set toRemove = new HashSet<>(); + for (var ent : map.entrySet()) { + if (ent.getValue().getLastTick() < time - 5) { + toRemove.add(ent.getKey()); + } + } + for (var e : toRemove) { + map.remove(e); + } + } + map.computeIfAbsent(target.getUUID(), k -> new TargetEntry()).tick(time, self); + } + + public int getPrevCount(AbstractGolemEntity self, LivingEntity target) { + return map.computeIfAbsent(target.getUUID(), k -> new TargetEntry()).get(self.level().getGameTime(), self); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingReason.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingReason.java new file mode 100644 index 000000000..95576a5b1 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingReason.java @@ -0,0 +1,5 @@ +package dev.xkmc.modulargolems.content.entity.targeting; + +public enum TargetingReason { + FORCED, LAST_HURT, HURT, MALICE, PREY, PREVIOUS +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingStatus.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingStatus.java new file mode 100644 index 000000000..28b1b51ae --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/TargetingStatus.java @@ -0,0 +1,23 @@ +package dev.xkmc.modulargolems.content.entity.targeting; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; + +public record TargetingStatus(LivingEntity target, TargetingReason reason, int oldCount, double distSqr, double yDiff) { + + public double eval(AbstractGolemEntity self) { + double score = switch (reason()) { + case FORCED -> 1000; + case LAST_HURT -> 180.5; + case HURT -> 180.2; + case MALICE -> 180; + case PREY -> 150; + case PREVIOUS -> 120; + }; + score -= Mth.clamp(Math.sqrt(distSqr()) / 2, 0, 10); + score -= oldCount() * 10; + score -= Mth.clamp(yDiff() / 3, 0, 5); + return score; + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/package-info.java new file mode 100644 index 000000000..761d66ede --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/entity/targeting/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.entity.targeting; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/card/ConfigCard.java b/src/main/java/dev/xkmc/modulargolems/content/item/card/ConfigCard.java index a0b08820c..97ff0b2fb 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/card/ConfigCard.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/card/ConfigCard.java @@ -42,6 +42,19 @@ public static UUID getUUID(ItemStack stack) { return null; } + public static boolean filterMatch(Player player, AbstractGolemEntity golem) { + ItemStack stack = player.getOffhandItem(); + if (stack.getItem() instanceof ConfigCard card) { + UUID uuid = getUUID(stack); + if (uuid != null) { + return Optional.ofNullable(golem.getConfigEntry(null)) + .map(x -> x.getID().equals(uuid) && x.getColor() == card.color.getId()) + .orElse(false); + } + } + return false; + } + public static Predicate> getFilter(Player player) { ItemStack stack = player.getOffhandItem(); if (stack.getItem() instanceof ConfigCard card) { @@ -67,8 +80,24 @@ public ConfigCard(Properties properties, DyeColor color) { this.color = color; } + public int getColor() { + return color.getId(); + } + @Override public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity target, InteractionHand hand) { + if (player.level() instanceof ServerLevel sl) { + UUID uuid = getUUID(stack); + if (uuid == null) { + stack.getOrCreateTag().putUUID(KEY_OWNER, uuid = player.getUUID()); + } + if (player.getUUID().equals(uuid)) { + var entry = GolemConfigStorage.get(sl).getOrCreateStorage(uuid, color.getId(), stack.getHoverName()); + entry.setName(stack.getHoverName(), sl); + entry.heartBeat(sl, (ServerPlayer) player); + } + } + if (target instanceof AbstractGolemEntity golem) { if (!golem.canModify(player)) return InteractionResult.FAIL; if (player.level().isClientSide()) return InteractionResult.SUCCESS; diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/card/DefaultFilterCard.java b/src/main/java/dev/xkmc/modulargolems/content/item/card/DefaultFilterCard.java index 13aae2afe..577e475d9 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/card/DefaultFilterCard.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/card/DefaultFilterCard.java @@ -1,5 +1,6 @@ package dev.xkmc.modulargolems.content.item.card; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.init.data.MGLangData; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResultHolder; @@ -18,7 +19,7 @@ public class DefaultFilterCard extends TargetFilterCard { public static boolean defaultPredicate(LivingEntity e) { - return e instanceof Enemy && !(e instanceof Creeper); + return e instanceof Enemy && !(e instanceof Creeper) || e instanceof AbstractGolemEntity golem && golem.isHostile(); } public DefaultFilterCard(Properties properties) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/card/PathRecordCard.java b/src/main/java/dev/xkmc/modulargolems/content/item/card/PathRecordCard.java index c3a9015cb..895e74ee4 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/card/PathRecordCard.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/card/PathRecordCard.java @@ -1,6 +1,5 @@ package dev.xkmc.modulargolems.content.item.card; -import com.simibubi.create.Create; import dev.xkmc.l2library.util.nbt.ItemCompoundTag; import dev.xkmc.l2serial.serialization.codec.TagCodec; import dev.xkmc.modulargolems.content.client.outline.BlockOutliner; @@ -21,7 +20,6 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.fml.ModList; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -75,13 +73,35 @@ public InteractionResult useOn(UseOnContext ctx) { ItemStack stack = ctx.getItemInHand(); Level level = ctx.getLevel(); if (!level.isClientSide()) { + Player player = ctx.getPlayer(); + if (player != null && player.isShiftKeyDown()) { + stack.setTag(null); + player.sendSystemMessage(MGLangData.PATH_CLEAR.get()); + return InteractionResult.SUCCESS; + } BlockPos pos = ctx.getClickedPos(); BlockState state = level.getBlockState(pos); if (!state.getShape(level, pos).isEmpty()) { pos = pos.relative(ctx.getClickedFace()); } - Player player = ctx.getPlayer(); - if (togglePos(stack, new Pos(level.dimension().location(), pos))) { + var list = getList(stack); + var entry = new Pos(level.dimension().location(), pos); + if (!list.isEmpty()) { + var last = list.get(list.size() - 1); + if (!entry.level.equals(last.level)) { + if (player != null) { + player.sendSystemMessage(MGLangData.PATH_ERR_DIM.get()); + } + return InteractionResult.FAIL; + } + if (!list.contains(entry) && entry.pos.distSqr(last.pos) > 256) { + if (player != null) { + player.sendSystemMessage(MGLangData.PATH_ERR_DIST.get()); + } + return InteractionResult.FAIL; + } + } + if (togglePos(stack, entry)) { if (player != null) { player.sendSystemMessage(MGLangData.PATH_ADD.get()); } @@ -96,7 +116,7 @@ public InteractionResult useOn(UseOnContext ctx) { @Override public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { - if (!ModList.get().isLoaded(Create.ID)) return; + if (selected && entity instanceof Player player && level.isClientSide()) { BlockOutliner.drawOutlines(player, getList(stack)); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomDropGolemWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomDropGolemWeapon.java new file mode 100644 index 000000000..b69bc2ab6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomDropGolemWeapon.java @@ -0,0 +1,11 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.item.ItemStack; + +public interface CustomDropGolemWeapon { + + boolean dropCustomDeathLoot(AbstractGolemEntity self, MetalGolemEntity attacker, ItemStack stack, DamageSource source); +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomSweepBoxWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomSweepBoxWeapon.java new file mode 100644 index 000000000..6d3586d69 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/CustomSweepBoxWeapon.java @@ -0,0 +1,12 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; + +public interface CustomSweepBoxWeapon { + + AABB getAttackBoundingBox(MetalGolemEntity self, Entity target, double range, ItemStack stack); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorItem.java new file mode 100644 index 000000000..e2ff29c7c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorItem.java @@ -0,0 +1,65 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.DyeableLeatherItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.UUID; + +public class DogGolemArmorItem extends GolemEquipmentItem implements DyeableLeatherItem { + + private final ArmorMaterial mat; + + public DogGolemArmorItem(Properties properties, ArmorMaterial mat, int defense, float toughness) { + super(properties, EquipmentSlot.CHEST, GolemTypes.ENTITY_DOG::get, builder -> { + UUID uuid = UUID.get(EquipmentSlot.CHEST); + builder.put(Attributes.ARMOR, new AttributeModifier(uuid, "Armor modifier", defense, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(uuid, "Armor toughness", toughness, AttributeModifier.Operation.ADDITION)); + }); + this.mat = mat; + } + + protected String namespace(String def) { + return def; + } + + public ResourceLocation getModelTexture(LivingEntity user, boolean override) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this); + assert rl != null; + String name = mat.getName(); + if (override) name += "_overlay"; + return new ResourceLocation(namespace(rl.getNamespace()), "textures/entity/dog_armor/" + name + ".png"); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return true; + } + + @Override + public int getEnchantmentValue() { + return mat.getEnchantmentValue(); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment.category == EnchantmentCategory.ARMOR || + enchantment.category == EnchantmentCategory.ARMOR_HEAD || + enchantment.category == EnchantmentCategory.ARMOR_CHEST || + enchantment.category == EnchantmentCategory.ARMOR_LEGS || + enchantment.category == EnchantmentCategory.ARMOR_FEET) { + return true; + } + return super.canApplyAtEnchantingTable(stack, enchantment); + } + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorSpecialRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorSpecialRenderer.java new file mode 100644 index 000000000..e7ffae84a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/DogGolemArmorSpecialRenderer.java @@ -0,0 +1,24 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.dog.DogArmorRenderer; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemModel; +import dev.xkmc.modulargolems.content.entity.metalgolem.GolemEquipmentRenderer; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.item.ItemStack; + +import java.util.Optional; + +public interface DogGolemArmorSpecialRenderer { + + void render(DogGolemEntity entity, ItemStack stack, PoseStack pose, MultiBufferSource source, int light, float pTick, DogGolemModel renderer); + + interface ProviderItem { + + Optional getSpecialRenderer(); + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/ExtraAttackGolemWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/ExtraAttackGolemWeapon.java new file mode 100644 index 000000000..f7d565209 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/ExtraAttackGolemWeapon.java @@ -0,0 +1,10 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.entity.Entity; + +public interface ExtraAttackGolemWeapon { + + boolean repeatAttack(MetalGolemEntity self, Entity target, float damage, boolean prev); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemEquipmentItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemEquipmentItem.java index c3256177c..b4b393897 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemEquipmentItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemEquipmentItem.java @@ -5,15 +5,16 @@ import dev.xkmc.l2library.util.math.MathHelper; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.data.MGTagGen; import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -22,12 +23,11 @@ import java.util.EnumMap; import java.util.List; -import java.util.Map; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Supplier; -public abstract class GolemEquipmentItem extends Item { +public abstract class GolemEquipmentItem extends Item implements IGolemEquipmentItem { protected static final EnumMap UUID; @@ -49,65 +49,55 @@ public GolemEquipmentItem(Properties properties, EquipmentSlot slot, Supplier builder = ImmutableMultimap.builder(); attr.accept(builder); + addExtraModifiers(builder); this.defaultModifiers = builder.build(); } + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + } + public EquipmentSlot getSlot() { return slot; } + @Override + public @Nullable EquipmentSlot getEquipmentSlot(ItemStack stack) { + return slot; + } + + @Override + public boolean canEquip(ItemStack stack, EquipmentSlot slot, Entity entity) { + return isFor(entity.getType()) && super.canEquip(stack, slot, entity); + } + public boolean isFor(EntityType type) { return this.type.get() == type; } public Multimap getGolemModifiers(ItemStack stack, @Nullable Entity entity, EquipmentSlot slot) { - if (this.slot == slot && (entity == null || this.type.get() == entity.getType())) { - return getDefaultGolemModifiers(stack, slot); - } else { + if (entity != null && this.type.get() != entity.getType()) return ImmutableMultimap.of(); - } + return stack.getAttributeModifiers(slot); } - protected Multimap getDefaultGolemModifiers(ItemStack stack, EquipmentSlot slot) { - return defaultModifiers; + @Deprecated + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + return slot == this.slot ? defaultModifiers : super.getDefaultAttributeModifiers(slot); } @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { - list.add(MGLangData.GOLEM_EQUIPMENT.get(type.get().getDescription().copy().withStyle(ChatFormatting.GOLD))); - Multimap multimap = getGolemModifiers(stack, null, slot); - if (multimap.isEmpty()) return; - - list.add(CommonComponents.EMPTY); - list.add(Component.translatable("item.modifiers." + slot.getName()).withStyle(ChatFormatting.GRAY)); - - for (Map.Entry entry : multimap.entries()) { - AttributeModifier attr = entry.getValue(); - double val = attr.getAmount(); - - double disp; - if (attr.getOperation() != AttributeModifier.Operation.MULTIPLY_BASE && - attr.getOperation() != AttributeModifier.Operation.MULTIPLY_TOTAL) { - if (entry.getKey().equals(Attributes.KNOCKBACK_RESISTANCE)) { - disp = val * 10; - } else { - disp = val; - } - } else { - disp = val * 100; - } - if (val > 0) { - list.add(Component.translatable("attribute.modifier.plus." + - attr.getOperation().toValue(), ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(disp), - Component.translatable(entry.getKey().getDescriptionId())).withStyle(ChatFormatting.BLUE)); - } else if (val < 0) { - disp *= -1; - list.add(Component.translatable("attribute.modifier.take." + - attr.getOperation().toValue(), ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(disp), - Component.translatable(entry.getKey().getDescriptionId())).withStyle(ChatFormatting.RED)); - - } - } + list.add(MGLangData.GOLEM_EQUIPMENT.get(type.get().getDescription().copy().withStyle(ChatFormatting.GOLD)) + .withStyle(ChatFormatting.UNDERLINE)); + } + + @Override + public boolean canBeHurtBy(DamageSource source) { + return !getDefaultInstance().is(MGTagGen.TOUGH_ITEM) || !( + source.is(DamageTypeTags.IS_FIRE) || + source.is(DamageTypeTags.IS_EXPLOSION) || + source.is(DamageTypeTags.IS_LIGHTNING)); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemItemSpecialRenderer.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemItemSpecialRenderer.java new file mode 100644 index 000000000..4e8ba8bce --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemItemSpecialRenderer.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.xkmc.modulargolems.content.entity.metalgolem.GolemEquipmentRenderer; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.item.ItemStack; + +import java.util.Optional; + +public interface GolemItemSpecialRenderer { + + void render(MetalGolemEntity entity, ItemStack stack, PoseStack pose, MultiBufferSource source, int light, float pTick, GolemEquipmentRenderer renderer); + + interface ProviderItem { + + Optional getSpecialRenderer(); + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemModelItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemModelItem.java index e6a06d9dd..baf0c7c2a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemModelItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/GolemModelItem.java @@ -1,11 +1,25 @@ package dev.xkmc.modulargolems.content.item.equipments; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; public interface GolemModelItem { - ResourceLocation getModelTexture(); + ResourceLocation getModelTexture(LivingEntity user); ResourceLocation getModelPath(); + default ResourceLocation getEmissiveModelTexture(LivingEntity user) { + return getModelPath(); + } + + default boolean emissive(LivingEntity user, ItemStack stack) { + return emissive(); + } + + default boolean emissive() { + return false; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IAttackListenerWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IAttackListenerWeapon.java new file mode 100644 index 000000000..079d5ae01 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IAttackListenerWeapon.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.item.ItemStack; + +public interface IAttackListenerWeapon { + + default void onHurt(AttackCache cache, DamageSource source, MetalGolemEntity e, ItemStack stack) { + + } + + default void onAttack(AttackCache cache, DamageSource source, MetalGolemEntity e, ItemStack stack) { + + } + + default void onDamage(AttackCache cache, DamageSource source, MetalGolemEntity e, ItemStack stack) { + + } + + default void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand) { + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemEquipmentItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemEquipmentItem.java new file mode 100644 index 000000000..0436d68fe --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemEquipmentItem.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import com.google.common.collect.Multimap; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +public interface IGolemEquipmentItem { + + boolean isFor(EntityType type); + + EquipmentSlot getSlot(); + + Multimap getGolemModifiers(ItemStack stack, @Nullable Entity user, EquipmentSlot slot); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemModifierItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemModifierItem.java new file mode 100644 index 000000000..169acd37f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/IGolemModifierItem.java @@ -0,0 +1,23 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface IGolemModifierItem { + + List getModifier(ItemStack stack, @Nullable AbstractGolemEntity golem); + + default void appendModifierText(ItemStack stack, List list) { + var modifiers = getModifier(stack, null); + for (var ins : modifiers) { + list.add(ins.mod().getTooltip(ins.level())); + list.addAll(ins.mod().getDetail(ins.level())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemArmorItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemArmorItem.java index 88d040bd4..300da1f4a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemArmorItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemArmorItem.java @@ -3,6 +3,7 @@ import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; @@ -26,10 +27,20 @@ public MetalGolemArmorItem(Properties properties, ArmorItem.Type type, int defen this.model = model; } - public ResourceLocation getModelTexture() { + protected String namespace(String def) { + return def; + } + + public ResourceLocation getModelTexture(LivingEntity user) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this); + assert rl != null; + return new ResourceLocation(namespace(rl.getNamespace()), "textures/equipments/" + rl.getPath() + ".png"); + } + + public ResourceLocation getEmissiveModelTexture(LivingEntity user) { ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this); assert rl != null; - return new ResourceLocation(rl.getNamespace(), "textures/equipments/" + rl.getPath() + ".png"); + return new ResourceLocation(namespace(rl.getNamespace()), "textures/equipments/" + rl.getPath() + "_emissive.png"); } @Override diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemBeaconItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemBeaconItem.java index 326cea83c..756eb643c 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemBeaconItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemBeaconItem.java @@ -1,46 +1,73 @@ package dev.xkmc.modulargolems.content.item.equipments; +import com.google.common.collect.ImmutableMultimap; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +public class MetalGolemBeaconItem extends MetalGolemArmorItem implements TickEquipmentItem { + + private static Component effDesc(MobEffect eff, int amp) { + MutableComponent lang = Component.translatable(eff.getDescriptionId()); + if (amp > 0) { + lang = Component.translatable("potion.withAmplifier", lang, + Component.translatable("potion.potency." + amp)); + } + return lang.withStyle(eff.getCategory().getTooltipFormatting()); + } + + public MetalGolemBeaconItem(Properties properties, int def, int tough, ResourceLocation model) { + super(properties, ArmorItem.Type.BOOTS, def, tough, model); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.BEACON_BOOTS.get( + effDesc(MobEffects.DAMAGE_BOOST, 1), + effDesc(MobEffects.DAMAGE_RESISTANCE, 1) + )); + super.appendHoverText(stack, level, list, flag); + } + + @Override + public void tick(ItemStack stack, Level level, Entity user) { + if (level.getGameTime() % 80D != 0) + return; + if (user instanceof AbstractGolemEntity golem) { + double range = 40; + AABB aabb = golem.getBoundingBox().inflate(range).expandTowards(0D, level.getHeight(), 0D); + for (LivingEntity e : level.getEntitiesOfClass(LivingEntity.class, aabb, golem::isAlliedTo)) { + e.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 200, 1, true, true)); + e.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 200, 1, true, true)); + e.heal(2); + } + } + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, "Armor modifier", -0.5f, AttributeModifier.Operation.MULTIPLY_TOTAL)); + } -public class MetalGolemBeaconItem extends GolemEquipmentItem implements TickEquipmentItem { - private final int beaconLevel; - - public MetalGolemBeaconItem(Properties properties, int beaconLevel) { - super(properties, EquipmentSlot.FEET, GolemTypes.ENTITY_GOLEM::get, builder -> {}); - this.beaconLevel = beaconLevel; - } - - public int getBeaconLevel() { - return this.beaconLevel; - } - - @Override - public void tick(ItemStack stack, Level level, Entity entity) { - if (level.getGameTime() % 80D != 0) - return; - if (stack.getItem() instanceof MetalGolemBeaconItem beacon && entity instanceof AbstractGolemEntity golem) { - double range = this.getBeaconLevel() * 10D + 10D; - int time = (9 + this.getBeaconLevel() * 2) * 20; - AABB aabb = golem.getBoundingBox().inflate(range).expandTowards(0D, level.getHeight(), 0D); - for(LivingEntity entity1 : level.getEntitiesOfClass(LivingEntity.class, aabb)) { - if (entity1 == golem.getOwner()) { - entity1.addEffect(new MobEffectInstance(MobEffects.REGENERATION, time, this.getBeaconLevel() - 1, true, true)); - } else if (entity1 instanceof OwnableEntity ownable) { - if (golem.getOwner() == ownable.getOwner()) - entity1.addEffect(new MobEffectInstance(MobEffects.REGENERATION, time, this.getBeaconLevel() - 1, true, true)); - } - } - } - } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemWeaponItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemWeaponItem.java index fac7f024c..212f2b944 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemWeaponItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/MetalGolemWeaponItem.java @@ -1,34 +1,54 @@ package dev.xkmc.modulargolems.content.item.equipments; +import dev.xkmc.l2library.util.math.MathHelper; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.data.MGTagGen; import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraft.world.level.Level; import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.common.ToolAction; +import net.minecraftforge.common.ToolActions; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public class MetalGolemWeaponItem extends GolemEquipmentItem { public MetalGolemWeaponItem(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { super(properties, EquipmentSlot.MAINHAND, GolemTypes.ENTITY_GOLEM::get, builder -> { var uuid = UUID.get(EquipmentSlot.MAINHAND); + var perc = MathHelper.getUUIDFromString("golem_percent_attack"); if (attackDamage > 0) { builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(uuid, "Weapon modifier", attackDamage, AttributeModifier.Operation.ADDITION)); } if (percentAttack > 0) { - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(uuid, "Weapon modifier", percentAttack, AttributeModifier.Operation.MULTIPLY_BASE)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(perc, "Weapon modifier", percentAttack, AttributeModifier.Operation.MULTIPLY_BASE)); } if (range > 0) { - builder.put(ForgeMod.ENTITY_REACH.get(), new AttributeModifier(uuid, "spear_range", range, AttributeModifier.Operation.ADDITION)); + builder.put(ForgeMod.ENTITY_REACH.get(), new AttributeModifier(uuid, "weapon_range", range, AttributeModifier.Operation.ADDITION)); } if (sweep > 0) { - builder.put(GolemTypes.GOLEM_SWEEP.get(), new AttributeModifier(uuid, "spear_sweep", sweep, AttributeModifier.Operation.ADDITION)); + builder.put(GolemTypes.GOLEM_SWEEP.get(), new AttributeModifier(uuid, "weapon_sweep", sweep, AttributeModifier.Operation.ADDITION)); } }); } + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + if (stack.is(MGTagGen.SHIELD_BREAKER_WEAPONS)) + list.add(MGLangData.SHIELD_BREAK.get()); + super.appendHoverText(stack, level, list, flag); + } + @Override public boolean isEnchantable(ItemStack stack) { return true; @@ -39,6 +59,16 @@ public int getEnchantmentValue() { return 15; } + @Override + public boolean canDisableShield(ItemStack stack, ItemStack shield, LivingEntity entity, LivingEntity attacker) { + return stack.is(MGTagGen.SHIELD_BREAKER_WEAPONS); + } + + @Override + public boolean canPerformAction(ItemStack stack, ToolAction action) { + return action == ToolActions.SWORD_DIG || super.canPerformAction(stack, action); + } + @Override public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { if (enchantment.category == EnchantmentCategory.WEAPON) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/NetheriteBootItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/NetheriteBootItem.java new file mode 100644 index 000000000..f7d2e9138 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/NetheriteBootItem.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import com.google.common.collect.ImmutableMultimap; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; + +import java.util.UUID; + +public class NetheriteBootItem extends MetalGolemArmorItem { + + public NetheriteBootItem(Properties properties, ArmorItem.Type type, int defense, float toughness, ResourceLocation model) { + super(properties, type, defense, toughness, model); + } + + @Override + protected void addExtraModifiers(ImmutableMultimap.Builder builder) { + super.addExtraModifiers(builder); + UUID uuid = UUID.get(getSlot()); + builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(uuid, "Armor modifier", -0.5f, AttributeModifier.Operation.MULTIPLY_TOTAL)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/SlicingAxe.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/SlicingAxe.java new file mode 100644 index 000000000..810e5f7ed --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/SlicingAxe.java @@ -0,0 +1,101 @@ +package dev.xkmc.modulargolems.content.item.equipments; + +import com.tterrag.registrate.util.entry.ItemEntry; +import dev.xkmc.modulargolems.content.config.GolemMaterial; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.data.RecipeGen; +import dev.xkmc.modulargolems.init.material.GolemWeaponType; +import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.SmithingTransformRecipeBuilder; +import net.minecraft.network.chat.Component; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.loaders.SeparateTransformsModelBuilder; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; + +public class SlicingAxe extends MetalGolemWeaponItem implements CustomDropGolemWeapon { + + public SlicingAxe(Properties properties, int attackDamage, double percentAttack, float range, float sweep) { + super(properties, attackDamage, percentAttack, range, sweep); + } + + @Override + public boolean dropCustomDeathLoot(AbstractGolemEntity self, MetalGolemEntity attacker, ItemStack stack, DamageSource source) { + if (attacker.isHostile()) return false; + var rate = MGConfig.COMMON.slicingDropUpgradeChance.get(); + var random = self.getRandom(); + if (self.isHostile()) { + var mats = self.getMaterials(); + var mat = mats.get(random.nextInt(mats.size())); + self.spawnAtLocation(GolemPart.setMaterial(mat.part().getDefaultInstance(), mat.id())); + var upgrades = self.getUpgrades(); + if (!upgrades.isEmpty()) { + var upgrade = upgrades.get(random.nextInt(upgrades.size())); + if (random.nextFloat() < rate) { + self.spawnAtLocation(upgrade.getDefaultInstance()); + } + } + } else { + for (GolemMaterial mat : self.getMaterials()) { + self.spawnAtLocation(GolemPart.setMaterial(mat.part().getDefaultInstance(), mat.id())); + } + for (var e : self.getUpgrades()) { + if (random.nextFloat() < rate) { + self.spawnAtLocation(e.getDefaultInstance()); + } + } + } + return true; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.SLICING_GOLEM.get(Math.round(MGConfig.COMMON.slicingDropUpgradeChance.get() * 100) + "%")); + list.add(MGLangData.SLICING_ENEMY.get()); + super.appendHoverText(stack, level, list, flag); + } + + public static ItemEntry buildItem(String id, VanillaGolemWeaponMaterial material) { + return REGISTRATE.item(id, p -> new SlicingAxe(material.modify(p.stacksTo(1)), + 0, material.getDamage() * 0.05, 0, 2)) + .model((ctx, pvd) -> + pvd.getBuilder(ctx.getName()) + .guiLight(BlockModel.GuiLight.FRONT) + .customLoader(SeparateTransformsModelBuilder::begin) + .base(material.model(new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(new ModelFile.UncheckedModelFile(ModularGolems.loc(GolemWeaponType.AXE.model))) + .texture("layer0", pvd.modLoc("item/equipments/" + ctx.getName())))) + .perspective(ItemDisplayContext.GUI, material.model(new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(pvd.getExistingFile(pvd.mcLoc("item/generated"))) + .texture("layer0", pvd.modLoc("item/equipments/" + ctx.getName() + "_icon"))))) + .recipe((ctx, pvd) -> RecipeGen.unlock(pvd, + SmithingTransformRecipeBuilder.smithing( + Ingredient.of(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE), + Ingredient.of(GolemItems.METALGOLEM_WEAPON[GolemWeaponType.AXE.ordinal()][VanillaGolemWeaponMaterial.DIAMOND.ordinal()]), + Ingredient.of(Blocks.STONECUTTER), RecipeCategory.COMBAT, ctx.get() + )::unlocks, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE).save(pvd, ctx.getName())) + .tag(MGTagGen.SHIELD_BREAKER_WEAPONS) + .defaultLang().register(); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/TickEquipmentItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/TickEquipmentItem.java index 1366efd84..123ae4595 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/equipments/TickEquipmentItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/equipments/TickEquipmentItem.java @@ -5,5 +5,5 @@ import net.minecraft.world.level.Level; public interface TickEquipmentItem { - void tick(ItemStack stack, Level level, Entity entity); + void tick(ItemStack stack, Level level, Entity entity); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/ClientHolderManager.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/ClientHolderManager.java index 74ec822aa..a935c688a 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/golem/ClientHolderManager.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/ClientHolderManager.java @@ -29,7 +29,6 @@ static final class TimedCache { TimedCache(int life, @Nullable AbstractGolemEntity entity) { this.life = life; this.entity = entity; - if (entity != null) entity.addTag("ClientOnly"); } } @@ -55,7 +54,6 @@ public static void tickEvent(TickEvent.ClientTickEvent event) { T getEntityForDisplay(GolemHolder holder, ItemStack stack) { CompoundTag root = stack.getTag(); if (root == null) return null; - if (!root.contains(GolemHolder.KEY_ENTITY) && !root.contains(GolemHolder.KEY_ICON)) return null; int hash = stack.hashCode(); if (CACHE.containsKey(hash)) { AbstractGolemEntity ans = CACHE.get(stack.hashCode()).entity; @@ -72,18 +70,23 @@ T getEntityForDisplay(GolemHolder holder, ItemStack stack) { T getEntityForDisplayInternal(GolemHolder holder, ItemStack stack) { CompoundTag root = stack.getTag(); if (root == null) return null; - T ans = null; + T ans; if (root.contains(GolemHolder.KEY_ENTITY)) { CompoundTag entity = root.getCompound(GolemHolder.KEY_ENTITY); ans = holder.getEntityType().createForDisplay(entity); - } else if (root.contains(GolemHolder.KEY_ICON)) { + if (ans != null) ans.onCreate(GolemHolder.getMaterial(stack), GolemHolder.getUpgrades(stack), null); + } else { AbstractGolemEntity golem = holder.getEntityType().create(Proxy.getClientWorld()); + golem.addTag("ClientOnly"); golem.onCreate(GolemHolder.getMaterial(stack), GolemHolder.getUpgrades(stack), null); ItemCompoundTag tag = ItemCompoundTag.of(stack); - var list = tag.getSubList(GolemHolder.KEY_ICON, Tag.TAG_COMPOUND).getOrCreate(); - for (int i = 0; i < list.size(); i++) { - ItemStack e = ItemStack.of(list.getCompound(i)); - golem.equipItemIfPossible(e); + GolemEquipUtil.addItemsToGolem(golem, root, false); + if (root.contains(GolemHolder.KEY_ICON)) { + var list = tag.getSubList(GolemHolder.KEY_ICON, Tag.TAG_COMPOUND).getOrCreate(); + for (int i = 0; i < list.size(); i++) { + ItemStack e = ItemStack.of(list.getCompound(i)); + golem.equipItemIfPossible(e); + } } ans = Wrappers.cast(golem); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/FlagTest.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/FlagTest.java new file mode 100644 index 000000000..0dc737b35 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/FlagTest.java @@ -0,0 +1,25 @@ +package dev.xkmc.modulargolems.content.item.golem; + +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; + +import java.util.function.Consumer; + +public class FlagTest implements Consumer { + + private final GolemFlags flag; + private boolean match = false; + + public FlagTest(GolemFlags flag) { + this.flag = flag; + } + + @Override + public void accept(GolemFlags flag) { + match |= flag == this.flag; + } + + public boolean matched() { + return match; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemBEWLR.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemBEWLR.java index 014dc3cb9..7d9746640 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemBEWLR.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemBEWLR.java @@ -3,21 +3,27 @@ import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; import dev.xkmc.l2library.util.Proxy; import dev.xkmc.l2serial.util.Wrappers; +import dev.xkmc.modulargolems.content.client.override.ModelOverrides; import dev.xkmc.modulargolems.content.config.GolemMaterial; import dev.xkmc.modulargolems.content.core.GolemType; import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.IGolemModel; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.item.ItemDisplayContext; @@ -54,6 +60,7 @@ public GolemBEWLR(BlockEntityRenderDispatcher dispatcher, EntityModelSet set) { public void onResourceManagerReload(ResourceManager manager) { map.clear(); GolemType.GOLEM_TYPE_TO_MODEL.forEach((k, v) -> map.put(k, v.get().generateModel(entityModelSet))); + ModelOverrides.reload(); } @Override @@ -68,6 +75,9 @@ public void renderByItem(ItemStack stack, ItemDisplayContext type, PoseStack pos if (!renderEntity(handle, holder)) render(handle, holder); } + if (stack.getItem() instanceof GolemFacade) { + renderFacade(handle, GolemFacade.getMaterial(stack)); + } poseStack.popPose(); } @@ -93,12 +103,39 @@ private , P extends IGolemPart

> void rend private , P extends IGolemPart

, M extends EntityModel & IGolemModel> void renderPart(BEWLRHandle handle, ResourceLocation id, GolemType type, P part) { M model = Wrappers.cast(map.get(type.getRegistryName())); + RenderType rt = model.renderType(model.getTextureLocationInternal(id)); + VertexConsumer vc = ItemRenderer.getFoilBufferDirect(handle.bufferSource(), rt, false, handle.stack().hasFoil()); + model.renderToBufferInternal(part, handle.poseStack(), vc, handle.light(), handle.overlay(), 1.0F, 1.0F, 1.0F, 1.0F); + + var etex = model.getTextureLocationInternal(id.withSuffix("_emissive")); + if (ModelOverrides.isValid(etex)) { + rt = model.renderType(model.getTextureLocationInternal(id.withSuffix("_emissive"))); + if (rt != null) { + vc = ItemRenderer.getFoilBufferDirect(handle.bufferSource(), rt, false, handle.stack().hasFoil()); + model.renderToBufferInternal(part, handle.poseStack(), vc, LightTexture.FULL_BRIGHT, handle.overlay(), 1.0F, 1.0F, 1.0F, 1.0F); + } + } + + } + + private void renderFacade(BEWLRHandle handle, ResourceLocation id) { + MetalGolemModel model = Wrappers.cast(map.get(GolemTypes.TYPE_GOLEM.getId())); + handle.poseStack().translate(0.5f, -0.375f, 0.5f); + handle.poseStack().mulPose(Axis.YP.rotationDegrees(180)); + handle.poseStack().scale(1, -1, 1); RenderType render = model.renderType(model.getTextureLocationInternal(id)); VertexConsumer vc = ItemRenderer.getFoilBufferDirect(handle.bufferSource(), render, false, handle.stack().hasFoil()); - model.renderToBufferInternal(part, handle.poseStack(), vc, handle.light(), handle.overlay(), 1.0F, 1.0F, 1.0F, 1.0F); + model.getHead().render(handle.poseStack(), vc, handle.light(), handle.overlay(), 1.0F, 1.0F, 1.0F, 1.0F); } private , P extends IGolemPart

> boolean renderEntity(BEWLRHandle handle, GolemHolder item) { + CompoundTag root = handle.stack().getTag(); + if (root == null) return false; + if (!root.contains(GolemHolder.KEY_ENTITY) && + !root.contains(GolemHolder.KEY_ICON) && + !root.contains(GolemHolder.KEY_EQUIPMENTS)) + return false; + T golem = ClientHolderManager.getEntityForDisplay(item, handle.stack()); if (golem == null) return false; P[] parts = item.getEntityType().values(); diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemEquipUtil.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemEquipUtil.java new file mode 100644 index 000000000..fe24fa05c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemEquipUtil.java @@ -0,0 +1,172 @@ +package dev.xkmc.modulargolems.content.item.golem; + +import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.card.ConfigCard; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; +import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.events.CraftEventListeners; +import dev.xkmc.modulargolems.events.event.ModifyItemOnApplication; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import top.theillusivec4.curios.Curios; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.LinkedHashSet; + +public record GolemEquipUtil(boolean isClient, @Nullable Level level) { + + public static boolean isGolemCurio(GolemHolder holder, ItemStack stack) { + if (!ModList.get().isLoaded(Curios.MODID)) return false; + var set = CuriosApi.getEntitySlots(holder.getEntityType().type(), false).keySet(); + return ForgeRegistries.ITEMS.tags().getReverseTag(stack.getItem()) + .map(e -> e.getTagKeys().anyMatch(t -> + t.location().getNamespace().equals(Curios.MODID) && + set.contains(t.location().getPath()))) + .orElse(false); + } + + public ItemStack applyItemOnHolder(GolemHolder holder, ItemStack first, ItemStack second) { + if (second.getItem() instanceof ConfigCard card) { + var id = ConfigCard.getUUID(second); + if (id == null) return ItemStack.EMPTY; + GolemHolder.setGolemConfig(first, id, card.getColor()); + return first; + } else if (second.getItem() instanceof UpgradeItem upgrade) { + return CraftEventListeners.appendUpgrade(first, holder, upgrade); + } else if (GolemEquipUtil.isGolemCurio(holder, second)) { + return equipCurioOnHolder(holder, first, second); + } + var event = new ModifyItemOnApplication(first, second); + MinecraftForge.EVENT_BUS.post(event); + second = event.getStack(); + if (holder.getEntityType() == GolemTypes.TYPE_GOLEM.get()) { + EquipmentSlot slot = LivingEntity.getEquipmentSlotForItem(second); + if (!second.is(MGTagGen.LARGE_GOLEM_WEAPONS)) { + if (!(second.getItem() instanceof IGolemEquipmentItem equipment)) return ItemStack.EMPTY; + if (!equipment.isFor(GolemTypes.ENTITY_GOLEM.get())) return ItemStack.EMPTY; + slot = equipment.getSlot(); + } + return equipOnHolder(holder, first, second, slot); + } else if (holder.getEntityType() == GolemTypes.TYPE_DOG.get()) { + if (!(second.getItem() instanceof IGolemEquipmentItem equipment)) return ItemStack.EMPTY; + if (!equipment.isFor(GolemTypes.ENTITY_DOG.get())) return ItemStack.EMPTY; + var slot = equipment.getSlot(); + return equipOnHolder(holder, first, second, slot); + } else if (holder.getEntityType() == GolemTypes.TYPE_HUMANOID.get()) { + EquipmentSlot slot = LivingEntity.getEquipmentSlotForItem(second); + return equipOnHolder(holder, first, second, slot); + } else return ItemStack.EMPTY; + } + + public , P extends IGolemPart

> + ItemStack equipCurioOnHolder(GolemHolder holder, ItemStack golem, ItemStack equip) { + if (level == null) return ItemStack.EMPTY; + if (!ModList.get().isLoaded(Curios.MODID)) return ItemStack.EMPTY; + var tag = golem.getTag(); + if (tag != null && !tag.contains(GolemHolder.KEY_ENTITY)) { + var eq = tag.getCompound(GolemHolder.KEY_EQUIPMENTS); + var golemSlots = CuriosApi.getEntitySlots(holder.getEntityType().type(), isClient).keySet(); + var itemSlots = new LinkedHashSet<>(CuriosApi.getItemStackSlots(equip, isClient).keySet()); + itemSlots.retainAll(golemSlots); + for (var slot : itemSlots) { + if (!eq.contains(slot)) { + eq.put(slot, equip.save(new CompoundTag())); + tag.put(GolemHolder.KEY_EQUIPMENTS, eq); + return golem; + } + } + } + T entity = holder.createDummy(golem, level); + if (entity == null) return ItemStack.EMPTY; + var opt = CuriosApi.getCuriosInventory(entity).resolve(); + if (opt.isEmpty()) return ItemStack.EMPTY; + equip = equip.copy(); + equip.setCount(1); + for (var slot : CuriosApi.getItemStackSlots(equip, entity).keySet()) { + var handler = opt.get().getStacksHandler(slot); + if (handler.isEmpty()) continue; + var stacks = handler.get().getStacks(); + for (int i = 0; i < stacks.getSlots(); i++) { + if (stacks.getStackInSlot(i).isEmpty()) { + stacks.setStackInSlot(i, equip); + return GolemHolder.setEntity(entity); + } + } + } + return ItemStack.EMPTY; + } + + public , P extends IGolemPart

> + ItemStack equipOnHolder(GolemHolder holder, ItemStack golem, ItemStack equip, EquipmentSlot slot) { + var tag = golem.getTag(); + if (tag != null && !tag.contains(GolemHolder.KEY_ENTITY)) { + var eq = tag.getCompound(GolemHolder.KEY_EQUIPMENTS); + if (!eq.contains(slot.name())) { + eq.put(slot.name(), equip.save(new CompoundTag())); + tag.put(GolemHolder.KEY_EQUIPMENTS, eq); + return golem; + } + } + if (level == null) return ItemStack.EMPTY; + T entity = holder.createDummy(golem, level); + if (entity == null) return ItemStack.EMPTY; + if (!entity.getItemBySlot(slot).isEmpty()) return ItemStack.EMPTY; + equip = equip.copy(); + equip.setCount(1); + entity.setItemSlot(slot, equip); + return GolemHolder.setEntity(entity); + } + + public static boolean giveItemToGolem(AbstractGolemEntity golem, ItemStack item, String ent) { + try { + var slot = Enum.valueOf(EquipmentSlot.class, ent); + golem.setItemSlot(slot, item); + return true; + } catch (Exception ignored) { + } + if (!ModList.get().isLoaded(Curios.MODID)) return false; + return giveCurioToGolem(golem, item, ent); + } + + public static boolean giveCurioToGolem(AbstractGolemEntity golem, ItemStack item, String ent) { + var opt = CuriosApi.getCuriosInventory(golem).resolve(); + if (opt.isEmpty()) return false; + var handler = opt.get().getStacksHandler(ent); + if (handler.isEmpty()) return false; + var stacks = handler.get().getStacks(); + for (int i = 0; i < stacks.getSlots(); i++) { + if (stacks.getStackInSlot(i).isEmpty()) { + stacks.setStackInSlot(i, item); + return true; + } + } + return false; + } + + public static void addItemsToGolem(AbstractGolemEntity golem, CompoundTag root, boolean dropExtra) { + if (root.contains(GolemHolder.KEY_EQUIPMENTS, Tag.TAG_COMPOUND)) { + var equipMap = root.getCompound(GolemHolder.KEY_EQUIPMENTS); + for (var ent : equipMap.getAllKeys()) { + if (!equipMap.contains(ent, Tag.TAG_COMPOUND)) continue; + var item = ItemStack.of(equipMap.getCompound(ent)); + if (!GolemEquipUtil.giveItemToGolem(golem, item, ent)) { + if (dropExtra) { + golem.spawnAtLocation(item); + } + } + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemFacade.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemFacade.java new file mode 100644 index 000000000..b476e9d68 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemFacade.java @@ -0,0 +1,58 @@ +package dev.xkmc.modulargolems.content.item.golem; + +import com.tterrag.registrate.util.CreativeModeTabModifier; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; + +import java.util.function.Consumer; + +public class GolemFacade extends Item { + + public GolemFacade(Properties prop) { + super(prop); + } + + public static ItemStack setMaterial(ItemStack stack, ResourceLocation id) { + stack.getOrCreateTag().putString("FacadeSkin", id.toString()); + return stack; + } + + public static ResourceLocation getMaterial(ItemStack stack) { + var tag = stack.getTag(); + if (tag != null && tag.contains("FacadeSkin", Tag.TAG_STRING)) { + String id = tag.getString("FacadeSkin"); + var ans = ResourceLocation.tryParse(id); + if (ans != null) { + return ans; + } + } + return ModularGolems.loc("iron"); + } + + @Override + public Component getName(ItemStack stack) { + var id = getMaterial(stack); + return Component.translatable(this.getDescriptionId(stack)).append(": ").append( + Component.translatable("golem_material." + id.getNamespace() + "." + id.getPath())); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(GolemBEWLR.EXTENSIONS); + } + + public void fillItemCategory(CreativeModeTabModifier tab) { + for (ResourceLocation rl : GolemMaterialConfig.get().getAllMaterials()) { + ItemStack stack = new ItemStack(this); + setMaterial(stack, rl); + tab.accept(stack); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemHolder.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemHolder.java index b2fa3bb42..6d5d02ce9 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemHolder.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemHolder.java @@ -7,9 +7,12 @@ import dev.xkmc.modulargolems.content.capability.GolemConfigStorage; import dev.xkmc.modulargolems.content.config.GolemMaterial; import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.core.GolemStatType; import dev.xkmc.modulargolems.content.core.GolemType; import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGConfig; @@ -27,23 +30,30 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; @@ -59,6 +69,7 @@ public class GolemHolder, P extends IGolemPa public static final String KEY_MATERIAL = "golem_materials", KEY_UPGRADES = "golem_upgrades", KEY_ENTITY = "golem_entity", + KEY_EQUIPMENTS = "golem_equipments", KEY_DISPLAY = "golem_display", KEY_ICON = "golem_icon", KEY_CONFIG = "golem_config"; @@ -81,14 +92,34 @@ public static ArrayList getMaterial(ItemStack stack) { return ans; } - public static ArrayList getUpgrades(ItemStack stack) { - ArrayList ans = new ArrayList<>(); + public static Ingredient getCraftMaterial(ItemStack stack) { + if (!(stack.getItem() instanceof GolemHolder holder)) return Ingredient.EMPTY; + var mats = GolemHolder.getMaterial(stack); + var type = holder.getEntityType(); + var part = type.getBodyPart(); + if (mats.size() <= part.ordinal()) return Ingredient.EMPTY; + var mat = mats.get(part.ordinal()); + return GolemMaterialConfig.get().getCraftIngredient(mat.id()); + } + + public static Ingredient getHealingMaterial(ItemStack stack) { + if (!(stack.getItem() instanceof GolemHolder holder)) return Ingredient.EMPTY; + var mats = GolemHolder.getMaterial(stack); + var type = holder.getEntityType(); + var part = type.getBodyPart(); + if (mats.size() <= part.ordinal()) return Ingredient.EMPTY; + var mat = mats.get(part.ordinal()); + return GolemMaterialConfig.get().getRepairIngredient(mat.id()); + } + + public static ArrayList getUpgrades(ItemStack stack) { + ArrayList ans = new ArrayList<>(); CompoundTag tag = stack.getTag(); if (tag != null && tag.contains(KEY_UPGRADES, Tag.TAG_LIST)) { ListTag list = tag.getList(KEY_UPGRADES, Tag.TAG_STRING); for (int i = 0; i < list.size(); i++) { Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(list.getString(i))); - if (item instanceof UpgradeItem up) { + if (item instanceof IUpgradeItem up) { ans.add(up); } } @@ -119,14 +150,32 @@ public static void addMaterial(ItemStack stack, GolemPart item, ResourceLo elem.put(KEY_MAT, StringTag.valueOf(material.toString())); } - public static ItemStack addUpgrade(ItemStack stack, UpgradeItem item) { - ResourceLocation rl = ForgeRegistries.ITEMS.getKey(item); + public static void setMaterial(ItemStack stack, int index, ResourceLocation material) { + ItemCompoundTag tag = ItemCompoundTag.of(stack); + CompoundTag elem = tag.getSubList(KEY_MATERIAL, Tag.TAG_COMPOUND).getOrCreate().getCompound(index); + elem.put(KEY_MAT, StringTag.valueOf(material.toString())); + } + + public static ItemStack addUpgrade(ItemStack stack, IUpgradeItem item) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(item.asItem()); assert rl != null; ItemCompoundTag tag = ItemCompoundTag.of(stack); tag.getSubList(KEY_UPGRADES, Tag.TAG_STRING).getOrCreate().add(StringTag.valueOf(rl.toString())); return stack; } + public static ItemStack setUpgrades(ItemStack stack, ArrayList list) { + ItemCompoundTag tag = ItemCompoundTag.of(stack); + var listTag = tag.getSubList(KEY_UPGRADES, Tag.TAG_STRING).getOrCreate(); + listTag.clear(); + for (var e : list) { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(e.asItem()); + assert rl != null; + listTag.add(StringTag.valueOf(rl.toString())); + } + return stack; + } + public static , P extends IGolemPart

> ItemStack setEntity(T entity) { GolemHolder holder = GolemType.getGolemHolder(entity.getType()); ItemStack stack = new ItemStack(holder); @@ -149,7 +198,12 @@ public static , P extends IGolemPart

> Ite assert rl != null; uplist.add(StringTag.valueOf(rl.toString())); } - entity.save(tag.getSubTag(KEY_ENTITY).getOrCreate()); + var entityTag = tag.getSubTag(KEY_ENTITY).getOrCreate(); + entity.validateGuardedData(); + var hp = entity.getGuardedDataImpl(); + entity.saveToItem(entityTag); + setHealth(stack, hp); + var name = entity.getCustomName(); if (name != null) stack.setHoverName(name); return stack; @@ -163,13 +217,53 @@ public static float getHealth(ItemStack stack) { } public static float getMaxHealth(ItemStack stack) { + var entity = Optional.ofNullable(stack.getTag()) + .filter(e -> e.contains(KEY_ENTITY)) + .map(e -> e.getCompound(KEY_ENTITY)); + if (entity.isPresent()) { + AttributeInstance ins = null; + for (var e : entity.get().getList("Attributes", Tag.TAG_COMPOUND)) { + if (!(e instanceof CompoundTag t)) continue; + if (t.getString("Name").equals("minecraft:generic.max_health")) { + ins = new AttributeInstance(Attributes.MAX_HEALTH, x -> { + }); + ins.load(t); + break; + + } + } + if (ins == null) return -1; + var attrs = GolemMaterial.collectAttributes(getMaterial(stack), getUpgrades(stack)); + var mhp = attrs.get(Attributes.MAX_HEALTH); + if (mhp != null && mhp.getFirst().kind == GolemStatType.Kind.BASE) + ins.setBaseValue(mhp.getSecond()); + return (float) ins.getValue(); + } + return -1; + } + + public static int getReforge(ItemStack stack) { return Optional.ofNullable(stack.getTag()) .filter(e -> e.contains(KEY_ENTITY)) .map(e -> e.getCompound(KEY_ENTITY)) - .flatMap(e -> e.getList("Attributes", Tag.TAG_COMPOUND).stream() - .map(t -> ((CompoundTag) t)) - .filter(t -> t.getString("Name").equals("minecraft:generic.max_health")) - .findAny()).map(e -> e.getFloat("Base")).orElse(-1f); + .map(e -> e.getCompound("ForgeData").getInt("GolemReforge")) + .orElse(0); + } + + public static void setReforge(ItemStack stack, int reforge) { + var entity = Optional.ofNullable(stack.getTag()) + .filter(e -> e.contains(KEY_ENTITY)) + .map(e -> e.getCompound(KEY_ENTITY)); + if (entity.isPresent()) { + entity.get().getCompound("ForgeData").putInt("GolemReforge", reforge); + for (var e : entity.get().getList("Attributes", Tag.TAG_COMPOUND)) { + if (!(e instanceof CompoundTag t)) continue; + if (t.getString("Name").equals("minecraft:generic.max_health")) { + t.getList("Modifiers", Tag.TAG_COMPOUND).removeIf(x -> + x instanceof CompoundTag comp && comp.getUUID("UUID").equals(AbstractGolemEntity.REFORGE_ID)); + } + } + } } public static void setHealth(ItemStack result, float health) { @@ -184,6 +278,15 @@ public static ItemStack toEntityIcon(ItemStack golem, ItemStack... equipments) { return golem; } + public ItemStack toEntityWithItem(ItemStack golem, ItemStack... equipments) { + var ctx = new GolemEquipUtil(false, null); + for (var e : equipments) { + var ans = ctx.applyItemOnHolder(this, golem, e); + if (!ans.isEmpty()) golem = ans; + } + return golem; + } + private final RegistryEntry> type; public GolemHolder(Properties props, RegistryEntry> type) { @@ -192,26 +295,41 @@ public GolemHolder(Properties props, RegistryEntry> type) { GolemType.GOLEM_TYPE_TO_ITEM.put(type.getId(), this); } - @Override - public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + public float getInvHeal(ItemStack stack, Entity entity) { CompoundTag root = stack.getTag(); - if (root == null) return; - if (root.contains(KEY_ENTITY) && entity.tickCount % 20 == 0) { + if (root == null) return 0; + if (root.contains(KEY_ENTITY)) { var health = getHealth(stack); var maxHealth = getMaxHealth(stack); - if (health > 0 && health < maxHealth) { - var mats = getMaterial(stack); - var upgrades = getUpgrades(stack); - var attr = GolemMaterial.collectAttributes(mats, upgrades); - var modifiers = GolemMaterial.collectModifiers(mats, upgrades); - double heal = attr.getOrDefault(GolemTypes.GOLEM_REGEN.get(), Pair.of(GolemTypes.STAT_REGEN.get(), 0d)).getSecond(); - var ctx = new GolemModifier.HealingContext(health, maxHealth, entity); + if (health >= maxHealth) return 0; + var mats = getMaterial(stack); + var upgrades = getUpgrades(stack); + var attr = GolemMaterial.collectAttributes(mats, upgrades); + var modifiers = GolemMaterial.collectModifiers(mats, upgrades); + if (health <= 0) { + FlagTest test = new FlagTest(GolemFlags.REVIVE); for (var entry : modifiers.entrySet()) { - heal = entry.getKey().onInventoryHealTick(heal, ctx, entry.getValue()); - } - if (heal > 0) { - setHealth(stack, Math.min(maxHealth, (float) heal + health)); + entry.getKey().onRegisterFlag(test); } + if (!test.matched()) return 0; + } + double heal = attr.getOrDefault(GolemTypes.GOLEM_REGEN.get(), Pair.of(GolemTypes.STAT_REGEN.get(), 0d)).getSecond(); + var ctx = new GolemModifier.HealingContext(health, maxHealth, entity); + for (var entry : modifiers.entrySet()) { + heal = entry.getKey().onInventoryHealTick(heal, ctx, entry.getValue()); + } + return Math.min(maxHealth, (float) heal + health) - health; + } + return 0; + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + if (entity.tickCount % 20 == 0) { + var health = getHealth(stack); + var heal = getInvHeal(stack, entity); + if (heal > 0) { + setHealth(stack, health + heal); } } } @@ -225,12 +343,16 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List= 0) { - float health = getHealth(stack); + float health = Math.min(max, getHealth(stack)); float f = Mth.clamp(health / max, 0f, 1f); int color = Mth.hsvToRgb(f / 3.0F, 1.0F, 1.0F); MutableComponent hc = Component.literal("" + Math.round(health)).setStyle(Style.EMPTY.withColor(color)); list.add(MGLangData.HEALTH.get(hc, Math.round(max)).withStyle(health <= 0 ? ChatFormatting.RED : ChatFormatting.AQUA)); } + int reforge = getReforge(stack); + if (reforge > 0) { + list.add(MGLangData.MELTDOWN.get(reforge)); + } var config = getGolemConfig(stack); if (level == null || config.isEmpty()) { list.add(MGLangData.NO_CONFIG.get()); @@ -336,6 +458,19 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { } } + private static void setPos(Level level, AbstractGolemEntity golem, Vec3 pos) { + golem.setPos(pos); + EntityDimensions dim = golem.getDimensions(Pose.STANDING); + if (dim.width * dim.width * dim.height > 64) return; + Vec3 vec3 = golem.position().add(0.0D, (double) dim.height / 2.0D, 0.0D); + double xz = dim.width - 1 + 1e-6; + double y = dim.height - 1 + 1e-6; + VoxelShape voxelshape = Shapes.create(AABB.ofSize(vec3, xz, y, xz)); + var opt = level.findFreePosition(golem, voxelshape, vec3, dim.width, dim.height, dim.width); + if (opt.isPresent()) pos = opt.get().add(0.0D, (double) (-dim.height) / 2.0D, 0.0D); + golem.setPos(pos); + } + public boolean summon(ItemStack stack, Level level, Vec3 pos, @Nullable Player player, @Nullable Consumer> callback) { CompoundTag root = stack.getTag(); if (root == null) return false; @@ -343,10 +478,10 @@ public boolean summon(ItemStack stack, Level level, Vec3 pos, @Nullable Player p if (getHealth(stack) <= 0) return false; if (!level.isClientSide()) { - AbstractGolemEntity golem = type.get().create((ServerLevel) level, root.getCompound(KEY_ENTITY)); + AbstractGolemEntity golem = type.get().create(level, root.getCompound(KEY_ENTITY)); UUID id = player == null ? null : player.getUUID(); golem.updateAttributes(getMaterial(stack), getUpgrades(stack), id); - golem.moveTo(pos); + setPos(level, golem, pos); getGolemConfig(stack).ifPresent(e -> golem.setConfigCard(e.getFirst(), e.getSecond())); if (stack.hasCustomHoverName()) { golem.setCustomName(stack.getHoverName()); @@ -366,10 +501,11 @@ public boolean summon(ItemStack stack, Level level, Vec3 pos, @Nullable Player p if (root.contains(KEY_MATERIAL)) { if (!level.isClientSide()) { AbstractGolemEntity golem = type.get().create(level); - golem.moveTo(pos); + setPos(level, golem, pos); UUID id = player == null ? null : player.getUUID(); golem.onCreate(getMaterial(stack), getUpgrades(stack), id); getGolemConfig(stack).ifPresent(e -> golem.setConfigCard(e.getFirst(), e.getSecond())); + GolemEquipUtil.addItemsToGolem(golem, root, true); if (stack.hasCustomHoverName()) { golem.setCustomName(stack.getHoverName()); } @@ -377,9 +513,7 @@ public boolean summon(ItemStack stack, Level level, Vec3 pos, @Nullable Player p return false; } level.addFreshEntity(golem); - if (player == null || !player.getAbilities().instabuild) { - stack.shrink(1); - } + stack.shrink(1); if (callback != null) { callback.accept(golem); } @@ -395,11 +529,12 @@ public T createDummy(ItemStack stack, Level level) { if (root == null) return null; T golem; if (root.contains(KEY_ENTITY)) { - golem = type.get().create((ServerLevel) level, root.getCompound(KEY_ENTITY)); + golem = type.get().create(level, root.getCompound(KEY_ENTITY)); golem.updateAttributes(getMaterial(stack), getUpgrades(stack), null); } else if (root.contains(KEY_MATERIAL)) { golem = type.get().create(level); golem.onCreate(getMaterial(stack), getUpgrades(stack), null); + GolemEquipUtil.addItemsToGolem(golem, root, false); } else return null; getGolemConfig(stack).ifPresent(e -> golem.setConfigCard(e.getFirst(), e.getSecond())); if (stack.hasCustomHoverName()) { @@ -464,7 +599,7 @@ public ItemStack withUniformMaterial(ResourceLocation rl) { return stack; } - public int getRemaining(ArrayList mats, ArrayList upgrades) { + public int getRemaining(ArrayList mats, ArrayList upgrades) { int base = getEntityType().values().length; if (type.get() == GolemTypes.TYPE_GOLEM.get()) { base = MGConfig.COMMON.largeGolemSlot.get(); @@ -473,7 +608,11 @@ public int getRemaining(ArrayList mats, ArrayList up } else if (type.get() == GolemTypes.TYPE_DOG.get()) { base = MGConfig.COMMON.dogGolemSlot.get(); } - base -= upgrades.size(); + for (var e : upgrades) { + if (e instanceof UpgradeItem) { + base--; + } + } var modifiers = GolemMaterial.collectModifiers(mats, upgrades); for (var ent : modifiers.entrySet()) { base += ent.getKey().addSlot(upgrades, ent.getValue()); @@ -485,7 +624,7 @@ public int getRemaining(ArrayList mats, ArrayList up public void onDestroyed(ItemEntity entity, DamageSource source) { if (source.is(DamageTypeTags.IS_EXPLOSION)) { for (var e : getUpgrades(entity.getItem())) { - entity.level().addFreshEntity(new ItemEntity(entity.level(), entity.getX(), entity.getY(), entity.getZ(), e.getDefaultInstance())); + entity.level().addFreshEntity(new ItemEntity(entity.level(), entity.getX(), entity.getY(), entity.getZ(), e.asItem().getDefaultInstance())); } } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemPart.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemPart.java index e759f1ac6..6aeefba0d 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemPart.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/GolemPart.java @@ -9,8 +9,11 @@ import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -18,10 +21,7 @@ import net.minecraftforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; @@ -59,9 +59,11 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List { GolemMaterial mat = parseMaterial(e); list.add(mat.getDesc()); + int n = mat.modifiers().size(); mat.modifiers().forEach((m, v) -> { list.add(m.getTooltip(v)); - list.addAll(m.getDetail(v)); + if (n == 1 || Screen.hasShiftDown()) + list.addAll(m.getDetail(v)); }); mat.stats().forEach((k, v) -> list.add(k.getAdderTooltip(v))); }); @@ -71,18 +73,20 @@ public GolemMaterial parseMaterial(ResourceLocation mat) { var magnifier = GolemPartConfig.get().getMagnifier(getEntityType()); var filter = GolemPartConfig.get().getFilter(this); HashMap stats = new HashMap<>(); - GolemMaterialConfig.get().stats.get(mat).forEach((k, v) -> { + var matStat = GolemMaterialConfig.get().stats.get(mat); + if (matStat != null) matStat.forEach((k, v) -> { double val = v * filter.getOrDefault(k.type, 1d) * magnifier.getOrDefault(k, 1d); if (val != 0) stats.compute(k, (e, o) -> (o == null ? 0 : o) + val); }); HashMap modifiers = new HashMap<>(); - GolemMaterialConfig.get().modifiers.get(mat).forEach((k, v) -> { + var matMod = GolemMaterialConfig.get().modifiers.get(mat); + if (matMod != null) matMod.forEach((k, v) -> { if (k.canExistOn(this)) { modifiers.compute(k, (e, o) -> (o == null ? 0 : o) + v); } }); - return new GolemMaterial(stats, modifiers, mat, this); + return new GolemMaterial(new LinkedHashMap<>(new TreeMap<>(stats)), modifiers, mat, this); } @Override @@ -112,4 +116,13 @@ public void fillItemCategory(CreativeModeTabModifier tab) { } + @Override + public boolean canBeHurtBy(DamageSource source) { + if (source.is(DamageTypeTags.IS_FIRE) || + source.is(DamageTypeTags.IS_EXPLOSION) || + source.is(DamageTypeTags.IS_LIGHTNING)) + return false; + return super.canBeHurtBy(source); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/golem/IGolemPartItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/golem/IGolemPartItem.java index 1098d02e4..47b12b2b6 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/golem/IGolemPartItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/golem/IGolemPartItem.java @@ -2,6 +2,6 @@ public interface IGolemPartItem { - GolemPart asPart(); + GolemPart asPart(); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BeaconCannonItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BeaconCannonItem.java new file mode 100644 index 000000000..d5f99dfed --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BeaconCannonItem.java @@ -0,0 +1,54 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.misc.BeaconLaserEntity; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemMiscEntities; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BeaconCannonItem extends ShouldWeaponItem implements IShoulderCannonAnimated { + + public BeaconCannonItem(Properties properties) { + super(properties); + } + + @Override + public void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand) { + if (e.tickCount % 60 == (hand == InteractionHand.MAIN_HAND ? 20 : 50) && + !e.level().isClientSide() && e.getTarget() != null && e.getTarget().isAlive()) { + if (CannonPoseUtil.BEACON_CANNON.isOutOfRange(e, hand)) return; + var laser = new BeaconLaserEntity(GolemMiscEntities.LASER.get(), e.level(), e, 10, hand == InteractionHand.MAIN_HAND); + e.level().addFreshEntity(laser); + if (!e.isSilent()) + e.level().playSound(null, e.blockPosition(), SoundEvents.BEACON_DEACTIVATE, SoundSource.NEUTRAL, 2, 1.5f); + } + } + + @Override + public boolean emissive() { + return true; + } + + @Override + public ResourceLocation getModelForHand(InteractionHand hand) { + return hand == InteractionHand.MAIN_HAND ? GolemModelPaths.BEACON_RIGHT : GolemModelPaths.BEACON_LEFT; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.BEACON_CANNON.get()); + super.appendHoverText(stack, level, list, flag); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BowPoseUtil.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BowPoseUtil.java new file mode 100644 index 000000000..dc29ea4ba --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/BowPoseUtil.java @@ -0,0 +1,36 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class BowPoseUtil { + + public static float getAngle(MetalGolemEntity e) { + var dst = e.getTargetAimPos(); + if (dst.length() == 0) return 0; + var pos = e.position(); + dst = dst.add(pos); + var scale = e.getScale(); + var forward = e.getViewVector(1).multiply(1, 0, 1).normalize(); + var side = forward.yRot(-(float) (Math.PI / 2)); + var base = side.scale(0.7).add(0, 2, 0); + var origin = pos.add(base.scale(scale)); + var diff = dst.subtract(origin); + return (float) (-Math.atan2(diff.y, diff.horizontalDistance()) - Math.PI / 2); + } + + public static Vec3 getOrigin(MetalGolemEntity e) { + var pos = e.position(); + var scale = e.getScale(); + var forward = e.getViewVector(1).multiply(1, 0, 1).normalize(); + var side = forward.yRot(-(float) (Math.PI / 2)); + float angle = -getAngle(e) - (float) (Math.PI / 2); + var arm = new Vec3(forward.x * Mth.cos(angle), Mth.sin(angle), forward.z * Mth.cos(angle)).scale(2.2); + var diff = side.scale(0.7).add(0, 2, 0); + var ans = pos.add(diff.add(arm).scale(scale)); + + return ans; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/CannonPoseUtil.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/CannonPoseUtil.java new file mode 100644 index 000000000..93e4a5c1d --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/CannonPoseUtil.java @@ -0,0 +1,88 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.Vec3; + +public record CannonPoseUtil(float x0, float y0, float z0, float y1, float z1) { + + public static final float MAX_DEGREE = 15; + + public static final CannonPoseUtil BEACON_CANNON = new CannonPoseUtil(7f / 16f, 33 / 16f, 3 / 16f, 4.5f / 16f, 23f / 16f); + public static final CannonPoseUtil FLAME_THROWER = new CannonPoseUtil(7f / 16f, 33 / 16f, 3 / 16f, 4.5f / 16f, 17f / 16f); + + @Deprecated + public static final CannonPoseUtil BEACON = new CannonPoseUtil(7f / 16f, 33 / 16f, 3 / 16f, 4.5f / 16f, 17f / 16f); + + public float[] getAngle(MetalGolemEntity e, InteractionHand hand) { + var ans = new float[2]; + var dst = e.getTargetAimPos(); + if (dst.length() == 0) return ans; + int x = hand == InteractionHand.MAIN_HAND ? -1 : 1; + var scale = e.getScale(); + var br = e.yBodyRot * Mth.DEG_TO_RAD; + var forward = new Vec3(-Math.sin(br), 0, Math.cos(br)); + var side = forward.yRot(-(float) (Math.PI / 2)); + var diff = dst.add(new Vec3(0, -y0, 0) + .add(side.scale(x * x0)) + .add(forward.scale(z0)).scale(scale)); + + ans[0] = (float) Math.atan2(diff.x, diff.z); + ans[1] = (float) Math.asin(y1 * scale / diff.length()) + - (float) Math.atan2(diff.y, diff.horizontalDistance()); + return ans; + } + + public Vec3 getOrigin(MetalGolemEntity e, InteractionHand hand) { + var dst = e.getTargetAimPos(); + if (dst.length() == 0) return e.position(); + int x = hand == InteractionHand.MAIN_HAND ? -1 : 1; + var scale = e.getScale(); + var br = e.yBodyRot * Mth.DEG_TO_RAD; + var forward = new Vec3(-Math.sin(br), 0, Math.cos(br)); + var side = forward.yRot(-(float) (Math.PI / 2)); + var origin = new Vec3(0, y0, 0) + .add(side.scale(-x * x0)) + .add(forward.scale(-z0)).scale(scale); + var diff = dst.subtract(origin); + + var xrot = -(float) Math.asin(y1 * scale / diff.length()) + + (float) Math.atan2(diff.y, diff.horizontalDistance()); + + var point = diff.multiply(1, 0, 1).normalize(); + + var af = new Vec3( + point.x * Math.cos(xrot), + Math.sin(xrot), + point.z * Math.cos(xrot) + ).scale(z1 * scale); + var av = new Vec3( + -point.x * Math.sin(xrot), + Math.cos(xrot), + -point.z * Math.sin(xrot) + ).scale(y1 * scale); + + return e.position().add(origin.add(af).add(av)); + } + + public boolean isOutOfRange(MetalGolemEntity e, InteractionHand hand) { + return isOutOfRange(e, hand, 5); + } + + public boolean isOutOfRange(MetalGolemEntity e, InteractionHand hand, float allowance) { + var rot = getAngle(e, hand); + var f0 = Vec3.directionFromRotation(rot[1] * Mth.RAD_TO_DEG, rot[0] * Mth.RAD_TO_DEG); + var diff = Mth.wrapDegrees(rot[0] * Mth.RAD_TO_DEG + e.yBodyRot); + if (Math.abs(diff) <= CannonPoseUtil.MAX_DEGREE) return false; + if (diff > MAX_DEGREE) { + rot[0] = (MAX_DEGREE - e.yBodyRot) * Mth.DEG_TO_RAD; + } + if (diff < -MAX_DEGREE) { + rot[0] = (-MAX_DEGREE - e.yBodyRot) * Mth.DEG_TO_RAD; + } + var f1 = Vec3.directionFromRotation(rot[1] * Mth.RAD_TO_DEG, rot[0] * Mth.RAD_TO_DEG); + return Math.acos(f0.dot(f1)) > allowance * Mth.DEG_TO_RAD; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/FlameThrowerItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/FlameThrowerItem.java new file mode 100644 index 000000000..6f8560bb3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/FlameThrowerItem.java @@ -0,0 +1,153 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import dev.xkmc.modulargolems.util.TNTLauncher; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.projectile.LargeFireball; +import net.minecraft.world.entity.projectile.SmallFireball; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.ProjectileWeaponItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Predicate; + +public class FlameThrowerItem extends ProjectileWeaponItem implements IShoulderCannonAnimated { + + public static void setCharge(ItemStack stack, int charge) { + stack.getOrCreateTag().putInt("BlazeCharge", charge); + } + + public static int getCharge(ItemStack stack) { + var tag = stack.getTag(); + if (tag == null) return 0; + return tag.getInt("BlazeCharge"); + } + + public FlameThrowerItem(Properties p) { + super(p); + } + + @Override + public void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand) { + if (e.tickCount % 40 != (hand == InteractionHand.MAIN_HAND ? 10 : 30)) return; + var target = e.getTarget(); + if (target == null || !target.isAlive()) return; + if (CannonPoseUtil.FLAME_THROWER.isOutOfRange(e, hand, 15)) return; + var ammo = e.getProjectile(stack); + var pos = CannonPoseUtil.FLAME_THROWER.getOrigin(e, hand); + if (ammo.is(Items.TNT)) { + var tnt = TNTLauncher.getTNTEntity(e, pos, target); + if (tnt == null) return; + e.level().addFreshEntity(tnt); + if (!e.isSilent()) + e.playSound(SoundEvents.BLAZE_SHOOT); + if (!e.isHostile()) + ammo.shrink(1); + return; + } + var dst = target.position().add(0, target.getBbHeight() / 2, 0); + var dir = dst.subtract(pos).normalize(); + if (ammo.is(Items.FIRE_CHARGE)) { + var proj = new LargeFireball(e.level(), e, dir.x, dir.y, dir.z, 2); + proj.setPos(pos); + proj.setDeltaMovement(dir); + e.level().addFreshEntity(proj); + if (!e.isSilent()) + e.playSound(SoundEvents.BLAZE_SHOOT); + if (!e.isHostile()) + ammo.shrink(1); + return; + } + if (!e.isHostile() && stack.getEnchantmentLevel(Enchantments.INFINITY_ARROWS) <= 0) { + int charge = getCharge(stack); + if (charge <= 0) { + if (!ammo.is(Items.BLAZE_POWDER)) return; + setCharge(stack, 15); + if (!e.isHostile()) + ammo.shrink(1); + } else { + setCharge(stack, charge - 1); + } + } + var proj = new SmallFireball(e.level(), e, dir.x, dir.y, dir.z); + proj.setPos(pos); + proj.setDeltaMovement(dir); + e.level().addFreshEntity(proj); + if (!e.isSilent()) + e.playSound(SoundEvents.BLAZE_SHOOT); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.FLAMETHROWER.get()); + list.add(MGLangData.FLAMETHROWER_TNT.get()); + list.add(MGLangData.FLAMETHROWER_FIRECHARGE.get()); + list.add(MGLangData.FLAMETHROWER_FLAME.get()); + list.add(MGLangData.GOLEM_EQUIPMENT.get(GolemTypes.ENTITY_GOLEM.get().getDescription().copy().withStyle(ChatFormatting.GOLD)) + .withStyle(ChatFormatting.UNDERLINE)); + list.add(MGLangData.SHOULDER_WEAPON.get()); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return super.canApplyAtEnchantingTable(stack, enchantment) || enchantment == Enchantments.INFINITY_ARROWS; + } + + private static boolean supports(ItemStack stack) { + return stack.is(Items.BLAZE_POWDER) || stack.is(Items.FIRE_CHARGE) || stack.is(Items.TNT); + } + + @Override + public Predicate getAllSupportedProjectiles() { + return FlameThrowerItem::supports; + } + + @Override + public int getDefaultProjectileRange() { + return 15; + } + + @Override + public @Nullable ResourceLocation getModelForHand(InteractionHand hand) { + return hand == InteractionHand.MAIN_HAND ? GolemModelPaths.FLAME_RIGHT : GolemModelPaths.FLAME_LEFT; + } + + @Override + public @Nullable ResourceLocation getAnimBaseId(MetalGolemEntity user, ItemStack stack, InteractionHand hand) { + return hand == InteractionHand.MAIN_HAND ? GolemModelPaths.BEACON_RIGHT : GolemModelPaths.BEACON_LEFT; + } + + @Override + public boolean emissive() { + return true; + } + + @Override + public ResourceLocation getEmissiveTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + var id = ForgeRegistries.ITEMS.getKey(this); + assert id != null; + return id.withPath(e -> "textures/equipments/" + e + "_emissive.png"); + } + + @Override + public ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + var id = ForgeRegistries.ITEMS.getKey(this); + assert id != null; + return id.withPath(e -> "textures/equipments/" + e + ".png"); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemBowBehavior.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemBowBehavior.java new file mode 100644 index 000000000..39def8f1c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemBowBehavior.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.mob_weapon_api.api.projectile.BowUseContext; +import dev.xkmc.mob_weapon_api.api.projectile.ProjectileWeaponUser; +import dev.xkmc.mob_weapon_api.example.behavior.SimpleBowBehavior; +import net.minecraft.world.item.ItemStack; + +public class GolemBowBehavior extends SimpleBowBehavior { + + @Override + public boolean hasProjectile(ProjectileWeaponUser user, ItemStack stack) { + if (stack.getItem() instanceof MetalGolemBowItem bow && !bow.isFor(user.user().getType())) + return false; + return super.hasProjectile(user, stack); + } + + @Override + public int getStandardPullTime(BowUseContext ctx, ItemStack stack) { + return stack.getItem() instanceof MetalGolemBowItem bow ? bow.getPullTime(ctx.user()) : 20; + } + + @Override + public float getPowerForTime(BowUseContext ctx, ItemStack stack, int time) { + return stack.getItem() instanceof MetalGolemBowItem bow ? bow.getPower(ctx.user(), time) : 20; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemMechaBowBehavior.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemMechaBowBehavior.java new file mode 100644 index 000000000..88a09095a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/GolemMechaBowBehavior.java @@ -0,0 +1,78 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.mob_weapon_api.api.projectile.BowUseContext; +import dev.xkmc.mob_weapon_api.api.projectile.ProjectileProperties; +import dev.xkmc.mob_weapon_api.util.ShootUtils; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.targeting.TargetManager; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.BowItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.entity.EntityTypeTest; + +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +public class GolemMechaBowBehavior extends GolemBowBehavior { + + public int shootArrow(BowUseContext user, float power, ItemStack stack, InteractionHand hand) { + Item arrow = stack.getItem(); + if (!(arrow instanceof BowItem bow)) return 20; + if (!(user.user() instanceof MetalGolemEntity golem)) return 20; + var target = golem.getTarget(); + if (target == null) return 20; + ItemStack arrowStack = user.getPreferredProjectile(stack); + if (arrowStack.isEmpty()) return 20; + boolean infinite = user.bypassAllConsumption() || user.hasInfiniteArrow(stack, arrowStack); + shoot(user, bow, power, arrowStack, infinite, target); + if (arrow instanceof IMultiShotBow shot) { + var list = getPreferableTargets(golem, 35, Math.PI / 8); + int n = Math.min(list.size(), shot.getMaxShoot(user.user(), stack) - 1); + for (int i = 0; i < n; i++) { + shoot(user, bow, power, arrowStack, true, list.get(i)); + } + } + user.user().playSound(SoundEvents.ARROW_SHOOT, 1.0F, 1.0F / (user.user().getRandom().nextFloat() * 0.4F + 0.8F)); + if (!infinite) arrowStack.shrink(1); + return 10; + } + + private List getPreferableTargets(MetalGolemEntity golem, int range, double span) { + var list = golem.level().getEntities( + EntityTypeTest.forClass(LivingEntity.class), + golem.getBoundingBox().inflate(range), + e -> { + if (!golem.canAttack(e) || !golem.hasLineOfSight(e) || !golem.predicateTarget(e)) return false; + if (golem.getTarget() == e) return false; + var diff = e.position().add(0, e.getBbHeight() / 2, 0) + .subtract(golem.getEyePosition()).normalize(); + return Math.acos(golem.getViewVector(1).normalize().dot(diff)) < span; + }); + list.sort(Comparator.comparing(ke -> Optional.ofNullable( + TargetManager.predicateTarget(golem, ke) + ).map(Enum::ordinal).orElse(100))); + return list; + } + + private void shoot(BowUseContext user, BowItem bow, float power, ItemStack arrowStack, boolean infinite, LivingEntity target) { + AbstractArrow proj = bow.customArrow(user.createArrow(arrowStack, power)); + ProjectileProperties prop = new ProjectileProperties( + power * user.getInitialVelocityFactor(), + proj.isNoGravity() ? 0.0F : 0.05F, + user.getInitialInaccuracy(), infinite); + if (prop.infinite()) { + proj.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + proj.getPersistentData().putInt("DespawnFactor", 20); + } else { + proj.pickup = AbstractArrow.Pickup.ALLOWED; + } + ShootUtils.getShootVector(target, proj.position(), prop.velocity(), prop.gravity(), prop.inaccuracy()).shoot(proj, 0f); + user.user().level().addFreshEntity(proj); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IMultiShotBow.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IMultiShotBow.java new file mode 100644 index 000000000..c102bcd07 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IMultiShotBow.java @@ -0,0 +1,11 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +public interface IMultiShotBow { + + int getMaxShoot(@Nullable LivingEntity user, ItemStack stack); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderCannonAnimated.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderCannonAnimated.java new file mode 100644 index 000000000..8fba44796 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderCannonAnimated.java @@ -0,0 +1,34 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.client.weapon.ShoulderAnimData; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface IShoulderCannonAnimated extends IShoulderWeapon { + + default @Nullable ResourceLocation getAnimBaseId(MetalGolemEntity user, ItemStack stack, InteractionHand hand) { + return getModelForHand(hand); + } + + @Override + default List getAnimationData(MetalGolemEntity user, ItemStack stack, InteractionHand hand) { + var model = getAnimBaseId(user, stack, hand); + if (model == null) return List.of(); + int starting = user.animState.getStartingAnim(); + int ending = user.animState.getEndingAnim(); + if (starting >= 0 && starting <= 5) + return List.of(new ShoulderAnimData(model.withSuffix("_start"), 1, starting)); + else if (ending >= 0 && ending <= 5) + return List.of(new ShoulderAnimData(model.withSuffix("_end"), 1, ending)); + else if (starting > 0) { + return List.of(new ShoulderAnimData(model.withSuffix("_active"), 1, 0)); + } + return List.of(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderWeapon.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderWeapon.java new file mode 100644 index 000000000..a91568db7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/IShoulderWeapon.java @@ -0,0 +1,30 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.client.weapon.ShoulderAnimData; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface IShoulderWeapon { + + @Nullable ResourceLocation getModelForHand(InteractionHand hand); + + List getAnimationData(MetalGolemEntity user, ItemStack stack, InteractionHand hand); + + ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand); + + default boolean emissive() { + return false; + } + + default ResourceLocation getEmissiveTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + return getModelTexture(entity, stack, hand); + } + + void onTick(MetalGolemEntity e, ItemStack stack, InteractionHand hand); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemBowItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemBowItem.java new file mode 100644 index 000000000..ffc949dad --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemBowItem.java @@ -0,0 +1,198 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import dev.xkmc.l2library.util.math.MathHelper; +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.weapon.IEntityModelWeapon; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.BowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Consumer; + +public class MetalGolemBowItem extends BowItem implements IGolemEquipmentItem, IEntityModelWeapon { + + private final Multimap defaultModifiers; + private final int baseline; + + public MetalGolemBowItem(Properties properties, int baseline, Consumer> attr) { + super(properties.stacksTo(1)); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + attr.accept(builder); + this.defaultModifiers = builder.build(); + this.baseline = baseline; + } + + public MetalGolemBowItem(Properties properties, int baseline, int atk, Consumer> attr) { + this(properties, baseline, b -> { + if (atk > 0) + b.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(MathHelper.getUUIDFromString("bow_melee"), + "bow_melee", atk, AttributeModifier.Operation.ADDITION)); + attr.accept(b); + }); + } + + public MetalGolemBowItem(Properties properties, int baseline, int atk) { + this(properties, baseline, atk, b -> { + }); + } + + public float getPower(LivingEntity user, int time) { + return Math.min(1, 1f * time / getPullTime(user)); + } + + public int getPullTime(LivingEntity user) { + var val = user.getAttributeValue(Attributes.ATTACK_DAMAGE); + val = Mth.clamp(0.5, val / baseline, 4); + return (int) (40 / val); + } + + protected int getPiercing(ItemStack stack, @Nullable MetalGolemEntity e) { + return baseline / 10 + stack.getEnchantmentLevel(Enchantments.PIERCING); + } + + @Override + public AbstractArrow customArrow(AbstractArrow arrow) { + var ans = super.customArrow(arrow); + if (ans.getOwner() instanceof MetalGolemEntity e) { + var p = BowPoseUtil.getOrigin(e); + ans.setPos(p); + ans.setBaseDamage((ans.getBaseDamage() + 3) * baseline / 15f); + + if (e.getMainHandItem().getItem() == this) { + ans.setPierceLevel((byte) getPiercing(e.getMainHandItem(), e)); + } + + } + return ans; + } + + @Override + public @Nullable ResourceLocation getModelForHand(InteractionHand hand) { + return hand == InteractionHand.MAIN_HAND ? GolemModelPaths.BOW_MAINHAND : GolemModelPaths.BOW_OFFHAND; + } + + @Override + public ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + var id = ForgeRegistries.ITEMS.getKey(this); + assert id != null; + String suffix = shouldPlayAnimation(entity, stack, hand) ? "_pulling.png" : ".png"; + return id.withPath(e -> "textures/equipments/" + e + suffix); + } + + @Override + public boolean shouldPlayAnimation(LivingEntity user, ItemStack stack, InteractionHand hand) { + return user.isUsingItem() && user.getUsedItemHand() == hand; + } + + @Override + public float getAnimationSpeed(LivingEntity user, ItemStack stack, InteractionHand hand) { + return 10f / getPullTime(user); + } + + @Override + public float getAnimationTick(LivingEntity user, ItemStack stack, InteractionHand hand) { + return 10f * user.getTicksUsingItem() / getPullTime(user); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.GOLEM_EQUIPMENT.get(GolemTypes.ENTITY_GOLEM.get().getDescription().copy().withStyle(ChatFormatting.GOLD)) + .withStyle(ChatFormatting.UNDERLINE)); + list.add(MGLangData.BOW_STIFFNESS.get(baseline + "").withStyle(ChatFormatting.BLUE)); + int pierce = getPiercing(stack, null); + list.add(MGLangData.BOW_PIERCE.get(pierce + "").withStyle(ChatFormatting.GRAY)); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + return InteractionResultHolder.pass(player.getItemInHand(hand)); + } + + @Override + public void releaseUsing(ItemStack stack, Level level, LivingEntity user, int time) { + } + + @Override + public boolean isFor(EntityType type) { + return type == GolemTypes.ENTITY_GOLEM.get(); + } + + @Override + public EquipmentSlot getSlot() { + return EquipmentSlot.MAINHAND; + } + + @Override + public Multimap getGolemModifiers(ItemStack stack, @Nullable Entity user, EquipmentSlot slot) { + if (user != null && !isFor(user.getType())) + return ImmutableMultimap.of(); + return stack.getAttributeModifiers(slot); + } + + @Deprecated + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + return slot == getSlot() ? defaultModifiers : super.getDefaultAttributeModifiers(slot); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return true; + } + + @Override + public int getEnchantmentValue() { + return 15; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment.category == EnchantmentCategory.BOW) { + return true; + } + if (enchantment == Enchantments.PIERCING) { + return true; + } + return super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public boolean canBeHurtBy(DamageSource source) { + return !getDefaultInstance().is(MGTagGen.TOUGH_ITEM) || !( + source.is(DamageTypeTags.IS_FIRE) || + source.is(DamageTypeTags.IS_EXPLOSION) || + source.is(DamageTypeTags.IS_LIGHTNING)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemMechaBowItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemMechaBowItem.java new file mode 100644 index 000000000..847abe9ed --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/MetalGolemMechaBowItem.java @@ -0,0 +1,49 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import com.google.common.collect.ImmutableMultimap; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Consumer; + +public class MetalGolemMechaBowItem extends MetalGolemBowItem implements IMultiShotBow { + + public MetalGolemMechaBowItem(Properties properties, int baseline, Consumer> attr) { + super(properties, baseline, attr); + } + + public MetalGolemMechaBowItem(Properties properties, int baseline, int atk, Consumer> attr) { + super(properties, baseline, atk, attr); + } + + public MetalGolemMechaBowItem(Properties properties, int baseline, int atk) { + super(properties, baseline, atk); + } + + @Override + public int getMaxShoot(@Nullable LivingEntity user, ItemStack stack) { + return 3 + stack.getEnchantmentLevel(Enchantments.MULTISHOT) * 2; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + super.appendHoverText(stack, level, list, flag); + list.add(MGLangData.MULTI_SHOT.get(getMaxShoot(null, stack)).withStyle(ChatFormatting.GRAY)); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return super.canApplyAtEnchantingTable(stack, enchantment) || enchantment == Enchantments.MULTISHOT; + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/ShouldWeaponItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/ShouldWeaponItem.java new file mode 100644 index 000000000..002ee64fd --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/ShouldWeaponItem.java @@ -0,0 +1,39 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class ShouldWeaponItem extends Item implements IShoulderWeapon { + + public ShouldWeaponItem(Properties properties) { + super(properties.stacksTo(1)); + } + + @Override + public ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + var id = ForgeRegistries.ITEMS.getKey(this); + assert id != null; + return id.withPath(e -> "textures/equipments/" + e + ".png"); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.GOLEM_EQUIPMENT.get(GolemTypes.ENTITY_GOLEM.get().getDescription().copy().withStyle(ChatFormatting.GOLD)) + .withStyle(ChatFormatting.UNDERLINE)); + list.add(MGLangData.SHOULDER_WEAPON.get()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonBehavior.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonBehavior.java new file mode 100644 index 000000000..83d1c103c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonBehavior.java @@ -0,0 +1,120 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.mob_weapon_api.api.projectile.ProjectileWeaponUser; +import dev.xkmc.mob_weapon_api.api.simple.IHoldWeaponBehavior; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGDamageTypes; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +import java.util.ArrayList; +import java.util.List; + +public class SonicCannonBehavior implements IHoldWeaponBehavior { + + public static void setCharge(ItemStack stack, int charge) { + stack.getOrCreateTag().putInt("SonicCharge", charge); + } + + public static int getCharge(ItemStack stack) { + var tag = stack.getTag(); + if (tag == null) return 0; + return tag.getInt("SonicCharge"); + } + + @Override + public boolean isValid(ProjectileWeaponUser user, ItemStack stack) { + return user.user() instanceof MetalGolemEntity; + } + + @Override + public double range(LivingEntity le, ItemStack stack) { + return 15; + } + + @Override + public int holdTime(LivingEntity le, ItemStack stack) { + return getCharge(stack) > 0 ? 0 : 34; + } + + @Override + public void tickUsing(ProjectileWeaponUser user, ItemStack stack, int time) { + if (getCharge(stack) <= 0 && time == 1) { + user.user().playSound(SoundEvents.WARDEN_SONIC_CHARGE, 3.0F, 1.0F); + } + } + + @Override + public int trigger(ProjectileWeaponUser user, ItemStack stack, LivingEntity target, int time) { + if (!(user.user() instanceof MetalGolemEntity golem)) return 20; + int charge = getCharge(stack); + if (charge <= 0) setCharge(stack, 2); + else setCharge(stack, charge - 1); + float factor = MGConfig.COMMON.sonicCannonDamageFactor.get().floatValue(); + int cd = 20; + for (var e : golem.getMaterials()) { + if (e.id().equals(ModularGolems.loc("sculk"))) { + factor += MGConfig.COMMON.sonicCannonResonanceBonus.get().floatValue(); + if (e.getPart().getPart() == MetalGolemPartType.BODY) { + cd = 10; + } + } + } + if (user.user().level() instanceof ServerLevel sl) { + float dmg = Math.max(10, (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE) * factor); + Vec3 dst = target.getEyePosition(); + var offset = 7 / 16f * golem.getScale(); + Vec3 src = BowPoseUtil.getOrigin(golem).add(0, offset, 0); + Vec3 dir = dst.subtract(src).normalize(); + shoot(sl, user.user(), src, dir, dmg); + } + return cd; + } + + + public static void shoot(ServerLevel level, LivingEntity user, Vec3 src, Vec3 dir, float damage) { + for (int i = 1; i < 17; ++i) { + Vec3 vec33 = src.add(dir.scale(i)); + level.sendParticles(ParticleTypes.SONIC_BOOM, vec33.x, vec33.y, vec33.z, 1, 0.0F, 0.0F, 0.0F, 0.0F); + } + + List target = new ArrayList<>(); + AABB aabb = new AABB(src, src.add(dir.scale(17.0F))); + + for (Entity e : level.getEntities(user, aabb)) { + if (e instanceof LivingEntity x) { + AABB box = x.getBoundingBox().inflate(1.0F); + for (int i = 0; i <= 17; ++i) { + if (box.contains(src.add(dir.scale(i)))) { + target.add(x); + break; + } + } + } + } + + for (LivingEntity e : target) { + var source = new DamageSource(level.registryAccess().lookupOrThrow(Registries.DAMAGE_TYPE).getOrThrow(MGDamageTypes.ECHO), user); + e.hurt(source, damage); + double d1 = (double) 0.5F * ((double) 1.0F - e.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE)); + double d0 = (double) 2.5F * ((double) 1.0F - e.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE)); + e.push(dir.x() * d0, dir.y() * d1, dir.z() * d0); + } + level.playSound(null, user.blockPosition(), SoundEvents.WARDEN_SONIC_BOOM, SoundSource.PLAYERS, 3.0F, 1.0F); + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonItem.java new file mode 100644 index 000000000..3c9468b83 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/SonicCannonItem.java @@ -0,0 +1,64 @@ +package dev.xkmc.modulargolems.content.item.ranged; + +import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; +import dev.xkmc.modulargolems.content.client.weapon.IEntityModelWeapon; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.GolemEquipmentItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class SonicCannonItem extends GolemEquipmentItem implements IEntityModelWeapon { + + public SonicCannonItem(Properties properties) { + super(properties, EquipmentSlot.MAINHAND, GolemTypes.ENTITY_GOLEM::get, e -> { + }); + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public boolean emissive() { + return true; + } + + @Override + public ResourceLocation getModelTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + return ModularGolems.loc("textures/equipments/sonic_cannon.png"); + } + + @Override + public ResourceLocation getEmissiveTexture(MetalGolemEntity entity, ItemStack stack, InteractionHand hand) { + return ModularGolems.loc("textures/equipments/sonic_cannon_emissive.png"); + } + + @Override + public @Nullable ResourceLocation getPoseId() { + return GolemModelPaths.BOW_MAINHAND; + } + + @Override + public @Nullable ResourceLocation getModelForHand(InteractionHand hand) { + return hand == InteractionHand.MAIN_HAND ? GolemModelPaths.SONIC_MAINHAND : GolemModelPaths.SONIC_OFFHAND; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.SONIC_CANNON.get()); + list.add(MGLangData.SONIC_CANNON_RESONANCE.get()); + super.appendHoverText(stack, level, list, flag); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/ranged/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/package-info.java new file mode 100644 index 000000000..b72950dc8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/ranged/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.item.ranged; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/AddSlotTemplate.java b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/AddSlotTemplate.java new file mode 100644 index 000000000..02c9b2b38 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/AddSlotTemplate.java @@ -0,0 +1,37 @@ +package dev.xkmc.modulargolems.content.item.upgrade; + +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import dev.xkmc.modulargolems.content.modifier.common.AddSlotModifier; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Supplier; + +public class AddSlotTemplate extends Item implements IUpgradeItem { + + private final Supplier sup; + + public AddSlotTemplate(Properties p, Supplier sup) { + super(p); + this.sup = sup; + } + + @Override + public List get() { + return List.of(new ModifierInstance(sup.get(), 1)); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + for (var e : get()) { + list.add(e.mod().getTooltip(e.level())); + list.addAll(e.mod().getDetail(e.level())); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/CraftMaterialItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/CraftMaterialItem.java new file mode 100644 index 000000000..90fe8f803 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/CraftMaterialItem.java @@ -0,0 +1,24 @@ +package dev.xkmc.modulargolems.content.item.upgrade; + +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CraftMaterialItem extends Item { + + public CraftMaterialItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.CRAFT_MAT.get()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/IUpgradeItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/IUpgradeItem.java new file mode 100644 index 000000000..24fcb669f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/IUpgradeItem.java @@ -0,0 +1,12 @@ +package dev.xkmc.modulargolems.content.item.upgrade; + +import dev.xkmc.modulargolems.content.modifier.base.ModifierInstance; +import net.minecraft.world.level.ItemLike; + +import java.util.List; + +public interface IUpgradeItem extends ItemLike { + + List get(); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/RepairMaterialItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/RepairMaterialItem.java new file mode 100644 index 000000000..ed3fe52d6 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/RepairMaterialItem.java @@ -0,0 +1,24 @@ +package dev.xkmc.modulargolems.content.item.upgrade; + +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class RepairMaterialItem extends Item { + + public RepairMaterialItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flag) { + list.add(MGLangData.REPAIR_MAT.get()); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/UpgradeItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/UpgradeItem.java index 7dc31551e..7e77e6bf6 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/UpgradeItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/upgrade/UpgradeItem.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; -public abstract class UpgradeItem extends Item { +public abstract class UpgradeItem extends Item implements IUpgradeItem { public static final List LIST = new ArrayList<>(); diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/CommandWandItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/CommandWandItem.java index 52facf37c..0824fd50b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/wand/CommandWandItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/CommandWandItem.java @@ -1,6 +1,5 @@ package dev.xkmc.modulargolems.content.item.wand; -import com.simibubi.create.Create; import com.tterrag.registrate.util.entry.ItemEntry; import dev.xkmc.l2library.util.raytrace.IGlowingTarget; import dev.xkmc.l2library.util.raytrace.RayTraceUtil; @@ -8,12 +7,12 @@ import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; import dev.xkmc.modulargolems.content.client.outline.BlockOutliner; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.mode.GolemMode; import dev.xkmc.modulargolems.content.entity.mode.GolemModes; import dev.xkmc.modulargolems.content.item.card.ConfigCard; import dev.xkmc.modulargolems.content.menu.equipment.EquipmentsMenuPvd; +import dev.xkmc.modulargolems.content.menu.wheel.GolemWheelHandler; +import dev.xkmc.modulargolems.init.data.MGConfig; import dev.xkmc.modulargolems.init.data.MGLangData; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -25,7 +24,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.entity.EntityTypeTest; -import net.minecraftforge.fml.ModList; import org.jetbrains.annotations.Nullable; public class CommandWandItem extends BaseWandItem implements GolemInteractItem, IGlowingTarget { @@ -40,11 +38,9 @@ public CommandWandItem(Properties properties, @Nullable ItemEntry golem) { - if (golem.getMode() == GolemModes.ROUTE) { - BlockOutliner.drawOutlines(player, golem.getPatrolList()); - } + if (RayTraceUtil.serverGetTarget(player) instanceof AbstractGolemEntity golem) { + if (golem.getMode() == GolemModes.ROUTE) { + BlockOutliner.drawOutlines(player, golem.getPatrolList()); } } } @@ -58,6 +54,8 @@ public InteractionResultHolder use(Level level, Player player, Intera if (target != null) { interactLivingEntity(stack, player, target, hand); } + } else if (RayTraceUtil.serverGetTarget(player) instanceof AbstractGolemEntity golem) { + return command(golem.level(), player, golem) ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); } return InteractionResultHolder.success(stack); } @@ -72,7 +70,8 @@ public InteractionResult interactLivingEntity(ItemStack stack, Player user, Livi if (!(target instanceof AbstractGolemEntity golem)) { if (user instanceof ServerPlayer sp) { if (target instanceof OwnableEntity ownable && ownable.getOwner() == user) { - CurioCompatRegistry.tryOpen(sp, target); + if (MGConfig.COMMON.allowEditCuriosForOthers.get()) + CurioCompatRegistry.tryOpen(sp, target); } else { hurtEnemy(stack, target, user); } @@ -84,15 +83,15 @@ public InteractionResult interactLivingEntity(ItemStack stack, Player user, Livi private static boolean command(Level level, Player user, AbstractGolemEntity golem) { if (!ConfigCard.getFilter(user).test(golem)) return false; - if (!golem.canModify(user)) return false; - if (level.isClientSide()) return true; + if (!golem.canWandModify(user)) return false; + if (user.isShiftKeyDown()) { + if (level.isClientSide()) return true; new EquipmentsMenuPvd(golem).open((ServerPlayer) user); return true; } - GolemMode mode = GolemModes.nextMode(golem.getMode()); - golem.setMode(mode.getID(), mode.hasPos() ? golem.blockPosition() : BlockPos.ZERO); - return true; + if (!level.isClientSide()) return true; + return GolemWheelHandler.enableWheel(user, golem); } @Override @@ -102,7 +101,7 @@ public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity atta int size = 0; for (var e : list) { if (!ConfigCard.getFilter(player).test(e)) return false; - if (!e.canModify(player)) return false; + if (!e.canWandModify(player)) return false; if (e.getOwner() == attacker) { size++; e.resetTarget(target); diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/DispenseWand.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/DispenseWand.java index cf7c9ca23..5ae919179 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/wand/DispenseWand.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/DispenseWand.java @@ -16,18 +16,8 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -import java.util.function.Predicate; - public class DispenseWand extends BaseWandItem implements GolemInteractItem { - private static void iter(Player player, Predicate use) { - if (use.test(player.getOffhandItem())) return; - for (int i = 0; i < 36; i++) { - if (use.test(player.getInventory().getItem(i))) - return; - } - } - public DispenseWand(Properties properties, @Nullable ItemEntry base) { super(properties, MGLangData.WAND_SUMMON_RIGHT, MGLangData.WAND_SUMMON_SHIFT, base); } @@ -35,7 +25,7 @@ public DispenseWand(Properties properties, @Nullable ItemEntry use(Level level, Player user, InteractionHand hand) { ItemStack stack = user.getItemInHand(hand); - if (!level.isClientSide()) { + if (user instanceof ServerPlayer sp) { boolean all = user.isShiftKeyDown(); Vec3 pos = user.position(); if (!all) { @@ -46,7 +36,7 @@ public InteractionResultHolder use(Level level, Player user, Interact } Vec3 finalPos = pos; int[] counter = new int[]{0}; - iter(user, golem -> { + GolemTransportHandler.summonGolemFromPlayer(sp, golem -> { if (golem.getItem() instanceof GolemHolder holder) { if (holder.summon(golem, level, finalPos, user, null)) { counter[0]++; @@ -55,7 +45,7 @@ public InteractionResultHolder use(Level level, Player user, Interact } return false; }); - if (counter[0] > 1 && user instanceof ServerPlayer sp) { + if (counter[0] > 1) { GolemTriggers.MAS_SUMMON.trigger(sp, counter[0]); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/GolemTransportHandler.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/GolemTransportHandler.java new file mode 100644 index 000000000..c644b20f5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/GolemTransportHandler.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.content.item.wand; + +import dev.xkmc.l2backpack.init.L2Backpack; +import dev.xkmc.modulargolems.compat.backpack.L2BCompat; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.ModList; + +import java.util.function.Predicate; + +public class GolemTransportHandler { + + public static void addGolemToPlayer(ServerPlayer player, ItemStack stack, AbstractGolemEntity golem) { + if (ModList.get().isLoaded(L2Backpack.MODID)) { + if (L2BCompat.addGolemToPlayer(player, stack, golem)) { + return; + } + } + if (player.addItem(stack)) { + golem.setRetrivedTo(GolemTracker.RetrieveTarget.INVENTORY); + return; + } + player.drop(stack, false); + } + + public static void summonGolemFromPlayer(ServerPlayer player, Predicate use) { + if (ModList.get().isLoaded(L2Backpack.MODID)) { + if (L2BCompat.summonGolemFromPlayer(player, use)) { + return; + } + } + if (use.test(player.getOffhandItem())) return; + for (int i = 0; i < 36; i++) { + if (use.test(player.getInventory().getItem(i))) + return; + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/HostileWandItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/HostileWandItem.java new file mode 100644 index 000000000..87b36c054 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/HostileWandItem.java @@ -0,0 +1,70 @@ +package dev.xkmc.modulargolems.content.item.wand; + +import dev.xkmc.l2library.util.raytrace.IGlowingTarget; +import dev.xkmc.l2library.util.raytrace.RayTraceUtil; +import dev.xkmc.modulargolems.content.capability.GolemTracker; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.hostile.HostileGolemRegistry; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class HostileWandItem extends Item implements GolemInteractItem, IGlowingTarget { + + private static final int RANGE = 64; + + public HostileWandItem(Item.Properties properties) { + super(properties); + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + if (level.isClientSide() && selected && entity instanceof Player player) { + RayTraceUtil.clientUpdateTarget(player, RANGE); + } + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + if (!level.isClientSide()) { + LivingEntity target = RayTraceUtil.serverGetTarget(player); + if (target != null) { + interactLivingEntity(stack, player, target, hand); + } + } + return InteractionResultHolder.success(stack); + } + + @Override + public int getDistance(ItemStack itemStack) { + return RANGE; + } + + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player user, LivingEntity target, InteractionHand hand) { + if (target instanceof AbstractGolemEntity golem) { + if (user instanceof ServerPlayer sp) { + if (!golem.isHostile()) { + if (golem.getOwner() == user || sp.getAbilities().instabuild) { + golem.untrack(GolemTracker.Status.OTHER_RETRIEVED, null); + golem.setOwnerUUID(HostileGolemRegistry.DEFAULT.uuid); + } + } else if (sp.getAbilities().instabuild) { + golem.setOwnerUUID(sp.getUUID()); + } + } + } else { + target.addTag("HostileGolemTarget"); + } + return InteractionResult.SUCCESS; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/RetrievalWandItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/RetrievalWandItem.java index 3dbe27dae..259e322f4 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/wand/RetrievalWandItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/RetrievalWandItem.java @@ -7,6 +7,7 @@ import dev.xkmc.modulargolems.content.item.card.ConfigCard; import dev.xkmc.modulargolems.init.data.MGConfig; import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -27,13 +28,8 @@ public RetrievalWandItem(Properties properties, @Nullable ItemEntry use(Level level, Player user, InteractionHand hand) { ItemStack stack = user.getItemInHand(hand); if (user.isShiftKeyDown()) { - var result = RayTraceUtil.rayTraceEntity(user, MGConfig.COMMON.retrieveDistance.get(), e -> (e instanceof AbstractGolemEntity golem) && golem.canModify(user)); - if (result == null) return InteractionResultHolder.fail(stack); - var golem = result.getEntity(); - return attemptRetrieve(level, user, Wrappers.cast(golem)) ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); - } else { var list = level.getEntities(EntityTypeTest.forClass(AbstractGolemEntity.class), user.getBoundingBox().inflate(MGConfig.COMMON.retrieveRange.get()), e -> true); - if (list.size() == 0) { + if (list.isEmpty()) { return InteractionResultHolder.pass(stack); } boolean success = false; @@ -41,6 +37,11 @@ public InteractionResultHolder use(Level level, Player user, Interact success |= attemptRetrieve(level, user, golem); } return success ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); + } else { + var result = RayTraceUtil.rayTraceEntity(user, MGConfig.COMMON.retrieveDistance.get(), e -> (e instanceof AbstractGolemEntity golem) && golem.canWandModify(user)); + if (result == null) return InteractionResultHolder.fail(stack); + var golem = result.getEntity(); + return attemptRetrieve(level, user, Wrappers.cast(golem)) ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); } } @@ -52,10 +53,10 @@ public InteractionResult interactLivingEntity(ItemStack stack, Player user, Livi private static boolean attemptRetrieve(Level level, Player user, AbstractGolemEntity golem) { if (!ConfigCard.getFilter(user).test(golem)) return false; - if (!golem.canModify(user)) return false; - if (level.isClientSide()) return true; + if (!golem.canWandModify(user)) return false; + if (!(user instanceof ServerPlayer sp)) return true; golem.unRide(); - user.getInventory().placeItemBackInInventory(golem.toItem()); + GolemTransportHandler.addGolemToPlayer(sp, golem.toItem(user), golem); return true; } diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/RiderWandItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/RiderWandItem.java index 3296cfdcb..899c0f9a0 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/wand/RiderWandItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/RiderWandItem.java @@ -44,7 +44,7 @@ public InteractionResultHolder use(Level level, Player user, Interact private static boolean ride(Level level, Player user, AbstractGolemEntity golem) { if (!ConfigCard.getFilter(user).test(golem)) return false; - if (!golem.canModify(user) && !(golem.getControllingPassenger() instanceof Player)) return false; + if (!golem.canWandModify(user) && !(golem.getControllingPassenger() instanceof Player)) return false; if (level.isClientSide()) return true; if (golem instanceof DogGolemEntity e) { user.startRiding(e, false); diff --git a/src/main/java/dev/xkmc/modulargolems/content/item/wand/SquadWandItem.java b/src/main/java/dev/xkmc/modulargolems/content/item/wand/SquadWandItem.java index d78210bbe..c666dfcc3 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/item/wand/SquadWandItem.java +++ b/src/main/java/dev/xkmc/modulargolems/content/item/wand/SquadWandItem.java @@ -6,7 +6,6 @@ import dev.xkmc.modulargolems.content.capability.GolemConfigEditor; import dev.xkmc.modulargolems.content.capability.GolemConfigEntry; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; -import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; import dev.xkmc.modulargolems.content.item.card.ConfigCard; import dev.xkmc.modulargolems.init.data.MGLangData; import net.minecraft.world.InteractionHand; @@ -64,22 +63,19 @@ public InteractionResult interactLivingEntity(ItemStack stack, Player user, Livi private static boolean choose(Level level, Player user, AbstractGolemEntity golem) { if (!ConfigCard.getFilter(user).test(golem)) return false; - if (!golem.canModify(user)) return false; + if (!golem.canWandModify(user)) return false; if (level.isClientSide()) return true; - if (!(golem instanceof DogGolemEntity)) { - GolemConfigEntry entry = golem.getConfigEntry(null); - if (entry != null) { - var editor = new GolemConfigEditor.Writable(level, entry).getSquad(); - UUID capId = editor.getCaptainId(); - UUID golemId = golem.getUUID(); - if (capId != null && capId.equals(golemId)) { - editor.setCaptainId(null); - } else { - editor.setCaptainId(golemId); - } - } else return false; - - } + GolemConfigEntry entry = golem.getConfigEntry(null); + if (entry != null) { + var editor = new GolemConfigEditor.Writable(level, entry).getSquad(); + UUID capId = editor.getCaptainId(); + UUID golemId = golem.getUUID(); + if (capId != null && capId.equals(golemId)) { + editor.setCaptainId(null); + } else { + editor.setCaptainId(golemId); + } + } else return false; return false; } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/attribute/AttributeScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/attribute/AttributeScreen.java index 727dee53a..ebce3209b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/attribute/AttributeScreen.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/attribute/AttributeScreen.java @@ -29,17 +29,17 @@ public class AttributeScreen extends BaseTextScreen implements ITabScreen { public static final Lazy> ATTRIBUTES = Lazy.of(() -> List.of( - new AttributeEntry(Attributes.MAX_HEALTH, false, 0,0), - new AttributeEntry(Attributes.ATTACK_DAMAGE, false, 1,0), - new AttributeEntry(Attributes.ARMOR, false, 2,0), - new AttributeEntry(Attributes.ARMOR_TOUGHNESS, false, 3,0), - new AttributeEntry(Attributes.KNOCKBACK_RESISTANCE, false, 4,0), - new AttributeEntry(Attributes.MOVEMENT_SPEED, false, 5,0), - new AttributeEntry(ForgeMod.ENTITY_REACH.get(), false, 6,0), - new AttributeEntry(GolemTypes.GOLEM_REGEN.get(), false, 7,0), - new AttributeEntry(GolemTypes.GOLEM_SWEEP.get(), false, 8,0), - new AttributeEntry(GolemTypes.GOLEM_SIZE.get(), false, 9,0), - new AttributeEntry(GolemTypes.GOLEM_JUMP.get(), false, 10,0) + new AttributeEntry(Attributes.MAX_HEALTH, false, 0, 0), + new AttributeEntry(Attributes.ATTACK_DAMAGE, false, 1, 0), + new AttributeEntry(Attributes.ARMOR, false, 2, 0), + new AttributeEntry(Attributes.ARMOR_TOUGHNESS, false, 3, 0), + new AttributeEntry(Attributes.KNOCKBACK_RESISTANCE, false, 4, 0), + new AttributeEntry(Attributes.MOVEMENT_SPEED, false, 5, 0), + new AttributeEntry(ForgeMod.ENTITY_REACH.get(), false, 6, 0), + new AttributeEntry(GolemTypes.GOLEM_REGEN.get(), false, 7, 0), + new AttributeEntry(GolemTypes.GOLEM_SWEEP.get(), false, 8, 0), + new AttributeEntry(GolemTypes.GOLEM_SIZE.get(), false, 9, 0), + new AttributeEntry(GolemTypes.GOLEM_JUMP.get(), false, 10, 0) )); private final AbstractGolemEntity golem; diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsContainer.java b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsContainer.java index 283aae886..12a3c67c5 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsContainer.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsContainer.java @@ -1,8 +1,10 @@ package dev.xkmc.modulargolems.content.menu.equipment; import dev.xkmc.l2library.base.menu.base.BaseContainerMenu; +import dev.xkmc.mob_weapon_api.api.ai.ItemWrapper; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; -import dev.xkmc.modulargolems.content.entity.humanoid.ItemWrapper; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import net.minecraft.world.item.ItemStack; public class EquipmentsContainer extends BaseContainerMenu.BaseContainer { @@ -14,14 +16,20 @@ public EquipmentsContainer(EquipmentsMenu menu) { private ItemWrapper getWrapper(int index) { if (parent.golem == null || index < 0) return ItemWrapper.EMPTY; if (index < 6) { - return parent.golem.getWrapperOfHand(EquipmentsMenu.SLOTS[index]); + return parent.golem.getWrapperOfHand(parent.equipmentSlots[index]); + } + if (parent.golem instanceof SweepGolemEntity e) { + if (index == 6) + return e.getBackupHand(); + if (index == 7) + return e.getArrowSlot(); + } + if (parent.golem instanceof MetalGolemEntity metal) { + if (index == 8) + return metal.getRightShoulder(); + if (index == 9) + return metal.getLeftShoulder(); } - if (!(parent.golem instanceof HumanoidGolemEntity humanoid)) - return ItemWrapper.EMPTY; - if (index == 6) - return humanoid.getBackupHand(); - if (index == 7) - return humanoid.getArrowSlot(); return ItemWrapper.EMPTY; } @@ -40,4 +48,10 @@ public ItemStack removeItem(int index, int count) { return getWrapper(index).getItem().split(count); } + @Override + public void setChanged() { + if (parent.golem instanceof HumanoidGolemEntity humanoid) { + humanoid.triggerReassess(); + } + } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsMenu.java b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsMenu.java index 01cba5fe0..4a057cc49 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsMenu.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsMenu.java @@ -5,13 +5,14 @@ import dev.xkmc.l2library.base.menu.base.SpriteManager; import dev.xkmc.l2library.util.Proxy; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemBeaconItem; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.ranged.IShoulderWeapon; import dev.xkmc.modulargolems.events.event.GolemEquipEvent; +import dev.xkmc.modulargolems.events.event.GolemEquipItemEvent; import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; @@ -19,11 +20,12 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.BannerItem; +import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import javax.annotation.Nullable; +import java.util.Set; public class EquipmentsMenu extends BaseContainerMenu { @@ -34,32 +36,57 @@ public static EquipmentsMenu fromNetwork(MenuType type, int wid, } public static EquipmentSlot[] SLOTS = {EquipmentSlot.MAINHAND, EquipmentSlot.OFFHAND, EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}; + public static EquipmentSlot[] DOG_SLOTS = {EquipmentSlot.HEAD, EquipmentSlot.CHEST}; public static final SpriteManager MANAGER = new SpriteManager(ModularGolems.MODID, "equipments"); - public static final SpriteManager EXTRA = new SpriteManager(ModularGolems.MODID, "equipments_extra"); + @Nullable public final AbstractGolemEntity golem; + protected final EquipmentSlot[] equipmentSlots; protected EquipmentsMenu(MenuType type, int wid, Inventory plInv, @Nullable AbstractGolemEntity golem) { - super(type, wid, plInv, golem instanceof HumanoidGolemEntity ? EXTRA : MANAGER, EquipmentsContainer::new, false); + super(type, wid, plInv, MANAGER, EquipmentsContainer::new, false); this.golem = golem; - addSlot("hand", (i, e) -> isValid(SLOTS[i], e)); - addSlot("armor", (i, e) -> isValid(SLOTS[i + 2], e)); - if (golem instanceof HumanoidGolemEntity) { - addSlot("backup", e -> isValid(EquipmentSlot.MAINHAND, e)); - addSlot("arrow", ItemStack::isStackable); + equipmentSlots = golem instanceof DogGolemEntity ? DOG_SLOTS : SLOTS; + if (golem instanceof DogGolemEntity) { + addSlot("chest", e -> isValid(EquipmentSlot.HEAD, e)); + addSlot("legs", e -> isValid(EquipmentSlot.CHEST, e)); + } else { + addSlot("right_hand", (i, e) -> isValid(EquipmentSlot.MAINHAND, e)); + addSlot("left_hand", (i, e) -> isValid(EquipmentSlot.OFFHAND, e)); + addSlot("head", e -> isValid(EquipmentSlot.HEAD, e)); + addSlot("chest", e -> isValid(EquipmentSlot.CHEST, e)); + addSlot("legs", e -> isValid(EquipmentSlot.LEGS, e)); + addSlot("feet", e -> isValid(EquipmentSlot.FEET, e)); + if (golem instanceof SweepGolemEntity) { + addSlot("backup", e -> isValid(EquipmentSlot.MAINHAND, e) || isValid(EquipmentSlot.OFFHAND, e)); + addSlot("arrow", e -> true); + } + if (golem instanceof MetalGolemEntity) { + addSlot("right_shoulder", e -> e.getItem() instanceof IShoulderWeapon); + addSlot("left_shoulder", e -> e.getItem() instanceof IShoulderWeapon); + } } } private boolean isValid(EquipmentSlot slot, ItemStack stack) { - return getSlotForItem(stack) == slot; + if (golem instanceof HumanoidGolemEntity) { + if (slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) + return true; + } + var valids = getSlotForItem(stack); + if (golem instanceof MetalGolemEntity && valids.contains(EquipmentSlot.MAINHAND)) { + if (slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) + return true; + } + return valids.contains(slot); } @Override public boolean stillValid(Player player) { - if (golem == null) return false; + if (golem == null || !player.isAlive()) return false; golem.inventoryTick = 5; - return golem.isAlive() && !golem.isRemoved(); + return !golem.isRemoved() && golem.getGuardedDataImpl() > 0; } @Override @@ -74,10 +101,17 @@ public ItemStack quickMoveStack(Player pl, int id) { if (id >= 36) { this.moveItemStackTo(stack, 0, 36, true); } else { - EquipmentSlot es = getSlotForItem(stack); - for (int i = 0; i < 6; i++) { - if (SLOTS[i] == es) { + if (golem instanceof SweepGolemEntity && stack.getItem() instanceof ArrowItem) { + this.moveItemStackTo(stack, 36 + 7, 37 + 7, false); + } + if (golem instanceof MetalGolemEntity && stack.getItem() instanceof IShoulderWeapon) { + this.moveItemStackTo(stack, 36 + 8, 37 + 9, false); + } + var es = getSlotForItem(stack); + for (int i = 0; i < equipmentSlots.length; i++) { + if (es.contains(equipmentSlots[i])) { this.moveItemStackTo(stack, 36 + i, 37 + i, false); + break; } } } @@ -86,36 +120,25 @@ public ItemStack quickMoveStack(Player pl, int id) { return ItemStack.EMPTY; } - @Nullable - public EquipmentSlot getSlotForItem(ItemStack stack) { + public Set getSlotForItem(ItemStack stack) { if (!stillValid(inventory.player) || golem == null) { - return null; + return Set.of(); } - if (!stack.getItem().canFitInsideContainerItems()) return null; - if (stack.getItem() instanceof GolemHolder) return null; + if (!stack.getItem().canFitInsideContainerItems()) return Set.of(); + if (stack.getItem() instanceof GolemHolder) return Set.of(); if (golem instanceof HumanoidGolemEntity humanoidGolem) { GolemEquipEvent event = new GolemEquipEvent(humanoidGolem, stack); MinecraftForge.EVENT_BUS.post(event); if (event.canEquip()) { - return event.getSlot(); - } else { - return null; + return Set.of(event.getSlot()); } } - if (golem instanceof MetalGolemEntity) {//TODO use events - if (stack.getItem() instanceof MetalGolemArmorItem mgai) { - return mgai.getSlot(); - } else if (stack.getItem() instanceof MetalGolemBeaconItem) { - return EquipmentSlot.FEET; - } else if (stack.getItem() instanceof MetalGolemWeaponItem) { - return EquipmentSlot.MAINHAND; - } else if (stack.getItem() instanceof BannerItem) { - if (golem.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) - return EquipmentSlot.HEAD; - else return EquipmentSlot.FEET; - } + GolemEquipItemEvent event = new GolemEquipItemEvent(golem, stack); + MinecraftForge.EVENT_BUS.post(event); + if (event.canEquip()) { + return Set.of(event.getSlot()); } - return null; + return Set.of(); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsScreen.java index 01cba7d5b..ccce37b41 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsScreen.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/equipment/EquipmentsScreen.java @@ -1,13 +1,24 @@ package dev.xkmc.modulargolems.content.menu.equipment; import dev.xkmc.l2library.base.menu.base.BaseContainerScreen; +import dev.xkmc.l2library.base.menu.base.PredSlot; +import dev.xkmc.modulargolems.content.entity.common.SweepGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.PlayerSkinButton; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.PlayerSkinInputScreen; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.menu.registry.EquipmentGroup; import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; import dev.xkmc.modulargolems.content.menu.tabs.GolemTabManager; import dev.xkmc.modulargolems.content.menu.tabs.ITabScreen; import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; @@ -25,54 +36,112 @@ public EquipmentsScreen(EquipmentsMenu cont, Inventory plInv, Component title) { protected void renderBg(GuiGraphics g, float pTick, int mx, int my) { var sr = menu.sprite.get().getRenderer(this); sr.start(g); - - if (menu.getAsPredSlot("hand", 0, 1).getItem().isEmpty()) - sr.draw(g, "hand", "altas_shield", 0, 18); - if (menu.getAsPredSlot("armor", 0, 0).getItem().isEmpty()) - sr.draw(g, "armor", "altas_helmet", 0, 0); - if (menu.getAsPredSlot("armor", 0, 1).getItem().isEmpty()) - sr.draw(g, "armor", "altas_chestplate", 0, 18); - if (menu.getAsPredSlot("armor", 0, 2).getItem().isEmpty()) - sr.draw(g, "armor", "altas_leggings", 0, 18 * 2); - if (menu.getAsPredSlot("armor", 0, 3).getItem().isEmpty()) - sr.draw(g, "armor", "altas_boots", 0, 18 * 3); - - if (menu.golem instanceof HumanoidGolemEntity) { - if (menu.getAsPredSlot("arrow", 0, 0).getItem().isEmpty()) - sr.draw(g, "arrow", "slotbg_arrow", -1, -1); + if (menu.golem instanceof DogGolemEntity) { + sr.draw(g, "chest", "slot", -1, -1); + sr.draw(g, "legs", "slot", -1, -1); + if (menu.getAsPredSlot("chest", 0, 0).getItem().isEmpty()) + sr.draw(g, "chest", "altas_helmet", 0, 0); + if (menu.getAsPredSlot("legs", 0, 0).getItem().isEmpty()) + sr.draw(g, "legs", "slotbg_dog_armor", -1, -1); + } else { + sr.draw(g, "right_hand", "slot", -1, -1); + sr.draw(g, "left_hand", "slot", -1, -1); + sr.draw(g, "head", "slot", -1, -1); + sr.draw(g, "chest", "slot", -1, -1); + sr.draw(g, "legs", "slot", -1, -1); + sr.draw(g, "feet", "slot", -1, -1); + if (menu.getAsPredSlot("left_hand", 0, 0).getItem().isEmpty()) + sr.draw(g, "left_hand", "altas_shield", 0, 0); + if (menu.getAsPredSlot("right_hand", 0, 0).getItem().isEmpty()) + sr.draw(g, "right_hand", "slotbg_sword", -1, -1); + if (menu.getAsPredSlot("head", 0, 0).getItem().isEmpty()) + sr.draw(g, "head", "altas_helmet", 0, 0); + if (menu.getAsPredSlot("chest", 0, 0).getItem().isEmpty()) + sr.draw(g, "chest", "altas_chestplate", 0, 0); + if (menu.getAsPredSlot("legs", 0, 0).getItem().isEmpty()) + sr.draw(g, "legs", "altas_leggings", 0, 0); + if (menu.getAsPredSlot("feet", 0, 0).getItem().isEmpty()) + sr.draw(g, "feet", "altas_boots", 0, 0); + if (menu.golem instanceof SweepGolemEntity) { + sr.draw(g, "arrow", "slot", -1, -1); + sr.draw(g, "backup", "slot", -1, -1); + if (menu.getAsPredSlot("arrow", 0, 0).getItem().isEmpty()) + sr.draw(g, "arrow", "slotbg_arrow", -1, -1); + if (menu.getAsPredSlot("backup", 0, 0).getItem().isEmpty()) + sr.draw(g, "backup", "slotbg_bow", -1, -1); + } + if (menu.golem instanceof MetalGolemEntity) { + sr.draw(g, "left_shoulder", "slot", -1, -1); + sr.draw(g, "right_shoulder", "slot", -1, -1); + if (menu.getAsPredSlot("left_shoulder", 0, 0).getItem().isEmpty()) + sr.draw(g, "left_shoulder", "slotbg_shoulder", -1, -1); + if (menu.getAsPredSlot("right_shoulder", 0, 0).getItem().isEmpty()) + sr.draw(g, "right_shoulder", "slotbg_shoulder", -1, -1); + } } + renderPreview(g, mx, my); } @Override protected void init() { super.init(); + if (menu.golem == null) return; new GolemTabManager<>(this, new EquipmentGroup(menu.golem)) .init(this::addRenderableWidget, GolemTabRegistry.EQUIPMENT); + if (menu.golem instanceof HumanoidGolemEntity golem) { + addRenderableWidget(new PlayerSkinButton(leftPos + 137, topPos + 5, golem, b -> + Minecraft.getInstance().setScreen(new PlayerSkinInputScreen(golem)))); + } } @Override protected void renderTooltip(GuiGraphics g, int mx, int my) { super.renderTooltip(g, mx, my); - if (menu.golem instanceof HumanoidGolemEntity && + if (menu.golem instanceof SweepGolemEntity && menu.getCarried().isEmpty() && - hoveredSlot != null && !hoveredSlot.hasItem()) { + hoveredSlot instanceof PredSlot && !hoveredSlot.hasItem()) { List list = null; - if (hoveredSlot.getContainerSlot() == 0) { - list = List.of(MGLangData.SLOT_MAIN.get(), - MGLangData.SLOT_MAIN_DESC.get()); - } - if (hoveredSlot.getContainerSlot() == 1) { - list = List.of(MGLangData.SLOT_OFF.get()); + if (menu.golem instanceof HumanoidGolemEntity) { + if (hoveredSlot.getContainerSlot() == 0) { + list = List.of(MGLangData.SLOT_MAIN.get(), + MGLangData.SLOT_MAIN_DESC.get()); + } + if (hoveredSlot.getContainerSlot() == 1) { + list = List.of(MGLangData.SLOT_OFF.get()); + } + if (hoveredSlot.getContainerSlot() == 6) { + list = List.of(MGLangData.SLOT_BACKUP.get(), + MGLangData.SLOT_BACKUP_DESC.get(), + MGLangData.SLOT_BACKUP_INFO.get()); + } + if (hoveredSlot.getContainerSlot() == 7) { + list = List.of(MGLangData.SLOT_ARROW.get(), + MGLangData.SLOT_ARROW_DESC.get()); + } } - if (hoveredSlot.getContainerSlot() == 6) { - list = List.of(MGLangData.SLOT_BACKUP.get(), - MGLangData.SLOT_BACKUP_DESC.get(), - MGLangData.SLOT_BACKUP_INFO.get()); - } - if (hoveredSlot.getContainerSlot() == 7) { - list = List.of(MGLangData.SLOT_ARROW.get(), - MGLangData.SLOT_ARROW_DESC.get()); - + if (menu.golem instanceof MetalGolemEntity) { + if (hoveredSlot.getContainerSlot() == 0) { + list = List.of(MGLangData.SLOT_MAIN.get(), + MGLangData.SLOT_MAIN_DESC_METAL.get()); + } + if (hoveredSlot.getContainerSlot() == 1) { + list = List.of(MGLangData.SLOT_OFF.get()); + } + if (hoveredSlot.getContainerSlot() == 6) { + list = List.of(MGLangData.SLOT_BACKUP.get(), + MGLangData.SLOT_BACKUP_DESC.get(), + MGLangData.SLOT_BACKUP_INFO.get()); + } + if (hoveredSlot.getContainerSlot() == 7) { + list = List.of(MGLangData.SLOT_ARROW.get(), + MGLangData.SLOT_ARROW_DESC.get()); + } + if (hoveredSlot.getContainerSlot() == 8) { + list = List.of(MGLangData.SLOT_SHOULDER.get()); + } + if (hoveredSlot.getContainerSlot() == 9) { + list = List.of(MGLangData.SLOT_SHOULDER.get()); + } } if (list != null) { g.renderTooltip(this.font, list, Optional.empty(), ItemStack.EMPTY, mx, my); @@ -80,6 +149,22 @@ protected void renderTooltip(GuiGraphics g, int mx, int my) { } } + private void renderPreview(GuiGraphics g, int mx, int my) { + if (menu.golem == null) return; + int x = leftPos + 30; + int y = topPos + 80; + double lx = x - mx; + double ly = y - 40 - my; + int scale = menu.golem instanceof MetalGolemEntity ? 20 : + menu.golem instanceof HumanoidGolemEntity ? 24 : + menu.golem instanceof DogGolemEntity ? 32 : 18; + float ax = (float) Math.atan(lx / 50.0); + float ay = (float) Math.atan(ly / 50.0); + scale = (int) (scale / menu.golem.getScale()); + InventoryScreen.renderEntityInInventoryFollowsAngle(g, x, y, scale, ax, ay, menu.golem); + + } + @Override public int screenWidth() { return width; @@ -90,4 +175,8 @@ public int screenHeight() { return height; } + public T addSkinWidget(T pWidget) { + return addRenderableWidget(pWidget); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenu.java b/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenu.java index 6ae086010..c6938a96f 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenu.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenu.java @@ -4,7 +4,6 @@ import dev.xkmc.modulargolems.content.capability.GolemConfigEditor; import dev.xkmc.modulargolems.content.capability.PathEditor; import dev.xkmc.modulargolems.content.capability.PickupFilterConfig; -import dev.xkmc.modulargolems.content.capability.PickupFilterEditor; import dev.xkmc.modulargolems.content.menu.ghost.GhostItemMenu; import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.network.FriendlyByteBuf; @@ -12,7 +11,6 @@ import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; -import org.jetbrains.annotations.NotNull; public class PathConfigMenu extends GhostItemMenu { diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenuProvider.java b/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenuProvider.java index a09400f30..8c92a34d2 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenuProvider.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/path/PathConfigMenuProvider.java @@ -2,7 +2,6 @@ import dev.xkmc.modulargolems.content.capability.GolemConfigEditor; import dev.xkmc.modulargolems.content.capability.GolemConfigEntry; -import dev.xkmc.modulargolems.content.menu.filter.ItemConfigMenu; import dev.xkmc.modulargolems.content.menu.registry.IMenuPvd; import dev.xkmc.modulargolems.init.registrate.GolemMiscs; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/registry/GolemTabRegistry.java b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/GolemTabRegistry.java index 606d94f58..2a41e9732 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/registry/GolemTabRegistry.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/GolemTabRegistry.java @@ -1,10 +1,13 @@ package dev.xkmc.modulargolems.content.menu.registry; +import dev.xkmc.modulargolems.content.client.tracker.TrackerTab; import dev.xkmc.modulargolems.content.menu.attribute.AttributeTab; import dev.xkmc.modulargolems.content.menu.config.ConfigToggleTab; import dev.xkmc.modulargolems.content.menu.equipment.EquipmentTab; import dev.xkmc.modulargolems.content.menu.filter.ConfigItemTab; import dev.xkmc.modulargolems.content.menu.path.ConfigPathTab; +import dev.xkmc.modulargolems.content.menu.table.TableTab; +import dev.xkmc.modulargolems.content.menu.table.TableTabType; import dev.xkmc.modulargolems.content.menu.tabs.GolemTabToken; import dev.xkmc.modulargolems.content.menu.target.ConfigTargetTab; import dev.xkmc.modulargolems.init.data.MGLangData; @@ -18,6 +21,8 @@ public class GolemTabRegistry { public static final List> LIST_CONFIG = new ArrayList<>(); public static final List> LIST_EQUIPMENT = new ArrayList<>(); + public static final List> LIST_TRACKER = new ArrayList<>(); + public static final List> LIST_TABLE = new ArrayList<>(); public static final GolemTabToken CONFIG_TOGGLE = new GolemTabToken<>(ConfigToggleTab::new, GolemItems.CARD[0]::get, MGLangData.TAB_TOGGLE.get()); @@ -37,6 +42,28 @@ public class GolemTabRegistry { public static final GolemTabToken ATTRIBUTE = new GolemTabToken<>(AttributeTab::new, () -> Items.IRON_SWORD, MGLangData.TAB_ATTRIBUTE.get()); + public static final GolemTabToken TRACKER_ALIVE = + new GolemTabToken<>(TrackerTab.Type.ALIVE::create, () -> Items.POPPY, MGLangData.TAB_ALIVE.get()); + public static final GolemTabToken TRACKER_DEAD = + new GolemTabToken<>(TrackerTab.Type.DEAD::create, () -> Items.WITHER_ROSE, MGLangData.TAB_DEAD.get()); + public static final GolemTabToken TRACKER_RETRIEVE = + new GolemTabToken<>(TrackerTab.Type.RETRIEVE::create, GolemItems.RETRIEVAL_WAND::get, MGLangData.TAB_RETRIEVE.get()); + + public static final GolemTabToken TABLE_UPGRADE = + new GolemTabToken<>(TableTab.from(TableTabType.UPGRADE), GolemItems.EMPTY_UPGRADE, TableTabType.UPGRADE.getDisplayName()); + public static final GolemTabToken TABLE_DISINTEGRATE = + new GolemTabToken<>(TableTab.from(TableTabType.DISINTEGRATE), GolemItems.SLICING_AXE::get, TableTabType.DISINTEGRATE.getDisplayName()); + public static final GolemTabToken TABLE_CRAFT = + new GolemTabToken<>(TableTab.from(TableTabType.CRAFT), () -> Items.CRAFTING_TABLE, TableTabType.CRAFT.getDisplayName()); + public static final GolemTabToken TABLE_STONECUTTER = + new GolemTabToken<>(TableTab.from(TableTabType.STONECUTTER), () -> Items.STONECUTTER, TableTabType.STONECUTTER.getDisplayName()); + public static final GolemTabToken TABLE_ANVIL = + new GolemTabToken<>(TableTab.from(TableTabType.ANVIL), () -> Items.ANVIL, TableTabType.ANVIL.getDisplayName()); + public static final GolemTabToken TABLE_SMITHING = + new GolemTabToken<>(TableTab.from(TableTabType.SMITHING), () -> Items.SMITHING_TABLE, TableTabType.SMITHING.getDisplayName()); + public static final GolemTabToken TABLE_GRINDSTONE = + new GolemTabToken<>(TableTab.from(TableTabType.GRINDSTONE), () -> Items.GRINDSTONE, TableTabType.GRINDSTONE.getDisplayName()); + public static void register() { LIST_CONFIG.add(CONFIG_TOGGLE); LIST_CONFIG.add(CONFIG_ITEM); @@ -44,6 +71,16 @@ public static void register() { LIST_CONFIG.add(CONFIG_PATH); LIST_EQUIPMENT.add(EQUIPMENT); LIST_EQUIPMENT.add(ATTRIBUTE); + LIST_TRACKER.add(TRACKER_ALIVE); + LIST_TRACKER.add(TRACKER_DEAD); + LIST_TRACKER.add(TRACKER_RETRIEVE); + LIST_TABLE.add(TABLE_DISINTEGRATE); + LIST_TABLE.add(TABLE_UPGRADE); + LIST_TABLE.add(TABLE_CRAFT); + LIST_TABLE.add(TABLE_STONECUTTER); + LIST_TABLE.add(TABLE_ANVIL); + LIST_TABLE.add(TABLE_SMITHING); + LIST_TABLE.add(TABLE_GRINDSTONE); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TableGroup.java b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TableGroup.java new file mode 100644 index 000000000..3840f9ebb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TableGroup.java @@ -0,0 +1,11 @@ +package dev.xkmc.modulargolems.content.menu.registry; + +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabGroup; + +public class TableGroup extends GolemTabGroup { + + public TableGroup() { + super(GolemTabRegistry.LIST_TABLE); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TrackerGroup.java b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TrackerGroup.java new file mode 100644 index 000000000..7f041365f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/registry/TrackerGroup.java @@ -0,0 +1,11 @@ +package dev.xkmc.modulargolems.content.menu.registry; + +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabGroup; + +public class TrackerGroup extends GolemTabGroup { + + public TrackerGroup() { + super(GolemTabRegistry.LIST_TRACKER); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisinegrateScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisinegrateScreen.java new file mode 100644 index 000000000..9fa752db3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisinegrateScreen.java @@ -0,0 +1,273 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import com.mojang.datafixers.util.Pair; +import dev.xkmc.l2library.base.menu.base.BaseContainerScreen; +import dev.xkmc.l2library.base.overlay.TextBox; +import dev.xkmc.modulargolems.content.config.GolemMaterial; +import dev.xkmc.modulargolems.content.core.GolemStatType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.ClientHolderManager; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.menu.tabs.ITabScreen; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; + +import java.util.*; + +public class GolemDisinegrateScreen extends BaseContainerScreen implements ITabScreen { + + private Button disintegrate; + private Component buttonError; + + public GolemDisinegrateScreen(GolemDisintegrateMenu cont, Inventory plInv, Component title) { + super(cont, plInv, title); + } + + @Override + protected void init() { + super.init(); + TableTab.initScreen(TableTabType.DISINTEGRATE, this, this::addRenderableWidget); + + var ref = menu.sprite.get().getComp("button"); + this.addRenderableWidget(disintegrate = Button.builder(Component.empty(), (e) -> this.click(1)) + .pos(leftPos + ref.x + 1, topPos + ref.y + 1).size(14, 14) + .build(b -> new SpriteButton(b, menu.sprite.get(), + "dissembly_on", "dissembly_down", "dissembly_ban"))); + } + + @Override + protected void renderBg(GuiGraphics g, float pt, int mx, int my) { + var sr = menu.sprite.get().getRenderer(this); + sr.start(g); + for (var e : menu.partSlots) { + if (e.isActive()) { + if (e == menu.body) { + sr.draw(g, e.name, "core_slot", -2, -2); + } else { + sr.draw(g, e.name, "slot", -1, -1); + } + if (e.getItem().isEmpty() && !e.partShadow.isEmpty()) + drawShadow(g, e, e.partShadow); + } + } + if (menu.extra.isActive()) { + sr.draw(g, "extra_mat", "slot", -1, -1); + if (menu.extra.getItem().isEmpty() && !menu.extra.ingot.isEmpty()) { + drawShadow(g, menu.extra, getExtraMat()); + } + } + if (menu.result.isActive()) { + sr.draw(g, "result", "result_slot", -5, -5); + sr.draw(g, "arrow", "arrow_0", -3, 0); + if (menu.result.getItem().isEmpty() && !menu.result.output.isEmpty()) + drawShadow(g, menu.result, menu.result.output); + } + var input = menu.main.getItem(); + buttonError = null; + boolean mayBreak = !input.isEmpty(); + for (var e : menu.partSlots) + mayBreak &= e.getItem().isEmpty(); + disintegrate.visible = mayBreak; + if (mayBreak) { + float max = GolemHolder.getMaxHealth(input); + float health = GolemHolder.getHealth(input); + int reforge = GolemHolder.getReforge(input); + if (max > 0 && health < max || reforge > 0) { + mayBreak = false; + buttonError = MGLangData.UI_FIX_FIRST.get(); + } + } + disintegrate.active = mayBreak; + var result = menu.result.getItem(); + if (result.isEmpty()) + result = menu.result.output; + renderPreview(g, mx, my, result.isEmpty() ? input : result); + if (!result.isEmpty()) renderDiff(g, input, result); + } + + private ItemStack getExtraMat() { + var list = menu.extra.ingot.getItems(); + if (list.length == 0) return ItemStack.EMPTY; + var time = menu.inventory.player.level().getGameTime() / 30; + return list[(int) (time % list.length)]; + } + + private void drawShadow(GuiGraphics g, Slot e, ItemStack stack) { + int x = leftPos + e.x; + int y = topPos + e.y; + g.renderItem(stack, x, y, e.x + e.y * this.imageWidth); + g.fillGradient(RenderType.guiOverlay(), x, y, x + 16, y + 16, 0x7f8B8B8B, 0x7f8B8B8B, 0); + + } + + private void renderPreview(GuiGraphics g, int mx, int my, ItemStack preview) { + if (preview.getItem() instanceof GolemHolder holder) { + AbstractGolemEntity golem = ClientHolderManager.getEntityForDisplay(holder, preview); + if (golem != null) { + int x = leftPos + 30; + int y = topPos + 80; + double lx = x - mx; + double ly = y - 40 - my; + + int scale = golem instanceof MetalGolemEntity ? 18 : + golem instanceof HumanoidGolemEntity ? 24 : + golem instanceof DogGolemEntity ? 32 : 18; + float ax = (float) Math.atan(lx / 50.0); + float ay = (float) Math.atan(ly / 50.0); + InventoryScreen.renderEntityInInventoryFollowsAngle(g, + x, y, scale, ax, ay, golem); + } + } + } + + private void renderDiff(GuiGraphics g, ItemStack input, ItemStack result) { + var matI = GolemHolder.getMaterial(input); + var matR = GolemHolder.getMaterial(result); + var upI = GolemHolder.getUpgrades(input); + var upR = GolemHolder.getUpgrades(result); + + List comp = new ArrayList<>(); + { + var statI = GolemMaterial.collectAttributes(matI, upI); + var statR = GolemMaterial.collectAttributes(matR, upR); + Map> ans = new LinkedHashMap<>(); + var add = new LinkedHashSet<>(statR.keySet()); + add.removeAll(statI.keySet()); + for (var e : add) + ans.put(e, statR.get(e)); + var common = new LinkedHashSet<>(statI.keySet()); + common.retainAll(statR.keySet()); + for (var e : common) { + var er = statR.get(e); + var ei = statI.get(e); + if (er.getFirst() != ei.getFirst()) continue; + ans.put(e, Pair.of(er.getFirst(), er.getSecond() - ei.getSecond())); + } + var old = new LinkedHashSet<>(statI.keySet()); + old.removeAll(statR.keySet()); + for (var e : old) + ans.put(e, statI.get(e).mapSecond(x -> -x)); + for (var ent : ans.entrySet()) { + var v = ent.getValue(); + if (Math.abs(v.getSecond()) > 1e-3) { + comp.add(v.getFirst().getDiffTooltip(v.getSecond())); + } + } + } + + { + var modI = GolemMaterial.collectModifiers(matI, upI); + var modR = GolemMaterial.collectModifiers(matR, upR); + Map ans = new LinkedHashMap<>(); + var add = new LinkedHashSet<>(modR.keySet()); + add.removeAll(modI.keySet()); + for (var e : add) + ans.put(e, modR.get(e)); + var common = new LinkedHashSet<>(modI.keySet()); + common.retainAll(modR.keySet()); + for (var e : common) { + ans.put(e, modR.get(e) - modI.get(e)); + } + var old = new LinkedHashSet<>(modI.keySet()); + old.removeAll(modR.keySet()); + for (var e : old) + ans.put(e, -modI.get(e)); + for (var ent : ans.entrySet()) { + int lv = ent.getValue(); + if (lv == 0) continue; + var col = lv > 0 ? ChatFormatting.LIGHT_PURPLE : ChatFormatting.RED; + comp.add(Component.literal(lv > 0 ? "+ " : "- ") + .append(ent.getKey().getTooltip(Math.abs(lv)).copy() + .withStyle(col)).withStyle(col)); + } + } + + if (comp.isEmpty()) return; + comp.add(0, MGLangData.UI_DIFF_STAT.get()); + var box = new TextBox(g, 2, 0, leftPos - 6, topPos + 6, leftPos - 10); + box.renderLongText(font, comp); + } + + protected void renderTooltip(GuiGraphics g, int x, int y) { + if (disintegrate.isHovered()) { + if (buttonError != null) { + g.renderTooltip(font, + List.of(buttonError), + Optional.empty(), + ItemStack.EMPTY, x, y); + return; + } + if (disintegrate.isActive()) { + var list = menu.main.dropList; + if (list.isEmpty()) { + g.renderTooltip(font, + List.of(MGLangData.UI_DISINTEGRATE.get()), + Optional.empty(), + ItemStack.EMPTY, x, y); + } else if (list.size() > 54) { + g.renderTooltip(font, + List.of(MGLangData.UI_RETURN_MANY.get(list.size())), + Optional.empty(), + ItemStack.EMPTY, x, y); + } else { + g.renderTooltip(font, + List.of(MGLangData.UI_RETURN_ITEMS.get()), + Optional.of(new ItemListTooltip(list)), + ItemStack.EMPTY, x, y); + } + return; + } + } + if (this.menu.getCarried().isEmpty() && hoveredSlot != null && hoveredSlot.getItem().isEmpty()) { + if (hoveredSlot instanceof GolemDisintegrateMenu.ResultSlot slot && slot.error != null) { + Optional item = Optional.empty(); + if (!menu.extra.ingot.isEmpty()) { + item = Optional.of(new ItemListTooltip(List.of(getExtraMat().copyWithCount(menu.extra.count)))); + } + g.renderTooltip(font, List.of(slot.error), item, ItemStack.EMPTY, x, y); + return; + } + if (hoveredSlot instanceof GolemDisintegrateMenu.PartSlot slot && !slot.partShadow.isEmpty()) { + var stack = slot.partShadow; + g.renderTooltip(font, getTooltipFromContainerItem(stack), stack.getTooltipImage(), stack, x, y); + return; + } + } + super.renderTooltip(g, x, y); + } + + @Override + public int getLeftExpansion() { + return menu.result.getItem().isEmpty() && menu.result.output.isEmpty() ? 0 : leftPos; + } + + @Override + public int getRightExpansion() { + return 0; + } + + @Override + public int screenWidth() { + return width; + } + + @Override + public int screenHeight() { + return height; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisintegrateMenu.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisintegrateMenu.java new file mode 100644 index 000000000..d3a37bb26 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemDisintegrateMenu.java @@ -0,0 +1,389 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.l2library.base.menu.base.BaseContainerMenu; +import dev.xkmc.l2library.base.menu.base.PredSlot; +import dev.xkmc.l2library.base.menu.base.SpriteManager; +import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemPartType; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemPartType; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.content.item.upgrade.AddSlotTemplate; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import dev.xkmc.modulargolems.util.GolemUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class GolemDisintegrateMenu extends BaseContainerMenu implements ITableMenu { + + private record GolemSlots

>(String name, IGolemPart

part) { + + } + + public static GolemDisintegrateMenu fromNetwork(MenuType type, int wid, Inventory plInv, FriendlyByteBuf buf) { + return new GolemDisintegrateMenu(type, wid, plInv); + } + + public static GolemDisintegrateMenu createFloating(int wid, Inventory plInv, ContainerLevelAccess access) { + return new GolemDisintegrateMenu(GolemMiscs.DISINTEGRATE.get(), wid, plInv); + } + + public static final SpriteManager MANAGER = new SpriteManager(ModularGolems.MODID, "disintegrate"); + + private static final String UP = "golem_up", LEFT = "golem_left", MIDDLE = "golem_middle", RIGHT = "golem_right", DOWN = "golem_down"; + + @SuppressWarnings("unchecked") + private static final GolemSlots[] LARGE = new GolemSlots[]{ + new GolemSlots<>(LEFT, MetalGolemPartType.RIGHT), + new GolemSlots<>(MIDDLE, MetalGolemPartType.BODY), + new GolemSlots<>(RIGHT, MetalGolemPartType.LEFT), + new GolemSlots<>(DOWN, MetalGolemPartType.LEG) + }; + + @SuppressWarnings("unchecked") + private static final GolemSlots[] HUMANOID = new GolemSlots[]{ + new GolemSlots<>(UP, HumanoidGolemPartType.BODY), + new GolemSlots<>(MIDDLE, HumanoidGolemPartType.ARMS), + new GolemSlots<>(DOWN, HumanoidGolemPartType.LEGS) + }; + + @SuppressWarnings("unchecked") + private static final GolemSlots[] DOG = new GolemSlots[]{ + new GolemSlots<>(MIDDLE, DogGolemPartType.BODY), + new GolemSlots<>(DOWN, DogGolemPartType.LEGS) + }; + + protected MainSlot main; + protected ExtraMatSlot extra; + protected ResultSlot result; + protected PartSlot body; + protected final List partSlots = new ArrayList<>(); + + private boolean changing = false; + + public GolemDisintegrateMenu(MenuType type, int wid, Inventory plInv) { + super(type, wid, plInv, MANAGER, e -> new BaseContainer<>(7, e), true); + sprite.get().getSlot("golem", (x, y) -> new MainSlot(container, added++, x, y), this::addSlot); + addPartSlot(UP); + addPartSlot(LEFT); + addPartSlot(MIDDLE); + addPartSlot(RIGHT); + addPartSlot(DOWN); + sprite.get().getSlot("extra_mat", (x, y) -> new ExtraMatSlot(container, added++, x, y), this::addSlot); + sprite.get().getSlot("result", ResultSlot::new, this::addSlot); + added++; + } + + private void addPartSlot(String slot) { + sprite.get().getSlot(slot, (x, y) -> new PartSlot(slot, container, added++, x, y), this::addSlot); + } + + @Override + public Slot getMainSlot() { + return main; + } + + @Override + public void slotsChanged(Container cont) { + if (!changing) { + main.update(); + boolean allEmpty = main.getItem().isEmpty(); + for (var e : partSlots) + allEmpty &= e.getItem().isEmpty(); + for (var e : partSlots) + e.updateVisibility(allEmpty); + result.update(); + extra.update(); + } + super.slotsChanged(cont); + } + + @Override + public boolean clickMenuButton(Player player, int id) { + if (id == 1) { + var input = main.getItem(); + if (input.getItem() instanceof GolemHolder) { + boolean mayBreak = !input.isEmpty(); + for (var e : partSlots) + mayBreak &= e.getItem().isEmpty(); + if (mayBreak) { + float max = GolemHolder.getMaxHealth(input); + float health = GolemHolder.getHealth(input); + int reforge = GolemHolder.getReforge(input); + if (max > 0 && health < max || reforge > 0) + mayBreak = false; + } + if (!mayBreak) return false; + if (!(inventory.player instanceof ServerPlayer sp)) + return true; + changing = true; + for (var e : partSlots) + e.set(e.partShadow); + changing = false; + for (var e : main.dropList) { + returnToPlayer(e); + } + main.set(ItemStack.EMPTY); + return true; + } + return false; + } + return super.clickMenuButton(player, id); + } + + @Override + public ItemStack quickMoveStack(Player pl, int id) { + var slot = this.slots.get(id); + ItemStack stack = slot.getItem(); + if (slot instanceof ResultSlot result) { + if (moveItemStackTo(stack, 0, 36, true)) { + result.onTake(pl, stack); + } + return ItemStack.EMPTY; + } + return super.quickMoveStack(pl, id); + } + + public class MainSlot extends PredSlot { + + public List dropList = new ArrayList<>(); + + public MainSlot(Container container, int index, int x, int y) { + super(container, index, x, y, e -> e.getItem() instanceof GolemHolder); + main = this; + } + + @Override + public boolean mayPlace(ItemStack stack) { + for (var e : partSlots) + if (!e.isValid(stack, e.getItem())) + return false; + return super.mayPlace(stack); + } + + public void update() { + dropList = GolemUtils.collectFromGolem(inventory.player.level(), getItem(), true); + } + } + + public class ExtraMatSlot extends PredSlot { + + public Ingredient ingot = Ingredient.EMPTY; + public int count = 0; + + public ExtraMatSlot(Container container, int index, int x, int y) { + super(container, index, x, y, e -> true); + extra = this; + } + + @Override + public boolean mayPlace(ItemStack stack) { + return ingot.test(stack); + } + + @Override + public boolean isActive() { + return !getItem().isEmpty() || !ingot.isEmpty() && count > 0; + } + + public void update() { + } + + } + + public class ResultSlot extends PredSlot { + + protected int rem; + protected ItemStack output = ItemStack.EMPTY; + protected @Nullable Component error; + + public ResultSlot(int x, int y) { + super(new SimpleContainer(1), 0, x, y, e -> false); + result = this; + } + + + @Override + public void onTake(Player player, ItemStack stack) { + changing = true; + for (var e : partSlots) { + if (!e.getItem().isEmpty()) + e.set(e.partShadow); + } + if (!extra.getItem().isEmpty()) { + extra.getItem().shrink(extra.count); + } + changing = false; + main.set(ItemStack.EMPTY); + super.onTake(player, stack); + } + + @Override + public boolean isActive() { + return !getItem().isEmpty() || !output.isEmpty(); + } + + public void update() { + rem = 0; + extra.ingot = Ingredient.EMPTY; + extra.count = 0; + output = ItemStack.EMPTY; + error = null; + var input = main.getItem(); + if (input.getItem() instanceof GolemHolder holder) { + var list = GolemHolder.getMaterial(input); + boolean success = false; + var ans = input.copy(); + if (list.size() == holder.getEntityType().values().length) { + for (var slot : partSlots) { + var item = slot.getItem(); + var part = slot.of(holder); + if (part == null) continue; + if (!(item.getItem() instanceof GolemPart)) continue; + var opt = GolemPart.getMaterial(item); + if (opt.isEmpty()) continue; + GolemHolder.setMaterial(ans, part.ordinal(), opt.get()); + success = true; + } + } + if (success) { + var mhp = GolemHolder.getMaxHealth(input); + if (mhp > 0 && GolemHolder.getHealth(input) >= mhp) { + GolemHolder.setHealth(ans, GolemHolder.getMaxHealth(ans)); + } + var upgrades = GolemHolder.getUpgrades(ans); + rem = holder.getRemaining(GolemHolder.getMaterial(ans), upgrades); + if (rem < 0) { + error = MGLangData.UI_SUB_SLOT.get(); + output = ans; + set(ItemStack.EMPTY); + return; + } + if (body != null && !body.getItem().isEmpty()) { + int count = 0; + for (var e : upgrades) { + if (e instanceof AddSlotTemplate) { + count++; + } + } + if (count > 0) { + var mat = GolemHolder.getCraftMaterial(ans); + extra.ingot = mat; + extra.count = count; + ItemStack ex = extra.getItem(); + if (!mat.test(ex) || ex.getCount() < count) { + error = MGLangData.UI_SUB_INGOT.get(); + output = ans; + set(ItemStack.EMPTY); + return; + } + } + } + set(ans); + return; + } + } + set(ItemStack.EMPTY); + } + + } + + public class PartSlot extends Slot { + + public final String name; + + @Nullable + private IGolemPart large, humanoid, dog; + + private boolean active = false; + + public ItemStack partShadow = ItemStack.EMPTY; + + public PartSlot(String name, Container container, int index, int x, int y) { + super(container, index, x, y); + this.name = name; + partSlots.add(this); + for (var e : LARGE) if (e.name.equals(name)) large = e.part(); + for (var e : HUMANOID) if (e.name.equals(name)) humanoid = e.part(); + for (var e : DOG) if (e.name.equals(name)) dog = e.part(); + } + + @Nullable + private IGolemPart of(GolemHolder holder) { + return holder == GolemItems.HOLDER_GOLEM.get() ? large : + holder == GolemItems.HOLDER_HUMANOID.get() ? humanoid : + holder == GolemItems.HOLDER_DOG.get() ? dog : null; + } + + public boolean isValid(ItemStack golem, ItemStack item) { + if (item.isEmpty()) return true; + if (!(golem.getItem() instanceof GolemHolder holder)) return false; + if (!(item.getItem() instanceof GolemPart part)) return false; + if (GolemPart.getMaterial(item).isEmpty()) return false; + var type = of(holder); + return type != null && type.toItem() == part; + } + + @Override + public boolean mayPlace(ItemStack stack) { + return super.mayPlace(stack) && isValid(main.getItem(), stack); + } + + @Override + public boolean isActive() { + return !getItem().isEmpty() || active; + } + + public void updateVisibility(boolean allEmpty) { + partShadow = ItemStack.EMPTY; + if (allEmpty) { + active = !getItem().isEmpty(); + return; + } + if (!(main.getItem().getItem() instanceof GolemHolder holder)) + return; + var part = of(holder); + active = !getItem().isEmpty() || part != null; + if (part == null) return; + partShadow = part.toItem().getDefaultInstance(); + var list = GolemHolder.getMaterial(main.getItem()); + if (list.size() > part.ordinal()) { + partShadow = GolemPart.setMaterial(partShadow, list.get(part.ordinal()).id()); + } + if (part == holder.getEntityType().getBodyPart()) { + body = this; + } + } + + } + + private void returnToPlayer(ItemStack e) { + var player = inventory.player; + if (!(player instanceof ServerPlayer sp)) return; + if (player.isAlive() && !sp.hasDisconnected()) { + inventory.placeItemBackInInventory(e); + } else { + player.drop(e, false); + } + } + + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeItemHandler.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeItemHandler.java new file mode 100644 index 000000000..4effb6798 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeItemHandler.java @@ -0,0 +1,175 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.modulargolems.content.config.GolemMaterial; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.function.Supplier; + +public class GolemUpgradeItemHandler implements IItemHandlerModifiable { + + private static final int SIZE = 27; + + private final boolean client; + private final Supplier parent; + + public ItemStack golem = ItemStack.EMPTY; + public int[] data = new int[]{0, 1}; + public int modification = 0; + private GolemHolder holderItem = null; + private ArrayList materials = null; + private ArrayList upgrades = null; + private final LinkedHashMap upgradeMap = new LinkedHashMap<>(); + private ArrayList upgradeList = new ArrayList<>(); + private Item lastForbidTest = Items.AIR; + + public GolemUpgradeItemHandler(Supplier slot, boolean client) { + this.client = client; + parent = slot; + } + + public void setHolder(ItemStack stack) { + modification++; + golem = stack; + lastForbidTest = Items.AIR; + if (!(golem.getItem() instanceof GolemHolder holder)) { + holderItem = null; + materials = null; + upgrades = null; + golem = ItemStack.EMPTY; + upgradeMap.clear(); + upgradeList = new ArrayList<>(); + if (!client) { + data[0] = 0; + data[1] = 1; + } + return; + } + holderItem = holder; + materials = GolemHolder.getMaterial(stack); + upgrades = GolemHolder.getUpgrades(stack); + upgradeMap.clear(); + for (var e : upgrades) { + if (!upgradeMap.containsKey(e)) + upgradeMap.put(e, e.asItem().getDefaultInstance()); + else upgradeMap.get(e).grow(1); + } + upgradeList = new ArrayList<>(upgradeMap.values()); + if (!client) { + data[1] = upgradeList.size() / SIZE + 1; + } + } + + public ItemStack appendUpgrade(UpgradeItem upgrade) { + if (holderItem == null || !upgrade.fitsOn(holderItem.getEntityType())) return ItemStack.EMPTY; + var copy = new ArrayList<>(upgrades); + copy.add(upgrade); + int remaining = holderItem.getRemaining(materials, copy); + if (remaining < 0) return ItemStack.EMPTY; + var map = GolemMaterial.collectModifiers(materials, upgrades); + for (var e : upgrade.get()) { + if (map.getOrDefault(e.mod(), 0) >= e.mod().maxLevel) return ItemStack.EMPTY; + } + ItemStack result = golem.copy(); + GolemHolder.addUpgrade(result, upgrade); + return result; + } + + public ItemStack removeUpgrade(IUpgradeItem upgrade) { + var list = new ArrayList<>(upgrades); + if (!list.remove(upgrade)) return ItemStack.EMPTY; + if (holderItem.getRemaining(materials, list) < 0) return ItemStack.EMPTY; + var ans = golem.copy(); + GolemHolder.setUpgrades(ans, list); + return ans; + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + if (golem.isEmpty()) return; + var old = getStackInSlot(slot); + if (client || ItemStack.matches(old, stack)) return; + boolean match = ItemStack.isSameItemSameTags(old, stack); + int remove = match ? old.getCount() - stack.getCount() : old.getCount(); + int add = match ? stack.getCount() - old.getCount() : stack.getCount(); + if (remove > 0) { + for (int i = 0; i < remove; i++) { + extractItem(slot, 1, false); + } + } + if (add > 0) { + for (int i = 0; i < add; i++) { + insertItem(slot, stack.copyWithCount(1), false); + } + } + } + + @Override + public int getSlots() { + return SIZE; + } + + @Override + public @NotNull ItemStack getStackInSlot(int slot) { + int index = slot + SIZE * data[0]; + if (golem.isEmpty() || index < 0 || index >= upgradeList.size()) return ItemStack.EMPTY; + return upgradeList.get(index); + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (holderItem == null || stack.isEmpty()) return stack; + if (!(stack.getItem() instanceof UpgradeItem item)) return stack; + var ans = appendUpgrade(item); + if (ans.isEmpty()) return stack; + if (!simulate) { + parent.get().set(ans); + } + return stack.getCount() == 1 ? ItemStack.EMPTY : stack.copyWithCount(stack.getCount() - 1); + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + if (holderItem == null) return ItemStack.EMPTY; + var stack = getStackInSlot(slot); + if (stack.isEmpty() || !(stack.getItem() instanceof UpgradeItem item)) return ItemStack.EMPTY; + var ans = removeUpgrade(item); + if (ans.isEmpty()) return ItemStack.EMPTY; + if (!simulate) { + parent.get().set(ans); + } + return stack.copyWithCount(1); + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + if (golem.isEmpty()) return false; + var old = getStackInSlot(slot); + if (!old.isEmpty()) + return false; + if (!(stack.getItem() instanceof UpgradeItem)) + return false; + if (stack.getItem() == lastForbidTest) + return false; + if (insertItem(slot, stack.copyWithCount(1), true).isEmpty()) { + return true; + } + lastForbidTest = stack.getItem(); + return false; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeMenu.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeMenu.java new file mode 100644 index 000000000..081e4bb12 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeMenu.java @@ -0,0 +1,106 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.l2library.base.menu.base.BaseContainerMenu; +import dev.xkmc.l2library.base.menu.base.SpriteManager; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; + +public class GolemUpgradeMenu extends BaseContainerMenu implements ITableMenu { + + public static GolemUpgradeMenu fromNetwork(MenuType type, int wid, Inventory plInv, FriendlyByteBuf buf) { + return new GolemUpgradeMenu(type, wid, plInv); + } + + public static GolemUpgradeMenu createFloating(int wid, Inventory plInv, ContainerLevelAccess access) { + return new GolemUpgradeMenu(GolemMiscs.UPGRADES.get(), wid, plInv); + } + + public static final SpriteManager MANAGER = new SpriteManager(ModularGolems.MODID, "upgrades"); + + protected final GolemUpgradeItemHandler handler; + protected final DataSlot page, maxPage; + + public GolemUpgradeMenu(MenuType type, int wid, Inventory plInv) { + super(type, wid, plInv, MANAGER, e -> new BaseContainer<>(1, e), true); + handler = new GolemUpgradeItemHandler(() -> getAsPredSlot("golem"), plInv.player.level().isClientSide()); + addSlot("golem", e -> e.getItem() instanceof GolemHolder); + sprite.get().getSlot("upgrades", (x, y) -> new UpgradeSlot(handler, -1 + added++, x, y), this::addSlot); + page = addDataSlot(DataSlot.shared(handler.data, 0)); + maxPage = addDataSlot(DataSlot.shared(handler.data, 1)); + } + + @Override + public Slot getMainSlot() { + return getAsPredSlot("golem"); + } + + @Override + public void slotsChanged(Container cont) { + handler.setHolder(getAsPredSlot("golem").getItem()); + super.slotsChanged(cont); + } + + @Override + public boolean clickMenuButton(Player player, int val) { + if (val == -1) { + if (page.get() > 0) { + page.set(page.get() - 1); + return true; + } + return false; + } + if (val == 1) { + if (page.get() < maxPage.get()) { + page.set(page.get() + 1); + return true; + } + return false; + } + return false; + } + + @Override + public ItemStack quickMoveStack(Player pl, int id) { + ItemStack stack = slots.get(id).getItem(); + if (id >= 36) { + if (slots.get(id) instanceof UpgradeSlot upSlot) { + if (moveItemStackTo(stack.copyWithCount(1), 0, 36, true)) { + slots.get(id).remove(1); + } + } else { + moveItemStackTo(stack, 0, 36, true); + slots.get(id).setChanged(); + } + } else { + if (!moveItemStackTo(stack, 36, 37, false)) { + for (int i = 37; i < slots.size(); i++) { + var slotStack = slots.get(i).getItem(); + if (slotStack.isEmpty() || ItemStack.isSameItemSameTags(slotStack, stack)) { + if (handler.insertItem(i - 37, stack.copyWithCount(1), false).isEmpty()) { + stack.shrink(1); + break; + } + } + } + } + } + container.setChanged(); + return ItemStack.EMPTY; + } + + @Override + protected boolean shouldClear(Container container, int slot) { + return super.shouldClear(container, slot); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeScreen.java new file mode 100644 index 000000000..43db876a4 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/GolemUpgradeScreen.java @@ -0,0 +1,88 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.l2library.base.menu.base.BaseContainerScreen; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.content.menu.tabs.ITabScreen; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; + +import java.util.List; +import java.util.Optional; + +public class GolemUpgradeScreen extends BaseContainerScreen implements ITabScreen { + + private Button left, right; + + public GolemUpgradeScreen(GolemUpgradeMenu cont, Inventory plInv, Component title) { + super(cont, plInv, title); + } + + @Override + protected void renderBg(GuiGraphics g, float p_97788_, int p_97789_, int p_97790_) { + var sr = menu.sprite.get().getRenderer(this); + sr.start(g); + updatePage(); + } + + @Override + protected void init() { + super.init(); + TableTab.initScreen(TableTabType.UPGRADE, this, this::addRenderableWidget); + + int w = 11; + int h = 11; + int x = (this.width + this.imageWidth) / 2 - 70; + int y = (this.height - this.imageHeight) / 2 + 27; + this.addRenderableWidget(left = Button.builder(Component.empty(), (e) -> this.click(-1)) + .pos(x - w - 36, y).size(w, h).build(b -> new SpriteButton(b, menu.sprite.get(), + "page_prev_on", "page_prev_down", "page_prev_ban"))); + this.addRenderableWidget(right = Button.builder(Component.empty(), (e) -> this.click(1)) + .pos(x, y).size(w, h).build(b -> new SpriteButton(b, menu.sprite.get(), + "page_next_on", "page_next_down", "page_next_ban"))); + updatePage(); + } + + private void updatePage() { + left.active = left.visible = menu.page.get() > 0; + right.active = right.visible = menu.page.get() < menu.maxPage.get() - 1; + } + + + protected void renderTooltip(GuiGraphics g, int x, int y) { + if (this.menu.getCarried().isEmpty() && hoveredSlot != null && hoveredSlot.hasItem()) { + ItemStack stack = hoveredSlot.getItem(); + if (hoveredSlot instanceof UpgradeSlot) { + if (stack.getItem() instanceof IUpgradeItem && !(stack.getItem() instanceof UpgradeItem)) { + g.renderTooltip(font, List.of(MGLangData.UI_REMOVE_TEMPLATE.get()), Optional.empty(), stack, x, y); + return; + } + if (!hoveredSlot.mayPickup(menu.inventory.player)) { + g.renderTooltip(font, List.of(MGLangData.UI_NO_SLOT.get()), Optional.empty(), stack, x, y); + return; + } + } + g.renderTooltip(font, getTooltipFromContainerItem(stack), stack.getTooltipImage(), stack, x, y); + } + + } + + public int getRightExpansion() { + return 0; + } + + @Override + public int screenWidth() { + return width; + } + + @Override + public int screenHeight() { + return height; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/ITableMenu.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ITableMenu.java new file mode 100644 index 000000000..083ae2c30 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ITableMenu.java @@ -0,0 +1,9 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import net.minecraft.world.inventory.Slot; + +public interface ITableMenu { + + Slot getMainSlot(); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListClientTooltip.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListClientTooltip.java new file mode 100644 index 000000000..4d40ad906 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListClientTooltip.java @@ -0,0 +1,47 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public record ItemListClientTooltip(List inv) implements ClientTooltipComponent { + + public static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation("textures/gui/container/bundle.png"); + + public ItemListClientTooltip(ItemListTooltip comp) { + this(comp.inv()); + } + + public int getHeight() { + return (inv.size() + 8) / 9 * 18 + 2; + } + + public int getWidth(Font font) { + return Math.min(9, inv.size()) * 18; + } + + public void renderImage(Font font, int mx, int my, GuiGraphics g) { + int w = Math.min(9, inv.size()); + for (int i = 0; i < inv.size(); ++i) { + this.renderSlot(font, mx + i % w * 18, my + i / w * 18, g, inv.get(i)); + } + + } + + private void renderSlot(Font font, int x, int y, GuiGraphics g, ItemStack stack) { + this.blit(g, x, y); + if (!stack.isEmpty()) { + g.renderItem(stack, x + 1, y + 1, 0); + g.renderItemDecorations(font, stack, x + 1, y + 1); + } + } + + private void blit(GuiGraphics g, int x, int y) { + g.blit(TEXTURE_LOCATION, x, y, 0, 0.0F, 0.0F, 18, 18, 128, 128); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListTooltip.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListTooltip.java new file mode 100644 index 000000000..ebdc5b371 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/ItemListTooltip.java @@ -0,0 +1,10 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public record ItemListTooltip(List inv) implements TooltipComponent { + +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/OpenTableMenuToServer.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/OpenTableMenuToServer.java new file mode 100644 index 000000000..80cc83939 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/OpenTableMenuToServer.java @@ -0,0 +1,49 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkHooks; + +@SerialClass +public class OpenTableMenuToServer extends SerialPacketBase { + + @SerialClass.SerialField + public TableTabType type; + + @Deprecated + public OpenTableMenuToServer() { + + } + + public OpenTableMenuToServer(TableTabType type) { + this.type = type; + } + + @Override + public void handle(NetworkEvent.Context context) { + var player = context.getSender(); + if (player == null) return; + AbstractContainerMenu menu = player.containerMenu; + ItemStack stack = menu.getCarried(); + menu.setCarried(ItemStack.EMPTY); + ItemStack golem = ItemStack.EMPTY; + if (menu instanceof ITableMenu table) { + golem = table.getMainSlot().getItem(); + table.getMainSlot().set(ItemStack.EMPTY); + } + NetworkHooks.openScreen(player, type); + menu = player.containerMenu; + menu.setCarried(stack); + if (!golem.isEmpty()) { + if (menu instanceof ITableMenu table) { + table.getMainSlot().set(golem); + } else { + player.getInventory().placeItemBackInInventory(golem); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/SpriteButton.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/SpriteButton.java new file mode 100644 index 000000000..6328ac067 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/SpriteButton.java @@ -0,0 +1,46 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.l2library.base.menu.base.MenuLayoutConfig; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; + +public class SpriteButton extends Button { + + private final MenuLayoutConfig config; + private final String normal, down, inactive; + + private boolean pressed = false; + + protected SpriteButton(Builder builder, MenuLayoutConfig config, String normal, String down, String inactive) { + super(builder); + this.config = config; + this.normal = normal; + this.down = down; + this.inactive = inactive; + } + + @Override + public void onPress() { + pressed = true; + } + + @Override + public void onRelease(double mx, double my) { + if (!pressed) return; + pressed = false; + if (clicked(mx, my)) { + super.onPress(); + } + } + + public void renderWidget(GuiGraphics g, int mx, int my, float pt) { + if (pressed & !clicked(mx, my)) pressed = false; + var side = config.getSide(isActive() ? pressed ? + isHoveredOrFocused() ? down + "_hover" : down : + isHoveredOrFocused() ? normal + "_hover" : normal : + inactive); + this.renderTexture(g, config.getTexture(), this.getX(), this.getY(), + side.x, side.y, 0, this.width, this.height, 256, 256); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTab.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTab.java new file mode 100644 index 000000000..a63fbf158 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTab.java @@ -0,0 +1,62 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; +import dev.xkmc.modulargolems.content.menu.registry.TableGroup; +import dev.xkmc.modulargolems.content.menu.tabs.*; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import java.util.function.Consumer; + +public class TableTab extends GolemTabBase { + + public static Level level = null; + public static long time = 0; + public static TableTabType lastOpened = null; + + public static GolemTabToken.TabFactory from(TableTabType type) { + return (index, token, manager, stack, title) -> new TableTab(type, index, token, manager, stack, title); + } + + public static void initScreen(TableTabType type, AbstractContainerScreen screen, Consumer cons) { + ITabScreen tab = screen instanceof ITabScreen e ? e : new DelegateTabScreen(screen); + new GolemTabManager<>(tab, new TableGroup(), GolemTabType.ABOVE, 2) + .init(cons, GolemTabRegistry.LIST_TABLE.get(type.ordinal())); + } + + private final TableTabType tab; + + public TableTab(TableTabType tab, int index, GolemTabToken token, GolemTabManager manager, ItemStack stack, Component title) { + super(index, token, manager, stack, title); + this.tab = tab; + } + + @Override + public void onTabClicked() { + level = Minecraft.getInstance().level; + if (level == null) return; + if (tab.ordinal() > 1) { + lastOpened = tab; + time = level.getGameTime(); + } + ModularGolems.HANDLER.toServer(new OpenTableMenuToServer(tab)); + } + + public void reinitIfMatched(Screen screen) { + level = Minecraft.getInstance().level; + if (level == null) return; + if (screen instanceof AbstractContainerScreen acs) { + if (acs.getMenu().getType() == tab.menu) { + lastOpened = tab; + time = level.getGameTime(); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTabType.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTabType.java new file mode 100644 index 000000000..37633ddbb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/TableTabType.java @@ -0,0 +1,62 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import com.tterrag.registrate.util.entry.MenuEntry; +import dev.xkmc.l2screentracker.click.quickaccess.DummyHandler; +import dev.xkmc.l2screentracker.click.quickaccess.SimpleMenuAction; +import dev.xkmc.l2screentracker.compat.arclight.AnvilMenuArclight; +import dev.xkmc.l2screentracker.compat.arclight.GrindstoneMenuArclight; +import dev.xkmc.l2screentracker.compat.arclight.SmithingMenuArclight; +import dev.xkmc.l2screentracker.compat.arclight.StonecutterMenuArclight; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.network.chat.Component; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; + +public enum TableTabType implements MenuProvider { + DISINTEGRATE(MGLangData.TAB_DISINTEGRATE, GolemMiscs.DISINTEGRATE), + UPGRADE(MGLangData.TAB_UPGRADES, GolemMiscs.UPGRADES), + CRAFT(MenuType.CRAFTING, Items.CRAFTING_TABLE, CraftingMenu::new, "container.crafting"), + STONECUTTER(MenuType.STONECUTTER, Items.STONECUTTER, StonecutterMenuArclight::new, "container.stonecutter"), + ANVIL(MenuType.ANVIL, Items.ANVIL, AnvilMenuArclight::new, "container.repair"), + SMITHING(MenuType.SMITHING, Items.SMITHING_TABLE, SmithingMenuArclight::new, "container.upgrade"), + GRINDSTONE(MenuType.GRINDSTONE, Items.GRINDSTONE, GrindstoneMenuArclight::new, "container.grindstone_title"); + + private final Component lang; + private final MenuFactory factory; + + public final MenuType menu; + + TableTabType(MGLangData lang, MenuEntry factory) { + this.lang = lang.get(); + this.factory = factory::create; + menu = factory.get(); + } + + TableTabType(MenuType type, Item item, SimpleMenuAction.MenuFactory factory, String id) { + lang = Component.translatable(id); + this.factory = (wid, inv) -> factory.create(wid, inv, new DummyHandler(inv.player)); + menu = type; + } + + @Override + public Component getDisplayName() { + return lang; + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return factory.create(id, inv); + } + + public interface MenuFactory { + AbstractContainerMenu create(int wid, Inventory inv); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/UpgradeSlot.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/UpgradeSlot.java new file mode 100644 index 000000000..aedad0f92 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/UpgradeSlot.java @@ -0,0 +1,45 @@ +package dev.xkmc.modulargolems.content.menu.table; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; + +public class UpgradeSlot extends SlotItemHandler { + + private final GolemUpgradeItemHandler handler; + private final int index; + + public UpgradeSlot(GolemUpgradeItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + this.handler = itemHandler; + this.index = index; + } + + private ItemStack lastReturnedItem = ItemStack.EMPTY; + + @Override + public @NotNull ItemStack getItem() { + var newItem = super.getItem(); + if (!lastReturnedItem.equals(newItem)) + lastReturnedItem = newItem; + return lastReturnedItem; + } + + public void setChanged() { + handler.setStackInSlot(index, lastReturnedItem); + } + + private int lastModification = -1; + private boolean lastMayPickup; + + @Override + public boolean mayPickup(Player playerIn) { + if (lastModification == handler.modification) { + return lastMayPickup; + } + lastModification = handler.modification; + return lastMayPickup = super.mayPickup(playerIn); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/table/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/menu/table/package-info.java new file mode 100644 index 000000000..12e0ea26e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/table/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.menu.table; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/DelegateTabScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/DelegateTabScreen.java new file mode 100644 index 000000000..e69ae0a5a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/DelegateTabScreen.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.content.menu.tabs; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; + +public record DelegateTabScreen(AbstractContainerScreen screen) implements ITabScreen { + + @Override + public int getGuiLeft() { + return screen.getGuiLeft(); + } + + @Override + public int getGuiTop() { + return screen.getGuiTop(); + } + + @Override + public int screenWidth() { + return screen.width; + } + + @Override + public int screenHeight() { + return screen.height; + } + + @Override + public int getXSize() { + return screen.getXSize(); + } + + @Override + public int getYSize() { + return screen.getYSize(); + } + + @Override + public Screen asScreen() { + return screen; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabBase.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabBase.java index 8d233c673..aed86848e 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabBase.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabBase.java @@ -15,9 +15,11 @@ public abstract class GolemTabBase, T extends GolemTa public final GolemTabToken token; public final GolemTabManager manager; + private int relX, relY; + @SuppressWarnings("unchecked") public GolemTabBase(int index, GolemTabToken token, GolemTabManager manager, ItemStack stack, Component title) { - super(0, 0, 32, 28, title, b -> ((T) b).onTabClicked(), Supplier::get); + super(0, 0, manager.type.width, manager.type.height, title, b -> ((T) b).onTabClicked(), Supplier::get); this.index = index; this.stack = stack; this.token = token; @@ -32,7 +34,7 @@ public void onTooltip(GuiGraphics g, int x, int y) { public void renderWidget(GuiGraphics g, int mouseX, int mouseY, float partialTicks) { if (this.visible) { - token.type.draw(g, getX(), getY(), manager.selected == token, index); + manager.type.draw(g, getX(), getY(), manager.selected == token, index); renderIcon(g); } if (this == manager.list.get(manager.list.size() - 1)) { // draw on last @@ -41,7 +43,16 @@ public void renderWidget(GuiGraphics g, int mouseX, int mouseY, float partialTic } protected void renderIcon(GuiGraphics g) { - token.type.drawIcon(g, getX(), getY(), index, this.stack); + manager.type.drawIcon(g, getX(), getY(), index, this.stack); + } + + public void init(int guiLeft, int guiTop) { + relX = getX() - guiLeft; + relY = getY() - guiTop; + } + + public void reposition(int guiLeft, int guiTop) { + setPosition(guiLeft + relX, guiTop + relY); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabManager.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabManager.java index 915783fdf..8b4a91cda 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabManager.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabManager.java @@ -14,13 +14,21 @@ public class GolemTabManager> { public final ITabScreen screen; public final G token; + public final GolemTabType type; + private final int split; public int tabPage; public GolemTabToken selected; - public GolemTabManager(ITabScreen screen, G token) { + public GolemTabManager(ITabScreen screen, G token, GolemTabType type, int split) { this.screen = screen; this.token = token; + this.type = type; + this.split = split; + } + + public GolemTabManager(ITabScreen screen, G token) { + this(screen, token, GolemTabType.RIGHT, -1); } public void init(Consumer adder, GolemTabToken selected) { @@ -29,12 +37,14 @@ public void init(Consumer adder, GolemTabToken selected) { this.selected = selected; int guiLeft = screen.getGuiLeft(); int guiTop = screen.getGuiTop(); - int imgWidth = screen.getXSize(); + int w = screen.getXSize(); + int h = screen.getYSize(); for (int i = 0; i < token_list.size(); i++) { GolemTabToken token = token_list.get(i); GolemTabBase tab = token.create(i, this); - tab.setX(guiLeft + imgWidth + GolemTabType.RIGHT.getX(tab.index)); - tab.setY(guiTop + GolemTabType.RIGHT.getY(tab.index)); + tab.setX(guiLeft + type.getX(w, h, tab.index, split)); + tab.setY(guiTop + type.getY(w, h, tab.index, split)); + tab.init(guiLeft, guiTop); adder.accept(tab); list.add(tab); } @@ -43,7 +53,7 @@ public void init(Consumer adder, GolemTabToken selected) { private void updateVisibility() { for (GolemTabBase tab : list) { - tab.visible = tab.index >= tabPage * GolemTabType.MAX_TABS && tab.index < (tabPage + 1) * GolemTabType.MAX_TABS; + tab.visible = tab.index >= tabPage * type.max && tab.index < (tabPage + 1) * type.max; tab.active = tab.visible; } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabToken.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabToken.java index e112fad5c..5d8aa07f7 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabToken.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabToken.java @@ -15,14 +15,11 @@ public interface TabFactory, T extends GolemTabBase factory; - public final GolemTabType type; - - private final Supplier item; - private final Component title; + public final Supplier item; + public final Component title; public GolemTabToken(TabFactory factory, Supplier item, Component component) { this.factory = factory; - this.type = GolemTabType.RIGHT; this.item = item; this.title = component; diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabType.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabType.java index 1456e519e..097cbea6e 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabType.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/GolemTabType.java @@ -9,35 +9,36 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -enum GolemTabType { - ABOVE(0, 0, 28, 32, 8), - BELOW(84, 0, 28, 32, 8), - LEFT(0, 64, 32, 28, 5), - RIGHT(96, 64, 32, 28, 5); +public enum GolemTabType { + ABOVE(0, 120, 24, 28, 7), + BELOW(72, 120, 24, 28, 7), + LEFT(0, 176, 28, 24, 5), + RIGHT(84, 176, 28, 24, 5); private final static ResourceLocation TEXTURE = new ResourceLocation(ModularGolems.MODID, "textures/gui/tabs.png"); - public static final int MAX_TABS = 8; + public final int max; private final int textureX; private final int textureY; - private final int width; - private final int height; + final int width; + final int height; GolemTabType(int tx, int ty, int w, int h, int max) { this.textureX = tx; this.textureY = ty; this.width = w; this.height = h; + this.max = max; } public void draw(GuiGraphics g, int x, int y, boolean selected, int index) { - index = index % MAX_TABS; + index = index % max; int tx = this.textureX; if (index > 0) { tx += this.width; } - if (index == MAX_TABS - 1) { + if (index == max - 1) { tx += this.width; } @@ -50,8 +51,8 @@ public void drawIcon(GuiGraphics g, int x, int y, int index, ItemStack stack) { int j = y; switch (this) { case ABOVE -> { - i += 6; - j += 9; + i += 4; + j += 6; } case BELOW -> { i += 6; @@ -63,32 +64,29 @@ public void drawIcon(GuiGraphics g, int x, int y, int index, ItemStack stack) { } case RIGHT -> { i += 6; - j += 5; + j += 4; } } g.renderFakeItem(stack, i, j); g.renderItemDecorations(Minecraft.getInstance().font, stack, i, j); } - public int getX(int pIndex) { + public int getX(int w, int h, int index, int split) { + int space = split < 0 ? 0 : w - (width + 1) * max + 1; return switch (this) { - case ABOVE, BELOW -> (this.width + 4) * pIndex; - case LEFT -> -this.width + 4; - case RIGHT -> -4; + case ABOVE, BELOW -> (width + 1) * index + (index >= split ? space : 0); + case LEFT -> -width + 4; + case RIGHT -> w - 4; }; } - public int getY(int pIndex) { + public int getY(int w, int h, int index, int split) { + int space = split < 0 ? 0 : h - (height + 1) * max + 1; return switch (this) { - case ABOVE -> -this.height + 4; - case BELOW -> -4; - case LEFT, RIGHT -> this.height * pIndex; + case ABOVE -> -height + 4; + case BELOW -> h - 4; + case LEFT, RIGHT -> (height + 1) * index + (index >= split ? space : 0); }; } - public boolean isMouseOver(int p_97214_, int p_97215_, int p_97216_, double p_97217_, double p_97218_) { - int i = p_97214_ + this.getX(p_97216_); - int j = p_97215_ + this.getY(p_97216_); - return p_97217_ > (double) i && p_97217_ < (double) (i + this.width) && p_97218_ > (double) j && p_97218_ < (double) (j + this.height); - } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/ITabScreen.java b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/ITabScreen.java index 42989d008..ef9bd0274 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/ITabScreen.java +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/tabs/ITabScreen.java @@ -20,4 +20,12 @@ default Screen asScreen() { return (Screen) this; } + default int getLeftExpansion() { + return 0; + } + + default int getRightExpansion() { + return 32; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemFakeWheel.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemFakeWheel.java new file mode 100644 index 000000000..17f3d5d9f --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemFakeWheel.java @@ -0,0 +1,48 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2itemselector.wheel.WheelAdaptor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public record GolemFakeWheel(ItemStack stack, Component text) implements WheelAdaptor { + + @Override + public List getWheelContent() { + return List.of(); + } + + @Override + public int getIndex(Player player) { + return 0; + } + + @Override + public void select(int i) { + + } + + @Override + public void renderIcon(GuiGraphics g, int x0, int y0, boolean left, float sideWidth, boolean hover) { + float cx = left ? sideWidth / 2.0F : (float) g.guiWidth() - sideWidth / 2.0F; + float r = Math.min((float) x0 / 1.5F, (float) y0) / 1.5F; + float s = r * 0.015F * (hover ? 1.3f : 1); + g.pose().pushPose(); + g.pose().translate(cx, (float) y0, 0.0F); + g.pose().scale(s, s, s); + g.renderItem(stack, -8, -8); + g.pose().popPose(); + int cx2 = left ? (int) (sideWidth / 2) : g.guiWidth() - (int) (sideWidth / 2); + int ty = y0 + (int) (s * 10); + var font = Minecraft.getInstance().font; + for (var line : font.split(text, (int) sideWidth - 4)) { + g.drawString(font, line, cx2 - font.width(line) / 2, ty, 0xffffff, true); + ty += font.lineHeight + 1; + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeEntry.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeEntry.java new file mode 100644 index 000000000..1230371bc --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeEntry.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2itemselector.wheel.WheelAdaptor; +import dev.xkmc.modulargolems.content.entity.mode.GolemMode; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; + +public record GolemModeEntry(GolemMode mode) implements WheelAdaptor.Entry { + + @Override + public void render(GuiGraphics g, float x0, float y0, float ai, float r0, float r, float da, boolean sel) { + var s = sel ? 1.1f : 1; + s *= Math.min(r * 0.015f, da * r0 / 16f); + + float dx = x0 + Mth.cos(ai) * r0; + float dy = y0 + Mth.sin(ai) * r0; + g.pose().pushPose(); + g.pose().translate(dx, dy, 0); + g.pose().scale(s, s, s); + renderIcon(g); + g.pose().popPose(); + } + + public void renderIcon(GuiGraphics g){ + var tex = ModularGolems.loc("textures/gui/sprites/mode/" + mode.key + ".png"); + g.blit(tex, -8, -8, 0, 0, 16, 16, 16, 16); + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeWheel.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeWheel.java new file mode 100644 index 000000000..34b7e7b3a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemModeWheel.java @@ -0,0 +1,100 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2itemselector.wheel.PersistentWheel; +import dev.xkmc.l2itemselector.wheel.WheelAdaptor; +import dev.xkmc.l2itemselector.wheel.WheelContext; +import dev.xkmc.l2itemselector.wheel.WheelKeyHandler; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.entity.mode.GolemModes; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGLangData; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public record GolemModeWheel( + AbstractGolemEntity golem +) implements PersistentWheel { + + @Override + public WheelKeyHandler getInputHandler() { + return new GolemWheelKeyHandler(); + } + + @Override + public @Nullable WheelAdaptor getAtIndex(Player player, int index, boolean main) { + if (!main && index != 0) { + if (index < 0) { + var entry = golem.getConfigEntry(MGLangData.LOADING.get()); + if (entry == null || !entry.getID().equals(player.getUUID())) return null; + return new GolemFakeWheel(GolemItems.CARD[entry.getColor()].asStack(), MGLangData.TAB_TOGGLE.get()); + } else { + ItemStack armor; + if (golem instanceof MetalGolemEntity) armor = GolemItems.WINDSPIRIT_CHESTPLATE.asStack(); + else if (golem instanceof DogGolemEntity) armor = GolemItems.DOG_ARMOR_DIAMOND.asStack(); + else armor = Items.DIAMOND_CHESTPLATE.getDefaultInstance(); + return new GolemFakeWheel(armor, MGLangData.TAB_EQUIPMENT.get()); + } + } + return PersistentWheel.super.getAtIndex(player, index, main); + } + + @Override + public boolean isValid(Player player) { + return player.isAlive() && golem.isAlive() && golem.canWandModify(player); + } + + @Override + public List getWheelContent() { + return GolemModes.LIST.stream().map(e -> new GolemModeEntry(e)).toList(); + } + + @Override + public int getIndex(Player player) { + return golem.getMode().getID(); + } + + @Override + public void select(int index) { + ModularGolems.HANDLER.toServer(GolemSetModeToServer.of(golem, index)); + } + + @Override + public void renderImpl(GuiGraphics g, Player player, List list, WheelContext ctx) { + PersistentWheel.super.renderImpl(g, player, list, ctx); + int index = ctx.hover() >= 0 ? ctx.hover() : ctx.sel(); + if (index < 0) index = getIndex(player); + if (index < 0) return; + int x0 = g.guiWidth() / 2, y0 = g.guiHeight() / 2; + float r = Math.min(x0 / 1.5f, y0) / 1.5f; + float s = r * 0.02f; + g.pose().pushPose(); + g.pose().translate(x0, y0, 0); + g.pose().scale(s, s, s); + g.pose().translate(0, -8, 0); + var entry = list.get(index); + entry.renderIcon(g); + g.pose().popPose(); + var text = entry.mode().getName().plainCopy(); + var font = Minecraft.getInstance().font; + int y = (int) (y0 + s * 3); + for (var line : font.split(text, (int) r)) { + g.drawString(font, line, x0 - font.width(line) / 2, y, 0xffffff, true); + y += font.lineHeight + 1; + } + } + + @Override + public void renderIcon(GuiGraphics g, int x0, int y0, boolean left, float sideWidth, boolean hover) { + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemSetModeToServer.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemSetModeToServer.java new file mode 100644 index 000000000..8a4df15c5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemSetModeToServer.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.SerialClass; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.mode.GolemModes; +import net.minecraft.core.BlockPos; +import net.minecraftforge.network.NetworkEvent; + +@SerialClass +public class GolemSetModeToServer extends SerialPacketBase { + + public static GolemSetModeToServer of(AbstractGolemEntity golem, int mode) { + var ans = new GolemSetModeToServer(); + ans.golem = golem.getId(); + ans.mode = mode; + return ans; + } + + @SerialClass.SerialField + public int golem, mode; + + @Override + public void handle(NetworkEvent.Context context) { + var player = context.getSender(); + if (player == null) return; + var e = player.level().getEntity(golem); + if (!(e instanceof AbstractGolemEntity golem)) return; + if (mode < 0 || mode >= GolemModes.LIST.size()) return; + var m = GolemModes.LIST.get(mode); + if (!golem.canWandModify(player)) return; + golem.setMode(mode, m.hasPos() ? golem.blockPosition() : BlockPos.ZERO); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelHandler.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelHandler.java new file mode 100644 index 000000000..cf6377b8a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelHandler.java @@ -0,0 +1,26 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2itemselector.wheel.WheelHandler; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; + +public class GolemWheelHandler { + + public static boolean press = false; + + public static boolean enableWheel(Player player, AbstractGolemEntity golem) { + Minecraft.getInstance().options.keyUse.setDown(false); + if (WheelHandler.wheel instanceof GolemModeWheel) + return false; + if (WheelHandler.wheel != null) WheelHandler.wheel.onClose(); + WheelHandler.wheelIndex = 0; + WheelHandler.wheel = new GolemModeWheel(golem); + WheelHandler.wheel.onOpen(); + WheelHandler.keyboardIndex = -1; + Minecraft.getInstance().mouseHandler.releaseMouse(); + press = true; + return true; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelKeyHandler.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelKeyHandler.java new file mode 100644 index 000000000..e08630abf --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/GolemWheelKeyHandler.java @@ -0,0 +1,38 @@ +package dev.xkmc.modulargolems.content.menu.wheel; + +import dev.xkmc.l2itemselector.wheel.DefaultKeyHandler; +import dev.xkmc.l2itemselector.wheel.WheelAdaptor; +import dev.xkmc.l2itemselector.wheel.WheelContext; +import dev.xkmc.modulargolems.content.menu.registry.OpenConfigMenuToServer; +import dev.xkmc.modulargolems.content.menu.registry.OpenEquipmentMenuToServer; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGLangData; +import net.minecraft.world.entity.player.Player; + +public class GolemWheelKeyHandler extends DefaultKeyHandler.Fast { + + @Override + public void rightClick(WheelAdaptor wheel, Player player) { + if (GolemWheelHandler.press) { + GolemWheelHandler.press = false; + return; + } + super.rightClick(wheel, player); + } + + @Override + protected void execute(WheelAdaptor wheel, Player player, ActionCode action, WheelContext ctx) { + if (action == ActionCode.SWITCH && wheel instanceof GolemModeWheel golemWheel) { + var golem = golemWheel.golem(); + if (ctx.code().switcher() < 0) { + var entry = golem.getConfigEntry(MGLangData.LOADING.get()); + if (entry != null) { + ModularGolems.HANDLER.toServer(new OpenConfigMenuToServer(entry.getID(), entry.getColor(), OpenConfigMenuToServer.Type.TOGGLE)); + } + } else { + ModularGolems.HANDLER.toServer(new OpenEquipmentMenuToServer(golem.getUUID(), OpenEquipmentMenuToServer.Type.EQUIPMENT)); + } + } + super.execute(wheel, player, action, ctx); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/package-info.java b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/package-info.java new file mode 100644 index 000000000..aa0b6b49a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/menu/wheel/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.content.menu.wheel; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/AttributeGolemModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/AttributeGolemModifier.java index bbad8c66e..b5763ad04 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/AttributeGolemModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/AttributeGolemModifier.java @@ -2,33 +2,44 @@ import dev.xkmc.modulargolems.content.core.GolemStatType; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import net.minecraft.network.chat.MutableComponent; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import java.util.function.DoubleSupplier; import java.util.function.Supplier; /** * should not be used in materials */ +// 属性修饰器 public class AttributeGolemModifier extends GolemModifier { + // AttrEntry 是一个内部记录类,用于存储属性类型和对应的属性值: + // 一个 Supplier 类型的对象,用于提供属性类型;一个 DoubleSupplier 类型的对象,用于提供属性值。 public record AttrEntry(Supplier type, DoubleSupplier value) { - + // getValue 方法根据传入的等级 level 计算属性值,并将其乘以等级值,返回最终的属性值 public double getValue(int level) { return value.getAsDouble() * level; } } + // 用于存储多个 AttrEntry 对象,用于存储多个属性 public final AttrEntry[] entries; + // 构造方法 public AttributeGolemModifier(int max, AttrEntry... entries) { super(StatFilterType.MASS, max); this.entries = entries; } @Override + // 根据列表增加Tooltip public List getDetail(int v) { List ans = new ArrayList<>(); for (AttrEntry ent : entries) { @@ -36,4 +47,43 @@ public List getDetail(int v) { } return ans; } + + @Nullable + // 一个可空的 Set 对象,用于存储当前属性修改器可能会与其他属性修改器冲突的属性类型 + private Set checking = null; + + // 如果 checking 字段为 null,则会创建一个新的 LinkedHashSet 对象 + private Set checking() { + if (checking == null) { + checking = new LinkedHashSet<>(); + // 将所有 AttrEntry 对象可能冲突的属性类型添加到 checking 集合中 + for (var e : entries) { + checking.addAll(e.type.get().hasConflict()); + } + } + return checking; + } + + @Override + // 这个方法用于检查添加该属性修改器时是否会与其他属性修改器发生冲突。如果发生冲突,则返回一个非常小的整数值 -1000000,否则返回 0 + public int addSlot(List upgrades, int lv) { + // 首先检查 checking 集合是否为空,如果为空,则说明没有冲突,返回 0 + if (checking().isEmpty()) return 0; + // 如果不为空,则逐个检查传入的升级物品中是否包含与 checking 集合中相同的属性类型 + for (var item : upgrades) { + if (item instanceof UpgradeItem up) { + for (var mod : up.get()) { + if (mod.mod() instanceof AttributeGolemModifier attr) { + for (var ent : attr.entries) { + var stat = ent.type().get(); + // 如果有冲突,则返回 -1000000 + if (checking().contains(stat)) return -1000000; + } + } + } + } + } + return 0; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/GolemModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/GolemModifier.java index e7e5cc64c..67d96e433 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/GolemModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/GolemModifier.java @@ -5,26 +5,26 @@ import dev.xkmc.l2library.base.NamedEntry; import dev.xkmc.modulargolems.content.config.GolemPartConfig; import dev.xkmc.modulargolems.content.core.GolemType; -import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.GolemFlags; import dev.xkmc.modulargolems.content.item.golem.GolemPart; -import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingDamageEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import java.util.List; @@ -38,12 +38,14 @@ public class GolemModifier extends NamedEntry { public final StatFilterType type; public final int maxLevel; + // 构造函数 public GolemModifier(StatFilterType type, int maxLevel) { super(GolemTypes.MODIFIERS); this.type = type; this.maxLevel = maxLevel; } + // 获取工具提示信息 public Component getTooltip(int v) { MutableComponent ans = getDesc(); if (maxLevel > 1) @@ -51,14 +53,47 @@ public Component getTooltip(int v) { return ans.withStyle(ChatFormatting.LIGHT_PURPLE); } + // 似乎是shift获取细节的提示内容 public List getDetail(int v) { return List.of(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GREEN)); } - public void onGolemSpawn(AbstractGolemEntity entity, int level) { + public boolean canExistOn(GolemPart part) { + // 通过 GolemPartConfig 获取配置,并判断该零件是否允许当前修饰符类型 + return GolemPartConfig.get().getFilter(part).getOrDefault(type, 0d) > 0; + } + + public boolean fitsOn(GolemType type) { + return true; + } + + // dynamic methods + + /** + * fires when this golem is attacked. Damage taking phase + */ + public void onDamaged(AttackCache cache, AbstractGolemEntity entity, int level) { + + } + public void onDamageMax(AttackCache cache, AbstractGolemEntity golem, int value) { } + /** + * modify damage + */ + public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { + } + + /** + * modify healing + */ + public double onHealTick(double heal, AbstractGolemEntity entity, int level) { + return onInventoryHealTick(heal, new HealingContext(entity.getGuardedDataImpl(), entity.getMaxHealth(), entity), level); + } + + // static damage methods + /** * fires when this golem attacks others */ @@ -94,11 +129,16 @@ public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, } - /** - * modify healing - */ - public double onHealTick(double heal, AbstractGolemEntity entity, int level) { - return onInventoryHealTick(heal, new HealingContext(entity.getHealth(), entity.getMaxHealth(), entity), level); + public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { + } + + public void finalizeHurtTarget(AttackCache cache, AbstractGolemEntity golem, int value) { + } + + // static methods + + public void onGolemSpawn(AbstractGolemEntity entity, int level) { + } /** @@ -108,16 +148,10 @@ public double onInventoryHealTick(double heal, HealingContext ctx, int level) { return heal; } - /** - * modify damage - */ - public void modifyDamage(AttackCache cache, AbstractGolemEntity entity, int level) { - } - /** * provide more slots */ - public int addSlot(List upgrades, int lv) { + public int addSlot(List upgrades, int lv) { return 0; } @@ -131,29 +165,32 @@ public void onRegisterFlag(Consumer addFlag) { public void onRegisterGoals(AbstractGolemEntity entity, int lv, BiConsumer addGoal) { } - @OnlyIn(Dist.CLIENT) public void onClientTick(AbstractGolemEntity entity, int level) { } - public boolean canExistOn(GolemPart part) { - return GolemPartConfig.get().getFilter(part).getOrDefault(type, 0d) > 0; + public void onSetTarget(AbstractGolemEntity golem, Mob mob, int level) { } - public void onSetTarget(AbstractGolemEntity golem, Mob mob, int level) { + public void handleEvent(AbstractGolemEntity golem, int value, byte event) { } - public boolean fitsOn(GolemType type) { - return true; + public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand, int value) { + // 返回交互结果PASS + return InteractionResult.PASS; } - public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { + public void onKillTarget(AbstractGolemEntity golem, LivingEntity entity, LivingDeathEvent event, int level) { } - public void handleEvent(AbstractGolemEntity golem, int value, byte event) { + public float onHealPre(float heal, AbstractGolemEntity golem, int value) { + return heal; } - public InteractionResult interact(Player player, AbstractGolemEntity golem, InteractionHand hand) { - return InteractionResult.PASS; + public void onHealPost(float heal, AbstractGolemEntity golem, int value) { + } + + public boolean isImmuneTo(AbstractGolemEntity golem, MobEffectInstance ins, int level) { + return false; } public record HealingContext(float health, float maxHealth, Entity owner) { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionAttackModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionAttackModifier.java index 5c1cfc27f..93d4beb90 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionAttackModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionAttackModifier.java @@ -18,8 +18,10 @@ public class PotionAttackModifier extends GolemModifier { + // 这个函数用于根据给定的等级生成相应的药水效果实例 private final Function func; + // 构造函数 public PotionAttackModifier(StatFilterType type, int maxLevel, Function func) { super(type, maxLevel); this.func = func; @@ -33,11 +35,14 @@ public void onHurtTarget(AbstractGolemEntity entity, LivingHurtEvent event @Override public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { if (event.getSource().getDirectEntity() instanceof LivingEntity attacker) { + // 向伤害来源施加药水效果 applyPotion(entity, attacker, level); } } + // 实际添加药水效果到目标实体上,是上两个方法的效果实现 private void applyPotion(AbstractGolemEntity self, LivingEntity target, int level) { + // 避免客户端执行不必要的逻辑 if (!target.level().isClientSide()) { EffectUtil.addEffect(target, func.apply(level), EffectUtil.AddReason.NONE, self); } @@ -52,6 +57,7 @@ public List getDetail(int v) { lang = Component.translatable("potion.withAmplifier", lang, Component.translatable("potion.potency." + ins.getAmplifier())); } + // 如果药水效果的持续时间(duration)大于等于 20 if (ins.getDuration() >= 20) { lang = Component.translatable("potion.withDuration", lang, MobEffectUtil.formatDuration(ins, 1)); diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionDefenseModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionDefenseModifier.java index 829054227..d20d4e987 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionDefenseModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/PotionDefenseModifier.java @@ -23,10 +23,12 @@ public PotionDefenseModifier(int maxLevel, Supplier effect) { } private MobEffectInstance getIns(int lv) { + // 根据给定的等级 lv 创建并返回一个 MobEffectInstance 实例 return new MobEffectInstance(effect.get(), 40, lv - 1, false, false); } - @Override + @Override// 重写了从父类继承的 onAiStep 方法 + // 每个 AI 步骤(即每个游戏刻)被调用一次 public void onAiStep(AbstractGolemEntity golem, int level) { EffectUtil.refreshEffect(golem, getIns(level), EffectUtil.AddReason.SELF, golem); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/TargetBonusModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/TargetBonusModifier.java index 26c72f84b..1454390b8 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/base/TargetBonusModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/base/TargetBonusModifier.java @@ -14,8 +14,10 @@ public class TargetBonusModifier extends GolemModifier { + // Predicate是一个函数式接口,代表一个返回布尔值的函数,用于判断目标实体是否符合某些条件 private final Predicate pred; + // 构造 public TargetBonusModifier(Predicate pred) { super(StatFilterType.ATTACK, 2); this.pred = pred; diff --git a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/AddSlotModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/AddSlotModifier.java similarity index 67% rename from src/main/java/dev/xkmc/modulargolems/compat/materials/common/AddSlotModifier.java rename to src/main/java/dev/xkmc/modulargolems/content/modifier/common/AddSlotModifier.java index 4ad091fe6..067a6cdd1 100644 --- a/src/main/java/dev/xkmc/modulargolems/compat/materials/common/AddSlotModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/AddSlotModifier.java @@ -1,7 +1,7 @@ -package dev.xkmc.modulargolems.compat.materials.common; +package dev.xkmc.modulargolems.content.modifier.common; import dev.xkmc.modulargolems.content.core.StatFilterType; -import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -11,8 +11,8 @@ public class AddSlotModifier extends GolemModifier { - public AddSlotModifier() { - super(StatFilterType.MASS, MAX_LEVEL); + public AddSlotModifier(int slot) { + super(StatFilterType.MASS, slot); } @Override @@ -21,7 +21,8 @@ public List getDetail(int v) { } @Override - public int addSlot(List list, int lv) { + // 添加槽位 + public int addSlot(List list, int lv) { return lv; } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/common/AttackBypassArmorModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/AttackBypassArmorModifier.java new file mode 100644 index 000000000..d96af514b --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/AttackBypassArmorModifier.java @@ -0,0 +1,41 @@ +package dev.xkmc.modulargolems.content.modifier.common; + +import dev.xkmc.l2damagetracker.contents.attack.CreateSourceEvent; +import dev.xkmc.l2damagetracker.contents.damage.DefaultDamageState; +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import dev.xkmc.modulargolems.init.data.MGConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.List; + +// 一个护甲穿透的升级 +public class AttackBypassArmorModifier extends GolemModifier { + + // 构造函数,传入最大等级 + public AttackBypassArmorModifier(int max) { + super(StatFilterType.ATTACK, max); + } + + @Override + public List getDetail(int v) { + int perc = Math.round(MGConfig.COMMON.armorBypassChance.get().floatValue() * v * 100); + return List.of(Component.translatable(getDescriptionId() + ".desc", perc).withStyle(ChatFormatting.GREEN)); + } + + @Override + // 该方法在攻击事件创建时被调用,用于修改攻击源 + public void modifySource(AbstractGolemEntity golem, CreateSourceEvent event, int value) { + // 首先检查攻击事件的结果是否存在,如果不存在则直接返回 + if (event.getResult() == null) return; + // 检查攻击结果是否包含 BYPASS_ARMOR 这个状态,如果不存在则返回 + if (!event.getResult().validState(DefaultDamageState.BYPASS_ARMOR)) return; + // 通过随机数判断是否启用 BYPASS_ARMOR 状态,如果计算出的概率大于随机生成的双精度数,则启用这个状态 + if (MGConfig.COMMON.armorBypassChance.get() * value > golem.getRandom().nextDouble()) + event.enable(DefaultDamageState.BYPASS_ARMOR); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/common/BellModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/BellModifier.java index 2bc25a82d..8cb1b10a4 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/common/BellModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/BellModifier.java @@ -13,24 +13,41 @@ public class BellModifier extends GolemModifier { + // 构造方法 + // 调用了父类 GolemModifier 的构造方法,并传入了两个参数: + // StatFilterType.HEALTH 表示该修饰符主要涉及傀儡的生命值属性 + // 1 表示该修饰符的默认级别为 1 public BellModifier() { super(StatFilterType.HEALTH, 1); } @Override + // 在傀儡设置目标时被调用 public void onSetTarget(AbstractGolemEntity golem, Mob mob, int level) { + // 获取傀儡的边界框,并将其膨胀 48 个方块,这样可以检测到傀儡周围一定范围内的生物 var aabb = golem.getBoundingBox().inflate(48); + // 获取边界框内的所有生物,并将这些生物过滤为傀儡可以攻击的目标 + // 使用了 lambda 表达式 golem::canAttack 来过滤符合条件的生物 var list = golem.level().getEntitiesOfClass(Mob.class, aabb, golem::canAttack); + // 初始化一个布尔变量 sound,用于判断是否需要播放声音 boolean sound = false; + // 遍历过滤后的生物列表 for (var e : list) { + // 如果生物是敌人且不是爬行者且可以攻击傀儡 if (e instanceof Enemy && !(e instanceof Creeper) && e.canAttack(golem)) { - sound |= !e.hasEffect(MobEffects.GLOWING); + // !e.hasEffect(MobEffects.GLOWING) 为 true),如果是,则将 sound 设置为 true + sound |= !e.getTags().contains("BellHit"); + e.getTags().add("BellHit"); EffectUtil.addEffect(e, new MobEffectInstance(MobEffects.GLOWING, 200), EffectUtil.AddReason.NONE, golem); - if (!(e.getTarget() instanceof AbstractGolemEntity)) + if (!(e.getTarget() instanceof AbstractGolemEntity)) { + // 将其目标设置为傀儡 e.setTarget(golem); + } } } + // 判断是否播放声音 if (sound) { + // SoundEvents.BELL_BLOCK 表示声音事件,后面两个参数分别是音量和音调 golem.playSound(SoundEvents.BELL_BLOCK, 1, 1); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/common/ThornModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/ThornModifier.java index 2aebc75ee..f2fb98056 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/common/ThornModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/common/ThornModifier.java @@ -1,5 +1,6 @@ package dev.xkmc.modulargolems.content.modifier.common; +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; @@ -8,10 +9,10 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.event.entity.living.LivingHurtEvent; import java.util.List; @@ -26,16 +27,17 @@ public ThornModifier() { } @Override - public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { - if (level == 0) { - return; - } + public void onDamageMax(AttackCache cache, AbstractGolemEntity golem, int level) { + if (level <= 0) return; + var event = cache.getLivingHurtEvent(); + assert event != null; DamageSource source = event.getSource(); - if (source.is(L2DamageTypes.MAGIC) || source.is(DamageTypes.THORNS)) { + if (source.is(L2DamageTypes.MAGIC) || source.is(DamageTypes.THORNS) || source.is(DamageTypeTags.AVOIDS_GUARDIAN_THORNS)) { return; } if (source.getDirectEntity() instanceof LivingEntity living && living.isAlive()) { - living.hurt(entity.level().damageSources().thorns(entity), event.getAmount() * getPercent() * level); + var dmg = Math.max(cache.getPreDamage() / 4, cache.getDamageDealt()); + living.hurt(golem.level().damageSources().thorns(golem), dmg * getPercent() * level); } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/DamageCapModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/DamageCapModifier.java index c2fa507eb..0d65a703d 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/DamageCapModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/DamageCapModifier.java @@ -10,10 +10,10 @@ import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.entity.EntityEvent; import net.minecraftforge.event.entity.living.LivingDamageEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; import java.util.List; +// 限制伤害 public class DamageCapModifier extends GolemModifier { public DamageCapModifier() { @@ -25,6 +25,7 @@ public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, if (event.getSource().is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { return; } + // 计算一个因子 factor,这个因子会随着修饰符等级的提高而减小,且不会小于0 float factor = (float) Math.max(0, (2 - level * 0.2) * MGConfig.COMMON.damageCap.get()); if (event.getAmount() > factor * entity.getMaxHealth()) { event.setAmount(factor * entity.getMaxHealth()); diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ExplosionResistanceModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ExplosionResistanceModifier.java index a331f6766..a196ccba9 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ExplosionResistanceModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ExplosionResistanceModifier.java @@ -12,6 +12,7 @@ import java.util.List; +// 爆炸伤害抗性 public class ExplosionResistanceModifier extends GolemModifier { public ExplosionResistanceModifier() { @@ -21,6 +22,7 @@ public ExplosionResistanceModifier() { @Override public void onHurt(AbstractGolemEntity entity, LivingHurtEvent event, int level) { float factor = (float) Math.max(0, 1 - level * MGConfig.COMMON.explosionResistance.get()); + // 检查伤害的来源是否是爆炸,并且伤害是否可以被普通防御机制抵挡住 if (!event.getSource().is(DamageTypeTags.BYPASSES_INVULNERABILITY) && event.getSource().is(DamageTypeTags.IS_EXPLOSION)) { event.setAmount(event.getAmount() * factor); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/FireImmuneModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/FireImmuneModifier.java index 9d2fa379a..bcbb1f615 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/FireImmuneModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/FireImmuneModifier.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; +// 火焰免疫 public class FireImmuneModifier extends GolemModifier { public FireImmuneModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ImmunityModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ImmunityModifier.java index b81ae5abf..1ca246f83 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ImmunityModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ImmunityModifier.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; +// 不灭 public class ImmunityModifier extends GolemModifier { public ImmunityModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicImmuneModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicImmuneModifier.java index b2ce90aa1..7ccfc539b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicImmuneModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicImmuneModifier.java @@ -6,6 +6,7 @@ import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import net.minecraftforge.event.entity.living.LivingAttackEvent; +// 魔免 public class MagicImmuneModifier extends GolemModifier { public MagicImmuneModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicResistanceModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicResistanceModifier.java index b397a329c..4f911ac13 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicResistanceModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/MagicResistanceModifier.java @@ -13,6 +13,7 @@ import java.util.List; +// 魔抗 public class MagicResistanceModifier extends GolemModifier { public MagicResistanceModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/PlayerImmuneModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/PlayerImmuneModifier.java index 2feaf479f..acd444cf2 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/PlayerImmuneModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/PlayerImmuneModifier.java @@ -6,6 +6,7 @@ import net.minecraft.world.entity.Entity; import net.minecraftforge.event.entity.living.LivingAttackEvent; +// 玩家伤害免疫 public class PlayerImmuneModifier extends GolemModifier { public PlayerImmuneModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ProjectileRejectModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ProjectileRejectModifier.java index ea887e5be..fff0abed9 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ProjectileRejectModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ProjectileRejectModifier.java @@ -6,6 +6,7 @@ import net.minecraft.tags.DamageTypeTags; import net.minecraftforge.event.entity.living.LivingAttackEvent; +// 弹射物免疫 public class ProjectileRejectModifier extends GolemModifier { public ProjectileRejectModifier() { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ThunderImmuneModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ThunderImmuneModifier.java index d1c7d6ea6..044a70a93 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ThunderImmuneModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/immunes/ThunderImmuneModifier.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.function.Consumer; +// 雷免 public class ThunderImmuneModifier extends GolemModifier { public ThunderImmuneModifier() { @@ -28,7 +29,12 @@ public ThunderImmuneModifier() { @Override public void onAttacked(AbstractGolemEntity entity, LivingAttackEvent event, int level) { - if (level > 0 && event.getSource().is(DamageTypeTags.IS_LIGHTNING)) { + if (level <= 0) return; + if (entity.isOnFire()) { + // 灭火 + entity.clearFire(); + } + if (event.getSource().is(DamageTypeTags.IS_LIGHTNING)) { event.setCanceled(true); EffectUtil.addEffect(entity, new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 200), EffectUtil.AddReason.SELF, entity); entity.heal(MGConfig.COMMON.thunderHeal.get() * level); diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/ride/RideUpgrade.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/ride/RideUpgrade.java index e10acfb26..50f7e8667 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/ride/RideUpgrade.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/ride/RideUpgrade.java @@ -1,12 +1,16 @@ package dev.xkmc.modulargolems.content.modifier.ride; import dev.xkmc.modulargolems.content.core.GolemType; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.GolemFlags; import dev.xkmc.modulargolems.content.modifier.base.AttributeGolemModifier; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.Mob; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingDamageEvent; import java.util.List; import java.util.function.Consumer; @@ -17,13 +21,29 @@ public RideUpgrade(int max, AttrEntry... entries) { super(max, entries); } + @Override + public void onAttacked(AbstractGolemEntity entity, LivingAttackEvent event, int level) { + if (event.getSource().getEntity() instanceof Mob mob && mob.getTarget() != entity) { + event.setCanceled(true); + } + } + + @Override + public void onDamaged(AbstractGolemEntity entity, LivingDamageEvent event, int level) { + if (event.getSource().getEntity() instanceof Mob mob && mob.getTarget() != entity) { + event.setAmount(0); + } + } + @Override public void onRegisterFlag(Consumer addFlag) { + // 该Golem应该是被动的,不会主动攻击其他实体 addFlag.accept(GolemFlags.PASSIVE); } @Override public boolean fitsOn(GolemType type) { + // 只有狗型Golem才能装备这个坐骑升级 return type == GolemTypes.TYPE_DOG.get(); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/BaseRangedAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/BaseRangedAttackGoal.java index 1c42cc306..d3d028e4d 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/BaseRangedAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/BaseRangedAttackGoal.java @@ -4,20 +4,26 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.Goal; +// 基于 Minecraft 的 Goal 类,并且用于实现一个通用的远程攻击机制 public abstract class BaseRangedAttackGoal extends Goal { + // 冷却\内限\外限 private final int waitTime, near, far; + // 傀儡示例 protected final AbstractGolemEntity golem; + // 傀儡等级 protected final int lv; - private int attackTime; + // 初始攻击延迟 + public long attackTime; + private boolean lock; public BaseRangedAttackGoal(int waitTime, int near, int far, AbstractGolemEntity golem, int lv) { this.golem = golem; this.lv = lv; this.waitTime = waitTime; - this.attackTime = waitTime; + this.attackTime = 0; this.near = near * near; this.far = far * far; } @@ -39,7 +45,9 @@ public boolean canUse() { * Execute a one shot task or start executing a continuous task */ public void start() { - this.attackTime = waitTime; + if (attackTime == 0) { + this.attackTime = golem.level().getGameTime() + waitTime; + } } /** @@ -56,16 +64,26 @@ public boolean requiresUpdateEveryTick() { * Keep ticking a continuous task that has already been started */ public void tick() { - --this.attackTime; LivingEntity le = golem.getTarget(); - if (attackTime <= 0 && le != null && le.isAlive()) { - performAttack(le); - this.attackTime = waitTime; + long time = golem.level().getGameTime(); + boolean mayAttack = golem.specialAttackCoolDown <= 0 || lock; + if (attackTime <= time && le != null && le.isAlive() && mayAttack) { + if (performAttack(le)) { + this.attackTime = time + waitTime; + lock = false; + } else { + lock = true; + } + golem.specialAttackCoolDown = 20; } super.tick(); } - protected abstract void performAttack(LivingEntity target); + public void setInitialDelay(int delay) { + attackTime = delay; + } + + protected abstract boolean performAttack(LivingEntity target); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/DynamicReductionModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/DynamicReductionModifier.java new file mode 100644 index 000000000..065217c35 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/DynamicReductionModifier.java @@ -0,0 +1,20 @@ +package dev.xkmc.modulargolems.content.modifier.special; + +import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; + +import java.util.function.Consumer; + +public class DynamicReductionModifier extends GolemModifier { + + public DynamicReductionModifier() { + super(StatFilterType.HEALTH, 1); + } + + @Override + public void onRegisterFlag(Consumer addFlag) { + addFlag.accept(GolemFlags.DYNAMIC_REDUCTION); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/EarthquakeHelper.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/EarthquakeHelper.java new file mode 100644 index 000000000..488a1a1b5 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/EarthquakeHelper.java @@ -0,0 +1,158 @@ +package dev.xkmc.modulargolems.content.modifier.special; + +import dev.xkmc.l2serial.util.Wrappers; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.common.GolemFlags; +import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class EarthquakeHelper { + + public static final byte FLAG = 83; + + public static void makeParticles(LivingEntity le, float vec, float math) { + if (le.level().isClientSide) { + for (int i1 = 0; i1 < 80 + le.getRandom().nextInt(12); ++i1) { + double DeltaMovementX = le.getRandom().nextGaussian() * 0.07; + double DeltaMovementY = le.getRandom().nextGaussian() * 0.07; + double DeltaMovementZ = le.getRandom().nextGaussian() * 0.07; + float f = Mth.cos(le.yBodyRot * 0.017453292F); + float f1 = Mth.sin(le.yBodyRot * 0.017453292F); + float angle = 0.017453292F * le.yBodyRot + i1; + double extraX = 2.0F * Mth.sin((float) (Math.PI + angle)); + double extraY = 0.30000001192092896; + double extraZ = 2.0F * Mth.cos(angle); + double theta = le.yBodyRot * 0.017453292519943295; + ++theta; + double vecX = Math.cos(theta); + double vecZ = Math.sin(theta); + int hitX = Mth.floor(le.getX() + vec * vecX + extraX); + int hitY = Mth.floor(le.getY()); + int hitZ = Mth.floor(le.getZ() + vec * vecZ + extraZ); + BlockPos hit = new BlockPos(hitX, hitY, hitZ); + BlockState block = le.level().getBlockState(hit.below()); + le.level().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, block), le.getX() + (double) vec * vecX + extraX + (double) (f * math), le.getY() + extraY, le.getZ() + (double) vec * vecZ + extraZ + (double) (f1 * math), DeltaMovementX, DeltaMovementY, DeltaMovementZ); + } + } + + } + + public static void launch(LivingEntity le, Entity e, float f) { + double d0 = e.getX() - le.getX(); + double d1 = e.getZ() - le.getZ(); + double d2 = Math.max(d0 * d0 + d1 * d1, 0.001); + e.push(d0 / d2 * f, 0.375 * f, d1 / d2 * f); + } + + + @Nullable + public static Instance findMountInstance(AbstractGolemEntity golem) { + if (golem.hasFlag(GolemFlags.PASSIVE)) return null; + List list = new ArrayList<>(); + long time = golem.level().getGameTime(); + for (var e : golem.getModifiersExtended().entrySet()) { + if (e.getKey() instanceof Modifier m) { + long last = golem.getPersistentData().getLong(e.getKey().getID() + ":timestamp"); + if (last + m.getCoolDown(golem, e.getValue()) < time || last > time) { + list.add(new Instance(golem, m, e.getValue())); + } + } + } + if (!list.isEmpty()) { + return list.get(golem.getRandom().nextInt(list.size())); + } + return null; + } + + @Nullable + public static Instance findInstance(AbstractGolemEntity golem, LivingEntity target, double distSqr) { + if (golem.getVehicle() != null && !(golem.getVehicle() instanceof AbstractGolemEntity dog && dog.getControllingPassenger() == golem)) + return null; + if (!golem.getPassengers().isEmpty()) return null; + List list = new ArrayList<>(); + long time = golem.level().getGameTime(); + for (var e : golem.getModifiersExtended().entrySet()) { + if (e.getKey() instanceof Modifier m) { + long last = golem.getPersistentData().getLong(e.getKey().getID() + ":timestamp"); + if (last + m.getCoolDown(golem, e.getValue()) < time || last > time) { + if (m.getEarthquakeRangeSqr(golem, target, e.getValue()) > distSqr) { + list.add(new Instance(golem, m, e.getValue())); + } + } + } + } + if (golem.getVehicle() instanceof AbstractGolemEntity dog && !dog.hasFlag(GolemFlags.PASSIVE)) { + for (var e : dog.getModifiersExtended().entrySet()) { + if (e.getKey() instanceof Modifier m) { + long last = dog.getPersistentData().getLong(e.getKey().getID() + ":timestamp"); + if (last + m.getCoolDown(dog, e.getValue()) < time || last > time) { + if (m.getEarthquakeRangeSqr(dog, target, e.getValue()) > distSqr) { + list.add(new Instance(dog, m, e.getValue())); + } + } + } + } + } + if (!list.isEmpty()) { + return list.get(golem.getRandom().nextInt(list.size())); + } + return null; + } + + public static boolean shouldRetreat(AbstractGolemEntity golem, LivingEntity target, double dist, double reach) { + return golem.hasFlag(GolemFlags.EARTH_QUAKE) && dist < reach + 4 && + EarthquakeHelper.findInstance(golem, target, dist * dist - reach * reach + 4) != null; + } + + public record Instance(AbstractGolemEntity owner, Modifier modifier, int lv) { + + public void performJump(AbstractGolemEntity mover) { + modifier().performJump(mover, lv()); + } + + public void addCD() { + owner().getPersistentData().putLong(modifier().self().getID() + ":timestamp", owner().level().getGameTime()); + } + + public boolean isValid() { + var time = owner().level().getGameTime(); + long last = owner().getPersistentData().getLong(modifier().self().getID() + ":timestamp"); + return last + modifier().getCoolDown(owner(), lv()) < time || last > time; + } + + } + + public interface Modifier { + + void performEarthQuake(AbstractGolemEntity golem, int level); + + default double getEarthquakeRangeSqr(AbstractGolemEntity golem, LivingEntity target, int lv) { + return 25; + } + + default void performJump(AbstractGolemEntity golem, int lv) { + golem.addDeltaMovement(new Vec3(0, 1, 0)); + } + + default int getCoolDown(AbstractGolemEntity golem, int lv) { + return 100; + } + + default GolemModifier self() { + return Wrappers.cast(this); + } + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PickupGoal.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PickupGoal.java index 990464269..f425d432b 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PickupGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PickupGoal.java @@ -126,7 +126,7 @@ private int repairGolemAndItems(int exp) { if (!golem.hasFlag(GolemFlags.MENDING)) { return exp; } - float lost = golem.getMaxHealth() - golem.getHealth(); + float lost = golem.getMaxHealth() - golem.getGuardedDataImpl(); float ratio = MGConfig.COMMON.mendingXpCost.get(); float heal = Math.min(lost, exp / ratio); int cost = (int) (heal * ratio); diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PotionMetaModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PotionMetaModifier.java index 0902d11cc..9bc134a07 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PotionMetaModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/PotionMetaModifier.java @@ -1,6 +1,7 @@ package dev.xkmc.modulargolems.content.modifier.special; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGTagGen; @@ -16,11 +17,11 @@ public PotionMetaModifier() { } @Override - public int addSlot(List upgrades, int lv) { + public int addSlot(List upgrades, int lv) { int ans = 0; - Set set = new HashSet<>(); - for (UpgradeItem item : upgrades) { - if (item.getDefaultInstance().is(MGTagGen.POTION_UPGRADES)) { + Set set = new HashSet<>(); + for (IUpgradeItem item : upgrades) { + if (item.asItem().getDefaultInstance().is(MGTagGen.POTION_UPGRADES)) { if (set.contains(item)) { ans++; } else { diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/SonicAttackGoal.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/SonicAttackGoal.java index a11d4cb85..fe4333216 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/SonicAttackGoal.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/SonicAttackGoal.java @@ -1,6 +1,7 @@ package dev.xkmc.modulargolems.content.modifier.special; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.ranged.SonicCannonItem; import dev.xkmc.modulargolems.init.registrate.GolemTypes; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; @@ -36,6 +37,8 @@ public boolean canUse() { LivingEntity livingentity = this.warden.getTarget(); if (targetPos != null && attackTime <= DELAY) return true; + if (warden.getMainHandItem().getItem() instanceof SonicCannonItem) + return false; return livingentity != null && livingentity.isAlive() && this.warden.canAttack(livingentity) && diff --git a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/TalentMetaModifier.java b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/TalentMetaModifier.java index f55d6f5d6..f63921325 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/modifier/special/TalentMetaModifier.java +++ b/src/main/java/dev/xkmc/modulargolems/content/modifier/special/TalentMetaModifier.java @@ -1,6 +1,7 @@ package dev.xkmc.modulargolems.content.modifier.special; import dev.xkmc.modulargolems.content.core.StatFilterType; +import dev.xkmc.modulargolems.content.item.upgrade.IUpgradeItem; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; import dev.xkmc.modulargolems.init.data.MGTagGen; @@ -16,11 +17,11 @@ public TalentMetaModifier() { } @Override - public int addSlot(List upgrades, int lv) { + public int addSlot(List upgrades, int lv) { int ans = 0; - Set set = new HashSet<>(upgrades); - for (UpgradeItem item : set) { - if (item.getDefaultInstance().is(MGTagGen.BLUE_UPGRADES)) { + Set set = new HashSet<>(upgrades); + for (IUpgradeItem item : set) { + if (item.asItem().getDefaultInstance().is(MGTagGen.BLUE_UPGRADES)) { ans++; } } diff --git a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemAssembleRecipe.java b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemAssembleRecipe.java index 337bd6af5..231f1e532 100644 --- a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemAssembleRecipe.java +++ b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemAssembleRecipe.java @@ -23,7 +23,9 @@ public boolean matches(CraftingContainer cont, Level level) { if (!super.matches(cont, level)) return false; for (int i = 0; i < cont.getContainerSize(); i++) { ItemStack input = cont.getItem(i); + // 如果物品堆非空且物品是GolemPart的实例 if (!input.isEmpty() && input.getItem() instanceof GolemPart part) { + // 检查该傀儡部件对应材料是否为空 if (GolemPart.getMaterial(input).isEmpty()) { return false; } @@ -45,6 +47,7 @@ public ItemStack assemble(CraftingContainer cont, RegistryAccess access) { } @Override + // getSerializer方法重写了父类的方法,用于返回该配方类型的序列化器(Serializer),以便将配方数据写入或从数据包中读取 public Serializer getSerializer() { return GolemMiscs.ASSEMBLE.get(); } diff --git a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceBuilder.java b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceBuilder.java new file mode 100644 index 000000000..3f95dda59 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceBuilder.java @@ -0,0 +1,12 @@ +package dev.xkmc.modulargolems.content.recipe; + +import dev.xkmc.l2library.serial.recipe.CustomShapedBuilder; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.world.level.ItemLike; + +public class GolemReplaceBuilder extends CustomShapedBuilder { + + public GolemReplaceBuilder(ItemLike result, int count) { + super(GolemMiscs.REPLACE, result, count); + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceRecipe.java b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceRecipe.java new file mode 100644 index 000000000..90070977e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemReplaceRecipe.java @@ -0,0 +1,143 @@ +package dev.xkmc.modulargolems.content.recipe; + +import dev.xkmc.l2library.serial.recipe.AbstractShapedRecipe; +import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.content.item.upgrade.AddSlotTemplate; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; + +import javax.annotation.ParametersAreNullableByDefault; + +// 替换配方 +public class GolemReplaceRecipe extends AbstractShapedRecipe { + + public GolemReplaceRecipe(ResourceLocation rl, String group, int w, int h, NonNullList ingredients, ItemStack result) { + super(rl, group, w, h, ingredients, result); + } + + @Override + public boolean matches(CraftingContainer cont, Level level) { + if (!super.matches(cont, level)) return false; + for (int i = 0; i < cont.getContainerSize(); i++) { + ItemStack input = cont.getItem(i); + if (!input.isEmpty() && input.getItem() instanceof GolemPart) { + if (GolemPart.getMaterial(input).isEmpty()) { + return false; + } + } + } + var stack = assemble(cont, level.registryAccess()); + if (stack.getItem() instanceof GolemHolder holder) { + var mats = GolemHolder.getMaterial(stack); + var upgrades = GolemHolder.getUpgrades(stack); + int remain = holder.getRemaining(mats, upgrades); + return remain >= 0; + } + return false; + } + + @Override + public ItemStack assemble(CraftingContainer cont, RegistryAccess access) { + boolean holderFirst = false; + ItemStack holder = null; + ResourceLocation mat = null; + IGolemPart[] parts = null; + IGolemPart sel = null; + for (int i = 0; i < cont.getContainerSize(); i++) { + ItemStack input = cont.getItem(i); + if (input.isEmpty()) continue; + if (input.getItem() instanceof GolemHolder h) { + holder = input; + parts = h.getEntityType().values(); + if (sel == null) holderFirst = true; + } + if (input.getItem() instanceof GolemPart p) { + mat = GolemPart.getMaterial(input).orElse(null); + sel = p.getPart(); + } + } + return replacePart(holder, mat, parts, sel, holderFirst); + } + + public ItemStack assembleForJEI(ResourceLocation mat) { + boolean holderFirst = false; + ItemStack holder = null; + IGolemPart[] parts = null; + IGolemPart sel = null; + for (var ing : getIngredients()) { + if (ing.isEmpty() || ing.getItems().length != 1) + continue; + ItemStack input = ing.getItems()[0]; + if (input.isEmpty()) continue; + if (input.getItem() instanceof GolemHolder h) { + holder = input; + parts = h.getEntityType().values(); + if (sel == null) holderFirst = true; + } + if (input.getItem() instanceof GolemPart p) { + sel = p.getPart(); + } + } + return replacePart(holder, mat, parts, sel, holderFirst); + } + + @ParametersAreNullableByDefault + public ItemStack replacePart( + ItemStack holder, ResourceLocation mat, + IGolemPart[] parts, IGolemPart sel, boolean holderFirst + ) { + if (holder == null || parts == null || mat == null || sel == null) + return ItemStack.EMPTY; + int index = -1; + if (!holderFirst) { + for (int i = 0; i < parts.length; i++) { + if (parts[i].toItem() == sel.toItem()) { + index = i; + break; + } + } + } else { + for (int i = parts.length - 1; i >= 0; i--) { + if (parts[i].toItem() == sel.toItem()) { + index = i; + break; + } + } + } + if (index < 0) + return ItemStack.EMPTY; + if (holder.getItem() instanceof GolemHolder h && h.getEntityType().getBodyPart() == sel) { + for (var e : GolemHolder.getUpgrades(holder)) { + if (e instanceof AddSlotTemplate) { + return ItemStack.EMPTY; + } + } + } + ItemStack result = holder.copy(); + var mats = GolemHolder.getMaterial(result); + if (mats.size() < parts.length) { + result = holder.getItem().getDefaultInstance(); + mats.clear(); + for (var e : parts) { + GolemHolder.addMaterial(result, e.toItem(), ModularGolems.loc("empty")); + } + } + GolemHolder.setMaterial(result, index, mat); + return result; + } + + @Override + public Serializer getSerializer() { + return GolemMiscs.REPLACE.get(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithAddSlotRecipe.java b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithAddSlotRecipe.java new file mode 100644 index 000000000..742cd58c0 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithAddSlotRecipe.java @@ -0,0 +1,58 @@ +package dev.xkmc.modulargolems.content.recipe; + +import dev.xkmc.l2library.serial.recipe.AbstractSmithingRecipe; +import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.content.item.upgrade.AddSlotTemplate; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; + +public class GolemSmithAddSlotRecipe extends AbstractSmithingRecipe { + + public final Ingredient template, base, addition; + + public GolemSmithAddSlotRecipe(ResourceLocation id, Ingredient template, Ingredient base, Ingredient addition, ItemStack result) { + super(id, template, base, addition, result); + this.template = template; + this.base = base; + this.addition = addition; + } + + @Override + public boolean matches(Container input, Level level) { + if (!template.test(input.getItem(0))) return false; + if (!base.test(input.getItem(1))) return false; + var ing = GolemHolder.getCraftMaterial(input.getItem(1)); + if (!ing.test(input.getItem(2))) return false; + var upgrade = GolemHolder.getUpgrades(input.getItem(1)); + return !upgrade.contains((AddSlotTemplate) input.getItem(0).getItem()); + } + + @Override + public ItemStack assemble(Container input, RegistryAccess pvd) { + ItemStack stack = input.getItem(1).copy(); + GolemHolder.addUpgrade(stack, (AddSlotTemplate) input.getItem(0).getItem()); + return stack; + } + + @Override + public boolean isAdditionIngredient(ItemStack stack) { + for (var e : GolemMaterialConfig.get().ingredients.values()) { + if (e.test(stack)) + return true; + } + return false; + } + + @Override + // 序列化 + public Serializer getSerializer() { + return GolemMiscs.SMITH_ADD_SLOT.get(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithBuilder.java b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithBuilder.java new file mode 100644 index 000000000..fba163708 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/content/recipe/GolemSmithBuilder.java @@ -0,0 +1,16 @@ +package dev.xkmc.modulargolems.content.recipe; + +import dev.xkmc.l2library.serial.recipe.CustomSmithingBuilder; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.init.registrate.GolemMiscs; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +public class GolemSmithBuilder extends CustomSmithingBuilder { + + public GolemSmithBuilder(GolemHolder holder, ItemLike template) { + super(GolemMiscs.SMITH_ADD_SLOT, Ingredient.of(template), Ingredient.of(holder), Ingredient.of(Items.IRON_INGOT), holder); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/ClientPacketHandler.java b/src/main/java/dev/xkmc/modulargolems/events/ClientPacketHandler.java new file mode 100644 index 000000000..63525c7da --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/ClientPacketHandler.java @@ -0,0 +1,17 @@ +package dev.xkmc.modulargolems.events; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.client.Minecraft; + +// 客户端数据包的处理 +public class ClientPacketHandler { + + public static void handleReforge(int id, int reforge) { + var level = Minecraft.getInstance().level; + if (level == null) return; + var e = level.getEntity(id); + if (!(e instanceof AbstractGolemEntity golem)) return; + golem.updateReforge(reforge); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/CraftEventListeners.java b/src/main/java/dev/xkmc/modulargolems/events/CraftEventListeners.java index 7b9bfc9a3..b7917c575 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/CraftEventListeners.java +++ b/src/main/java/dev/xkmc/modulargolems/events/CraftEventListeners.java @@ -4,11 +4,14 @@ import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; import dev.xkmc.modulargolems.content.core.IGolemPart; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemFacade; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; import dev.xkmc.modulargolems.content.item.golem.GolemPart; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.advancement.GolemTriggers; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.event.AnvilUpdateEvent; @@ -23,19 +26,21 @@ public class CraftEventListeners { @SubscribeEvent + // 监听铁砧合成 public static void onAnvilCraft(AnvilUpdateEvent event) { ItemStack stack = event.getLeft(); ItemStack block = event.getRight(); - if (stack.getItem() instanceof GolemPart part && part.count <= block.getCount()) { + if (stack.getItem() instanceof GolemPart part) { + if (part.count > block.getCount() || block.is(MGTagGen.SPECIAL_CRAFT)) return; var mat = GolemMaterial.getMaterial(block); - if (mat.isPresent()) { - ItemStack new_stack = stack.copy(); - GolemPart.setMaterial(new_stack, mat.get()); - event.setOutput(new_stack); - event.setMaterialCost(part.count); - event.setCost(1); - } + if (mat.isEmpty()) return; + ItemStack new_stack = stack.copy(); + GolemPart.setMaterial(new_stack, mat.get()); + event.setOutput(new_stack); + event.setMaterialCost(part.count); + event.setCost(1); } + // 若左侧为GolemHolder if (stack.getItem() instanceof GolemHolder holder) { if (block.getItem() instanceof UpgradeItem upgrade) { appendUpgrade(event, holder, upgrade); @@ -43,6 +48,16 @@ public static void onAnvilCraft(AnvilUpdateEvent event) { fixGolem(event, holder, stack); } } + if (stack.is(GolemItems.EMPTY_UPGRADE.get())) { + var mat = GolemMaterial.getRepairMaterial(block); + if (mat.isEmpty()) return; + var ans = GolemFacade.setMaterial(GolemItems.FACADE.asStack(), mat.get()); + ans.setCount(stack.getCount()); + int consume = Math.min(stack.getCount(), block.getCount()); + event.setOutput(ans); + event.setMaterialCost(consume); + event.setCost(stack.getCount() - consume + 1); + } } @SubscribeEvent @@ -69,8 +84,8 @@ public static void onAnvilFinish(AnvilRepairEvent event) { IGolemPart part = type.getBodyPart(); if (mats.size() <= part.ordinal()) return; var mat = mats.get(part.ordinal()); - var ing = GolemMaterialConfig.get().ingredients.get(mat.id()); - if (ing == null || !ing.test(block)) return; + var ing = GolemMaterialConfig.get().getRepairIngredient(mat.id()); + if (!ing.test(block)) return; GolemTriggers.ANVIL_FIX.trigger((ServerPlayer) event.getEntity(), mat.id()); } } @@ -91,23 +106,40 @@ public static void onGrindStone(GrindstoneEvent.OnPlaceItem event) { private static , P extends IGolemPart

> void fixGolem(AnvilUpdateEvent event, GolemHolder holder, ItemStack stack) { if (stack.getTag() == null || !stack.getTag().contains(GolemHolder.KEY_ENTITY)) return; - float max = GolemHolder.getMaxHealth(stack); - float health = GolemHolder.getHealth(stack); - if (health >= max) return; - var mats = GolemHolder.getMaterial(stack); - var type = holder.getEntityType(); - P part = type.getBodyPart(); - if (mats.size() <= part.ordinal()) return; - var mat = mats.get(part.ordinal()); - var ing = GolemMaterialConfig.get().ingredients.get(mat.id()); + var ing = GolemHolder.getHealingMaterial(stack); + if (ing.isEmpty()) return; ItemStack repairStack = event.getRight(); - if (ing == null || !ing.test(repairStack)) return; - int maxFix = Math.min(repairStack.getCount(), (int) Math.ceil((max - health) / max * 4)); - event.setMaterialCost(maxFix); - event.setCost(maxFix); - ItemStack result = stack.copy(); - GolemHolder.setHealth(result, Math.min(max, health + max / 4 * maxFix)); - event.setOutput(result); + if (!ing.test(repairStack)) return; + int reforge = GolemHolder.getReforge(stack); + if (reforge > 0) { + if (repairStack.getCount() <= reforge) { + var result = stack.copy(); + GolemHolder.setReforge(result, reforge - repairStack.getCount()); + event.setMaterialCost(repairStack.getCount()); + event.setCost(1); + event.setOutput(result); + } else { + var result = stack.copy(); + GolemHolder.setReforge(result, 0); + float max = GolemHolder.getMaxHealth(result); + float health = GolemHolder.getHealth(stack); + int maxFix = Math.min(repairStack.getCount() - reforge, (int) Math.ceil((max - health) / max * 4)); + event.setMaterialCost(maxFix + reforge); + event.setCost(reforge + maxFix); + GolemHolder.setHealth(result, Math.min(max, health + max / 4 * maxFix)); + event.setOutput(result); + } + } else { + float max = GolemHolder.getMaxHealth(stack); + float health = GolemHolder.getHealth(stack); + if (health >= max) return; + int maxFix = Math.min(repairStack.getCount(), (int) Math.ceil((max - health) / max * 4)); + event.setMaterialCost(maxFix); + event.setCost(maxFix); + ItemStack result = stack.copy(); + GolemHolder.setHealth(result, Math.min(max, health + max / 4 * maxFix)); + event.setOutput(result); + } } private static , P extends IGolemPart

> diff --git a/src/main/java/dev/xkmc/modulargolems/events/GolemAttackListener.java b/src/main/java/dev/xkmc/modulargolems/events/GolemAttackListener.java index 741c9f260..ac7696b7f 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/GolemAttackListener.java +++ b/src/main/java/dev/xkmc/modulargolems/events/GolemAttackListener.java @@ -9,9 +9,10 @@ public class GolemAttackListener implements AttackListener { @Override + // 当攻击源创建时触发。如果攻击者是 AbstractGolemEntity 的实例,则遍历该傀儡的修饰符,并调用每个修饰符的 modifySource 方法来修改攻击源。 public void onCreateSource(CreateSourceEvent event) { if (event.getAttacker() instanceof AbstractGolemEntity golem) { - for (var e : golem.getModifiers().entrySet()) { + for (var e : golem.getModifiersExtended().entrySet()) { e.getKey().modifySource(golem, event, e.getValue()); } } @@ -20,11 +21,38 @@ public void onCreateSource(CreateSourceEvent event) { @Override public void onHurt(AttackCache cache, ItemStack weapon) { if (cache.getAttacker() instanceof AbstractGolemEntity golem) { - for (var entry : golem.getModifiers().entrySet()) { + for (var entry : golem.getModifiersExtended().entrySet()) { entry.getKey().modifyDamage(cache, golem, entry.getValue()); } } } + @Override + public void onDamage(AttackCache cache, ItemStack weapon) { + if (cache.getAttackTarget() instanceof AbstractGolemEntity golem) { + for (var entry : golem.getModifiersExtended().entrySet()) { + entry.getKey().onDamaged(cache, golem, entry.getValue()); + } + } + } + + @Override + public void onDamageFinalized(AttackCache cache, ItemStack weapon) { + if (cache.getAttacker() instanceof AbstractGolemEntity golem) { + var owner = golem.getOwner(); + // 如果傀儡有主人,则将伤害者设为主人 + if (owner != null) { + cache.getAttackTarget().setLastHurtByPlayer(owner); + } + for (var entry : golem.getModifiersExtended().entrySet()) { + entry.getKey().finalizeHurtTarget(cache, golem, entry.getValue()); + } + } + if (cache.getAttackTarget() instanceof AbstractGolemEntity golem) { + for (var entry : golem.getModifiersExtended().entrySet()) { + entry.getKey().onDamageMax(cache, golem, entry.getValue()); + } + } + } } diff --git a/src/main/java/dev/xkmc/modulargolems/events/GolemClientEventListeners.java b/src/main/java/dev/xkmc/modulargolems/events/GolemClientEventListeners.java index 37e66e1a0..48970a86d 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/GolemClientEventListeners.java +++ b/src/main/java/dev/xkmc/modulargolems/events/GolemClientEventListeners.java @@ -1,22 +1,53 @@ package dev.xkmc.modulargolems.events; +import dev.xkmc.modulargolems.content.client.outline.BlockOutliner; import dev.xkmc.modulargolems.content.entity.humanoid.skin.ClientProfileManager; import dev.xkmc.modulargolems.content.entity.humanoid.skin.SpecialRenderProfile; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.mob.MobSkinDispatch; +import dev.xkmc.modulargolems.content.menu.table.TableTab; +import dev.xkmc.modulargolems.content.menu.tabs.GolemTabBase; import dev.xkmc.modulargolems.events.event.HumanoidSkinEvent; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Items; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; - @Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ModularGolems.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class GolemClientEventListeners { + @SubscribeEvent + public static void renderStageEvent(RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { + BlockOutliner.renderOutline(event.getPoseStack(), event.getCamera().getPosition()); + } + } + @SubscribeEvent public static void onHumanoidSkin(HumanoidSkinEvent event) { + if (!event.getStack().hasTag()) { + if (event.getStack().is(Items.ZOMBIE_HEAD)) { + event.setSkin(MobSkinDispatch.of(EntityType.ZOMBIE)); + } + if (event.getStack().is(Items.SKELETON_SKULL)) { + event.setSkin(MobSkinDispatch.of(EntityType.SKELETON)); + } + if (event.getStack().is(Items.WITHER_SKELETON_SKULL)) { + event.setSkin(MobSkinDispatch.of(EntityType.WITHER_SKELETON)); + } + if (event.getStack().is(Items.PIGLIN_HEAD)) { + event.setSkin(MobSkinDispatch.of(EntityType.PIGLIN)); + } + return; + } if (event.getStack().is(Items.PLAYER_HEAD)) { String name = event.getStack().getHoverName().getString(); if (ResourceLocation.isValidResourceLocation(name)) @@ -32,4 +63,30 @@ public static void onHumanoidSkin(HumanoidSkinEvent event) { } } + @SubscribeEvent + public static void onInitScreen(ScreenEvent.Init.Post event) { + if (TableTab.lastOpened != null && TableTab.level != null) { + long time = TableTab.level.getGameTime(); + if (TableTab.level == Minecraft.getInstance().level && + TableTab.time + 60 >= time && + TableTab.time <= time && + event.getScreen() instanceof AbstractContainerScreen acs && + acs.getMenu().getType() == TableTab.lastOpened.menu) { + TableTab.initScreen(TableTab.lastOpened, acs, event::addListener); + } + TableTab.lastOpened = null; + } + } + + @SubscribeEvent(priority = EventPriority.LOW) + public static void onBGRender(ScreenEvent.Render.Post event) { + if (event.getScreen() instanceof AbstractContainerScreen cont) { + for (var e : cont.renderables) { + if (e instanceof GolemTabBase base) { + base.reposition(cont.getGuiLeft(), cont.getGuiTop()); + } + } + } + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/events/GolemDispenserBehaviors.java b/src/main/java/dev/xkmc/modulargolems/events/GolemDispenserBehaviors.java index 5090a3027..0ebdb4449 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/GolemDispenserBehaviors.java +++ b/src/main/java/dev/xkmc/modulargolems/events/GolemDispenserBehaviors.java @@ -14,6 +14,7 @@ public class GolemDispenserBehaviors { public static void registerDispenseBehaviors() { DispenseItemBehavior behavior = new DefaultDispenseItemBehavior() { @Override + // 定义了如何在投掷器中处理一些特殊的物品 protected ItemStack execute(BlockSource source, ItemStack stack) { if (((GolemHolder) stack.getItem()).summon( stack, source.getLevel(), diff --git a/src/main/java/dev/xkmc/modulargolems/events/GolemEventListeners.java b/src/main/java/dev/xkmc/modulargolems/events/GolemEventListeners.java index 968d05227..7c500382a 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/GolemEventListeners.java +++ b/src/main/java/dev/xkmc/modulargolems/events/GolemEventListeners.java @@ -1,8 +1,13 @@ package dev.xkmc.modulargolems.events; -import dev.xkmc.modulargolems.events.event.GolemEquipEvent; +import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; +import dev.xkmc.modulargolems.events.event.GolemEquipItemEvent; import dev.xkmc.modulargolems.events.event.GolemThrowableEvent; import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ThrownTrident; @@ -10,33 +15,75 @@ import net.minecraft.world.item.BannerItem; import net.minecraft.world.item.BowItem; import net.minecraft.world.item.TridentItem; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import static net.minecraft.world.entity.LivingEntity.getEquipmentSlotForItem; + @Mod.EventBusSubscriber(modid = ModularGolems.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class GolemEventListeners { - @SubscribeEvent - public static void onEquip(GolemEquipEvent event) { - if (event.getStack().getItem() instanceof ArrowItem) { - event.setSlot(EquipmentSlot.OFFHAND, event.getStack().getCount()); + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onEquip(GolemEquipItemEvent event) { + var golem = event.getEntity(); + var stack = event.getStack(); + // 人形 + if (golem instanceof HumanoidGolemEntity) { + // 对箭,装到副手 + if (stack.getItem() instanceof ArrowItem) { + event.setSlot(stack.getCount(), EquipmentSlot.OFFHAND); + } + // 对弓,装到主手,副手 + if (stack.getItem() instanceof BowItem) { + event.setSlot(1, EquipmentSlot.MAINHAND, EquipmentSlot.OFFHAND); + } + // 旗帜,头部 + if (stack.getItem() instanceof BannerItem) { + event.setSlot(1, EquipmentSlot.HEAD); + } + + var slot = getEquipmentSlotForItem(stack); + if (stack.canEquip(slot, golem)) { + if (slot == EquipmentSlot.MAINHAND) { + event.setSlot(1, EquipmentSlot.MAINHAND, EquipmentSlot.OFFHAND); + } else event.setSlot(1, slot); + } } - if (!event.getEntity().getItemBySlot(EquipmentSlot.MAINHAND).isEmpty()) { - if (event.getStack().getItem() instanceof BowItem) { - event.setSlot(EquipmentSlot.OFFHAND, 1); + + // 大傀儡 + if (golem instanceof MetalGolemEntity) { + if (stack.getItem() instanceof IGolemEquipmentItem item && item.isFor(golem.getType())) { + event.setSlot(1, item.getSlot()); + } else if (stack.is(MGTagGen.LARGE_GOLEM_WEAPONS)) { + event.setSlot(1, EquipmentSlot.MAINHAND); + } else if (stack.getItem() instanceof BannerItem) { + event.setSlot(1, EquipmentSlot.HEAD, EquipmentSlot.FEET); + } else if (stack.getItem() instanceof ArrowItem) { + event.setSlot(stack.getCount(), EquipmentSlot.OFFHAND); } } - if (event.getStack().getItem() instanceof BannerItem) { - event.setSlot(EquipmentSlot.HEAD, 1); + + // 狗傀儡 + if (golem instanceof DogGolemEntity) { + if (stack.getItem() instanceof IGolemEquipmentItem item && item.isFor(golem.getType())) { + event.setSlot(1, item.getSlot()); + } else if (stack.getItem() instanceof BannerItem) { + event.setSlot(1, EquipmentSlot.HEAD); + } + } } @SubscribeEvent public static void isThrowable(GolemThrowableEvent event) { + // 判断当前装备的物品是否属于投掷物品(仅含三叉戟)如果是,则将该物品设置为可投掷,并创建一个ThrownTrident对象 if (event.getStack().getItem() instanceof TridentItem) { event.setThrowable(level -> { + // 创建投掷物模拟投掷行为 var ans = new ThrownTrident(level, event.getEntity(), event.getStack()); + // 该投掷物不可拾取 ans.pickup = AbstractArrow.Pickup.DISALLOWED; return ans; }); diff --git a/src/main/java/dev/xkmc/modulargolems/events/GolemItemPriorityHandler.java b/src/main/java/dev/xkmc/modulargolems/events/GolemItemPriorityHandler.java new file mode 100644 index 000000000..fe9e9bfdf --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/GolemItemPriorityHandler.java @@ -0,0 +1,40 @@ +package dev.xkmc.modulargolems.events; + +import dev.xkmc.modulargolems.content.item.card.ClickEntityFilterCard; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = ModularGolems.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class GolemItemPriorityHandler { + // 指定事件处理的优先级为高 + @SubscribeEvent(priority = EventPriority.HIGH) + // 右键点击方块 + public static void onItemUseOnBlock(PlayerInteractEvent.RightClickBlock event) { + // 检查玩家使用的物品是否是模组化傀儡中的路径卡 + if (event.getItemStack().is(GolemItems.CARD_PATH.get())) { + event.setUseItem(Event.Result.ALLOW); + event.setUseBlock(Event.Result.DENY); + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + // 右键点击实体 + public static void onItemUseOnEntity(PlayerInteractEvent.EntityInteractSpecific event) { + // 检查玩家使用的物品是否是模组化傀儡中的实体过滤卡,且目标实体是否为LivingEntity + if (event.getItemStack().getItem() instanceof ClickEntityFilterCard card && event.getTarget() instanceof LivingEntity le) { + // 调用卡牌的interactLivingEntity方法,处理玩家与目标实体之间的交互 + var ans = card.interactLivingEntity(event.getItemStack(), event.getEntity(), le, event.getHand()); + // 设置事件的取消结果为卡牌处理交互的结果 + event.setCancellationResult(ans); + // 并取消该事件 + event.setCanceled(true); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/ModifierEventListeners.java b/src/main/java/dev/xkmc/modulargolems/events/ModifierEventListeners.java index 30bdc5c07..012b98d93 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/ModifierEventListeners.java +++ b/src/main/java/dev/xkmc/modulargolems/events/ModifierEventListeners.java @@ -12,20 +12,21 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.TraceableEntity; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.goal.target.TargetGoal; import net.minecraft.world.entity.animal.IronGolem; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.level.Level; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.entity.EntityJoinLevelEvent; -import net.minecraftforge.event.entity.living.LivingAttackEvent; -import net.minecraftforge.event.entity.living.LivingDamageEvent; -import net.minecraftforge.event.entity.living.LivingDropsEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.EntityMobGriefingEvent; +import net.minecraftforge.event.entity.living.*; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.ExplosionEvent; +import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -35,8 +36,11 @@ public class ModifierEventListeners { @SubscribeEvent public static void onGolemSpawn(EntityJoinLevelEvent event) { + // 首先检查事件是否发生在客户端,如果是,则直接返回,不执行任何逻辑 if (event.getLevel().isClientSide()) return; + // 检查事件中的实体是否为AbstractGolemEntity的实例 if (event.getEntity() instanceof AbstractGolemEntity entity) { + // 遍历该傀儡的所有修饰符(modifiers),并调用每个修饰符的onGolemSpawn方法,传入傀儡实例和修饰符的值,以便对傀儡的属性进行初始化或修改 entity.getModifiers().forEach((k, v) -> k.onGolemSpawn(entity, v)); } } @@ -45,43 +49,72 @@ public static void onGolemSpawn(EntityJoinLevelEvent event) { public static void onHurtPre(LivingHurtEvent event) { DamageSource source = event.getSource(); if (source.getEntity() instanceof AbstractGolemEntity entity) { - entity.getModifiers().forEach((k, v) -> k.onHurtTarget(entity, event, v)); + entity.getModifiersExtended().forEach((k, v) -> k.onHurtTarget(entity, event, v)); } } @SubscribeEvent(priority = EventPriority.HIGH) public static void onAttackPre(LivingAttackEvent event) { if (event.getSource().getEntity() instanceof AbstractGolemEntity entity) { - entity.getModifiers().forEach((k, v) -> k.onAttackTarget(entity, event, v)); + if (!entity.canAttack(event.getEntity())) { + event.setCanceled(true); + return; + } + entity.getModifiersExtended().forEach((k, v) -> k.onAttackTarget(entity, event, v)); } } @SubscribeEvent public static void onAttacked(LivingAttackEvent event) { if (event.getEntity() instanceof AbstractGolemEntity entity) { - entity.getModifiers().forEach((k, v) -> k.onAttacked(entity, event, v)); + entity.getModifiersExtended().forEach((k, v) -> k.onAttacked(entity, event, v)); } } @SubscribeEvent(priority = EventPriority.LOW) public static void onHurtPost(LivingHurtEvent event) { if (event.getEntity() instanceof AbstractGolemEntity entity) { - entity.getModifiers().forEach((k, v) -> k.onHurt(entity, event, v)); + entity.getModifiersExtended().forEach((k, v) -> k.onHurt(entity, event, v)); } } @SubscribeEvent public static void onDamaged(LivingDamageEvent event) { if (event.getEntity() instanceof AbstractGolemEntity entity) { - entity.getModifiers().forEach((k, v) -> k.onDamaged(entity, event, v)); + entity.getModifiersExtended().forEach((k, v) -> k.onDamaged(entity, event, v)); } } + @SubscribeEvent + public static void onKillTarget(LivingDeathEvent event) { + if (event.getSource().getEntity() instanceof AbstractGolemEntity golem) { + golem.getModifiersExtended().forEach((k, v) -> k.onKillTarget(golem, event.getEntity(), event, v)); + } + } + + @SubscribeEvent public static void onExplosion(ExplosionEvent.Detonate event) { + var direct = event.getExplosion().getDirectSourceEntity(); + var owner = event.getExplosion().getIndirectSourceEntity(); + if (direct != null && (owner instanceof AbstractGolemEntity golem)) { + event.getAffectedBlocks().clear(); + event.getAffectedEntities().removeIf(e -> { + if (e instanceof ItemEntity) return true; + if (e instanceof LivingEntity le) { + if (!golem.canAttack(le)) return true; + } + if (e instanceof TraceableEntity proj) { + return proj.getOwner() == golem; + } + return false; + }); + } for (var e : event.getAffectedEntities()) { + // 如果有傀儡实体 if (e instanceof AbstractGolemEntity golem) { - if (golem.getModifiers().getOrDefault(GolemModifiers.EXPLOSION_RES.get(), 0) > 0) { + // 且实体有爆炸抗性修饰符,并且其值大于0,则取消爆炸对所有方块的影响 + if (golem.getModifiersExtended().getOrDefault(GolemModifiers.EXPLOSION_RES.get(), 0) > 0) { event.getAffectedBlocks().clear(); return; } @@ -101,7 +134,8 @@ public static void onEntityJoinWorld(EntityJoinLevelEvent event) { if (target.targetType == IronGolem.class) { priority = goal.getPriority(); ans = new NearestAttackableTargetGoal<>(mob, AbstractGolemEntity.class, - target.randomInterval, target.mustSee, target.mustReach, null); + target.randomInterval, target.mustSee, target.mustReach, + e -> e instanceof AbstractGolemEntity golem && !golem.isHostile()); break; } } @@ -115,8 +149,11 @@ public static void onEntityJoinWorld(EntityJoinLevelEvent event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onLivingDrop(LivingDropsEvent event) { + // 检查掉落物品的来源是否为AbstractGolemEntity实例 if (event.getSource().getEntity() instanceof AbstractGolemEntity e) { + // 进一步检查该傀儡是否具有拾取掉落物的标志(GolemFlags.PICKUP) if (e.hasFlag(GolemFlags.PICKUP)) { + // 如果具有,则将所有掉落物移动到该傀儡所在的位置 event.getDrops().forEach(x -> x.moveTo(e.position())); } } @@ -143,4 +180,12 @@ public static void onTargetCardClick(PlayerInteractEvent.EntityInteract event) { } } + @SubscribeEvent + public static void onMobGrief(EntityMobGriefingEvent event) { + var e = event.getEntity(); + if (e instanceof TraceableEntity te) e = te.getOwner(); + if (e instanceof AbstractGolemEntity golem && !golem.isHostile()) + event.setResult(Event.Result.DENY); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/events/WeaponAttackListener.java b/src/main/java/dev/xkmc/modulargolems/events/WeaponAttackListener.java new file mode 100644 index 000000000..0bf1b55c3 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/WeaponAttackListener.java @@ -0,0 +1,56 @@ +package dev.xkmc.modulargolems.events; + +import dev.xkmc.l2damagetracker.contents.attack.AttackCache; +import dev.xkmc.l2damagetracker.contents.attack.AttackListener; +import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; +import dev.xkmc.modulargolems.content.item.equipments.IAttackListenerWeapon; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.item.ItemStack; + +public class WeaponAttackListener implements AttackListener { + + @Override + public void onAttack(AttackCache cache, ItemStack weapon) { + var event = cache.getLivingAttackEvent(); + assert event != null; + var source = event.getSource(); + if (cache.getAttacker() instanceof MetalGolemEntity e) { + if (source.is(L2DamageTypes.DIRECT)) { + var stack = e.getMainHandItem(); + if (stack.getItem() instanceof IAttackListenerWeapon item) { + item.onAttack(cache, source, e, stack); + } + } + } + } + + @Override + public void onHurt(AttackCache cache, ItemStack weapon) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + if (cache.getAttacker() instanceof MetalGolemEntity e) { + if (source.is(L2DamageTypes.DIRECT)) { + var stack = e.getMainHandItem(); + if (stack.getItem() instanceof IAttackListenerWeapon item) { + item.onHurt(cache, source, e, stack); + } + } + } + } + + @Override + public void onDamage(AttackCache cache, ItemStack weapon) { + var event = cache.getLivingHurtEvent(); + assert event != null; + var source = event.getSource(); + if (cache.getAttacker() instanceof MetalGolemEntity e) { + if (source.is(L2DamageTypes.DIRECT)) { + var stack = e.getMainHandItem(); + if (stack.getItem() instanceof IAttackListenerWeapon item) { + item.onDamage(cache, source, e, stack); + } + } + } + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemBowAttackEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemBowAttackEvent.java index 9b2608453..b99d88448 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/event/GolemBowAttackEvent.java +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemBowAttackEvent.java @@ -5,6 +5,7 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; +@Deprecated public class GolemBowAttackEvent extends GolemItemUseEvent { private AbstractArrow entity; diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectInventoryEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectInventoryEvent.java new file mode 100644 index 000000000..91a9c9b90 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectInventoryEvent.java @@ -0,0 +1,30 @@ +package dev.xkmc.modulargolems.events.event; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.Container; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.InvWrapper; + +import java.util.ArrayList; + +/** + * Inventories that golem have access to, provided as an item handler capability from golem + * */ +public class GolemCollectInventoryEvent extends GolemEvent { + + private final ArrayList list; + + public GolemCollectInventoryEvent(AbstractGolemEntity golem, ArrayList list) { + super(golem); + this.list = list; + } + + public void add(IItemHandlerModifiable inv) { + list.add(inv); + } + + public void add(Container inv) { + list.add(new InvWrapper(inv)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectItemEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectItemEvent.java new file mode 100644 index 000000000..be35b6655 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemCollectItemEvent.java @@ -0,0 +1,29 @@ +package dev.xkmc.modulargolems.events.event; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +/** + * Items golem will return on disintegration + */ +public class GolemCollectItemEvent extends GolemEvent { + + private final List list; + + public GolemCollectItemEvent(AbstractGolemEntity golem, List list) { + super(golem); + this.list = list; + } + + public List getAll() { + return list; + } + + public void add(ItemStack stack) { + if (stack.isEmpty()) return; + list.add(stack); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemDeathEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemDeathEvent.java new file mode 100644 index 000000000..6b34ca14e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemDeathEvent.java @@ -0,0 +1,22 @@ +package dev.xkmc.modulargolems.events.event; + +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.eventbus.api.Cancelable; + +@Cancelable +public class GolemDeathEvent extends LivingEvent { + + private final DamageSource source; + + public GolemDeathEvent(LivingEntity golem, DamageSource source) { + super(golem); + this.source = source; + } + + public DamageSource getSource() { + return source; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipEvent.java index 5b0b742d1..02716c221 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipEvent.java +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipEvent.java @@ -6,6 +6,7 @@ import static net.minecraft.world.entity.LivingEntity.getEquipmentSlotForItem; +@Deprecated public class GolemEquipEvent extends HumanoidGolemEvent { private final ItemStack stack; diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipItemEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipItemEvent.java new file mode 100644 index 000000000..0fefa8406 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEquipItemEvent.java @@ -0,0 +1,43 @@ +package dev.xkmc.modulargolems.events.event; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; + +import static net.minecraft.world.entity.LivingEntity.getEquipmentSlotForItem; + +public class GolemEquipItemEvent extends GolemEvent { + + private final ItemStack stack; + + private EquipmentSlot[] slot = new EquipmentSlot[0]; + private boolean canEquip = false; + private int amount; + + public GolemEquipItemEvent(AbstractGolemEntity golem, ItemStack stack) { + super(golem); + this.stack = stack; + } + + public void setSlot(int amount, EquipmentSlot... slot) { + this.slot = slot; + canEquip = true; + this.amount = amount; + } + + public boolean canEquip() { + return canEquip; + } + + public EquipmentSlot[] getSlot() { + return slot; + } + + public ItemStack getStack() { + return stack; + } + + public int getAmount() { + return amount; + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEvent.java index e5b795088..a0aaef8b2 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/event/GolemEvent.java +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemEvent.java @@ -5,13 +5,16 @@ public class GolemEvent extends LivingEvent { + // 声明了一个私有的、不可变的成员变量 golem private final AbstractGolemEntity golem; + // 构造函数用于创建一个 GolemEvent 对象 public GolemEvent(AbstractGolemEntity golem) { super(golem); this.golem = golem; } + // 公共方法,用于返回触发此事件的具体傀儡实体 public AbstractGolemEntity getEntity() { return golem; } diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemInfoEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemInfoEvent.java new file mode 100644 index 000000000..b1db5490c --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemInfoEvent.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.events.event; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.network.chat.Component; +import net.minecraftforge.eventbus.api.Event; + +import java.util.List; + +public class GolemInfoEvent extends Event { + + private final AbstractGolemEntity golem; + private final List info; + + public GolemInfoEvent(AbstractGolemEntity golem, List info) { + this.golem = golem; + this.info = info; + } + + public AbstractGolemEntity getGolem() { + return golem; + } + + public void addLine(Component comp) { + info.add(comp); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemRenderItemInHandEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemRenderItemInHandEvent.java new file mode 100644 index 000000000..bafca05aa --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemRenderItemInHandEvent.java @@ -0,0 +1,36 @@ +package dev.xkmc.modulargolems.events.event; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +@Cancelable +public class GolemRenderItemInHandEvent extends Event { + + public final LivingEntity entity; + public final ItemStack stack; + public final ItemDisplayContext ctx; + public final HumanoidArm arm; + public final PoseStack pose; + public final MultiBufferSource buffer; + public final int light; + public final ItemInHandRenderer renderer; + + public GolemRenderItemInHandEvent(LivingEntity entity, ItemStack stack, ItemDisplayContext ctx, HumanoidArm arm, PoseStack pose, MultiBufferSource buffer, int light, ItemInHandRenderer renderer) { + this.entity = entity; + this.stack = stack; + this.ctx = ctx; + this.arm = arm; + this.pose = pose; + this.buffer = buffer; + this.light = light; + this.renderer = renderer; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemRidingOffsetEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemRidingOffsetEvent.java new file mode 100644 index 000000000..b8dcdaf0a --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemRidingOffsetEvent.java @@ -0,0 +1,28 @@ +package dev.xkmc.modulargolems.events.event; + +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraftforge.eventbus.api.Event; + +public class GolemRidingOffsetEvent extends Event { + + private final AbstractGolemEntity golem; + + private double offset; + + public GolemRidingOffsetEvent(AbstractGolemEntity golem) { + this.golem = golem; + } + + public AbstractGolemEntity getGolem() { + return golem; + } + + public void setOffset(double offset) { + this.offset = offset; + } + + public double getOffset() { + return offset; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemThrowableEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemThrowableEvent.java index 7b25d34c8..70ac6fe41 100644 --- a/src/main/java/dev/xkmc/modulargolems/events/event/GolemThrowableEvent.java +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemThrowableEvent.java @@ -8,6 +8,7 @@ import java.util.function.Function; +@Deprecated public class GolemThrowableEvent extends GolemItemUseEvent { private boolean isThrowable; diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/GolemToOwnerEvent.java b/src/main/java/dev/xkmc/modulargolems/events/event/GolemToOwnerEvent.java new file mode 100644 index 000000000..1999a86e7 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/GolemToOwnerEvent.java @@ -0,0 +1,27 @@ +package dev.xkmc.modulargolems.events.event; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +@Cancelable +public class GolemToOwnerEvent extends Event { + + private final LivingEntity owner; + private final ItemStack stack; + + public GolemToOwnerEvent(LivingEntity owner, ItemStack stack) { + this.owner = owner; + this.stack = stack; + } + + public LivingEntity getOwner() { + return owner; + } + + public ItemStack getStack() { + return stack; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/events/event/ModifyItemOnApplication.java b/src/main/java/dev/xkmc/modulargolems/events/event/ModifyItemOnApplication.java new file mode 100644 index 000000000..3e8fcc4c1 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/events/event/ModifyItemOnApplication.java @@ -0,0 +1,28 @@ +package dev.xkmc.modulargolems.events.event; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.Event; + +public class ModifyItemOnApplication extends Event { + + private final ItemStack golem; + private ItemStack stack; + + public ModifyItemOnApplication(ItemStack golem, ItemStack stack) { + this.golem = golem; + this.stack = stack; + } + + public ItemStack getGolem() { + return golem; + } + + public ItemStack getStack() { + return stack; + } + + public void setStack(ItemStack stack) { + this.stack = stack; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/GolemClient.java b/src/main/java/dev/xkmc/modulargolems/init/GolemClient.java index 51fd1eb46..54102147d 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/GolemClient.java +++ b/src/main/java/dev/xkmc/modulargolems/init/GolemClient.java @@ -1,23 +1,37 @@ package dev.xkmc.modulargolems.init; import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; +import dev.xkmc.l2tabs.tabs.core.TabRegistry; +import dev.xkmc.l2tabs.tabs.core.TabToken; import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; -import dev.xkmc.modulargolems.compat.materials.common.CompatManager; -import dev.xkmc.modulargolems.compat.misc.MaidCompat; +import dev.xkmc.modulargolems.compat.maid.MaidSkinCompat; +import dev.xkmc.modulargolems.compat.materials.blazegear.DuplicatedBlazeArmsModel; +import dev.xkmc.modulargolems.compat.materials.common.ClientCompatManager; import dev.xkmc.modulargolems.content.client.armor.GolemEquipmentModels; import dev.xkmc.modulargolems.content.client.overlay.GolemStatusOverlay; +import dev.xkmc.modulargolems.content.client.tracker.GolemInvTab; import dev.xkmc.modulargolems.content.entity.humanoid.skin.PlayerSkinRenderer; import dev.xkmc.modulargolems.content.item.golem.GolemBEWLR; import dev.xkmc.modulargolems.content.item.upgrade.UpgradeItem; import dev.xkmc.modulargolems.content.menu.registry.GolemTabRegistry; +import dev.xkmc.modulargolems.content.menu.table.ItemListClientTooltip; +import dev.xkmc.modulargolems.content.menu.table.ItemListTooltip; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.mob.MobSkinDispatch; +import dev.xkmc.modulargolems.init.data.MGConfig; +import dev.xkmc.modulargolems.init.data.MGLangData; import dev.xkmc.modulargolems.init.data.MGTagGen; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.util.EsterEggUtil; +import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; +import net.minecraft.world.item.ShieldItem; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; +import net.minecraftforge.client.event.RegisterClientTooltipComponentFactoriesEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; import net.minecraftforge.common.MinecraftForge; @@ -25,29 +39,45 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.registries.ForgeRegistries; @Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ModularGolems.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class GolemClient { private static final boolean ENABLE_TLM = true; + public static ModelLayerLocation BLAZE_ARMS_LAYER = new ModelLayerLocation(new ResourceLocation(ModularGolems.MODID, "golems"), "blazegear_blaze_arms"); + public static TabToken TAB; + @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { if (ENABLE_TLM && ModList.get().isLoaded(TouhouLittleMaid.MOD_ID)) { - MinecraftForge.EVENT_BUS.register(MaidCompat.class); + MinecraftForge.EVENT_BUS.register(MaidSkinCompat.class); } event.enqueueWork(() -> { ClampedItemPropertyFunction func = (stack, level, entity, layer) -> entity != null && entity.isBlocking() && entity.getUseItem() == stack ? 1.0F : 0.0F; - ItemProperties.register(Items.SHIELD, new ResourceLocation("blocking"), func); + if (MGConfig.CLIENT.shieldUsePoseFixForModdedShields.get()) { + for (var e : ForgeRegistries.ITEMS) { + if (e instanceof ShieldItem) { + ItemProperties.register(e, new ResourceLocation("blocking"), func); + } + } + } else { + ItemProperties.register(Items.SHIELD, new ResourceLocation("blocking"), func); + } ClampedItemPropertyFunction arrow = (stack, level, entity, layer) -> stack.is(MGTagGen.BLUE_UPGRADES) ? 1 : stack.is(MGTagGen.POTION_UPGRADES) ? 0.5f : 0; for (var item : UpgradeItem.LIST) ItemProperties.register(item, new ResourceLocation(ModularGolems.MODID, "blue_arrow"), arrow); - CompatManager.dispatchClientSetup(); + ClientCompatManager.dispatchClientSetup(); GolemTabRegistry.register(); CurioCompatRegistry.clientRegister(); + + TAB = TabRegistry.registerTab(3400, GolemInvTab::new, GolemItems.HOLDER_GOLEM::get, MGLangData.TAB_ALIVE.get()); + + EsterEggUtil.registerEsterEggTextures(); }); } @@ -59,6 +89,8 @@ public static void registerOverlays(RegisterGuiOverlaysEvent event) { @SubscribeEvent public static void registerArmorLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { GolemEquipmentModels.registerArmorLayer(event); + event.registerLayerDefinition(BLAZE_ARMS_LAYER, DuplicatedBlazeArmsModel::createBodyLayer); + ClientCompatManager.dispatchEntityLayer(event); } @SubscribeEvent @@ -68,11 +100,18 @@ public static void onResourceReload(RegisterClientReloadListenersEvent event) { @SubscribeEvent public static void onAddLayers(EntityRenderersEvent.AddLayers event) { + MobSkinDispatch.setup(event.getContext()); PlayerSkinRenderer.SLIM = new PlayerSkinRenderer(event.getContext(), true); PlayerSkinRenderer.REGULAR = new PlayerSkinRenderer(event.getContext(), false); if (ENABLE_TLM && ModList.get().isLoaded(TouhouLittleMaid.MOD_ID)) { - MaidCompat.addLayers(event); + MaidSkinCompat.addLayers(event); } } + @SubscribeEvent + public static void registerClientTooltip(RegisterClientTooltipComponentFactoriesEvent event) { + event.register(ItemListTooltip.class, ItemListClientTooltip::new); + } + + } diff --git a/src/main/java/dev/xkmc/modulargolems/init/ModularGolems.java b/src/main/java/dev/xkmc/modulargolems/init/ModularGolems.java index b42b447d2..548b89561 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/ModularGolems.java +++ b/src/main/java/dev/xkmc/modulargolems/init/ModularGolems.java @@ -7,29 +7,36 @@ import dev.xkmc.l2library.base.L2Registrate; import dev.xkmc.l2library.serial.config.ConfigTypeEntry; import dev.xkmc.l2library.serial.config.PacketHandlerWithConfig; +import dev.xkmc.l2screentracker.click.quickaccess.DefaultQuickAccessActions; import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.compat.maid.SetMaidModelToServer; +import dev.xkmc.modulargolems.content.entity.humanoid.skin.SetPlayerSkinToServer; import dev.xkmc.modulargolems.compat.materials.common.CompatManager; -import dev.xkmc.modulargolems.content.capability.ConfigHeartBeatToServer; -import dev.xkmc.modulargolems.content.capability.ConfigSyncToClient; -import dev.xkmc.modulargolems.content.capability.ConfigUpdateToServer; -import dev.xkmc.modulargolems.content.capability.GolemConfigStorage; +import dev.xkmc.modulargolems.content.capability.*; import dev.xkmc.modulargolems.content.config.GolemMaterialConfig; import dev.xkmc.modulargolems.content.config.GolemPartConfig; +import dev.xkmc.modulargolems.content.entity.common.GuardedEntity; +import dev.xkmc.modulargolems.content.entity.common.ReforgeUpdatePacket; +import dev.xkmc.modulargolems.content.entity.dog.DogSkillToServer; +import dev.xkmc.modulargolems.content.entity.humanoid.weapon.GolemWeaponRegistry; import dev.xkmc.modulargolems.content.entity.mode.GolemModes; import dev.xkmc.modulargolems.content.menu.ghost.SetItemFilterToServer; import dev.xkmc.modulargolems.content.menu.registry.OpenConfigMenuToServer; import dev.xkmc.modulargolems.content.menu.registry.OpenEquipmentMenuToServer; +import dev.xkmc.modulargolems.content.menu.table.GolemUpgradeMenu; +import dev.xkmc.modulargolems.content.menu.table.OpenTableMenuToServer; +import dev.xkmc.modulargolems.content.menu.wheel.GolemSetModeToServer; import dev.xkmc.modulargolems.events.GolemAttackListener; import dev.xkmc.modulargolems.events.GolemDispenserBehaviors; +import dev.xkmc.modulargolems.events.WeaponAttackListener; import dev.xkmc.modulargolems.init.advancement.GolemTriggers; import dev.xkmc.modulargolems.init.data.*; -import dev.xkmc.modulargolems.init.registrate.GolemItems; -import dev.xkmc.modulargolems.init.registrate.GolemMiscs; -import dev.xkmc.modulargolems.init.registrate.GolemModifiers; -import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import dev.xkmc.modulargolems.init.loot.MGGLMGen; +import dev.xkmc.modulargolems.init.registrate.*; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.entity.EntityAttributeModificationEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; @@ -52,13 +59,23 @@ public class ModularGolems { public static final IEventBus MOD_BUS = FMLJavaModLoadingContext.get().getModEventBus(); public static final PacketHandlerWithConfig HANDLER = new PacketHandlerWithConfig( - new ResourceLocation(ModularGolems.MODID, "main"), 1, + new ResourceLocation(ModularGolems.MODID, "main"), 5, e -> e.create(ConfigSyncToClient.class, NetworkDirection.PLAY_TO_CLIENT), e -> e.create(ConfigUpdateToServer.class, NetworkDirection.PLAY_TO_SERVER), e -> e.create(ConfigHeartBeatToServer.class, NetworkDirection.PLAY_TO_SERVER), e -> e.create(SetItemFilterToServer.class, NetworkDirection.PLAY_TO_SERVER), e -> e.create(OpenConfigMenuToServer.class, NetworkDirection.PLAY_TO_SERVER), - e -> e.create(OpenEquipmentMenuToServer.class, NetworkDirection.PLAY_TO_SERVER) + e -> e.create(OpenEquipmentMenuToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(OpenTableMenuToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(TrackerSyncToClient.class, NetworkDirection.PLAY_TO_CLIENT), + e -> e.create(TrackerHeartBeatToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(TrackerDeleteToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(ReforgeUpdatePacket.class, NetworkDirection.PLAY_TO_CLIENT), + e -> e.create(GuardedEntity.GuardedDataToClient.class, NetworkDirection.PLAY_TO_CLIENT), + e -> e.create(DogSkillToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(GolemSetModeToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(SetMaidModelToServer.class, NetworkDirection.PLAY_TO_SERVER), + e -> e.create(SetPlayerSkinToServer.class, NetworkDirection.PLAY_TO_SERVER) ); public static final ConfigTypeEntry PARTS = @@ -70,19 +87,16 @@ private static void registerRegistrates() { GolemItems.register(); GolemTypes.register(); GolemMiscs.register(); + GolemMiscEntities.register(); GolemModifiers.register(); MGConfig.init(); GolemTriggers.register(); GolemModes.register(); GolemConfigStorage.register(); CurioCompatRegistry.register(); - REGISTRATE.addDataGenerator(ProviderType.LANG, MGLangData::genLang); - REGISTRATE.addDataGenerator(ProviderType.RECIPE, RecipeGen::genRecipe); - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, MGTagGen::onBlockTagGen); - REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, MGTagGen::onItemTagGen); - REGISTRATE.addDataGenerator(ProviderType.ENTITY_TAGS, MGTagGen::onEntityTagGen); - REGISTRATE.addDataGenerator(ProviderType.ADVANCEMENT, MGAdvGen::genAdvancements); AttackEventHandler.register(3500, new GolemAttackListener()); + AttackEventHandler.register(7900, new WeaponAttackListener()); + } public ModularGolems() { @@ -97,15 +111,34 @@ public static void modifyAttributes(EntityAttributeModificationEvent event) { public static void setup(final FMLCommonSetupEvent event) { event.enqueueWork(() -> { GolemDispenserBehaviors.registerDispenseBehaviors(); + CompatManager.commonSetup(); + GolemWeaponRegistry.init(); + DefaultQuickAccessActions.quickAccess(GolemMiscs.DISINTEGRATE.get(), + GolemItems.TABLE.asItem(), + GolemUpgradeMenu::createFloating, MGLangData.TAB_UPGRADES.key()); }); } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.HIGH) public static void gatherData(GatherDataEvent event) { - event.getGenerator().addProvider(event.includeServer(), new MGConfigGen(event.getGenerator())); + REGISTRATE.addDataGenerator(ProviderType.LANG, MGLangData::genLang); + REGISTRATE.addDataGenerator(ProviderType.RECIPE, RecipeGen::genRecipe); + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, MGTagGen::onBlockTagGen); + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, MGTagGen::onItemTagGen); + REGISTRATE.addDataGenerator(ProviderType.ENTITY_TAGS, MGTagGen::onEntityTagGen); + REGISTRATE.addDataGenerator(ProviderType.ADVANCEMENT, MGAdvGen::genAdvancements); + + var gen = event.getGenerator(); + var server = event.includeServer(); + var pvd = event.getLookupProvider(); + var out = gen.getPackOutput(); + var helper = event.getExistingFileHelper(); + new MGDamageTypes(out, pvd, helper).generate(server, gen); + gen.addProvider(event.includeServer(), new MGConfigGen(gen)); CompatManager.gatherData(event); - event.getGenerator().addProvider(event.includeServer(), new SlotGen(event.getGenerator())); - if (ModList.get().isLoaded(L2Complements.MODID)){ + gen.addProvider(event.includeServer(), new SlotGen(gen)); + gen.addProvider(event.includeServer(), new MGGLMGen(gen.getPackOutput(), MODID)); + if (ModList.get().isLoaded(L2Complements.MODID)) { REGISTRATE.addDataGenerator(TagGen.EFF_TAGS, MGTagGen::onEffTagGen); } } @@ -115,4 +148,8 @@ public static void sendMessage(final InterModEnqueueEvent event) { } + public static ResourceLocation loc(String id) { + return new ResourceLocation(MODID, id); + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/MGConfig.java b/src/main/java/dev/xkmc/modulargolems/init/data/MGConfig.java index b1294cd07..95090e4ed 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/MGConfig.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/MGConfig.java @@ -10,7 +10,13 @@ public class MGConfig { public static class Client { + public final ForgeConfigSpec.BooleanValue shieldUsePoseFixForModdedShields; + Client(ForgeConfigSpec.Builder builder) { + shieldUsePoseFixForModdedShields = builder + .comment("Replace isUsingItem with isBlocking for modded shield model predicate") + .comment("Fix shield rendering on humanoid golem but may break stuff") + .define("shieldUsePoseFixForModdedShields", false); } } @@ -18,7 +24,7 @@ public static class Client { public static class Common { public final ForgeConfigSpec.DoubleValue thorn; - public final ForgeConfigSpec.DoubleValue fiery; + public final ForgeConfigSpec.DoubleValue fieryDamageFactor; public final ForgeConfigSpec.DoubleValue magicResistance; public final ForgeConfigSpec.DoubleValue explosionResistance; public final ForgeConfigSpec.DoubleValue compatTFHealing; @@ -53,15 +59,27 @@ public static class Common { public final ForgeConfigSpec.DoubleValue targetDamageBonus; public final ForgeConfigSpec.IntValue basePickupRange; public final ForgeConfigSpec.IntValue mendingXpCost; + public final ForgeConfigSpec.DoubleValue armorBypassChance; + public final ForgeConfigSpec.DoubleValue slicingDropUpgradeChance; + public final ForgeConfigSpec.DoubleValue beaconCannonDamageFactor; + public final ForgeConfigSpec.DoubleValue sonicCannonDamageFactor; + public final ForgeConfigSpec.DoubleValue sonicCannonResonanceBonus; + public final ForgeConfigSpec.DoubleValue mechanicalArmSpeed; + public final ForgeConfigSpec.DoubleValue mechanicalArmPowerBonus; + public final ForgeConfigSpec.DoubleValue mechanicalArmMiscBonusFactor; public final ForgeConfigSpec.IntValue summonDistance; public final ForgeConfigSpec.IntValue retrieveDistance; public final ForgeConfigSpec.IntValue retrieveRange; public final ForgeConfigSpec.BooleanValue ownerPickupOnly; + public final ForgeConfigSpec.BooleanValue allowEditCuriosForOthers; public final ForgeConfigSpec.DoubleValue startFollowRadius; public final ForgeConfigSpec.DoubleValue stopWanderRadius; public final ForgeConfigSpec.DoubleValue maxWanderRadius; public final ForgeConfigSpec.DoubleValue riddenSpeedFactor; + public final ForgeConfigSpec.BooleanValue sendForceRemovalMessage; + public final ForgeConfigSpec.DoubleValue golemSoundVolumeFactor; + public final ForgeConfigSpec.DoubleValue hostileGolemSoundVolumeFactor; public final ForgeConfigSpec.IntValue targetResetTime; public final ForgeConfigSpec.DoubleValue targetResetNoMovementRange; @@ -70,42 +88,115 @@ public static class Common { public final ForgeConfigSpec.IntValue humanoidGolemSlot; public final ForgeConfigSpec.IntValue largeGolemSlot; public final ForgeConfigSpec.BooleanValue doEnemyAggro; + public final ForgeConfigSpec.BooleanValue allowDimensionChange; + + public final ForgeConfigSpec.DoubleValue candyDamage; + public final ForgeConfigSpec.IntValue caramelDuration; + public final ForgeConfigSpec.DoubleValue polarizeRange; + public final ForgeConfigSpec.DoubleValue polarizeDamage; + public final ForgeConfigSpec.DoubleValue polarizeForce; + public final ForgeConfigSpec.DoubleValue reformationAbsorption; + public final ForgeConfigSpec.DoubleValue reformationHealing; + public final ForgeConfigSpec.IntValue reformationMax; + public final ForgeConfigSpec.IntValue radiationDuration; + public final ForgeConfigSpec.DoubleValue radiationDamage; + public final ForgeConfigSpec.DoubleValue atomicHeal; + public final ForgeConfigSpec.IntValue atomicDuration; + + public final ForgeConfigSpec.DoubleValue hauntedBaseChance; + public final ForgeConfigSpec.IntValue soulHealingRate; + public final ForgeConfigSpec.IntValue soulHealingCost; + public final ForgeConfigSpec.DoubleValue soulHealingThreshold; + public final ForgeConfigSpec.DoubleValue soulHealingArmorBonus; + public final ForgeConfigSpec.BooleanValue bossBreakShield; + + public final ForgeConfigSpec.DoubleValue ignitiumHealRate; + public final ForgeConfigSpec.DoubleValue ignisSkillDamageFactor; + public final ForgeConfigSpec.DoubleValue fireballArmorBonus; + public final ForgeConfigSpec.DoubleValue flameStrikeArmorBonus; + public final ForgeConfigSpec.DoubleValue laserArmorBonus; + public final ForgeConfigSpec.DoubleValue missileArmorBonus; + public final ForgeConfigSpec.DoubleValue earthquakeArmorBonus; + public final ForgeConfigSpec.DoubleValue sandCurseBonus; + public final ForgeConfigSpec.IntValue maledictusReviveCD; + public final ForgeConfigSpec.IntValue maledictusReviveCDPartReduction; + public final ForgeConfigSpec.DoubleValue maledictusRevivePHP; + public final ForgeConfigSpec.DoubleValue maledictusRevivePHPPartBonus; + + public final ForgeConfigSpec.BooleanValue wandBypassConfig; + + public final ForgeConfigSpec.DoubleValue dungeonMeleeHealFactor; + public final ForgeConfigSpec.DoubleValue dungeonLinkHealFactor; + public final ForgeConfigSpec.IntValue obsidianDamageReduction; + public final ForgeConfigSpec.DoubleValue primitiveHealthRatio; + public final ForgeConfigSpec.DoubleValue primitiveDamageMultiplier; + public final ForgeConfigSpec.IntValue resonanceAttackCooldown; + public final ForgeConfigSpec.DoubleValue resonanceAttackDamageFactor; + public final ForgeConfigSpec.IntValue resonanceAttackRange; + public final ForgeConfigSpec.DoubleValue resonanceHealFactor; + public final ForgeConfigSpec.IntValue resonanceHealRange; + public final ForgeConfigSpec.IntValue ethertiteRepairDelay; Common(ForgeConfigSpec.Builder builder) { - barehandRetrieve = builder.comment("Allow players to retrieve the golems by bare hand") - .define("barehandRetrieve", true); - doEnemyAggro = builder.comment("Make mobs aggro to iron golem automatically aggro to modular golems") - .define("doEnemyAggro", true); - summonDistance = builder.comment("Max distance to summon single golem") - .defineInRange("summonDistance", 64, 1, 1000); - retrieveDistance = builder.comment("Max distance to retrieve single golem") - .defineInRange("retrieveDistance", 64, 1, 1000); - retrieveRange = builder.comment("Max distance to retrieve all golems") - .defineInRange("retrieveRange", 20, 1, 1000); - ownerPickupOnly = builder.comment("Only owner can pickup") - .define("ownerPickupOnly", true); - strictInteract = builder.comment("When enabled, the following features will be disabled when player holds item in hand:") - .comment("- give item to golem or take items from golem by right click").comment("- order dog golem to seat") - .define("strictInteract", false); - startFollowRadius = builder.comment("Max golem activity radius before following player in follow mode") - .defineInRange("startFollowRadius", 10d, 1, 100); - stopWanderRadius = builder.comment("Max golem activity radius before willing to go back to origin in wander mode") - .defineInRange("stopWanderRadius", 20d, 1, 100); - maxWanderRadius = builder.comment("Max golem activity radius before being teleported back") - .defineInRange("maxWanderRadius", 30d, 1, 100); - riddenSpeedFactor = builder.comment("Speed factor for dog golem when ridden by entities") - .defineInRange("riddenSpeedFactor", 0.8, 0, 2); - targetResetTime = builder.comment("Target reset time after no movement, in ticks") - .defineInRange("targetResetTime", 600, 1, 10000); - targetResetNoMovementRange = builder.comment("Distance considered as no movement") - .defineInRange("targetResetNoMovementRange", 0.5, 0, 10); - - largeGolemSlot = builder.comment("Default slots for large golem") - .defineInRange("largeGolemSlot", 4, 0, 100); - humanoidGolemSlot = builder.comment("Default slots for humanoid golem") - .defineInRange("humanoidGolemSlot", 3, 0, 100); - dogGolemSlot = builder.comment("Default slots for dog golem") - .defineInRange("dogGolemSlot", 2, 0, 100); + { + barehandRetrieve = builder.comment("Allow players to retrieve the golems by bare hand") + .define("barehandRetrieve", true); + doEnemyAggro = builder.comment("Make mobs aggro to iron golem automatically aggro to modular golems") + .define("doEnemyAggro", true); + allowDimensionChange = builder.comment("Allow golems to enter portal") + .define("allowDimensionChange", false); + summonDistance = builder.comment("Max distance to summon single golem") + .defineInRange("summonDistance", 64, 1, 1000); + retrieveDistance = builder.comment("Max distance to retrieve single golem") + .defineInRange("retrieveDistance", 64, 1, 1000); + retrieveRange = builder.comment("Max distance to retrieve all golems") + .defineInRange("retrieveRange", 20, 1, 1000); + ownerPickupOnly = builder.comment("Only owner can pickup") + .define("ownerPickupOnly", true); + strictInteract = builder.comment("When enabled, the following features will be disabled when player holds item in hand:") + .comment("- give item to golem or take items from golem by right click").comment("- order dog golem to seat") + .define("strictInteract", false); + wandBypassConfig = builder.comment("Wand interaction bypass config lock") + .define("wandBypassConfig", false); + allowEditCuriosForOthers = builder.comment("Allow command wand to edit curios of other mobs you own") + .define("allowEditCuriosForOthers", true); + startFollowRadius = builder.comment("Max golem activity radius before following player in follow mode") + .defineInRange("startFollowRadius", 10d, 1, 100); + stopWanderRadius = builder.comment("Max golem activity radius before willing to go back to origin in wander mode") + .defineInRange("stopWanderRadius", 20d, 1, 100); + maxWanderRadius = builder.comment("Max golem activity radius before being teleported back") + .defineInRange("maxWanderRadius", 30d, 1, 100); + riddenSpeedFactor = builder.comment("Speed factor for dog golem when ridden by entities") + .defineInRange("riddenSpeedFactor", 0.8, 0, 2); + targetResetTime = builder.comment("Target reset time after no movement, in ticks") + .defineInRange("targetResetTime", 600, 1, 10000); + targetResetNoMovementRange = builder.comment("Distance considered as no movement") + .defineInRange("targetResetNoMovementRange", 0.5, 0, 10); + sendForceRemovalMessage = builder.comment("Send force removal message") + .define("sendForceRemovalMessage", true); + bossBreakShield = builder.comment("All blockable boss attacks will be able to break shields") + .define("bossBreakShield", true); + slicingDropUpgradeChance = builder.comment("Chance for each upgrade to drop when killed by Slicing Axe") + .defineInRange("slicingDropUpgradeChance", 0.5, 0, 1); + beaconCannonDamageFactor = builder.comment("Damage of Beacon Cannon as percentage of golem melee damage") + .defineInRange("beaconCannonDamageFactor", 0.5, 0, 1); + sonicCannonDamageFactor = builder.comment("Damage of Sonic Cannon as percentage of golem melee damage") + .defineInRange("sonicCannonDamageFactor", 0.25, 0, 1); + sonicCannonResonanceBonus = builder.comment("Bonus damage of Sonic Cannon per sculk part, as percentage of golem melee damage") + .defineInRange("sonicCannonResonanceBonus", 0.1, 0, 1); + + + largeGolemSlot = builder.comment("Default slots for large golem") + .defineInRange("largeGolemSlot", 4, 0, 100); + humanoidGolemSlot = builder.comment("Default slots for humanoid golem") + .defineInRange("humanoidGolemSlot", 3, 0, 100); + dogGolemSlot = builder.comment("Default slots for dog golem") + .defineInRange("dogGolemSlot", 2, 0, 100); + golemSoundVolumeFactor = builder.comment("Player golem sound factor") + .defineInRange("golemSoundVolumeFactor", 1d, 0, 2); + hostileGolemSoundVolumeFactor = builder.comment("Hostile golem sound factor") + .defineInRange("hostileGolemSoundVolumeFactor", 1d, 0, 2); + } // modifiers { @@ -121,13 +212,15 @@ public static class Common { .defineInRange("damageCap", 0.1d, 0, 1); thunderHeal = builder.comment("Healing when thunder immune golems are striked") .defineInRange("thunderHeal", 10, 1, 10000); + armorBypassChance = builder.comment("Armor Penetration modifier: chance for damage to bypass armor per level") + .defineInRange("armorBypassChance", 0.2, 0, 1); } builder.pop(); builder.push("twilight forest compat"); { - fiery = builder.comment("Percentage damage addition per level of fiery") - .defineInRange("fiery", 0.5, 0, 100); + fieryDamageFactor = builder.comment("Percentage damage addition per level of fiery") + .defineInRange("fieryDamageFactor", 0.25, 0, 100); compatTFHealing = builder.comment("Percentage healing bonus per level of twilight healing") .defineInRange("compatTFHealing", 0.5, 0, 100); compatTFDamage = builder.comment("Percentage damage bonus per level of twilight damage") @@ -161,14 +254,28 @@ public static class Common { builder.pop(); builder.push("create compat"); - coating = builder.comment("Damage absorbed per level of coating") - .defineInRange("coating", 1d, 0, 10000); - mechSpeed = builder.comment("Speed boost per level of Mechanical Mobility") - .defineInRange("mechSpeed", 0.2, 0, 1); - mechAttack = builder.comment("Attack boost per level of Mechanical Force") - .defineInRange("mechAttack", 0.2, 0, 1); - mechMaxFuel = builder.comment("Maximum number of fuel item that can be added at the same time") - .defineInRange("mechMaxFuel", 3, 1, 364); + { + coating = builder.comment("Damage absorbed per level of coating") + .defineInRange("coating", 1d, 0, 10000); + mechSpeed = builder.comment("Speed boost per level of Mechanical Mobility") + .defineInRange("mechSpeed", 0.2, 0, 1); + mechAttack = builder.comment("Attack boost per level of Mechanical Force") + .defineInRange("mechAttack", 0.2, 0, 1); + mechMaxFuel = builder.comment("Maximum number of fuel item that can be added at the same time") + .defineInRange("mechMaxFuel", 3, 1, 364); + mechanicalArmSpeed = builder.comment("Mechanical Arm: default movement speed") + .comment("Animation at speed of 1 is 5 seconds. At speed of 0.5, it takes the arm 10 seconds to perform a fix.") + .defineInRange("mechanicalArmSpeed", 0.5, 0.1, 4); + mechanicalArmPowerBonus = builder.comment("Mechanical Arm: bonus speed when golem is fueled up") + .comment("At default speed of 0.5 and bonus of 1, golems fix itself 3 times faster when powered.") + .defineInRange("mechanicalArmPowerBonus", 1d, 0, 4); + mechanicalArmMiscBonusFactor = builder.comment("Mechanical Arm: bonus speed factor for other create golem effects") + .comment("- Mechanical Engine Modifier: +0.2, making Create golem fix itself faster than other golems even when unpowered.") + .comment("- Mechanical Mobility Effect: +0.2 per level, effectively another power bonus") + .comment("- Mechanical Force Effect: +0.1 per level, effectively another power bonus") + .comment("This config value puts a factor on above bonuses.") + .defineInRange("mechanicalArmMiscBonusFactor", 1d, 0, 10); + } builder.pop(); builder.push("l2complements compat"); @@ -199,6 +306,107 @@ public static class Common { .defineInRange("mendingXpCost", 2, 1, 10000); } builder.pop(); + + builder.push("alexscaves compat"); + { + candyDamage = builder.comment("Gum ball damage") + .defineInRange("candyDamage", 4d, 1, 100); + caramelDuration = builder.comment("Molten caramel duration in ticks") + .defineInRange("caramelDuration", 200, 1, 10000); + polarizeRange = builder.comment("Polarize modifier pull/push base radius") + .defineInRange("polarizeRange", 5d, 1, 40); + polarizeDamage = builder.comment("Polarize modifier base damage") + .defineInRange("polarizeDamage", 2d, 0, 100); + polarizeForce = builder.comment("Polarize modifier pull/push force") + .defineInRange("polarizeForce", 0.1d, 0, 1); + reformationAbsorption = builder.comment("Reformation modifier absorption per iron ingot") + .defineInRange("reformationAbsorption", 10d, 1, 100); + reformationHealing = builder.comment("Reformation modifier healing per iron ingot") + .defineInRange("reformationHealing", 2d, 0, 100); + reformationMax = builder.comment("Reformation modifier max stacking per level") + .defineInRange("reformationMax", 2, 1, 10); + radiationDuration = builder.comment("Radiation modifier: duration of irradiated effect") + .defineInRange("radiationDuration", 200, 20, 20000); + radiationDamage = builder.comment("Radiation modifier: damage boost per irradiated level") + .defineInRange("radiationDamage", 0.2, 0, 1); + atomicHeal = builder.comment("Atomic Fueling modifier: percent healing per uranium nugget per level") + .defineInRange("atomicHeal", 0.1, 0, 1); + atomicDuration = builder.comment("Atomic Fueling modifier: boost duration per uranium nugget used") + .defineInRange("atomicDuration", 200, 20, 20000); + + } + builder.pop(); + + builder.push("goety compat"); + { + hauntedBaseChance = builder.comment("Chance per armor per modifier level to summon haunted armor servant") + .defineInRange("hauntedBaseChance", 0, 0.05, 1); + soulHealingCost = builder.comment("Soul Repair modifier healing soul cost as multiple of item repair soul cost") + .defineInRange("soulHealingCost", 2, 1, 100); + soulHealingRate = builder.comment("Soul Repair modifier healing rate per second") + .defineInRange("soulHealingRate", 2, 1, 100); + soulHealingThreshold = builder.comment("Soul Repair modifier healing only when golem health is below this percentage") + .defineInRange("soulHealingThreshold", 0.75, 0, 1); + soulHealingArmorBonus = builder.comment("Soul Repair bonus on armor items") + .defineInRange("soulHealingArmorBonus", 0.5, 0, 10); + } + builder.pop(); + + builder.push("cataclysm compat"); + { + ignitiumHealRate = builder.comment("Heal rate as percentage of damage dealt per level of blazing brand") + .defineInRange("ignitiumHealRate", 0.1d, 0, 10); + ignisSkillDamageFactor = builder.comment("Ignitium golem skill damage factor") + .defineInRange("ignisSkillDamageFactor", 0.5d, 0, 1); + fireballArmorBonus = builder.comment("Ignis Helmet Bonus: Fireball damage boost") + .defineInRange("fireballArmorBonus", 0.5, 0, 10); + flameStrikeArmorBonus = builder.comment("Ignis Shinguard Bonus: Flame Strike damage boost") + .defineInRange("flameStrikeArmorBonus", 0.5, 0, 10); + laserArmorBonus = builder.comment("Harbinger Helmet Bonus: Death Laser damage boost") + .defineInRange("laserArmorBonus", 1d, 0, 10); + missileArmorBonus = builder.comment("Harbinger Chestplate Bonus: Homing Missile damage boost") + .defineInRange("missileArmorBonus", 1d, 0, 10); + earthquakeArmorBonus = builder.comment("Monstrosity Armor Bonus: Monstrosity Earthquake Modifier damage boost") + .defineInRange("earthquakeArmorBonus", 0.5d, 0, 10); + sandCurseBonus = builder.comment("Sandstorm Upgrade damage bonus per level") + .defineInRange("sandCurseBonus", 0.1d, 0, 10); + maledictusReviveCD = builder.comment("Cursium Golem Chestplate: Revive Cooldown") + .defineInRange("maledictusReviveCD", 360, 10, 10000); + maledictusReviveCDPartReduction = builder.comment("Cursium Golem Chestplate: Cursium Part/Armor reduction on revive cooldown") + .defineInRange("maledictusReviveCDPartReduction", 30, 10, 10000); + maledictusRevivePHP = builder.comment("Cursium Golem Chestplate: Revived health percentage") + .defineInRange("maledictusRevivePHP", 0.25, 0.01, 1); + maledictusRevivePHPPartBonus = builder.comment("Cursium Golem Chestplate: Cursium Part/Armor bonus on revived health") + .defineInRange("maledictusRevivePHPPartBonus", 0.125, 0, 1); + } + builder.pop(); + + builder.push("composite material compat"); + { + dungeonMeleeHealFactor = builder.comment("Dungeon Absorption: lifesteal ratio for melee damage.") + .defineInRange("dungeonMeleeHealFactor", 0.25, 0, 2); + dungeonLinkHealFactor = builder.comment("Dungeon Link: lifesteal ratio for melee damage.") + .defineInRange("dungeonLinkHealFactor", 0.2, 0, 1); + obsidianDamageReduction = builder.comment("Obsidian: damage reduced.") + .defineInRange("obsidianDamageReduction", 1, 0, 100); + primitiveHealthRatio = builder.comment("Primitive Blast: health ratio") + .defineInRange("primitiveHealthRatio", 0.05, 0, 1); + primitiveDamageMultiplier = builder.comment("Primitive Curse: damage multiplier") + .defineInRange("primitiveDamageMultiplier", 0.8, 0, 1); + resonanceAttackCooldown = builder.comment("Resonant Attack: Cooldown") + .defineInRange("resonanceAttackCooldown", 20, 1, 1000); + resonanceAttackDamageFactor = builder.comment("Resonant Attack: damage factor") + .defineInRange("resonanceAttackDamageFactor", 0.1, 0, 1); + resonanceAttackRange = builder.comment("Resonant Attack: chain range") + .defineInRange("resonanceAttackRange", 8, 0, 64); + resonanceHealFactor = builder.comment("Resonant Heal: healing ratio") + .defineInRange("resonanceHealFactor", 0.25, 0, 5); + resonanceHealRange = builder.comment("Resonant Heal: chain range") + .defineInRange("resonanceHealRange", 32, 0, 64); + ethertiteRepairDelay = builder.comment("Etherite Plating: repair delay") + .defineInRange("ethertiteRepairDelay", 600, 20, 1000); + } + builder.pop(); } } diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/MGConfigGen.java b/src/main/java/dev/xkmc/modulargolems/init/data/MGConfigGen.java index de7d809f0..2c0237595 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/MGConfigGen.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/MGConfigGen.java @@ -140,9 +140,9 @@ public void add(Collector map) { .end() .addEntity(GolemTypes.TYPE_DOG.get()) - .addFilter(GolemTypes.STAT_HEALTH.get(), 0.2) + .addFilter(GolemTypes.STAT_HEALTH.get(), 0.8) .addFilter(GolemTypes.STAT_ATTACK.get(), 0.6) - .addFilter(GolemTypes.STAT_REGEN.get(), 0.2) + .addFilter(GolemTypes.STAT_REGEN.get(), 1) .addFilter(GolemTypes.STAT_SWEEP.get(), 0) .end() ); diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/MGDamageTypes.java b/src/main/java/dev/xkmc/modulargolems/init/data/MGDamageTypes.java new file mode 100644 index 000000000..a5b5baf08 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/data/MGDamageTypes.java @@ -0,0 +1,35 @@ +package dev.xkmc.modulargolems.init.data; + +import dev.xkmc.l2damagetracker.init.data.DamageTypeAndTagsGen; +import dev.xkmc.l2damagetracker.init.data.L2DamageTypes; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageType; +import net.minecraftforge.common.data.ExistingFileHelper; + +import java.util.concurrent.CompletableFuture; + +public class MGDamageTypes extends DamageTypeAndTagsGen { + + public static final ResourceKey BEACON = createDamage("bacon_attack"); + public static final ResourceKey ECHO = createDamage("echo_attack"); + + public MGDamageTypes(PackOutput output, CompletableFuture pvd, ExistingFileHelper helper) { + super(output, pvd, helper, ModularGolems.MODID); + new DamageTypeHolder(BEACON, new DamageType("magic", 0.1f)) + .add(L2DamageTypes.MAGIC, DamageTypeTags.BYPASSES_COOLDOWN, DamageTypeTags.BYPASSES_ARMOR); + + new DamageTypeHolder(ECHO, new DamageType("sonic_boom", 0.1f)) + .add(L2DamageTypes.MAGIC, DamageTypeTags.BYPASSES_COOLDOWN, DamageTypeTags.BYPASSES_ARMOR) + .add(L2DamageTypes.BYPASS_MAGIC); + } + + private static ResourceKey createDamage(String id) { + return ResourceKey.create(Registries.DAMAGE_TYPE, ModularGolems.loc(id)); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/MGLangData.java b/src/main/java/dev/xkmc/modulargolems/init/data/MGLangData.java index 92eddc62c..1b52ac8ea 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/MGLangData.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/MGLangData.java @@ -4,7 +4,7 @@ import dev.xkmc.modulargolems.compat.materials.common.CompatManager; import dev.xkmc.modulargolems.compat.misc.PatchouliLang; import dev.xkmc.modulargolems.content.entity.dog.DogGolemPartType; -import dev.xkmc.modulargolems.content.entity.humanoid.HumaniodGolemPartType; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemPartType; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; import dev.xkmc.modulargolems.init.ModularGolems; import net.minecraft.ChatFormatting; @@ -22,6 +22,41 @@ public enum MGLangData { POTION_DEFENSE("tooltip.potion_defense", "Golem gain %s.", 1, ChatFormatting.GREEN), GOLEM_EQUIPMENT("tooltip.golem_equipment", "Only effective on %s", 1, ChatFormatting.LIGHT_PURPLE), UPGRADE_COUNT("tooltip.modifier", "Total %s modifiers from %s upgrades", 2, ChatFormatting.LIGHT_PURPLE), + MELTDOWN("tooltip.meltdown", "Meltdown: %s", 1, ChatFormatting.RED), + CRAFT_MAT("tooltip.craft_material", "Golem crafting material", 0, ChatFormatting.GRAY), + REPAIR_MAT("tooltip.repair_material", "Golem repair material", 0, ChatFormatting.GRAY), + SHIELD_BREAK("tooltip.shield_break", "Shield Breaker", 0, ChatFormatting.GRAY), + SLICING_GOLEM("tooltip.slicing_golem", "When metal golem kill golems of other players with this axe, drop all parts and each upgrade has %s chance to drop", 1, ChatFormatting.GRAY), + SLICING_ENEMY("tooltip.slicing_enemy", "When metal golem kill certain enemies with this axe, drop one random metal golem part", 0, ChatFormatting.GRAY), + BEACON_BOOTS("tooltip.beacon_boots", "Heal and apply %s, %s to all nearby allies.", 2, ChatFormatting.GRAY), + BOW_STIFFNESS("tooltip.bow_stiffness", "Bow Stiffness: %s", 1, ChatFormatting.GRAY), + BOW_PIERCE("tooltip.bow_pierce", "Arrow pierces %s targets", 1, ChatFormatting.GRAY), + MULTI_SHOT("tooltip.multi_shot", "Shoots %s targets at once", 1, ChatFormatting.GRAY), + SHOULDER_WEAPON("tooltip.shoulder_weapon", "Mounts on Metal Golem Shoulders", 0, ChatFormatting.YELLOW), + BEACON_CANNON("tooltip.beacon_cannon", "Shoots beacon beam to inflict magic damage", 0, ChatFormatting.GRAY), + SONIC_CANNON("tooltip.sonic_cannon", "Shoots 3 sonic booms to inflict abyss echo damage", 0, ChatFormatting.GRAY), + SONIC_CANNON_RESONANCE("tooltip.sonic_cannon_resonance", "Stronger when paired with Sculk golem material", 0, ChatFormatting.GRAY), + MECHANICAL_ARM("tooltip.mechanical_arm", "Repairs golem with materials automatically. Can be powered by Mechanical Engine modifier.", 0, ChatFormatting.GRAY), + FLAMETHROWER("tooltip.flamethrower", "Has 3 forms of attack depending on available ammunition:", 0, ChatFormatting.GRAY), + FLAMETHROWER_TNT("tooltip.flamethrower_tnt", "- Launches TNT toward target.", 0, ChatFormatting.GRAY), + FLAMETHROWER_FIRECHARGE("tooltip.flamethrower_firecharge", "- Shoots fire charge that causes explosion.", 0, ChatFormatting.GRAY), + FLAMETHROWER_FLAME("tooltip.flamethrower_flame", "- Consumes blaze powder to shoot 16 blaze flames. Supports Infinity enchantment.", 0, ChatFormatting.GRAY), + + HARBINGER_BOOST_LASER("tooltip.cataclysm.harbinger_armor_laer", "+%s Death Laser Damage", 1, ChatFormatting.GRAY), + HARBINGER_BOOST_MISSILE("tooltip.cataclysm.harbinger_armor_missile", "+%s Homing Missile Damage", 1, ChatFormatting.GRAY), + MONSTROSITY_BOOST("tooltip.cataclysm.monstrosity_armor", "+%s Monstrosity Earthquake Damage", 1, ChatFormatting.GRAY), + IGNIS_BOOST_FIREBALL("tooltip.cataclysm.ignis_armor_fireball", "+%s Fireball Damage", 1, ChatFormatting.GRAY), + IGNIS_BOOST_STRIKE("tooltip.cataclysm.ignis_armor_strike", "+%s Flame Strike Damage", 1, ChatFormatting.GRAY), + IGNIS_BOOST_SOUL("tooltip.cataclysm.ignis_armor_soul", "Permanent Soul Form", 0, ChatFormatting.GRAY), + MALEDICTUS_BYPASS_CD("tooltip.cataclysm.maledictus_bypass_cd", "Phantom Halberd spawned from Jump Attack will bypass enemy invulnerable frames", 0, ChatFormatting.GRAY), + MALEDICTUS_FAST_SKILL("tooltip.cataclysm.maledictus_fast_skill", "Halves Phantom Halberd Jump Attack cooldown.", 0, ChatFormatting.GRAY), + MALEDICTUS_REVIVE("tooltip.cataclysm.maledictus_revive", "Revive Golem at %s%% HP on fatal hit, with cool down of %s seconds", 2, ChatFormatting.GRAY), + MALEDICTUS_REVIVE_CD("tooltip.cataclysm.maledictus_revive_cd", " Each piece of other cursium armor or part reduce cooldown by %s seconds and increase revived HP by %s%%.", 2, ChatFormatting.GRAY), + MALEDICTUS_REVIVE_ACTUAL_CD("tooltip.cataclysm.maledictus_revive_actual_cd", "Actual Cooldown: %s seconds.", 1, ChatFormatting.GRAY), + MALEDICTUS_REVIVE_IN_CD("tooltip.cataclysm.maledictus_revive_in_cd", "On Cooldown: %s seconds remaining.", 1, ChatFormatting.GRAY), + APOCALYPTIUM_ARMOR("tooltip.revelation.soul_boost", "+%s%% Soul Repair Efficiency", 1, ChatFormatting.GRAY), + APOCALYPTIUM_SWORD("tooltip.revelation.soul_reap", "Deal true damage. Gain soul on dealing damage", 0, ChatFormatting.GRAY), + APOCALYPTIUM_DASH("tooltip.revelation.dash", "Golem can charge against target to perform dash attack", 0, ChatFormatting.GRAY), TARGET_UUID_ADD("tooltip.target.uuid_add", "Right click entity to add entity UUID to the list", 0, ChatFormatting.GRAY), TARGET_UUID_REMOVE("tooltip.target.uuid_remove", "Sneak right click entity to remove entity UUID from the list", 0, ChatFormatting.GRAY), @@ -50,8 +85,8 @@ public enum MGLangData { WAND_MODE("wand.mode", "Current Mode: %s", 1, ChatFormatting.GOLD), WAND_RIGHT("wand.right_click", "On right click:", 0, ChatFormatting.YELLOW), WAND_SHIFT("wand.shift_click", "On sneak right click:", 0, ChatFormatting.YELLOW), - WAND_RETRIEVE_RIGHT("wand.retrieve_right", "Retrieve all your surrounding golems.", 0, ChatFormatting.GRAY), - WAND_RETRIEVE_SHIFT("wand.retrieve_shift", "Target a faraway golem to retrieve it.", 0, ChatFormatting.GRAY), + WAND_RETRIEVE_RIGHT("wand.retrieve_right", "Target a faraway golem to retrieve it.", 0, ChatFormatting.GRAY), + WAND_RETRIEVE_SHIFT("wand.retrieve_shift", "Retrieve all your surrounding golems.", 0, ChatFormatting.GRAY), WAND_COMMAND_RIGHT("wand.command_right", "Target a golem to switch modes. Target entity to command nearby golems to attack it.", 0, ChatFormatting.GRAY), WAND_COMMAND_SHIFT("wand.command_shift", "Click golem to configure inventory and view stats.", 0, ChatFormatting.GRAY), WAND_SUMMON_RIGHT("wand.summon_right", "Summon one golem to a faraway position pointed by the wand.", 0, ChatFormatting.GRAY), @@ -61,9 +96,12 @@ public enum MGLangData { CONFIG_CARD("wand.config", "Right click golem to set config. Right click again to remove. When in offhand, wands would only target golems having this config.", 0, ChatFormatting.GRAY), CONFIG_INIT("wand.config_init", "Right click to initialize config", 0, ChatFormatting.GRAY), CONFIG_OTHER("wand.config_other", "Not your card. You cannot edit it", 0, ChatFormatting.RED), - PATH("wand.path_record", "Right click block to add to path, right click again to remove. Path forms a cycle.", 0, ChatFormatting.GRAY), + PATH("wand.path_record", "Right click block to add to path, right click again to remove. Shift right click to clear. Path forms a cycle.", 0, ChatFormatting.GRAY), PATH_ADD("wand.add_node", "Added node to path", 0, null), PATH_REMOVE("wand.remove_node", "Removed node from path", 0, null), + PATH_CLEAR("wand.clear_node", "Removed all nodes from path", 0, null), + PATH_ERR_DIM("wand.err_dim", "You cannot add nodes across dimension", 0, ChatFormatting.RED), + PATH_ERR_DIST("wand.err_dist", "You cannot add nodes more than 16 blocks apart", 0, ChatFormatting.RED), PATH_COUNT("wand.node_count", "Path has %s nodes", 1, ChatFormatting.GRAY), DESTROY_ITEM("msg.destroy_item", "Golem %s destroyed %s items because it finds no place to store.", 2, ChatFormatting.RED), @@ -79,7 +117,9 @@ public enum MGLangData { SLOT_OFF("slot.off", "Off Hand Slot", 0, ChatFormatting.YELLOW), SLOT_BACKUP("slot.backup", "Secondary Weapon Slot", 0, ChatFormatting.YELLOW), SLOT_ARROW("slot.arrow", "Arrow Slot", 0, ChatFormatting.YELLOW), - SLOT_MAIN_DESC("slot.main_desc", "Place weapons here. Accepts anything.", 0, ChatFormatting.GRAY), + SLOT_SHOULDER("slot.shoulder", "Shoulder Equipment Slot", 0, ChatFormatting.YELLOW), + SLOT_MAIN_DESC("slot.main_desc", "Place weapon here. Accepts anything.", 0, ChatFormatting.GRAY), + SLOT_MAIN_DESC_METAL("slot.main_desc_metal", "Place metal golem weapon here.", 0, ChatFormatting.GRAY), SLOT_BACKUP_DESC("slot.backup_desc", "Place secondary weapons here.", 0, ChatFormatting.GRAY), SLOT_BACKUP_INFO("slot.backup_info", "If you have bow and sword, one in main hand and one in backup slot, your golem can switch between them depending on distance to enemies.", 0, ChatFormatting.GRAY), SLOT_ARROW_DESC("slot.arrow_desc", "Place arrows here to free up off hand for shields", 0, ChatFormatting.GRAY), @@ -109,9 +149,46 @@ public enum MGLangData { TAB_EQUIPMENT("tab.equipment", "Golem Equipments", 0, null), TAB_ATTRIBUTE("tab.attribute", "Golem Attributes", 0, null), - BOT_MANA("msg.botania_mana","Mana: %s/%s",2,null), - BOT_NO_RING("msg.botania_no_ring","No Band of Mana Equipped",0,null) + TAB_UPGRADES("tab.upgrades", "Golem Upgrades", 0, null), + TAB_DISINTEGRATE("tab.disintegrate", "Substitute & Disassemble", 0, null), + UI_NO_SLOT("tooltip.no_slot", "Removing this upgrade will result in insufficient slot", 0, ChatFormatting.RED), + UI_REMOVE_TEMPLATE("tooltip.remove_template", "Upgrade Template cannot be removed here", 0, ChatFormatting.RED), + UI_DISINTEGRATE("tooltip.disintegrate", "Disassemble the Golem", 0, null), + UI_RETURN_ITEMS("tooltip.return_items", "Returns the following items on disassembly:", 0, null), + UI_RETURN_MANY("tooltip.return_many", "Returns %s items on disassembly", 1, null), + UI_FIX_FIRST("tooltip.fix_first", "Fix the golem before disassembly!", 0, ChatFormatting.RED), + UI_SUB_SLOT("tooltip.sub_slot", "Insufficient slot on part replacement", 0, ChatFormatting.RED), + UI_SUB_INGOT("tooltip.sub_ingot", "On body replacement, each expansion template costs 1 body material. Requires:", 0, null), + UI_DIFF_STAT("tooltip.diff_stat", "Stat/Modifier Diff:", 0, null), + + TAB_ALIVE("tab.tracker_alive", "Golems in World", 0, null), + TAB_DEAD("tab.tracker_dead", "Golem Death Record", 0, null), + TAB_RETRIEVE("tab.tracker_retrieve", "Returned to Inventory", 0, null), + + BOT_MANA("msg.botania_mana", "Mana: %s/%s", 2, null), + BOT_NO_RING("msg.botania_no_ring", "No Band of Mana Equipped", 0, null), + TRACKER_PRESENT("tracker.present", "Loaded", 0, null), + TRACKER_TIME("tracker.time", "Unloaded", 0, null), + TRACKER_DIM("tracker.dim", "Dimension: %s", 1, null), + TRACKER_POS("tracker.pos", "Position: (%s,%s,%s)", 3, null), + TRACKER_ALIVE("tracker.alive", "Alive", 0, null), + TRACKER_RETRIEVED("tracker.retrieved", "Retrieved", 0, null), + TRACKER_RETRIEVED_OTHER("tracker.retrieved_other", "Retrieved by %s", 1, null), + TRACKER_KILLED("tracker.killed", "Killed by %s", 1, null), + TRACKER_RECYCLE_KILLED("tracker.recycle_killed", "Killed by %s (with recycle upgrade)", 1, null), + TRACKER_DIED("tracker.dead", "Dead", 0, null), + TRACKER_RECYCLE_DIED("tracker.recycle_dead", "Dead (with recycle upgrade)", 0, null), + TRACKER_INVENTORY("tracker.inventory", "To Inventory", 0, null), + TRACKER_ENDER("tracker.ender", "To Ender Backpack", 0, null), + TRACKER_DIMENSIONAL("tracker.dimensional", "To Dimensional Backpack", 0, null), + + MAID_SKIN_BUTTON("tooltip.maid_skin_button", "Change skin: Maid (Right-click to reset)", 0, null), + PLAYER_SKIN_BUTTON("tooltip.player_skin_button", "Change skin: Player/Texture (Right-click to reset)", 0, null), + PLAYER_SKIN_TITLE("gui.player_skin", "Player/Skin Texture", 0, null), + PLAYER_SKIN_CONFIRM("gui.player_skin.confirm", "Confirm", 0, null), + PLAYER_SKIN_CANCEL("gui.player_skin.cancel", "Cancel", 0, null), + PLAYER_SKIN_HINT("gui.player_skin.hint", "Enter player name or resource pack texture path", 0, null), ; private final String key, def; @@ -126,6 +203,10 @@ public enum MGLangData { this.format = format; } + public String key() { + return key; + } + public static String asId(String name) { return name.toLowerCase(Locale.ROOT); } @@ -152,6 +233,7 @@ public static void genLang(RegistrateLangProvider pvd) { pvd.add("attribute.name.golem_sweep", "Sweep Range"); pvd.add("attribute.name.golem_size", "Golem Size"); pvd.add("attribute.name.golem_jump", "Golem Jump Strength"); + pvd.add("attribute.name.dynamic_reduction", "Dynamic Reduction Time"); pvd.add("golem_material." + ModularGolems.MODID + ".copper", "Copper"); pvd.add("golem_material." + ModularGolems.MODID + ".iron", "Iron"); @@ -160,6 +242,15 @@ public static void genLang(RegistrateLangProvider pvd) { pvd.add("golem_material." + ModularGolems.MODID + ".sculk", "Sculk"); pvd.add("curios.identifier.golem_skin", "Humanoid Golem Skin"); + pvd.add("curios.identifier.golem_route", "Golem Patrol Path"); + + pvd.add("potion.potency.5", "VI"); + pvd.add("potion.potency.6", "VII"); + pvd.add("potion.potency.7", "VIII"); + pvd.add("potion.potency.8", "IX"); + pvd.add("potion.potency.9", "X"); + pvd.add("potion.potency.10", "XI"); + pvd.add("potion.potency.11", "XII"); CompatManager.dispatchGenLang(pvd); @@ -167,7 +258,7 @@ public static void genLang(RegistrateLangProvider pvd) { String name = type.name().toLowerCase(Locale.ROOT); pvd.add("golem_part.metal_golem." + name, RegistrateLangProvider.toEnglishName(name) + ": %s"); } - for (var type : HumaniodGolemPartType.values()) { + for (var type : HumanoidGolemPartType.values()) { String name = type.name().toLowerCase(Locale.ROOT); pvd.add("golem_part.humanoid_golem." + name, RegistrateLangProvider.toEnglishName(name) + ": %s"); } @@ -178,6 +269,17 @@ public static void genLang(RegistrateLangProvider pvd) { PatchouliLang.genLang(pvd); + pvd.add("task.modulargolems.summon_golems", "Golem Summoner"); + pvd.add("task.modulargolems.summon_golems.desc", "Maid will summon golems to attack surrounding hostile mobs"); + pvd.add("task.modulargolems.summon_golems.condition.has_golem_wand", "Hold Omnipotent Wand"); + + pvd.add("top." + ModularGolems.MODID + ".maid_model", "Maid Skin: %s"); + pvd.add("config.jade.plugin_" + ModularGolems.MODID + ".maid_model", "Maid Skin"); + + pvd.add("top." + ModularGolems.MODID + ".player_skin", "Player Skin: %s"); + pvd.add("top." + ModularGolems.MODID + ".file_skin", "File Skin: %s"); + pvd.add("config.jade.plugin_" + ModularGolems.MODID + ".player_skin", "Player/File Skin"); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/MGTagGen.java b/src/main/java/dev/xkmc/modulargolems/init/data/MGTagGen.java index 0fe407274..f2d028c19 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/MGTagGen.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/MGTagGen.java @@ -1,11 +1,19 @@ package dev.xkmc.modulargolems.init.data; +import com.github.L_Ender.cataclysm.Cataclysm; +import com.github.L_Ender.cataclysm.init.ModItems; import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import com.tterrag.registrate.providers.RegistrateItemTagsProvider; import com.tterrag.registrate.providers.RegistrateTagsProvider; +import dev.xkmc.l2itemselector.init.data.L2ISTagGen; +import dev.xkmc.l2weaponry.init.L2Weaponry; +import dev.xkmc.l2weaponry.init.materials.LWToolMats; +import dev.xkmc.l2weaponry.init.materials.LWToolTypes; +import dev.xkmc.l2weaponry.init.registrate.LWItems; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.registrate.GolemItems; import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import io.redspace.ironsspellbooks.IronsSpellbooks; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; @@ -35,9 +43,15 @@ public class MGTagGen { public static final TagKey CONFIG_CARD = createItemTag("config_card"); public static final TagKey SPECIAL_CRAFT = createItemTag("special_crafting_material"); public static final TagKey GOLEM_INTERACT = createItemTag("golem_interact"); + public static final TagKey GOLEM_OMNI_WAND = createItemTag("golem_omni_wand"); + public static final TagKey TOUGH_ITEM = createItemTag("tough_item"); public static final TagKey CURIO_SKIN = ItemTags.create(new ResourceLocation("curios", "golem_skin")); + public static final TagKey CURIO_PATH = ItemTags.create(new ResourceLocation("curios", "golem_route")); public static final TagKey PLAYER_SKIN = createItemTag("player_skin"); + public static final TagKey LARGE_GOLEM_WEAPONS = createItemTag("large_golem_weapons"); + public static final TagKey SHIELD_BREAKER_WEAPONS = createItemTag("shield_breaker_weapons"); public static final TagKey> GOLEM_FRIENDLY = createEntityTag("friendly"); + public static final TagKey> SHIELD_BREAKER = createEntityTag("shield_breaker"); public static final TagKey POTENTIAL_DST = createBlockTag("potential_destination"); public static final List> OPTIONAL_ITEM = new ArrayList<>(); @@ -57,6 +71,8 @@ public static void onEffTagGen(RegistrateTagsProvider.IntrinsicImpl p } public static void onItemTagGen(RegistrateItemTagsProvider pvd) { + pvd.addTag(L2ISTagGen.SELECTABLE).addTag(GOLEM_OMNI_WAND); + pvd.addTag(MGTagGen.GOLEM_INTERACT).addTag(GOLEM_OMNI_WAND); pvd.addTag(SCULK_MATS).add(Items.ECHO_SHARD); pvd.addTag(SPECIAL_CRAFT); pvd.addTag(GOLEM_INTERACT).addTag(CONFIG_CARD).addTag(GOLEM_HOLDERS); @@ -87,12 +103,47 @@ public static void onItemTagGen(RegistrateItemTagsProvider pvd) { if (ModList.get().isLoaded(TouhouLittleMaid.MOD_ID)) { skin.addOptional(new ResourceLocation(TouhouLittleMaid.MOD_ID, "garage_kit")); } + if (ModList.get().isLoaded(Cataclysm.MODID)) { + pvd.addTag(LARGE_GOLEM_WEAPONS) + .addOptional(ModItems.THE_ANNIHILATOR.getId()) + .addOptional(ModItems.THE_IMMOLATOR.getId()) + .addOptional(ModItems.THE_INCINERATOR.getId()) + .addOptional(ModItems.GAUNTLET_OF_GUARD.getId()) + .addOptional(ModItems.GAUNTLET_OF_BULWARK.getId()) + + .addOptional(ModItems.GAUNTLET_OF_MAELSTROM.getId()) + .addOptional(ModItems.SOUL_RENDER.getId()) + .addOptional(ModItems.MEAT_SHREDDER.getId()) + .addOptional(ModItems.INFERNAL_FORGE.getId()) + .addOptional(ModItems.VOID_FORGE.getId()) + .addOptional(ModItems.WITHER_ASSULT_SHOULDER_WEAPON.getId()) + .addOptional(ModItems.VOID_ASSULT_SHOULDER_WEAPON.getId()) + .addOptional(ModItems.ASTRAPE.getId()) + .addOptional(ModItems.CERAUNUS.getId()) + .addOptional(ModItems.BRONTES.getId()); + } + if (ModList.get().isLoaded(L2Weaponry.MODID)) { + var tag = pvd.addTag(LARGE_GOLEM_WEAPONS); + for (var e : LWToolTypes.values()) { + if (e == LWToolTypes.PLATE_SHIELD || e == LWToolTypes.ROUND_SHIELD || e == LWToolTypes.NUNCHAKU) + continue; + tag.addOptional(LWToolMats.ETERNIUM.getTool(e).builtInRegistryHolder().key().location()); + } + tag.addOptional(LWItems.CHEATER_CLAW.getId()).addOptional(LWItems.CHEATER_MACHETE.getId()); + } } public static void onEntityTagGen(RegistrateTagsProvider.IntrinsicImpl> pvd) { pvd.addTag(GOLEM_FRIENDLY).add(EntityType.PLAYER, EntityType.SNOW_GOLEM); pvd.addTag(EntityTypeTags.FALL_DAMAGE_IMMUNE).add(GolemTypes.ENTITY_GOLEM.get(), GolemTypes.ENTITY_HUMANOID.get(), GolemTypes.ENTITY_DOG.get()); + pvd.addTag(SHIELD_BREAKER).addTag(Tags.EntityTypes.BOSSES); + + pvd.addTag(TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(IronsSpellbooks.MODID, "cant_root"))) + .add(GolemTypes.ENTITY_GOLEM.get(), GolemTypes.ENTITY_HUMANOID.get(), GolemTypes.ENTITY_DOG.get()); + + pvd.addTag(TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath("carryon", "entity_blacklist"))) + .add(GolemTypes.ENTITY_GOLEM.get(), GolemTypes.ENTITY_HUMANOID.get(), GolemTypes.ENTITY_DOG.get()); } private static TagKey createItemTag(String id) { diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/RecipeGen.java b/src/main/java/dev/xkmc/modulargolems/init/data/RecipeGen.java index 6cd312e5f..b6c32d84a 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/RecipeGen.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/RecipeGen.java @@ -2,11 +2,22 @@ import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.util.DataIngredient; +import com.tterrag.registrate.util.entry.ItemEntry; +import dev.xkmc.golemdungeons.init.GolemDungeons; +import dev.xkmc.golemdungeons.init.reg.GDItems; +import dev.xkmc.l2complements.init.L2Complements; +import dev.xkmc.l2complements.init.registrate.LCItems; import dev.xkmc.l2library.serial.ingredients.EnchantmentIngredient; +import dev.xkmc.l2library.serial.recipe.ConditionalRecipeWrapper; import dev.xkmc.l2library.serial.recipe.NBTRecipe; import dev.xkmc.modulargolems.compat.materials.common.CompatManager; +import dev.xkmc.modulargolems.content.core.IGolemPart; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.item.card.NameFilterCard; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; import dev.xkmc.modulargolems.content.recipe.GolemAssembleBuilder; +import dev.xkmc.modulargolems.content.recipe.GolemReplaceBuilder; +import dev.xkmc.modulargolems.content.recipe.GolemSmithBuilder; import dev.xkmc.modulargolems.init.ModularGolems; import dev.xkmc.modulargolems.init.material.GolemWeaponType; import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; @@ -24,6 +35,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraftforge.common.Tags; +import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.tags.ITagManager; @@ -92,6 +104,15 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { .define('A', Items.AMETHYST_SHARD).define('B', Items.IRON_INGOT) .define('C', Items.CLAY_BALL).save(pvd); + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.TABLE.get(), 1)::unlockedBy, + Items.ECHO_SHARD).pattern("AGA").pattern("RTR").pattern("EIE") + .define('A', Items.AMETHYST_SHARD) + .define('G', GolemItems.SLICING_AXE) + .define('R', Items.REDSTONE) + .define('T', Items.SMITHING_TABLE) + .define('E', Items.ECHO_SHARD) + .define('I', Items.ANVIL).save(pvd); + pvd.stonecutting(DataIngredient.items(GolemItems.GOLEM_TEMPLATE.get()), RecipeCategory.MISC, GolemItems.GOLEM_BODY); pvd.stonecutting(DataIngredient.items(GolemItems.GOLEM_TEMPLATE.get()), RecipeCategory.MISC, GolemItems.GOLEM_ARM); pvd.stonecutting(DataIngredient.items(GolemItems.GOLEM_TEMPLATE.get()), RecipeCategory.MISC, GolemItems.GOLEM_LEGS); @@ -101,28 +122,123 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { pvd.stonecutting(DataIngredient.items(GolemItems.GOLEM_TEMPLATE.get()), RecipeCategory.MISC, GolemItems.DOG_BODY); pvd.stonecutting(DataIngredient.items(GolemItems.GOLEM_TEMPLATE.get()), RecipeCategory.MISC, GolemItems.DOG_LEGS); - unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, - GolemItems.GOLEM_BODY.get()) - .pattern("ABA").pattern(" L ") - .define('A', GolemItems.GOLEM_ARM.get()) - .define('B', GolemItems.GOLEM_BODY.get()) - .define('L', GolemItems.GOLEM_LEGS.get()) - .save(pvd); - unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_HUMANOID.get(), 1)::unlockedBy, - GolemItems.HUMANOID_BODY.get()) - .pattern("A").pattern("B").pattern("C") - .define('A', GolemItems.HUMANOID_BODY.get()) - .define('B', GolemItems.HUMANOID_ARMS.get()) - .define('C', GolemItems.HUMANOID_LEGS.get()) - .save(pvd); + { + unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, + GolemItems.GOLEM_BODY.get()) + .pattern("ABA").pattern(" L ") + .define('A', GolemItems.GOLEM_ARM.get()) + .define('B', GolemItems.GOLEM_BODY.get()) + .define('L', GolemItems.GOLEM_LEGS.get()) + .save(pvd, ModularGolems.loc("metal_golem/assemble_holder")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, + GolemItems.GOLEM_BODY.get()) + .pattern("PH") + .define('P', GolemItems.GOLEM_ARM.get()) + .define('H', GolemItems.HOLDER_GOLEM.get()) + .save(pvd, ModularGolems.loc("metal_golem/replace_right_arm")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, + GolemItems.GOLEM_BODY.get()) + .pattern("HP") + .define('P', GolemItems.GOLEM_ARM.get()) + .define('H', GolemItems.HOLDER_GOLEM.get()) + .save(pvd, ModularGolems.loc("metal_golem/replace_left_arm")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, + GolemItems.GOLEM_BODY.get()) + .pattern("P").pattern("H") + .define('P', GolemItems.GOLEM_BODY.get()) + .define('H', GolemItems.HOLDER_GOLEM.get()) + .save(pvd, ModularGolems.loc("metal_golem/replace_body")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_GOLEM.get(), 1)::unlockedBy, + GolemItems.GOLEM_BODY.get()) + .pattern("H").pattern("P") + .define('P', GolemItems.GOLEM_LEGS.get()) + .define('H', GolemItems.HOLDER_GOLEM.get()) + .save(pvd, ModularGolems.loc("metal_golem/replace_legs")); + } - unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_DOG.get(), 1)::unlockedBy, - GolemItems.HUMANOID_BODY.get()) - .pattern("A").pattern("B") - .define('A', GolemItems.DOG_BODY.get()) - .define('B', GolemItems.DOG_LEGS.get()) - .save(pvd); + { + + unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_HUMANOID.get(), 1)::unlockedBy, + GolemItems.HUMANOID_BODY.get()) + .pattern("A").pattern("B").pattern("C") + .define('A', GolemItems.HUMANOID_BODY.get()) + .define('B', GolemItems.HUMANOID_ARMS.get()) + .define('C', GolemItems.HUMANOID_LEGS.get()) + .save(pvd, ModularGolems.loc("humanoid_golem/assemble_holder")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_HUMANOID.get(), 1)::unlockedBy, + GolemItems.HUMANOID_BODY.get()) + .pattern("P").pattern("H") + .define('P', GolemItems.HUMANOID_BODY.get()) + .define('H', GolemItems.HOLDER_HUMANOID.get()) + .save(pvd, ModularGolems.loc("humanoid_golem/replace_body")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_HUMANOID.get(), 1)::unlockedBy, + GolemItems.HUMANOID_BODY.get()) + .pattern("H").pattern("P") + .define('P', GolemItems.HUMANOID_ARMS.get()) + .define('H', GolemItems.HOLDER_HUMANOID.get()) + .save(pvd, ModularGolems.loc("humanoid_golem/replace_arms")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_HUMANOID.get(), 1)::unlockedBy, + GolemItems.HUMANOID_BODY.get()) + .pattern("H").pattern("P") + .define('P', GolemItems.HUMANOID_LEGS.get()) + .define('H', GolemItems.HOLDER_HUMANOID.get()) + .save(pvd, ModularGolems.loc("humanoid_golem/replace_legs")); + } + + { + + unlock(pvd, new GolemAssembleBuilder(GolemItems.HOLDER_DOG.get(), 1)::unlockedBy, + GolemItems.HUMANOID_BODY.get()) + .pattern("A").pattern("B") + .define('A', GolemItems.DOG_BODY.get()) + .define('B', GolemItems.DOG_LEGS.get()) + .save(pvd, ModularGolems.loc("dog_golem/assemble_holder")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_DOG.get(), 1)::unlockedBy, + GolemItems.DOG_BODY.get()) + .pattern("P").pattern("H") + .define('P', GolemItems.DOG_BODY.get()) + .define('H', GolemItems.HOLDER_DOG.get()) + .save(pvd, ModularGolems.loc("dog_golem/replace_body")); + + unlock(pvd, new GolemReplaceBuilder(GolemItems.HOLDER_DOG.get(), 1)::unlockedBy, + GolemItems.DOG_BODY.get()) + .pattern("H").pattern("P") + .define('P', GolemItems.DOG_LEGS.get()) + .define('H', GolemItems.HOLDER_DOG.get()) + .save(pvd, ModularGolems.loc("dog_golem/replace_legs")); + + expand(pvd, GolemItems.HOLDER_GOLEM, GolemItems.ADD_DIAMOND); + expand(pvd, GolemItems.HOLDER_GOLEM, GolemItems.ADD_NETHERITE); + expand(pvd, GolemItems.HOLDER_HUMANOID, GolemItems.ADD_DIAMOND); + expand(pvd, GolemItems.HOLDER_HUMANOID, GolemItems.ADD_NETHERITE); + expand(pvd, GolemItems.HOLDER_DOG, GolemItems.ADD_DIAMOND); + expand(pvd, GolemItems.HOLDER_DOG, GolemItems.ADD_NETHERITE); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.ADD_DIAMOND, 1)::unlockedBy, Items.DIAMOND) + .pattern("ACA").pattern("CBC").pattern("ACA") + .define('A', GolemItems.EMPTY_UPGRADE) + .define('B', Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) + .define('C', Items.DIAMOND) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.ADD_NETHERITE, 1)::unlockedBy, Items.NETHERITE_INGOT) + .pattern("ADA").pattern("CBC").pattern("ACA") + .define('A', GolemItems.EMPTY_UPGRADE) + .define('B', Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) + .define('C', Items.NETHERITE_INGOT) + .define('D', Items.NETHER_STAR) + .save(pvd); + + } } // card @@ -223,6 +339,13 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { .define('B', Items.LAPIS_LAZULI) .save(pvd); + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.WINDSPIRIT_BOOTS.get())::unlockedBy, Items.DIAMOND) + .pattern("I I").pattern("BAB") + .define('I', Items.DIAMOND_BOOTS) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', Items.LAPIS_LAZULI) + .save(pvd); + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.BARBARICFLAMEVANGUARD_HELMET.get())::unlockedBy, Items.DIAMOND) .pattern(" B ").pattern("III").pattern("IAI") .define('I', Items.NETHERITE_HELMET) @@ -243,6 +366,44 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { .define('A', GolemItems.GOLEM_TEMPLATE.get()) .define('B', Items.QUARTZ) .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.BARBARICFLAMEVANGUARD_BOOTS.get())::unlockedBy, Items.DIAMOND) + .pattern("I I").pattern("BAB") + .define('I', Items.NETHERITE_BOOTS) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', Items.ANVIL) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.BEACON_BOOTS.get())::unlockedBy, Items.BEACON) + .pattern("SXS").pattern("ABA").pattern("AAA") + .define('X', Items.BEACON) + .define('S', Items.NETHER_STAR) + .define('B', GolemItems.WINDSPIRIT_BOOTS.get()) + .define('A', Items.ANVIL) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.DOG_ARMOR_IRON.get())::unlockedBy, Items.IRON_INGOT) + .pattern("I ").pattern("IBI").pattern("IAI") + .define('I', Items.IRON_INGOT) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', Items.LEATHER) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.DOG_ARMOR_GOLD.get())::unlockedBy, Items.GOLD_INGOT) + .pattern("I ").pattern("IBI").pattern("IAI") + .define('I', Items.GOLD_INGOT) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', Items.LEATHER) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.DOG_ARMOR_DIAMOND.get())::unlockedBy, Items.DIAMOND) + .pattern("I ").pattern("IBI").pattern("IAI") + .define('I', Items.DIAMOND) + .define('A', GolemItems.GOLEM_TEMPLATE.get()) + .define('B', Items.LEATHER) + .save(pvd); + + smithing(pvd, GolemItems.DOG_ARMOR_DIAMOND.get(), Items.NETHERITE_INGOT, GolemItems.DOG_ARMOR_NETHERITE.get()); } // weapon @@ -263,6 +424,52 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { } } + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.IRON_BOW.get())::unlockedBy, Items.BOW) + .pattern("CII").pattern("BCI").pattern("IBC") + .define('I', Items.IRON_INGOT) + .define('B', GolemItems.GOLEM_TEMPLATE) + .define('C', Items.CHAIN) + .save(pvd); + + smithing(pvd, GolemItems.IRON_BOW.get(), Items.NETHERITE_INGOT, GolemItems.NETHERITE_BOW.get()); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.BEACON_CANNON.get())::unlockedBy, Items.BEACON) + .pattern("III").pattern("BDD").pattern("TII") + .define('I', Items.IRON_INGOT) + .define('T', GolemItems.GOLEM_TEMPLATE) + .define('D', Items.DIAMOND) + .define('B', Items.BEACON) + .save(pvd); + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.FLAME_THROWER.get())::unlockedBy, Items.BLAZE_ROD) + .pattern("II ").pattern("BDD").pattern("TI ") + .define('I', Items.IRON_INGOT) + .define('T', GolemItems.GOLEM_TEMPLATE) + .define('D', Items.BLAZE_ROD) + .define('B', Items.BLAST_FURNACE) + .save(pvd); + + if (ModList.get().isLoaded(L2Complements.MODID)) { + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.SONIC_CANNON.get())::unlockedBy, LCItems.SONIC_SHOOTER.get()) + .pattern("III").pattern("BDD").pattern("TII") + .define('I', LCItems.WARDEN_BONE_SHARD) + .define('T', GolemItems.GOLEM_TEMPLATE) + .define('D', LCItems.RESONANT_FEATHER) + .define('B', LCItems.SONIC_SHOOTER) + .save(ConditionalRecipeWrapper.mod(pvd, L2Complements.MODID), "sonic_cannon_complements"); + } + + if (ModList.get().isLoaded(GolemDungeons.MODID)) { + + unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, GolemItems.SONIC_CANNON.get())::unlockedBy, GDItems.SCULK_SCYTHE.get()) + .pattern("III").pattern("BBD").pattern("TII") + .define('I', GDItems.SCULK_SCYTHE) + .define('T', GolemItems.GOLEM_TEMPLATE) + .define('B', Items.SCULK_CATALYST) + .define('D', Items.SCULK_SHRIEKER) + .save(ConditionalRecipeWrapper.mod(pvd, GolemDungeons.MODID), "sonic_cannon_dungeon"); + } } // upgrades @@ -334,7 +541,7 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { .save(pvd); unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, GolemItems.PLAYER_IMMUNE.get())::unlockedBy, GolemItems.EMPTY_UPGRADE.get()) - .requires(GolemItems.EMPTY_UPGRADE.get()).requires(Items.NETHER_STAR) + .requires(GolemItems.EMPTY_UPGRADE.get()).requires(Items.SHIELD) .save(pvd); unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, GolemItems.BELL.get())::unlockedBy, GolemItems.EMPTY_UPGRADE.get()) @@ -404,16 +611,16 @@ public static void genRecipe(RegistrateRecipeProvider pvd) { .define('E', Items.NETHER_STAR) .define('B', GolemItems.EMPTY_UPGRADE.get()) .define('C', Tags.Items.HEADS) - .define('A', Items.CHORUS_FLOWER) + .define('A', Items.DIAMOND) .save(pvd); unlock(pvd, ShapedRecipeBuilder.shaped(RecipeCategory.MISC, GolemItems.CAULDRON.get())::unlockedBy, GolemItems.EMPTY_UPGRADE.get()) .pattern("CEC").pattern("ABA").pattern("CDC") - .define('A', Items.NETHER_STAR) + .define('A', Items.BLAZE_POWDER) .define('B', GolemItems.EMPTY_UPGRADE.get()) .define('C', Items.DRAGON_BREATH) .define('D', Items.CAULDRON) - .define('E', Items.DRAGON_HEAD) + .define('E', Items.NETHER_STAR) .save(pvd); unlock(pvd, ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, GolemItems.MOUNT_UPGRADE.get())::unlockedBy, GolemItems.EMPTY_UPGRADE.get()) @@ -442,6 +649,13 @@ public static void smithing(RegistrateRecipeProvider pvd, Item in, Item mat, Ite RecipeCategory.COMBAT, out)::unlocks, mat).save(pvd, getID(out)); } + public static , P extends IGolemPart

> void + expand(RegistrateRecipeProvider pvd, ItemEntry> holder, ItemEntry template) { + unlock(pvd, new GolemSmithBuilder(holder.get(), template)::unlocks, template.get()) + .save(pvd, template.getId().withSuffix("_" + holder.getId().getPath())); + } + + @SuppressWarnings("ConstantConditions") private static ResourceLocation getID(Item item) { return new ResourceLocation(ModularGolems.MODID, ForgeRegistries.ITEMS.getKey(item).getPath()); diff --git a/src/main/java/dev/xkmc/modulargolems/init/data/SlotGen.java b/src/main/java/dev/xkmc/modulargolems/init/data/SlotGen.java index a931d17fc..771d3adda 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/data/SlotGen.java +++ b/src/main/java/dev/xkmc/modulargolems/init/data/SlotGen.java @@ -27,10 +27,8 @@ public void add(BiConsumer map) { map.accept(ModularGolems.MODID + "/curios/slots/golem_skin", new CurioSlotBuilder(1000, new ResourceLocation(ModularGolems.MODID, "slot/empty_skin_slot").toString())); - map.accept(ModularGolems.MODID + "/curios/entities/golem_skin", new CurioEntityBuilder( - new ArrayList<>(List.of(GolemTypes.TYPE_HUMANOID.getId())), - new ArrayList<>(List.of("golem_skin")), SlotCondition.of() - )); + map.accept(ModularGolems.MODID + "/curios/slots/golem_route", new CurioSlotBuilder(1100, + new ResourceLocation(ModularGolems.MODID, "slot/empty_route_slot").toString())); ArrayList entities = new ArrayList<>(List.of( GolemTypes.TYPE_GOLEM.getId(), @@ -39,13 +37,14 @@ public void add(BiConsumer map) { )); map.accept(ModularGolems.MODID + "/curios/entities/golem_curios", new CurioEntityBuilder(entities, - new ArrayList<>(List.of("head", "back", "ring", "charm", "hands")), SlotCondition.of() + new ArrayList<>(List.of("golem_route", "golem_skin", + "curio", "back", "belt", "body", "boot", "bracelet", "charm", "head", + "hands", "necklace", "ring", "feet", + "halo", "spellbook", "heart_amulet", "hostility_curse", "accessory", + "artifact_head", "artifact_necklace", "artifact_bracelet", "artifact_body", "artifact_belt" + )), SlotCondition.of() )); - map.accept(ModularGolems.MODID + "/curios/entities/golem_artifacts", new CurioEntityBuilder(entities, - new ArrayList<>(List.of("artifact_head", "artifact_necklace", "artifact_bracelet", "artifact_body", "artifact_belt")), - SlotCondition.of("l2artifacts") - )); map.accept(ModularGolems.MODID + "/curios/entities/maid_artifacts", new CurioEntityBuilder( new ArrayList<>(List.of(InitEntities.MAID.getId())), @@ -58,5 +57,6 @@ public void add(BiConsumer map) { new ArrayList<>(List.of("head", "back", "ring", "charm", "hands")), SlotCondition.of(TouhouLittleMaid.MOD_ID) )); + } } diff --git a/src/main/java/dev/xkmc/modulargolems/init/loot/DropPartModifier.java b/src/main/java/dev/xkmc/modulargolems/init/loot/DropPartModifier.java new file mode 100644 index 000000000..37b000a3e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/loot/DropPartModifier.java @@ -0,0 +1,56 @@ +package dev.xkmc.modulargolems.init.loot; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; +import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.minecraftforge.common.loot.LootModifier; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +public class DropPartModifier extends LootModifier { + + public static final Codec CODEC = RecordCodecBuilder.create(i -> + LootModifier.codecStart(i) + .and(ResourceLocation.CODEC.fieldOf("entity").forGetter(e -> e.entity)) + .and(ResourceLocation.CODEC.fieldOf("material").forGetter(e -> e.material)) + .apply(i, DropPartModifier::new)); + + private final ResourceLocation entity; + private final ResourceLocation material; + + protected DropPartModifier(LootItemCondition[] conditionsIn, ResourceLocation entity, ResourceLocation material) { + super(conditionsIn); + this.entity = entity; + this.material = material; + } + + protected DropPartModifier(ResourceLocation entity, ResourceLocation material, LootItemCondition... conditionsIn) { + super(conditionsIn); + this.entity = entity; + this.material = material; + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList loot, LootContext ctx) { + if (!ctx.hasParam(LootContextParams.THIS_ENTITY)) return loot; + var e = ctx.getParam(LootContextParams.THIS_ENTITY); + if (!entity.equals(ForgeRegistries.ENTITY_TYPES.getKey(e.getType()))) return loot; + MetalGolemPartType type = MetalGolemPartType.values()[ctx.getRandom().nextInt(4)]; + loot.add(GolemPart.setMaterial(type.toItem().getDefaultInstance(), material)); + return loot; + } + + @Override + public Codec codec() { + return CODEC; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/loot/MGGLMGen.java b/src/main/java/dev/xkmc/modulargolems/init/loot/MGGLMGen.java new file mode 100644 index 000000000..4efbee0b8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/loot/MGGLMGen.java @@ -0,0 +1,46 @@ +package dev.xkmc.modulargolems.init.loot; + +import dev.xkmc.modulargolems.compat.materials.common.CompatManager; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.registrate.GolemItems; +import dev.xkmc.modulargolems.init.registrate.GolemTypes; +import net.minecraft.advancements.critereon.EntityEquipmentPredicate; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; +import net.minecraftforge.common.data.GlobalLootModifierProvider; +import net.minecraftforge.registries.ForgeRegistries; + +public class MGGLMGen extends GlobalLootModifierProvider { + + public MGGLMGen(PackOutput output, String modid) { + super(output, modid); + } + + @Override + protected void start() { + drop(ModularGolems.MODID, EntityType.IRON_GOLEM, "iron"); + drop(ModularGolems.MODID, EntityType.WARDEN, "sculk"); + CompatManager.onGLMGen(this); + } + + public void drop(String modid, EntityType type, String material) { + add("slicing_axe_drop_" + material, new DropPartModifier( + ForgeRegistries.ENTITY_TYPES.getKey(type), + new ResourceLocation(modid, material), + LootItemEntityPropertyCondition.hasProperties( + LootContext.EntityTarget.DIRECT_KILLER, + EntityPredicate.Builder.entity().of(GolemTypes.ENTITY_GOLEM.get()).equipment( + EntityEquipmentPredicate.Builder.equipment().mainhand( + ItemPredicate.Builder.item().of(GolemItems.SLICING_AXE.get()).build() + ).build() + ).build() + ).build() + )); + + } +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/loot/package-info.java b/src/main/java/dev/xkmc/modulargolems/init/loot/package-info.java new file mode 100644 index 000000000..62737ae47 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/loot/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.init.loot; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/init/material/GolemWeaponType.java b/src/main/java/dev/xkmc/modulargolems/init/material/GolemWeaponType.java index c6fadd60f..b66deca8d 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/material/GolemWeaponType.java +++ b/src/main/java/dev/xkmc/modulargolems/init/material/GolemWeaponType.java @@ -2,26 +2,31 @@ import com.tterrag.registrate.util.entry.ItemEntry; import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.data.MGTagGen; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraftforge.client.model.generators.ItemModelBuilder; import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.loaders.SeparateTransformsModelBuilder; import java.util.Locale; -import java.util.function.BiFunction; import static dev.xkmc.modulargolems.init.ModularGolems.REGISTRATE; public enum GolemWeaponType { - SPEAR("item/long_weapon", (p, i) -> new MetalGolemWeaponItem(p, i, 0, 2, 0), "TII", " SI", "S T"), - AXE("item/battle_axe", (p, i) -> new MetalGolemWeaponItem(p, 0, i * 0.05, 0, 2), "III", "IS ", "TST"), - SWORD("item/sword", (p, i) -> new MetalGolemWeaponItem(p, i, 0, 1, 2), "TII", "ISI", "SIT"), + SPEAR("item/long_weapon", (p, i, f) -> f.create(p, i, 0, 2, 0), "TII", " SI", "S T"), + AXE("item/battle_axe", (p, i, f) -> f.create(p, 0, i * 0.05, 0, 2), "III", "IS ", "TST"), + SWORD("item/sword", (p, i, f) -> f.create(p, i, 0, 1, 2), "TII", "ISI", "SIT"), ; - private final BiFunction factory; + private final IWeaponConstructor factory; private final String[] pattern; - private final String model; + public final String model; - GolemWeaponType(String model, BiFunction factory, String... pattern) { + GolemWeaponType(String model, IWeaponConstructor factory, String... pattern) { this.model = model; this.factory = factory; this.pattern = pattern; @@ -32,10 +37,31 @@ public String getName() { } public ItemEntry buildItem(IGolemWeaponMaterial material) { - return REGISTRATE.item(material.getName() + "_" + getName(), p -> factory.apply(material.modify(p.stacksTo(1)), material.getDamage())) - .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile(pvd.modLoc(model))) - .texture("layer0", pvd.modLoc("item/equipments/" + ctx.getName()))) - .defaultLang().register(); + var builder = REGISTRATE.item(material.getName() + "_" + getName(), + p -> factory.create(material.modify(p.stacksTo(1)), material.getDamage(), material.factory())); + if (material.hasIcon(this)) { + builder.model((ctx, pvd) -> + pvd.getBuilder(ctx.getName()) + .guiLight(BlockModel.GuiLight.FRONT) + .customLoader(SeparateTransformsModelBuilder::begin) + .base(material.model(new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(new ModelFile.UncheckedModelFile(ModularGolems.loc(model))) + .texture("layer0", pvd.modLoc("item/equipments/" + ctx.getName())))) + .perspective(ItemDisplayContext.GUI, material.model(new ItemModelBuilder(null, pvd.existingFileHelper) + .parent(pvd.getExistingFile(pvd.mcLoc("item/generated"))) + .texture("layer0", pvd.modLoc("item/equipments/" + ctx.getName() + "_icon"))))); + } else { + builder.model((ctx, pvd) -> + material.model(pvd.getBuilder(ctx.getName())) + .parent(new ModelFile.UncheckedModelFile(pvd.modLoc(model))) + .texture("layer0", material.modLoc("item/equipments/" + ctx.getName()))); + } + var ans = builder.defaultLang().register(); + if (this != SWORD) { + MGTagGen.OPTIONAL_ITEM.add(pvd -> pvd.addTag(MGTagGen.SHIELD_BREAKER_WEAPONS) + .addOptional(ans.getId())); + } + return ans; } public static ItemEntry[][] build(IGolemWeaponMaterial[] values) { @@ -57,4 +83,10 @@ public ShapedRecipeBuilder pattern(ShapedRecipeBuilder unlock) { return unlock; } + interface IWeaponConstructor { + + MetalGolemWeaponItem create(Item.Properties prop, int val, IGolemWeaponFactory factory); + + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponFactory.java b/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponFactory.java new file mode 100644 index 000000000..5bebfd231 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponFactory.java @@ -0,0 +1,10 @@ +package dev.xkmc.modulargolems.init.material; + +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import net.minecraft.world.item.Item; + +public interface IGolemWeaponFactory { + + MetalGolemWeaponItem create(Item.Properties properties, int attackDamage, double percentAttack, float range, float sweep); + +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponMaterial.java b/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponMaterial.java index 7d91fcbb4..90b712faf 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponMaterial.java +++ b/src/main/java/dev/xkmc/modulargolems/init/material/IGolemWeaponMaterial.java @@ -1,5 +1,8 @@ package dev.xkmc.modulargolems.init.material; +import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; public interface IGolemWeaponMaterial { @@ -18,4 +21,21 @@ default Item.Properties modify(Item.Properties prop) { } boolean fireResistant(); + + default ResourceLocation modLoc(String s) { + return ModularGolems.loc(s); + } + + default IGolemWeaponFactory factory() { + return MetalGolemWeaponItem::new; + } + + default T model(T model) { + return model; + } + + default boolean hasIcon(GolemWeaponType type) { + return false; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/init/material/VanillaGolemWeaponMaterial.java b/src/main/java/dev/xkmc/modulargolems/init/material/VanillaGolemWeaponMaterial.java index c844af860..eae05437d 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/material/VanillaGolemWeaponMaterial.java +++ b/src/main/java/dev/xkmc/modulargolems/init/material/VanillaGolemWeaponMaterial.java @@ -39,4 +39,8 @@ public Item getIngot() { return ingot; } + public boolean hasIcon(GolemWeaponType type) { + return true; + } + } diff --git a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemItems.java b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemItems.java index 34548e217..c2be62c0e 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemItems.java +++ b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemItems.java @@ -2,24 +2,28 @@ import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.RegistryEntry; -import dev.xkmc.l2itemselector.init.data.L2ISTagGen; +import com.tterrag.registrate.util.nullness.NonNullFunction; import dev.xkmc.l2library.base.L2Registrate; +import dev.xkmc.l2screentracker.init.L2STTagGen; import dev.xkmc.modulargolems.compat.materials.common.CompatManager; +import dev.xkmc.modulargolems.content.block.TableBlock; import dev.xkmc.modulargolems.content.client.armor.GolemModelPaths; import dev.xkmc.modulargolems.content.entity.dog.DogGolemEntity; import dev.xkmc.modulargolems.content.entity.dog.DogGolemPartType; -import dev.xkmc.modulargolems.content.entity.humanoid.HumaniodGolemPartType; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemPartType; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemPartType; import dev.xkmc.modulargolems.content.item.card.*; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemArmorItem; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemBeaconItem; -import dev.xkmc.modulargolems.content.item.equipments.MetalGolemWeaponItem; +import dev.xkmc.modulargolems.content.item.equipments.*; +import dev.xkmc.modulargolems.content.item.golem.GolemFacade; import dev.xkmc.modulargolems.content.item.golem.GolemHolder; import dev.xkmc.modulargolems.content.item.golem.GolemPart; +import dev.xkmc.modulargolems.content.item.ranged.*; +import dev.xkmc.modulargolems.content.item.upgrade.AddSlotTemplate; import dev.xkmc.modulargolems.content.item.upgrade.SimpleUpgradeItem; import dev.xkmc.modulargolems.content.item.wand.*; import dev.xkmc.modulargolems.content.modifier.base.GolemModifier; @@ -27,11 +31,11 @@ import dev.xkmc.modulargolems.init.data.MGTagGen; import dev.xkmc.modulargolems.init.material.GolemWeaponType; import dev.xkmc.modulargolems.init.material.VanillaGolemWeaponMaterial; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.*; +import net.minecraft.world.level.block.Blocks; import net.minecraftforge.client.model.generators.ModelFile; import java.util.function.Supplier; @@ -40,20 +44,25 @@ public class GolemItems { - public static final RegistryEntry TAB; + public static final RegistryEntry ITEMS, UPGRADES, GOLEMS; static { - TAB = REGISTRATE.buildL2CreativeTab("golems", "Modular Golems", b -> b - .icon(GolemItems.HOLDER_GOLEM::asStack)); + ITEMS = REGISTRATE.buildL2CreativeTab("golem_items", "Modular Golems - Items", b -> b + .icon(GolemItems.GOLEM_TEMPLATE::asStack)); + UPGRADES = REGISTRATE.buildL2CreativeTab("golem_upgrades", "Modular Golems - Upgrades", b -> b + .icon(GolemItems.RECYCLE::asStack)); + REGISTRATE.defaultCreativeTab(ITEMS.getKey()); } + public static final BlockEntry TABLE; + public static final ItemEntry GOLEM_TEMPLATE, EMPTY_UPGRADE; public static final ItemEntry> GOLEM_BODY, GOLEM_ARM, GOLEM_LEGS; public static final ItemEntry> HOLDER_GOLEM; - public static final ItemEntry> HUMANOID_BODY, HUMANOID_ARMS, HUMANOID_LEGS; - public static final ItemEntry> HOLDER_HUMANOID; + public static final ItemEntry> HUMANOID_BODY, HUMANOID_ARMS, HUMANOID_LEGS; + public static final ItemEntry> HOLDER_HUMANOID; public static final ItemEntry> DOG_BODY, DOG_LEGS; public static final ItemEntry> HOLDER_DOG; @@ -67,21 +76,47 @@ public class GolemItems { public static final ItemEntry DISPENSE_WAND, OMNI_DISPENSE; public static final ItemEntry RIDER_WAND, OMNI_RIDER; public static final ItemEntry SQUAD_WAND, OMNI_SQUAD; + public static final ItemEntry HOSTILE_WAND; public static final ItemEntry GOLEMGUARD_HELMET, WINDSPIRIT_HELMET, BARBARICFLAMEVANGUARD_HELMET; public static final ItemEntry GOLEMGUARD_CHESTPLATE, WINDSPIRIT_CHESTPLATE, BARBARICFLAMEVANGUARD_CHESTPLATE; public static final ItemEntry GOLEMGUARD_SHINGUARD, WINDSPIRIT_SHINGUARD, BARBARICFLAMEVANGUARD_SHINGUARD; + public static final ItemEntry WINDSPIRIT_BOOTS; + public static final ItemEntry BARBARICFLAMEVANGUARD_BOOTS; public static final ItemEntry[][] METALGOLEM_WEAPON; - public static final ItemEntry[] METALGOLEM_BEACONS; + public static final ItemEntry IRON_BOW; + public static final ItemEntry NETHERITE_BOW; + public static final ItemEntry SONIC_CANNON; + public static final ItemEntry BEACON_CANNON; + public static final ItemEntry FLAME_THROWER; + public static final ItemEntry SLICING_AXE; + public static final ItemEntry BEACON_BOOTS; public static final ItemEntry[] CARD; public static final ItemEntry CARD_PATH; public static final ItemEntry CARD_NAME; public static final ItemEntry CARD_TYPE; public static final ItemEntry CARD_UUID; public static final ItemEntry CARD_DEF; + public static final ItemEntry FACADE; + public static final ItemEntry ADD_DIAMOND, ADD_NETHERITE; + + public static final ItemEntry DOG_ARMOR_IRON, DOG_ARMOR_GOLD, DOG_ARMOR_DIAMOND, DOG_ARMOR_NETHERITE; static { + TABLE = REGISTRATE.block("golem_workbench", TableBlock::new) + .initialProperties(() -> Blocks.ANVIL) + .blockstate((ctx, pvd) -> pvd.simpleBlock(ctx.get(), pvd.models() + .getBuilder("block/" + ctx.getName()) + .parent(new ModelFile.UncheckedModelFile(pvd.modLoc("custom/table"))) + .texture("top", pvd.modLoc("block/table_top")) + .texture("middle", pvd.modLoc("block/table_middle")) + .texture("bottom", pvd.modLoc("block/table_bottom")) + .texture("particle", pvd.modLoc("block/table_particle")) + )).tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item().tag(L2STTagGen.QUICK_ACCESS_VANILLA).build() + .register(); + GOLEM_TEMPLATE = REGISTRATE.item("metal_golem_template", Item::new).defaultModel().defaultLang().register(); { @@ -99,24 +134,24 @@ public class GolemItems { OMNI_COMMAND = REGISTRATE.item("omnipotent_wand_command", p -> new CommandWandItem(p.stacksTo(1), COMMAND_WAND)) .model((ctx, pvd) -> pvd.handheld(ctx, pvd.modLoc("item/omnipotent_wand"))) - .lang("Omnipotent Wand: Command").tag(L2ISTagGen.SELECTABLE, MGTagGen.GOLEM_INTERACT) + .lang("Omnipotent Wand: Command").tag(MGTagGen.GOLEM_OMNI_WAND) .register(); OMNI_RETRIVAL = REGISTRATE.item("omnipotent_wand_retrieval", p -> new RetrievalWandItem(p.stacksTo(1), RETRIEVAL_WAND)) .model((ctx, pvd) -> pvd.handheld(ctx, pvd.modLoc("item/omnipotent_wand"))) - .lang("Omnipotent Wand: Retrieval").tag(L2ISTagGen.SELECTABLE, MGTagGen.GOLEM_INTERACT) - .removeTab(TAB.getKey()).register(); + .lang("Omnipotent Wand: Retrieval").tag(MGTagGen.GOLEM_OMNI_WAND) + .removeTab(ITEMS.getKey()).register(); OMNI_DISPENSE = REGISTRATE.item("omnipotent_wand_summon", p -> new DispenseWand(p.stacksTo(1), DISPENSE_WAND)) .model((ctx, pvd) -> pvd.handheld(ctx, pvd.modLoc("item/omnipotent_wand"))) - .lang("Omnipotent Wand: Summon").tag(L2ISTagGen.SELECTABLE, MGTagGen.GOLEM_INTERACT) - .removeTab(TAB.getKey()).register(); + .lang("Omnipotent Wand: Summon").tag(MGTagGen.GOLEM_OMNI_WAND) + .removeTab(ITEMS.getKey()).register(); OMNI_RIDER = REGISTRATE.item("omnipotent_wand_rider", p -> new RiderWandItem(p.stacksTo(1), RIDER_WAND)) .model((ctx, pvd) -> pvd.handheld(ctx, pvd.modLoc("item/omnipotent_wand"))) - .lang("Omnipotent Wand: Rider").tag(L2ISTagGen.SELECTABLE, MGTagGen.GOLEM_INTERACT) - .removeTab(TAB.getKey()).register(); + .lang("Omnipotent Wand: Rider").tag(MGTagGen.GOLEM_OMNI_WAND) + .removeTab(ITEMS.getKey()).register(); OMNI_SQUAD = REGISTRATE.item("omnipotent_wand_squad", p -> new SquadWandItem(p.stacksTo(1), SQUAD_WAND)) .model((ctx, pvd) -> pvd.handheld(ctx, pvd.modLoc("item/omnipotent_wand"))) - .lang("Omnipotent Wand: Squad").tag(L2ISTagGen.SELECTABLE, MGTagGen.GOLEM_INTERACT) - .removeTab(TAB.getKey()).register(); + .lang("Omnipotent Wand: Squad").tag(MGTagGen.GOLEM_OMNI_WAND) + .removeTab(ITEMS.getKey()).register(); } @@ -147,36 +182,61 @@ public class GolemItems { ArmorItem.Type.LEGGINGS, 8, 6, GolemModelPaths.LEGGINGS)) .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) .defaultLang().register(); + WINDSPIRIT_BOOTS = REGISTRATE.item("wind_spirit_boots", p -> new MetalGolemArmorItem(p.stacksTo(1), + ArmorItem.Type.BOOTS, 6, 6, GolemModelPaths.BOOTS_DIAMOND)) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .defaultLang().register(); BARBARICFLAMEVANGUARD_HELMET = REGISTRATE.item("barbaric_vanguard_helmet", p -> new MetalGolemArmorItem(p.stacksTo(1).fireResistant(), ArmorItem.Type.HELMET, 14, 8, GolemModelPaths.HELMETS)) .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) - .defaultLang().register(); + .tag(MGTagGen.TOUGH_ITEM).defaultLang().register(); BARBARICFLAMEVANGUARD_CHESTPLATE = REGISTRATE.item("barbaric_vanguard_chestplate", p -> new MetalGolemArmorItem(p.stacksTo(1).fireResistant(), ArmorItem.Type.CHESTPLATE, 18, 8, GolemModelPaths.CHESTPLATES)) .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) - .defaultLang().register(); + .tag(MGTagGen.TOUGH_ITEM).defaultLang().register(); BARBARICFLAMEVANGUARD_SHINGUARD = REGISTRATE.item("barbaric_vanguard_shinguard", p -> new MetalGolemArmorItem(p.stacksTo(1).fireResistant(), ArmorItem.Type.LEGGINGS, 10, 8, GolemModelPaths.LEGGINGS)) .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) - .defaultLang().register(); + .tag(MGTagGen.TOUGH_ITEM).defaultLang().register(); + BARBARICFLAMEVANGUARD_BOOTS = REGISTRATE.item("barbaric_vanguard_boots", p -> new NetheriteBootItem(p.stacksTo(1).fireResistant(), + ArmorItem.Type.BOOTS, 10, 8, GolemModelPaths.BOOTS_NETHERITE)) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .tag(MGTagGen.TOUGH_ITEM).defaultLang().register(); + + BEACON_BOOTS = REGISTRATE.item("beacon_boots", + p -> new MetalGolemBeaconItem(p.stacksTo(1), 4, 4, GolemModelPaths.BOOTS_BEACON)) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/beacon_boots"))) + .tag(MGTagGen.TOUGH_ITEM).register(); + + DOG_ARMOR_IRON = regDogArmor("iron", ArmorMaterials.IRON, 16, 0).register(); + DOG_ARMOR_GOLD = regDogArmor("gold", ArmorMaterials.GOLD, 12, 0).register(); + DOG_ARMOR_DIAMOND = regDogArmor("diamond", ArmorMaterials.DIAMOND, 20, 8).register(); + DOG_ARMOR_NETHERITE = regDogArmor("netherite", ArmorMaterials.NETHERITE, 20, 12) + .properties(p -> p.fireResistant().rarity(Rarity.EPIC)) + .tag(MGTagGen.TOUGH_ITEM).register(); + } //metalgolem weapon { METALGOLEM_WEAPON = GolemWeaponType.build(VanillaGolemWeaponMaterial.values()); - } - - //metalgolem beacon - { - METALGOLEM_BEACONS = new ItemEntry[5]; - for (int i = 0; i < 5; i++) { - int lv = i + 1; - METALGOLEM_BEACONS[i] = REGISTRATE.item("golem_beacon_level_" + lv, - p -> new MetalGolemBeaconItem(p.stacksTo(1), lv)) - .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) - .removeTab(TAB.getKey()).register(); - } + SLICING_AXE = SlicingAxe.buildItem("golem_slicing_axe", VanillaGolemWeaponMaterial.DIAMOND); + IRON_BOW = REGISTRATE.item("iron_mecha_bow", p -> new MetalGolemBowItem(p, 15, 0)) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .register(); + NETHERITE_BOW = REGISTRATE.item("netherite_mecha_bow", p -> new MetalGolemMechaBowItem(p, 30, 5)) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .tag(MGTagGen.TOUGH_ITEM).register(); + SONIC_CANNON = REGISTRATE.item("sonic_cannon", p -> new SonicCannonItem(p.stacksTo(1))) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .tag(MGTagGen.TOUGH_ITEM).register(); + BEACON_CANNON = REGISTRATE.item("beacon_cannon", p -> new BeaconCannonItem(p.stacksTo(1))) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .tag(MGTagGen.TOUGH_ITEM).register(); + FLAME_THROWER = REGISTRATE.item("flame_thrower", p -> new FlameThrowerItem(p.stacksTo(1))) + .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/equipments/" + ctx.getName()))) + .tag(MGTagGen.TOUGH_ITEM).register(); } // cards @@ -208,13 +268,15 @@ public class GolemItems { .lang("Target Filter: Default Target").register(); CARD_PATH = REGISTRATE.item("patrol_path_recorder", p -> new PathRecordCard(p.stacksTo(1))) .model((ctx, pvd) -> pvd.generated(ctx, pvd.modLoc("item/card/path"))) - .tag(MGTagGen.GOLEM_INTERACT) + .tag(MGTagGen.GOLEM_INTERACT, MGTagGen.CURIO_PATH) .lang("Patrol Path Recorder").register(); } // upgrades { - EMPTY_UPGRADE = REGISTRATE.item("empty_upgrade", Item::new).defaultModel().defaultLang().register(); + EMPTY_UPGRADE = REGISTRATE.item("empty_upgrade", Item::new).defaultModel().defaultLang().tab(UPGRADES.getKey()).register(); + ADD_DIAMOND = REGISTRATE.item("diamond_expansion_template", p -> new AddSlotTemplate(p, GolemModifiers.DIAMOND_ADD)).defaultModel().defaultLang().tab(UPGRADES.getKey()).register(); + ADD_NETHERITE = REGISTRATE.item("netherite_expansion_template", p -> new AddSlotTemplate(p, GolemModifiers.NETHERITE_ADD)).defaultModel().defaultLang().tab(UPGRADES.getKey()).register(); FIRE_IMMUNE = regUpgrade("fire_immune", () -> GolemModifiers.FIRE_IMMUNE).lang("Fire Immune Upgrade").register(); THUNDER_IMMUNE = regUpgrade("thunder_immune", () -> GolemModifiers.THUNDER_IMMUNE).lang("Thunder Immune Upgrade").register(); RECYCLE = regUpgrade("recycle", () -> GolemModifiers.RECYCLE).lang("Recycle Ugpgrade").register(); @@ -245,27 +307,30 @@ public class GolemItems { } CompatManager.register(); + GOLEMS = REGISTRATE.buildL2CreativeTab("golems", "Modular Golems - Golems & Parts", b -> b + .icon(GolemItems.HOLDER_GOLEM::asStack)); + // holders { HOLDER_GOLEM = REGISTRATE.item("metal_golem_holder", p -> new GolemHolder<>(p.fireResistant(), GolemTypes.TYPE_GOLEM)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_HOLDERS).defaultLang().register(); HOLDER_HUMANOID = REGISTRATE.item("humanoid_golem_holder", p -> new GolemHolder<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_HOLDERS).defaultLang().register(); HOLDER_DOG = REGISTRATE.item("dog_golem_holder", p -> new GolemHolder<>(p.fireResistant(), GolemTypes.TYPE_DOG)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_HOLDERS).defaultLang().register(); } @@ -275,41 +340,47 @@ public class GolemItems { new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_GOLEM, MetalGolemPartType.BODY, 9)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); GOLEM_ARM = REGISTRATE.item("metal_golem_arm", p -> new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_GOLEM, MetalGolemPartType.LEFT, 9)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); GOLEM_LEGS = REGISTRATE.item("metal_golem_legs", p -> new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_GOLEM, MetalGolemPartType.LEG, 9)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); } // humanoid golem { HUMANOID_BODY = REGISTRATE.item("humanoid_golem_body", p -> - new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumaniodGolemPartType.BODY, 6)) + new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumanoidGolemPartType.BODY, 6)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); HUMANOID_ARMS = REGISTRATE.item("humanoid_golem_arms", p -> - new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumaniodGolemPartType.ARMS, 6)) + new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumanoidGolemPartType.ARMS, 6)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); HUMANOID_LEGS = REGISTRATE.item("humanoid_golem_legs", p -> - new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumaniodGolemPartType.LEGS, 6)) + new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_HUMANOID, HumanoidGolemPartType.LEGS, 6)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); } @@ -319,19 +390,41 @@ public class GolemItems { new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_DOG, DogGolemPartType.BODY, 6)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); DOG_LEGS = REGISTRATE.item("dog_golem_legs", p -> new GolemPart<>(p.fireResistant(), GolemTypes.TYPE_DOG, DogGolemPartType.LEGS, 3)) .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) .texture("particle", "minecraft:block/clay")) - .transform(e -> e.tab(TAB.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tab(ITEMS.getKey()) + .transform(e -> e.tab(GOLEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) .tag(MGTagGen.GOLEM_PARTS).defaultLang().register(); } + FACADE = REGISTRATE.item("golem_facade", GolemFacade::new) + .model((ctx, pvd) -> pvd.getBuilder(ctx.getName()).parent(new ModelFile.UncheckedModelFile("builtin/entity")) + .texture("particle", "minecraft:block/clay").guiLight(BlockModel.GuiLight.FRONT)) + .removeTab(GOLEMS.getKey()) + .transform(e -> e.tab(ITEMS.getKey(), x -> e.getEntry().fillItemCategory(x))) + .tag(MGTagGen.CURIO_SKIN).register(); + CompatManager.lateRegister(); + REGISTRATE.defaultCreativeTab(ITEMS.getKey()); + HOSTILE_WAND = REGISTRATE.item("hostile_wand", p -> new HostileWandItem(p.stacksTo(1))) + .model((ctx, pvd) -> pvd.handheld(ctx)).defaultLang().tag(MGTagGen.GOLEM_INTERACT).register(); + + } + + private static ItemBuilder regDogArmor(String id, ArmorMaterial mat, int def, int tough) { + return ModularGolems.REGISTRATE.item(id + "_dog_golem_armor", p -> new DogGolemArmorItem( + p.stacksTo(1), mat, def, tough)) + .model((ctx, pvd) -> pvd.generated(ctx, + pvd.modLoc("item/dog_armor/" + id + "_collar"), + pvd.modLoc("item/dog_armor/" + id + "_wolf_armor"))) + .color(() -> () -> (s, i) -> i == 0 ? ((DogGolemArmorItem) s.getItem()).getColor(s) : -1); } public static ItemBuilder regModUpgrade(String id, Supplier> mod, int lv, boolean foil, String modid) { @@ -365,7 +458,14 @@ private static ItemBuilder regUpgradeImpl(Strin .parent(new ModelFile.UncheckedModelFile("item/generated")) .texture("layer0", new ResourceLocation(modid, "item/upgrades/" + id)) .texture("layer1", new ResourceLocation(ModularGolems.MODID, "item/blue_arrow"))) - .end()); + .end()) + .removeTab(ITEMS.getKey()).tab(UPGRADES.getKey()); + } + + public static ItemEntry item(String modid, String id, NonNullFunction func) { + return REGISTRATE.item(id, func) + .model((ctx, pvd) -> pvd.generated(ctx, new ResourceLocation(modid, "item/" + id))) + .register(); } public static void register() { diff --git a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscEntities.java b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscEntities.java new file mode 100644 index 000000000..52ee059bb --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscEntities.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.init.registrate; + +import com.tterrag.registrate.util.entry.EntityEntry; +import dev.xkmc.modulargolems.content.entity.misc.BeaconLaserEntity; +import dev.xkmc.modulargolems.content.entity.misc.BeaconLaserRenderer; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.world.entity.MobCategory; + +public class GolemMiscEntities { + + public static final EntityEntry LASER = ModularGolems.REGISTRATE + .entity("beacon_laser", BeaconLaserEntity::new, MobCategory.MISC) + .properties(p -> p.fireImmune().noSave().noSummon().sized(0, 0)) + .renderer(() -> BeaconLaserRenderer::new) + .register(); + + public static void register() { + + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscs.java b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscs.java index 87acab73d..a0cb62e36 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscs.java +++ b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemMiscs.java @@ -4,6 +4,7 @@ import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.nullness.NonNullSupplier; import dev.xkmc.l2library.serial.recipe.AbstractShapedRecipe; +import dev.xkmc.l2library.serial.recipe.AbstractSmithingRecipe; import dev.xkmc.modulargolems.content.menu.config.ToggleGolemConfigMenu; import dev.xkmc.modulargolems.content.menu.config.ToggleGolemConfigScreen; import dev.xkmc.modulargolems.content.menu.equipment.EquipmentsMenu; @@ -12,9 +13,17 @@ import dev.xkmc.modulargolems.content.menu.filter.ItemConfigScreen; import dev.xkmc.modulargolems.content.menu.path.PathConfigMenu; import dev.xkmc.modulargolems.content.menu.path.PathConfigScreen; +import dev.xkmc.modulargolems.content.menu.table.GolemDisinegrateScreen; +import dev.xkmc.modulargolems.content.menu.table.GolemDisintegrateMenu; +import dev.xkmc.modulargolems.content.menu.table.GolemUpgradeMenu; +import dev.xkmc.modulargolems.content.menu.table.GolemUpgradeScreen; import dev.xkmc.modulargolems.content.menu.target.TargetConfigMenu; import dev.xkmc.modulargolems.content.menu.target.TargetConfigScreen; import dev.xkmc.modulargolems.content.recipe.GolemAssembleRecipe; +import dev.xkmc.modulargolems.content.recipe.GolemReplaceRecipe; +import dev.xkmc.modulargolems.content.recipe.GolemSmithAddSlotRecipe; +import dev.xkmc.modulargolems.init.ModularGolems; +import dev.xkmc.modulargolems.init.loot.DropPartModifier; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraftforge.registries.ForgeRegistries; @@ -24,6 +33,11 @@ public class GolemMiscs { public static final RegistryEntry> ASSEMBLE = reg("golem_assemble", () -> new AbstractShapedRecipe.Serializer<>(GolemAssembleRecipe::new)); + public static final RegistryEntry> REPLACE = + reg("golem_replace_part", () -> new AbstractShapedRecipe.Serializer<>(GolemReplaceRecipe::new)); + public static final RegistryEntry> SMITH_ADD_SLOT = + reg("golem_add_slot", () -> new AbstractSmithingRecipe.Serializer<>(GolemSmithAddSlotRecipe::new)); + public static final MenuEntry EQUIPMENTS = REGISTRATE.menu("equipments", EquipmentsMenu::fromNetwork, () -> EquipmentsScreen::new) @@ -45,10 +59,25 @@ public class GolemMiscs { REGISTRATE.menu("config_path", PathConfigMenu::fromNetwork, () -> PathConfigScreen::new) .register(); + public static final MenuEntry UPGRADES = + REGISTRATE.menu("upgrades", GolemUpgradeMenu::fromNetwork, () -> GolemUpgradeScreen::new) + .register(); + + public static final MenuEntry DISINTEGRATE = + REGISTRATE.menu("disintegrate", GolemDisintegrateMenu::fromNetwork, () -> GolemDisinegrateScreen::new) + .register(); + private static > RegistryEntry reg(String id, NonNullSupplier sup) { return REGISTRATE.simple(id, ForgeRegistries.Keys.RECIPE_SERIALIZERS, sup); } + static { + ModularGolems.REGISTRATE.simple("slicing", + ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, + () -> DropPartModifier.CODEC + ); + } + public static void register() { } diff --git a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemModifiers.java b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemModifiers.java index fbabad6c6..7e760b841 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemModifiers.java +++ b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemModifiers.java @@ -8,17 +8,16 @@ import dev.xkmc.modulargolems.content.core.StatFilterType; import dev.xkmc.modulargolems.content.entity.common.GolemFlags; import dev.xkmc.modulargolems.content.modifier.base.*; +import dev.xkmc.modulargolems.content.modifier.common.AddSlotModifier; +import dev.xkmc.modulargolems.content.modifier.common.AttackBypassArmorModifier; import dev.xkmc.modulargolems.content.modifier.common.BellModifier; import dev.xkmc.modulargolems.content.modifier.common.ThornModifier; import dev.xkmc.modulargolems.content.modifier.immunes.*; import dev.xkmc.modulargolems.content.modifier.ride.RideUpgrade; -import dev.xkmc.modulargolems.content.modifier.special.PickupModifier; -import dev.xkmc.modulargolems.content.modifier.special.PotionMetaModifier; -import dev.xkmc.modulargolems.content.modifier.special.SonicModifier; -import dev.xkmc.modulargolems.content.modifier.special.TalentMetaModifier; +import dev.xkmc.modulargolems.content.modifier.special.*; +import net.minecraft.tags.EntityTypeTags; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.MobType; import org.apache.commons.lang3.mutable.Mutable; import org.apache.commons.lang3.mutable.MutableObject; @@ -48,8 +47,14 @@ public class GolemModifiers { public static final RegistryEntry ARMOR, TOUGH, DAMAGE, REGEN, SPEED, SIZE_UPGRADE; public static final RegistryEntry SLOW, WEAK, WITHER; public static final RegistryEntry MOUNT_UPGRADE; + public static final RegistryEntry ARMOR_BYPASS; + public static final RegistryEntry ADD_SLOT; + public static final RegistryEntry DIAMOND_ADD, NETHERITE_ADD; + public static final RegistryEntry DYNAMIC_REDUCTION; + static { + // 各类升级,是Registrate对象的集合 FIRE_IMMUNE = reg("fire_immune", FireImmuneModifier::new, "Immune to fire damage. Floats in Lava."); THUNDER_IMMUNE = reg("thunder_immune", ThunderImmuneModifier::new, @@ -77,6 +82,9 @@ public class GolemModifiers { new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_REGEN, () -> 1) )).register(); + DIAMOND_ADD = reg("add_slot_diamond", () -> new AddSlotModifier(1), "Diamond Expansion", "Add 1 upgrade slot. Only once per golem."); + NETHERITE_ADD = reg("add_slot_netherite", () -> new AddSlotModifier(1), "Netherite Expansion", "Add 1 upgrade slot. Only once per golem."); + THORN = reg("thorn", ThornModifier::new, "Reflect %s%% damage"); FLOAT = reg("float", () -> new SimpleFlagModifier(StatFilterType.HEALTH, GolemFlags.FLOAT), @@ -108,7 +116,7 @@ public class GolemModifiers { WITHER = reg("wither", () -> new PotionAttackModifier(StatFilterType.MASS, 3, i -> new MobEffectInstance(MobEffects.WITHER, 60, i - 1)), "Potion Upgrade: Wither", null); - EMERALD = reg("emerald", () -> new TargetBonusModifier(e -> e.getMobType() == MobType.ILLAGER), + EMERALD = reg("emerald", () -> new TargetBonusModifier(e -> e.getType().is(EntityTypeTags.RAIDERS)), "Deal %s%% more damage to illagers"); PICKUP = reg("pickup", PickupModifier::new, "Pickup", "Golems will pickup items and experiences within %s blocks and give them to you. See Patchouli for full documentation. The golem may destroy items if it find nowhere to store them"); @@ -125,7 +133,7 @@ public class GolemModifiers { new RideUpgrade.AttrEntry(GolemTypes.STAT_SPEED, () -> 0.3), new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_JUMP, () -> 0.25), new AttributeGolemModifier.AttrEntry(GolemTypes.STAT_HEALTH_P, () -> 0.2) - ), "Mount Upgrade", "Golem will not attack, and will not be targeted for attack."); + ), "Mount Upgrade", "Golem will not attack, and will not be targeted for attack. Will not be harmed by mobs that is not targeting it"); SIZE_UPGRADE = reg("size_up", () -> new AttributeGolemModifier(2, new RideUpgrade.AttrEntry(GolemTypes.STAT_SPEED, () -> 0.15), @@ -133,15 +141,49 @@ public class GolemModifiers { new RideUpgrade.AttrEntry(GolemTypes.STAT_SIZE, () -> 0.5), new RideUpgrade.AttrEntry(GolemTypes.STAT_RANGE, () -> 0.5) )).register(); + + ADD_SLOT = reg("add_slot", () -> new AddSlotModifier(20), "Add %s golem upgrade slot"); + + ARMOR_BYPASS = reg("armor_penetration", () -> new AttackBypassArmorModifier(5), + "Armor Penetration", "Attack has %s%% chance to bypass armor and shields"); + DYNAMIC_REDUCTION = reg("dynamic_reduction", DynamicReductionModifier::new, + "Dynamic Reduction","Golem can only take damage of 20% max health per period of time"); + } public static RegistryEntry reg(String id, NonNullSupplier sup, String name, @Nullable String def) { + // 创建一个可变对象来持有注册结果 Mutable> holder = new MutableObject<>(); + // 使用REGISTRATE创建并配置一个泛型注册项 var ans = REGISTRATE.generic(GolemTypes.MODIFIERS, id, sup).defaultLang(); + // 设置名称的语言本地化 ans.lang(NamedEntry::getDescriptionId, name); + // 如果提供了描述文本,则添加描述的语言本地化 if (def != null) { ans.addMiscData(ProviderType.LANG, pvd -> pvd.add(holder.getValue().get().getDescriptionId() + ".desc", def)); } + // 完成注册并获取结果 + var result = ans.register(); + // 将注册结果设置到可变对象 holder 中 + holder.setValue(result); + return result; + } + + public static RegistryEntry multilinereg(String id, NonNullSupplier sup, + String name, String... def) { + Mutable> holder = new MutableObject<>(); + var ans = REGISTRATE.generic(GolemTypes.MODIFIERS, id, sup).defaultLang(); + ans.lang(NamedEntry::getDescriptionId, name); + + if (def.length > 0) { + ans.addMiscData(ProviderType.LANG, pvd -> { + // 为每行单独注册翻译键 + for (int i = 0; i < def.length; i++) { + pvd.add(holder.getValue().get().getDescriptionId() + ".desc" + (i + 1), def[i]); + } + }); + } + var result = ans.register(); holder.setValue(result); return result; diff --git a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemTypes.java b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemTypes.java index 08c960c83..b7a218c03 100644 --- a/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemTypes.java +++ b/src/main/java/dev/xkmc/modulargolems/init/registrate/GolemTypes.java @@ -10,9 +10,9 @@ import dev.xkmc.modulargolems.content.entity.dog.DogGolemModel; import dev.xkmc.modulargolems.content.entity.dog.DogGolemPartType; import dev.xkmc.modulargolems.content.entity.dog.DogGolemRenderer; -import dev.xkmc.modulargolems.content.entity.humanoid.HumaniodGolemPartType; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemEntity; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemModel; +import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemPartType; import dev.xkmc.modulargolems.content.entity.humanoid.HumanoidGolemRenderer; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemModel; @@ -46,6 +46,8 @@ public class GolemTypes { () -> new RangedAttribute("attribute.name.golem_size", 1, 0, 1000).setSyncable(true)); public static RegistryEntry GOLEM_JUMP = REGISTRATE.simple("golem_jump", ForgeRegistries.ATTRIBUTES.getRegistryKey(), () -> new RangedAttribute("attribute.name.golem_jump", 0.5, 0, 1000).setSyncable(true)); + public static RegistryEntry DYNAMIC_REDUCTION = REGISTRATE.simple("dynamic_reduction", ForgeRegistries.ATTRIBUTES.getRegistryKey(), + () -> new RangedAttribute("attribute.name.dynamic_reduction", 0, 0, 10).setSyncable(true)); public static final RegistryEntry STAT_HEALTH = regStat("max_health", () -> Attributes.MAX_HEALTH, GolemStatType.Kind.BASE, StatFilterType.HEALTH); public static final RegistryEntry STAT_ATTACK = regStat("attack", () -> Attributes.ATTACK_DAMAGE, GolemStatType.Kind.BASE, StatFilterType.ATTACK); @@ -60,14 +62,16 @@ public class GolemTypes { public static final RegistryEntry STAT_JUMP = regStat("jump_strength", GOLEM_JUMP, GolemStatType.Kind.PERCENT, StatFilterType.MOVEMENT); public static final RegistryEntry STAT_HEALTH_P = regStat("max_health_percent", () -> Attributes.MAX_HEALTH, GolemStatType.Kind.PERCENT, StatFilterType.HEALTH); public static final RegistryEntry STAT_SIZE = regStat("max_size", GOLEM_SIZE, GolemStatType.Kind.ADD, StatFilterType.HEALTH); + public static final RegistryEntry STAT_SIZE_P = regStat("max_size_percentage", GOLEM_SIZE, GolemStatType.Kind.PERCENT, StatFilterType.HEALTH); public static final RegistryEntry STAT_RANGE = regStat("range", ForgeMod.ENTITY_REACH, GolemStatType.Kind.ADD, StatFilterType.ATTACK); + public static final RegistryEntry STAT_DR = regStat("dynamic_reduction", DYNAMIC_REDUCTION, GolemStatType.Kind.ADD, StatFilterType.HEALTH); public static final EntityEntry ENTITY_GOLEM; public static final EntityEntry ENTITY_HUMANOID; public static final EntityEntry ENTITY_DOG; public static final RegistryEntry> TYPE_GOLEM; - public static final RegistryEntry> TYPE_HUMANOID; + public static final RegistryEntry> TYPE_HUMANOID; public static final RegistryEntry> TYPE_DOG; static { @@ -86,10 +90,11 @@ public class GolemTypes { .add(GOLEM_REGEN.get()) .add(GOLEM_SWEEP.get()) .add(GOLEM_SIZE.get(), 3) + .add(DYNAMIC_REDUCTION.get()) ).tag(MGTagGen.GOLEM_FRIENDLY).register(); ENTITY_HUMANOID = REGISTRATE.entity("humanoid_golem", HumanoidGolemEntity::new, MobCategory.MISC) - .properties(e -> e.sized(0.6F, 1.95F).clientTrackingRange(10)) + .properties(e -> e.sized(0.6F, 1.8F).clientTrackingRange(10)) .renderer(() -> HumanoidGolemRenderer::new) .attributes(() -> Mob.createMobAttributes() .add(Attributes.MAX_HEALTH, 20.0D) @@ -101,12 +106,13 @@ public class GolemTypes { .add(ForgeMod.ENTITY_REACH.get(), 1) .add(Attributes.FOLLOW_RANGE, 35.0D) .add(GOLEM_REGEN.get()) - .add(GOLEM_SWEEP.get(), 1) + .add(GOLEM_SWEEP.get(), 2) .add(GOLEM_SIZE.get(), 2.5) + .add(DYNAMIC_REDUCTION.get()) ).tag(MGTagGen.GOLEM_FRIENDLY).register(); ENTITY_DOG = REGISTRATE.entity("dog_golem", DogGolemEntity::new, MobCategory.MISC) - .properties(e -> e.sized(0.85F, 0.6F).clientTrackingRange(10)) + .properties(e -> e.sized(0.9F, 0.9F).clientTrackingRange(10)) .renderer(() -> DogGolemRenderer::new) .attributes(() -> Mob.createMobAttributes() .add(Attributes.MAX_HEALTH, 8.0D) @@ -120,6 +126,7 @@ public class GolemTypes { .add(GOLEM_JUMP.get(), 0.5D) .add(GOLEM_REGEN.get()) .add(GOLEM_SIZE.get(), 1) + .add(DYNAMIC_REDUCTION.get()) ).tag(MGTagGen.GOLEM_FRIENDLY).register(); TYPE_GOLEM = REGISTRATE.generic(TYPES, "metal_golem", @@ -127,7 +134,7 @@ public class GolemTypes { .defaultLang().register(); TYPE_HUMANOID = REGISTRATE.generic(TYPES, "humanoid_golem", - () -> new GolemType<>(ENTITY_HUMANOID, HumaniodGolemPartType::values, HumaniodGolemPartType.BODY, () -> HumanoidGolemModel::new)) + () -> new GolemType<>(ENTITY_HUMANOID, HumanoidGolemPartType::values, HumanoidGolemPartType.BODY, () -> HumanoidGolemModel::new)) .defaultLang().register(); TYPE_DOG = REGISTRATE.generic(TYPES, "dog_golem", diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/AbstractArrowMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/AbstractArrowMixin.java new file mode 100644 index 000000000..7ce51acb8 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/AbstractArrowMixin.java @@ -0,0 +1,18 @@ +package dev.xkmc.modulargolems.mixin; + +import com.llamalad7.mixinextras.injector.WrapWithCondition; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(AbstractArrow.class) +public class AbstractArrowMixin { + + @WrapWithCondition(method = "onHitEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/AbstractArrow;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V")) + public boolean modulargolems$pierce(AbstractArrow instance, Vec3 vec3) { + return instance.getPierceLevel() == 0 || !(instance.getOwner() instanceof MetalGolemEntity); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/BeltDeployerCallbacksMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/BeltDeployerCallbacksMixin.java new file mode 100644 index 000000000..b46497faf --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/BeltDeployerCallbacksMixin.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import dev.xkmc.modulargolems.compat.materials.create.automation.DeployerUpgradeRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; + +@Pseudo +@Mixin(targets = "com.simibubi.create.content.kinetics.deployer.BeltDeployerCallbacks") +public class BeltDeployerCallbacksMixin { + + @WrapOperation(method = "activate", require = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;isDamageableItem()Z")) + private static boolean modulargolems$applyItem$1(ItemStack instance, Operation original, @Local(argsOnly = true) Recipe recipe) { + if (recipe instanceof DeployerUpgradeRecipe) { + return false; + } + return original.call(instance); + } + + @WrapOperation(method = "activate", require = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getMaxDamage()I")) + private static int modulargolems$applyItem$2(ItemStack instance, Operation original, @Local(argsOnly = true) Recipe recipe) { + if (recipe instanceof DeployerUpgradeRecipe) { + return 0; + } + return original.call(instance); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/EntityAxeAttackMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/EntityAxeAttackMixin.java new file mode 100644 index 000000000..714787490 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/EntityAxeAttackMixin.java @@ -0,0 +1,33 @@ +package dev.xkmc.modulargolems.mixin; + +import com.bobmowzie.mowziesmobs.server.entity.effects.EntityAxeAttack; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; + +@Pseudo +@Mixin(EntityAxeAttack.class) +public class EntityAxeAttackMixin { + + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lcom/bobmowzie/mowziesmobs/server/entity/effects/EntityAxeAttack;dealDamage(FFFF)V")) + public void modulargolems$dealDamage(EntityAxeAttack self, float damage, float range, float arc, float applyKnockback, Operation original) { + if (self.getCaster() instanceof AbstractGolemEntity golem) + damage = Math.max(damage, (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE)); + original.call(self, damage, range, arc, applyKnockback); + } + + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z")) + public boolean modulargolems$hurt(Entity instance, DamageSource source, float amount, Operation original) { + EntityAxeAttack self = (EntityAxeAttack) (Object) this; + if (self.getCaster() instanceof AbstractGolemEntity golem) + amount = Math.max(amount, (float) golem.getAttributeValue(Attributes.ATTACK_DAMAGE)); + return original.call(instance, source, amount); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/EntityMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/EntityMixin.java new file mode 100644 index 000000000..8e8e24a7e --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/EntityMixin.java @@ -0,0 +1,21 @@ +package dev.xkmc.modulargolems.mixin; + +import dev.xkmc.modulargolems.content.entity.common.GuardedEntity; +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Entity.class) +public class EntityMixin { + + @Inject(at = @At("HEAD"), method = "setRemoved") + public void modulargolems$setRemoved(Entity.RemovalReason reason, CallbackInfo ci) { + Object self = this; + if (self instanceof GuardedEntity e) { + e.onRemove(reason); + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/IgnisExplosionMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/IgnisExplosionMixin.java new file mode 100644 index 000000000..eca8776df --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/IgnisExplosionMixin.java @@ -0,0 +1,39 @@ +package dev.xkmc.modulargolems.mixin; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; + +@Pseudo +@Mixin(targets = "com.github.L_Ender.cataclysm.util.CustomExplosion.IgnisExplosion") +public abstract class IgnisExplosionMixin extends Explosion { + + @Shadow + @Final + private ObjectArrayList toBlow; + + public IgnisExplosionMixin(Level p_46024_, @Nullable Entity p_46025_, double p_46026_, double p_46027_, double p_46028_, float p_46029_, List p_46030_) { + super(p_46024_, p_46025_, p_46026_, p_46027_, p_46028_, p_46029_, p_46030_); + } + + @Override + public void clearToBlow() { + toBlow.clear(); + } + + @Override + public @NotNull List getToBlow() { + return toBlow; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/LivingEntityMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/LivingEntityMixin.java index 137b722d3..3e644bd94 100644 --- a/src/main/java/dev/xkmc/modulargolems/mixin/LivingEntityMixin.java +++ b/src/main/java/dev/xkmc/modulargolems/mixin/LivingEntityMixin.java @@ -5,7 +5,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; import dev.xkmc.modulargolems.content.entity.common.GolemFlags; -import dev.xkmc.modulargolems.content.item.equipments.GolemEquipmentItem; +import dev.xkmc.modulargolems.content.item.equipments.IGolemEquipmentItem; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; @@ -17,6 +17,7 @@ import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { @@ -25,19 +26,19 @@ public LivingEntityMixin(EntityType type, Level level) { super(type, level); } - @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;travel(Lnet/minecraft/world/phys/Vec3;)V"), method = "aiStep") - public void modulargolems$travelRiddenByGolem(LivingEntity le, Vec3 vec3, Operation op) { + @ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;travel(Lnet/minecraft/world/phys/Vec3;)V"), method = "aiStep") + public Vec3 modulargolems$travelRiddenByGolem(Vec3 vec3) { + LivingEntity le = (LivingEntity) (Object) this; if (le.getControllingPassenger() instanceof AbstractGolemEntity && !(le instanceof AbstractGolemEntity)) { - op.call(le, vec3.normalize()); - } else { - op.call(le, vec3); + return vec3.normalize(); } + return vec3; } @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getAttributeModifiers(Lnet/minecraft/world/entity/EquipmentSlot;)Lcom/google/common/collect/Multimap;"), method = "collectEquipmentChanges") public Multimap modulargolems$collectEquipmentChanges$specialEquipment(ItemStack stack, EquipmentSlot slot, Operation> op) { - if (stack.getItem() instanceof GolemEquipmentItem item) { + if (stack.getItem() instanceof IGolemEquipmentItem item) { return item.getGolemModifiers(stack, this, slot); } else { return op.call(stack, slot); @@ -46,7 +47,7 @@ public LivingEntityMixin(EntityType type, Level level) { @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;position()Lnet/minecraft/world/phys/Vec3;"), method = "dropExperience") public Vec3 modulargolems$dropExperience$moveToGolem(LivingEntity killed, Operation original) { - if (killed.getLastHurtMob() instanceof AbstractGolemEntity e) { + if (killed.getLastHurtByMob() instanceof AbstractGolemEntity e) { if (e.hasFlag(GolemFlags.PICKUP)) { return e.position(); } diff --git a/src/main/java/dev/xkmc/modulargolems/mixin/ScreenMixin.java b/src/main/java/dev/xkmc/modulargolems/mixin/ScreenMixin.java new file mode 100644 index 000000000..31cee8d20 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/mixin/ScreenMixin.java @@ -0,0 +1,31 @@ +package dev.xkmc.modulargolems.mixin; + +import dev.xkmc.modulargolems.content.menu.table.TableTab; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(Screen.class) +public class ScreenMixin { + + @Shadow + @Final + public List renderables; + + @Inject(method = "rebuildWidgets", at = @At("HEAD")) + public void modulargolems$rebuildWidgets(CallbackInfo ci) { + for (var e : renderables) { + if (e instanceof TableTab tab) { + tab.reinitIfMatched((Screen) (Object) this); + } + } + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/util/EsterEggUtil.java b/src/main/java/dev/xkmc/modulargolems/util/EsterEggUtil.java new file mode 100644 index 000000000..b3018ae75 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/util/EsterEggUtil.java @@ -0,0 +1,50 @@ +package dev.xkmc.modulargolems.util; + +import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.content.client.override.ModelOverride; +import dev.xkmc.modulargolems.content.client.override.ModelOverrides; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.entity.metalgolem.MetalGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemFacade; +import dev.xkmc.modulargolems.init.ModularGolems; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fml.ModList; + +import java.util.Locale; + +public class EsterEggUtil { + + public static void registerEsterEggTextures() { + + ModelOverrides.registerOverride(ModularGolems.loc("netherite"), ModelOverride.texturePredicate( + e -> isKobe(e) ? "_kobe" : "" + )); + + } + + private static boolean isKobe(AbstractGolemEntity e) { + if (!hasFacadeWithMaterial(e, ModularGolems.loc("netherite"))) { + return false; + } + String id = e.getDisplayName().getString().toLowerCase(Locale.ROOT); + return id.equals("kobe") || id.equals("kobe bryant") || id.equals("manba") || id.equals("科比") || id.equals("科比·布莱恩特") || id.equals("曼巴") || id.equals("牢大"); + } + + private static boolean hasFacadeWithMaterial(AbstractGolemEntity e, ResourceLocation material) { + if (ModList.get().isLoaded("curios")) { + var opt = CurioCompatRegistry.getItem(e, "golem_skin"); + if (opt.isPresent() && opt.get().getItem() instanceof GolemFacade) { + return GolemFacade.getMaterial(opt.get()).equals(material); + } + } + if (e instanceof MetalGolemEntity) { + for (var tex : e.getMaterials()) { + if (!tex.id().equals(material)) { + return false; + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/dev/xkmc/modulargolems/util/GolemUtils.java b/src/main/java/dev/xkmc/modulargolems/util/GolemUtils.java new file mode 100644 index 000000000..fc5397375 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/util/GolemUtils.java @@ -0,0 +1,68 @@ +package dev.xkmc.modulargolems.util; + +import dev.xkmc.modulargolems.compat.curio.CurioCompatRegistry; +import dev.xkmc.modulargolems.content.entity.common.AbstractGolemEntity; +import dev.xkmc.modulargolems.content.item.golem.GolemHolder; +import dev.xkmc.modulargolems.events.event.GolemCollectItemEvent; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.ModList; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class GolemUtils { + + public static float adjustedDamage(float base, float bonus) { + if (bonus > base) { + return (float) Math.sqrt(bonus / base) * base * 2; + } else return base + bonus; + } + + public static List collectFromGolem(Level level, ItemStack golem, boolean getUpgrades) { + List ans = new ArrayList<>(); + if (!(golem.getItem() instanceof GolemHolder holder)) + return ans; + var root = golem.getTag(); + if (root == null) return ans; + if (root.contains(GolemHolder.KEY_EQUIPMENTS, Tag.TAG_COMPOUND)) { + var equipMap = root.getCompound(GolemHolder.KEY_EQUIPMENTS); + for (var ent : equipMap.getAllKeys()) { + if (!equipMap.contains(ent, Tag.TAG_COMPOUND)) continue; + var item = ItemStack.of(equipMap.getCompound(ent)); + if (!item.isEmpty()) { + ans.add(item); + } + } + } + if (root.contains(GolemHolder.KEY_ENTITY, Tag.TAG_COMPOUND)) { + AbstractGolemEntity entity = holder.createDummy(golem, level); + if (entity != null) { + entity.addItemsToList(ans); + if (ModList.get().isLoaded(CuriosApi.MODID)) { + CurioCompatRegistry.getAllItems(entity, ans); + } + MinecraftForge.EVENT_BUS.post(new GolemCollectItemEvent(entity, ans)); + } + } + if (getUpgrades) { + Map upgrades = new LinkedHashMap<>(); + for (var e : GolemHolder.getUpgrades(golem)) { + if (!upgrades.containsKey(e.asItem())) { + upgrades.put(e.asItem(), e.asItem().getDefaultInstance()); + } else { + upgrades.get(e.asItem()).grow(1); + } + } + ans.addAll(upgrades.values()); + } + return ans; + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/util/TNTLauncher.java b/src/main/java/dev/xkmc/modulargolems/util/TNTLauncher.java new file mode 100644 index 000000000..a368bdcde --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/util/TNTLauncher.java @@ -0,0 +1,50 @@ +package dev.xkmc.modulargolems.util; + +import dev.xkmc.mob_weapon_api.util.Estimator; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public class TNTLauncher { + + @Nullable + public static PrimedTnt getTNTEntity(LivingEntity owner, Vec3 pos, LivingEntity target) { + PrimedTnt e = new PrimedTnt(owner.level(), pos.x(), pos.y(), + pos.z(), owner); + Estimator.EstiResult er = setAim(owner, target, 3, 128, e, 0.04, 0.02, 80); + if (er.getType() == Estimator.EstiType.ZERO) { + e.setDeltaMovement(er.getVec()); + e.setFuse((int) Math.round(er.getT())); + } else return null; + return e; + } + + public static Estimator.EstiResult setAim(LivingEntity pl, LivingEntity target, double velo, double reach, Entity e, double g, double k, int maxt) { + if (target.position().distanceTo(pl.position()) < velo) + return Estimator.EstiType.CLOSE; + Vec3 mot = target.getDeltaMovement(); + Vec3 tar = target.position().add(0, target.getBbHeight() / 2, 0); + Vec3 pos = e.position(); + Estimator.EstiResult er = new Estimator(g, k, pos, velo, maxt, tar, mot).getAnswer(); + if (er.getType() == Estimator.EstiType.ZERO) + return er; + return Estimator.EstiType.FAIL; + } + + public static void setDire(float xRot, float yRot, float velo, net.minecraft.world.entity.Entity ent) { + float f = -Mth.sin(yRot * ((float) Math.PI / 180F)) * Mth.cos(xRot * ((float) Math.PI / 180F)); + float f1 = -Mth.sin(xRot * ((float) Math.PI / 180F)); + float f2 = Mth.cos(yRot * ((float) Math.PI / 180F)) * Mth.cos(xRot * ((float) Math.PI / 180F)); + Vec3 v = new Vec3(f, f1, f2).normalize().scale(velo); + ent.setDeltaMovement(v); + float f3 = Mth.sqrt((float) v.horizontalDistanceSqr()); + ent.setYRot((float) (Mth.atan2(v.x, v.z) * (180F / (float) Math.PI))); + ent.setXRot((float) (Mth.atan2(v.y, f3) * (180F / (float) Math.PI))); + ent.xRotO = ent.getXRot(); + ent.yRotO = ent.getYRot(); + } + +} diff --git a/src/main/java/dev/xkmc/modulargolems/util/package-info.java b/src/main/java/dev/xkmc/modulargolems/util/package-info.java new file mode 100644 index 000000000..fbdb39221 --- /dev/null +++ b/src/main/java/dev/xkmc/modulargolems/util/package-info.java @@ -0,0 +1,8 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault + +package dev.xkmc.modulargolems.util; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index bdf2a6918..a672f3eaa 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -2,4 +2,7 @@ public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_2 public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_26049_ # randomInterval public net.minecraft.world.entity.ai.goal.target.TargetGoal f_26136_ # mustSee public net.minecraft.world.entity.ai.goal.target.TargetGoal f_26131_ # mustReach -public net.minecraft.world.entity.LivingEntity f_20899_ # jumping \ No newline at end of file +public net.minecraft.world.entity.LivingEntity f_20899_ # jumping +public-f net.minecraft.world.entity.Entity m_20343_(DDD)V # setPosRaw + +public-f net.minecraft.client.model.geom.ModelPart f_104213_ # children \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 2f37d2232..9d5438e4f 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -26,9 +26,20 @@ This mod adds golems that can be crafted with different materials in a Tinker-li [[dependencies.modulargolems]] modId="l2library" mandatory=true - versionRange="[2.4.22,)" + versionRange="[2.5.3,)" ordering="AFTER" side="BOTH" + +[[dependencies.modulargolems]] + modId="l2complements" + mandatory=false + versionRange="[2.6.1,)" + side="BOTH" +[[dependencies.modulargolems]] + modId="l2archery" + mandatory=false + versionRange="[2.5.0,)" + side="BOTH" [[dependencies.modulargolems]] modId="curios" mandatory=false @@ -38,4 +49,14 @@ This mod adds golems that can be crafted with different materials in a Tinker-li modId="touhou_little_maid" mandatory=false versionRange="[1.1.9,)" + side="BOTH" +[[dependencies.modulargolems]] + modId="cataclysm" + mandatory=false + versionRange="[3.11,)" + side="BOTH" +[[dependencies.modulargolems]] + modId="alexscaves" + mandatory=false + versionRange="[2.0.2,)" side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/alexscaves/textures/entity/dog_golem/candy.png b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/candy.png new file mode 100644 index 000000000..806f0a15e Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/candy.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic.png b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic.png new file mode 100644 index 000000000..632bd332b Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic_emissive.png new file mode 100644 index 000000000..d3b460e12 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/magnetic_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear.png b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear.png new file mode 100644 index 000000000..515567164 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear_emissive.png new file mode 100644 index 000000000..0d5396969 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/dog_golem/nuclear_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/candy.png b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/candy.png new file mode 100644 index 000000000..3f717be02 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/candy.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic.png b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic.png new file mode 100644 index 000000000..6ec0f4c80 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic_emissive.png new file mode 100644 index 000000000..fc8f60031 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/magnetic_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear.png b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear.png new file mode 100644 index 000000000..256a6603c Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear_emissive.png new file mode 100644 index 000000000..bf0b9fae8 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/humanoid_golem/nuclear_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy.png new file mode 100644 index 000000000..57abcecb4 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy_emissive.png new file mode 100644 index 000000000..27b85b1a9 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/candy_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic.png new file mode 100644 index 000000000..e7eb9e5b0 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic_emissive.png new file mode 100644 index 000000000..c91ccf99e Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/magnetic_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear.png new file mode 100644 index 000000000..429932c82 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear.png differ diff --git a/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear_emissive.png b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear_emissive.png new file mode 100644 index 000000000..f76b58719 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/entity/metal_golem/nuclear_emissive.png differ diff --git a/src/main/resources/assets/alexscaves/textures/item/candy_construct.png b/src/main/resources/assets/alexscaves/textures/item/candy_construct.png new file mode 100644 index 000000000..66ddb2ccc Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/item/candy_construct.png differ diff --git a/src/main/resources/assets/alexscaves/textures/item/candy_mixture.png b/src/main/resources/assets/alexscaves/textures/item/candy_mixture.png new file mode 100644 index 000000000..7459e3edc Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/item/candy_mixture.png differ diff --git a/src/main/resources/assets/alexscaves/textures/item/magnetic_alloy.png b/src/main/resources/assets/alexscaves/textures/item/magnetic_alloy.png new file mode 100644 index 000000000..c35c2a4f3 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/item/magnetic_alloy.png differ diff --git a/src/main/resources/assets/alexscaves/textures/item/magnetic_construct.png b/src/main/resources/assets/alexscaves/textures/item/magnetic_construct.png new file mode 100644 index 000000000..22b9652a6 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/item/magnetic_construct.png differ diff --git a/src/main/resources/assets/alexscaves/textures/item/nuclear_construct.png b/src/main/resources/assets/alexscaves/textures/item/nuclear_construct.png new file mode 100644 index 000000000..21e6f1582 Binary files /dev/null and b/src/main/resources/assets/alexscaves/textures/item/nuclear_construct.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/dog_golem/allthemodium.png b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/allthemodium.png new file mode 100644 index 000000000..ebe70abaf Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/allthemodium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/dog_golem/unobtainium.png b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/unobtainium.png new file mode 100644 index 000000000..d7ca0a545 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/unobtainium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/dog_golem/vibranium.png b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/vibranium.png new file mode 100644 index 000000000..53c81fe52 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/dog_golem/vibranium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/allthemodium.png b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/allthemodium.png new file mode 100644 index 000000000..d91e006fa Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/allthemodium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/unobtainium.png b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/unobtainium.png new file mode 100644 index 000000000..e852bdb28 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/unobtainium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/vibranium.png b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/vibranium.png new file mode 100644 index 000000000..427d21a25 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/humanoid_golem/vibranium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/metal_golem/allthemodium.png b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/allthemodium.png new file mode 100644 index 000000000..c3e2ee0ac Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/allthemodium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/metal_golem/unobtainium.png b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/unobtainium.png new file mode 100644 index 000000000..d543b5846 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/unobtainium.png differ diff --git a/src/main/resources/assets/allthemodium/textures/entity/metal_golem/vibranium.png b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/vibranium.png new file mode 100644 index 000000000..7264a9cb2 Binary files /dev/null and b/src/main/resources/assets/allthemodium/textures/entity/metal_golem/vibranium.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ancient_metal.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ancient_metal.png new file mode 100644 index 000000000..7a39e2ca0 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ancient_metal.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium.png new file mode 100644 index 000000000..2e5cfb291 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium_emissive.png new file mode 100644 index 000000000..7c7b08772 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/cursium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian.png new file mode 100644 index 000000000..a654f6121 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian_emissive.png new file mode 100644 index 000000000..dc09f022c Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ender_guardian_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_emissive.png new file mode 100644 index 000000000..6a989bd25 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_soul_emissive.png new file mode 100644 index 000000000..f1f1b53a7 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/ignitium_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/storm.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/storm.png new file mode 100644 index 000000000..8f857c791 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/storm.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/dog_golem/witherite_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/witherite_emissive.png new file mode 100644 index 000000000..035f4ffe0 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/dog_golem/witherite_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ancient_metal.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ancient_metal.png new file mode 100644 index 000000000..d4069dee8 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ancient_metal.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium.png new file mode 100644 index 000000000..258cfe3f0 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium_emissive.png new file mode 100644 index 000000000..0ff35613c Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/cursium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian.png new file mode 100644 index 000000000..6ac562480 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian_emissive.png new file mode 100644 index 000000000..70d477ff2 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ender_guardian_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_emissive.png new file mode 100644 index 000000000..9fd106833 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_soul_emissive.png new file mode 100644 index 000000000..648e7973e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/ignitium_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/storm.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/storm.png new file mode 100644 index 000000000..4770c59f4 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/storm.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/witherite_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/witherite_emissive.png new file mode 100644 index 000000000..382f99380 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/humanoid_golem/witherite_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ancient_metal.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ancient_metal.png new file mode 100644 index 000000000..be15ff85e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ancient_metal.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium.png new file mode 100644 index 000000000..2d1e85fb1 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium_emissive.png new file mode 100644 index 000000000..b2377ae4e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/cursium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian.png new file mode 100644 index 000000000..4a24cd92e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian_emissive.png new file mode 100644 index 000000000..e22189862 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ender_guardian_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_emissive.png new file mode 100644 index 000000000..1aba2892e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_soul_emissive.png new file mode 100644 index 000000000..aaaf8abbf Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/ignitium_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/storm.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/storm.png new file mode 100644 index 000000000..9f26a18e8 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/storm.png differ diff --git a/src/main/resources/assets/cataclysm/textures/entity/metal_golem/witherite_emissive.png b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/witherite_emissive.png new file mode 100644 index 000000000..e127f7cad Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/entity/metal_golem/witherite_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate.png new file mode 100644 index 000000000..a279175f4 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate_emissive.png new file mode 100644 index 000000000..e445b4bd8 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_chestplate_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet.png new file mode 100644 index 000000000..e9ffb68e6 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet_emissive.png new file mode 100644 index 000000000..9fde705bb Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_helmet_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard.png new file mode 100644 index 000000000..348241dae Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard_emissive.png new file mode 100644 index 000000000..039ddc373 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/harbinger_shinguard_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate.png new file mode 100644 index 000000000..53877b9af Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_emissive.png new file mode 100644 index 000000000..16c506772 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul.png new file mode 100644 index 000000000..6f5cb24a5 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul_emissive.png new file mode 100644 index 000000000..c65d04545 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_chestplate_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet.png new file mode 100644 index 000000000..39e3a1966 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_emissive.png new file mode 100644 index 000000000..8c127194c Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul.png new file mode 100644 index 000000000..00efc3372 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul_emissive.png new file mode 100644 index 000000000..84a063c75 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_helmet_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard.png new file mode 100644 index 000000000..fbfc1aa40 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_emissive.png new file mode 100644 index 000000000..8ac28333b Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul.png new file mode 100644 index 000000000..499983d52 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul_emissive.png new file mode 100644 index 000000000..a3fd1cdf8 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/ignis_shinguard_soul_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate.png b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate.png new file mode 100644 index 000000000..2bdab5b88 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate_emissive.png new file mode 100644 index 000000000..19265ab46 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_chestplate_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/maledictus_helmet.png b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_helmet.png new file mode 100644 index 000000000..99a858ba1 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/maledictus_shinguard.png b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_shinguard.png new file mode 100644 index 000000000..99a858ba1 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/maledictus_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate.png new file mode 100644 index 000000000..62301d5bd Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate_emissive.png new file mode 100644 index 000000000..0ee67be85 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_chestplate_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet.png new file mode 100644 index 000000000..cd7a0cd0e Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet_emissive.png new file mode 100644 index 000000000..6332e1522 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_helmet_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard.png new file mode 100644 index 000000000..d2ba5367a Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard_emissive.png b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard_emissive.png new file mode 100644 index 000000000..7b436902a Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/equipments/monstrosity_shinguard_emissive.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/azure_cube.png b/src/main/resources/assets/cataclysm/textures/item/azure_cube.png new file mode 100644 index 000000000..f44a262dc Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/azure_cube.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_chestplate.png b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_chestplate.png new file mode 100644 index 000000000..32a6a1c1d Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_helmet.png b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_helmet.png new file mode 100644 index 000000000..b7472ae65 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_shinguard.png b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_shinguard.png new file mode 100644 index 000000000..57ee5f742 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/harbinger_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_chestplate.png b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_chestplate.png new file mode 100644 index 000000000..29ba89fe0 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_helmet.png b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_helmet.png new file mode 100644 index 000000000..64e034aa7 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_shinguard.png b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_shinguard.png new file mode 100644 index 000000000..2cbe6ac51 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/ignis_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_chestplate.png b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_chestplate.png new file mode 100644 index 000000000..2b8da4a5d Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_helmet.png b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_helmet.png new file mode 100644 index 000000000..c548c9f9a Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_shinguard.png b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_shinguard.png new file mode 100644 index 000000000..223940b6b Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/maledictus_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_chestplate.png b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_chestplate.png new file mode 100644 index 000000000..fb2a0cbbe Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_chestplate.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_helmet.png b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_helmet.png new file mode 100644 index 000000000..029b57100 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_helmet.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_shinguard.png b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_shinguard.png new file mode 100644 index 000000000..c5ddf66b5 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/equipments/monstrosity_shinguard.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png b/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png new file mode 100644 index 000000000..918dadfb1 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png.mcmeta b/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png.mcmeta new file mode 100644 index 000000000..bec44e639 --- /dev/null +++ b/src/main/resources/assets/cataclysm/textures/item/harbinger_upgrade_template.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": + { + "frametime": 4 + } +} diff --git a/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png b/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png new file mode 100644 index 000000000..9a8c03851 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png.mcmeta b/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png.mcmeta new file mode 100644 index 000000000..bec44e639 --- /dev/null +++ b/src/main/resources/assets/cataclysm/textures/item/monstrosity_upgrade_template.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": + { + "frametime": 4 + } +} diff --git a/src/main/resources/assets/cataclysm/textures/item/storm_construct.png b/src/main/resources/assets/cataclysm/textures/item/storm_construct.png new file mode 100644 index 000000000..6531345f9 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/storm_construct.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/upgrades/scylla_lightning_upgrade.png b/src/main/resources/assets/cataclysm/textures/item/upgrades/scylla_lightning_upgrade.png new file mode 100644 index 000000000..6df1caf99 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/upgrades/scylla_lightning_upgrade.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/void_construct.png b/src/main/resources/assets/cataclysm/textures/item/void_construct.png new file mode 100644 index 000000000..807407432 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/void_construct.png differ diff --git a/src/main/resources/assets/cataclysm/textures/item/void_cube.png b/src/main/resources/assets/cataclysm/textures/item/void_cube.png new file mode 100644 index 000000000..4b45cb331 Binary files /dev/null and b/src/main/resources/assets/cataclysm/textures/item/void_cube.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/allay_steel.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/allay_steel.png new file mode 100644 index 000000000..e2bb706a4 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/allay_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel.png new file mode 100644 index 000000000..9754ab40c Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel_emissive.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel_emissive.png new file mode 100644 index 000000000..917075501 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/dungeon_steel_emissive.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/etherite.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/etherite.png new file mode 100644 index 000000000..5793a092c Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/etherite.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/obsidian_steel.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/obsidian_steel.png new file mode 100644 index 000000000..8f5298d13 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/obsidian_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/dog_golem/primitive.png b/src/main/resources/assets/composite_material/textures/entity/dog_golem/primitive.png new file mode 100644 index 000000000..2e0729a0d Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/dog_golem/primitive.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/allay_steel.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/allay_steel.png new file mode 100644 index 000000000..4e1cd29b5 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/allay_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel.png new file mode 100644 index 000000000..c783e71c7 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel_emissive.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel_emissive.png new file mode 100644 index 000000000..c82a435b7 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/dungeon_steel_emissive.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/etherite.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/etherite.png new file mode 100644 index 000000000..420c0b96e Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/etherite.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/obsidian_steel.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/obsidian_steel.png new file mode 100644 index 000000000..aafa2ea2b Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/obsidian_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/primitive.png b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/primitive.png new file mode 100644 index 000000000..6d291ad9e Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/humanoid_golem/primitive.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/allay_steel.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/allay_steel.png new file mode 100644 index 000000000..e683eb1c1 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/allay_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel.png new file mode 100644 index 000000000..b35a5cb50 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel_emissive.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel_emissive.png new file mode 100644 index 000000000..9bf13649d Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/dungeon_steel_emissive.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/etherite.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/etherite.png new file mode 100644 index 000000000..ac1365563 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/etherite.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/obsidian_steel.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/obsidian_steel.png new file mode 100644 index 000000000..c1eba1661 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/obsidian_steel.png differ diff --git a/src/main/resources/assets/composite_material/textures/entity/metal_golem/primitive.png b/src/main/resources/assets/composite_material/textures/entity/metal_golem/primitive.png new file mode 100644 index 000000000..29e038e6d Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/entity/metal_golem/primitive.png differ diff --git a/src/main/resources/assets/composite_material/textures/item/upgrades/etherite.png b/src/main/resources/assets/composite_material/textures/item/upgrades/etherite.png new file mode 100644 index 000000000..2542eecf7 Binary files /dev/null and b/src/main/resources/assets/composite_material/textures/item/upgrades/etherite.png differ diff --git a/src/main/resources/assets/create/textures/entity/dog_golem/cardboard.png b/src/main/resources/assets/create/textures/entity/dog_golem/cardboard.png new file mode 100644 index 000000000..0dfa309a6 Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/dog_golem/cardboard.png differ diff --git a/src/main/resources/assets/create/textures/entity/humanoid_golem/cardboard.png b/src/main/resources/assets/create/textures/entity/humanoid_golem/cardboard.png new file mode 100644 index 000000000..38e8c95de Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/humanoid_golem/cardboard.png differ diff --git a/src/main/resources/assets/create/textures/entity/metal_golem/cardboard.png b/src/main/resources/assets/create/textures/entity/metal_golem/cardboard.png new file mode 100644 index 000000000..a86cf444c Binary files /dev/null and b/src/main/resources/assets/create/textures/entity/metal_golem/cardboard.png differ diff --git a/src/main/resources/assets/create/textures/item/equipments/mechanical_arm.png b/src/main/resources/assets/create/textures/item/equipments/mechanical_arm.png new file mode 100644 index 000000000..02e64d5d1 Binary files /dev/null and b/src/main/resources/assets/create/textures/item/equipments/mechanical_arm.png differ diff --git a/src/main/resources/assets/goety/textures/entity/dog_golem/cursed_metal.png b/src/main/resources/assets/goety/textures/entity/dog_golem/cursed_metal.png new file mode 100644 index 000000000..9bf935586 Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/dog_golem/cursed_metal.png differ diff --git a/src/main/resources/assets/goety/textures/entity/dog_golem/dark_metal.png b/src/main/resources/assets/goety/textures/entity/dog_golem/dark_metal.png new file mode 100644 index 000000000..10f9e9b51 Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/dog_golem/dark_metal.png differ diff --git a/src/main/resources/assets/goety/textures/entity/humanoid_golem/cursed_metal.png b/src/main/resources/assets/goety/textures/entity/humanoid_golem/cursed_metal.png new file mode 100644 index 000000000..e81f4b6b4 Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/humanoid_golem/cursed_metal.png differ diff --git a/src/main/resources/assets/goety/textures/entity/humanoid_golem/dark_metal.png b/src/main/resources/assets/goety/textures/entity/humanoid_golem/dark_metal.png new file mode 100644 index 000000000..763f81bec Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/humanoid_golem/dark_metal.png differ diff --git a/src/main/resources/assets/goety/textures/entity/metal_golem/cursed_metal.png b/src/main/resources/assets/goety/textures/entity/metal_golem/cursed_metal.png new file mode 100644 index 000000000..ce8ff45ad Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/metal_golem/cursed_metal.png differ diff --git a/src/main/resources/assets/goety/textures/entity/metal_golem/dark_metal.png b/src/main/resources/assets/goety/textures/entity/metal_golem/dark_metal.png new file mode 100644 index 000000000..95bf09848 Binary files /dev/null and b/src/main/resources/assets/goety/textures/entity/metal_golem/dark_metal.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/apostle.png b/src/main/resources/assets/goety/textures/item/upgrades/apostle.png new file mode 100644 index 000000000..96a424555 Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/apostle.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/fire_blast.png b/src/main/resources/assets/goety/textures/item/upgrades/fire_blast.png new file mode 100644 index 000000000..7dd338e22 Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/fire_blast.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/fire_tornado.png b/src/main/resources/assets/goety/textures/item/upgrades/fire_tornado.png new file mode 100644 index 000000000..f0862e7e5 Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/fire_tornado.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/hell_blast.png b/src/main/resources/assets/goety/textures/item/upgrades/hell_blast.png new file mode 100644 index 000000000..ea3d7bc62 Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/hell_blast.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/hell_bolt.png b/src/main/resources/assets/goety/textures/item/upgrades/hell_bolt.png new file mode 100644 index 000000000..d27f34d3c Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/hell_bolt.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/hell_cloud.png b/src/main/resources/assets/goety/textures/item/upgrades/hell_cloud.png new file mode 100644 index 000000000..2421ce171 Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/hell_cloud.png differ diff --git a/src/main/resources/assets/goety/textures/item/upgrades/soul_collection.png b/src/main/resources/assets/goety/textures/item/upgrades/soul_collection.png new file mode 100644 index 000000000..449be983d Binary files /dev/null and b/src/main/resources/assets/goety/textures/item/upgrades/soul_collection.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/entity/dog_golem/apocalyptium.png b/src/main/resources/assets/goety_revelation/textures/entity/dog_golem/apocalyptium.png new file mode 100644 index 000000000..93f82e70a Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/entity/dog_golem/apocalyptium.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/entity/humanoid_golem/apocalyptium.png b/src/main/resources/assets/goety_revelation/textures/entity/humanoid_golem/apocalyptium.png new file mode 100644 index 000000000..4f9d655db Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/entity/humanoid_golem/apocalyptium.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/entity/metal_golem/apocalyptium.png b/src/main/resources/assets/goety_revelation/textures/entity/metal_golem/apocalyptium.png new file mode 100644 index 000000000..eb7e744d3 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/entity/metal_golem/apocalyptium.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_boots.png b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_boots.png new file mode 100644 index 000000000..5e44db761 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_boots.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_chestplate.png b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_chestplate.png new file mode 100644 index 000000000..5e44db761 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_chestplate.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_helmet.png b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_helmet.png new file mode 100644 index 000000000..5e44db761 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_helmet.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_shinguard.png b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_shinguard.png new file mode 100644 index 000000000..5e44db761 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/equipments/apocalyptium_shinguard.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_boots.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_boots.png new file mode 100644 index 000000000..9d7ddba33 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_boots.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_chestplate.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_chestplate.png new file mode 100644 index 000000000..9f64fdab4 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_chestplate.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_helmet.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_helmet.png new file mode 100644 index 000000000..72dace12f Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_helmet.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_shinguard.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_shinguard.png new file mode 100644 index 000000000..c0ad71a10 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/apocalyptium_shinguard.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse.png new file mode 100644 index 000000000..44c4e3735 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse_icon.png b/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse_icon.png new file mode 100644 index 000000000..ea2ef32c8 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/equipments/stellar_apocalypse_icon.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_abhorrent.png b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_abhorrent.png new file mode 100644 index 000000000..ee3946679 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_abhorrent.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_atrocious.png b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_atrocious.png new file mode 100644 index 000000000..4b028f6fe Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_atrocious.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_profane.png b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_profane.png new file mode 100644 index 000000000..4dff3dee4 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_profane.png differ diff --git a/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_terrible.png b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_terrible.png new file mode 100644 index 000000000..5574978f6 Binary files /dev/null and b/src/main/resources/assets/goety_revelation/textures/item/upgrades/the_terrible.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/dog_golem/fire_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/fire_dragonsteel.png new file mode 100644 index 000000000..35d27161f Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/fire_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/dog_golem/ice_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/ice_dragonsteel.png new file mode 100644 index 000000000..12ab17271 Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/ice_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/dog_golem/lightning_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/lightning_dragonsteel.png new file mode 100644 index 000000000..cb189b5f3 Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/dog_golem/lightning_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/fire_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/fire_dragonsteel.png new file mode 100644 index 000000000..875966218 Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/fire_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/ice_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/ice_dragonsteel.png new file mode 100644 index 000000000..2ea6f438f Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/ice_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/lightning_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/lightning_dragonsteel.png new file mode 100644 index 000000000..0c48c4fdb Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/humanoid_golem/lightning_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/metal_golem/fire_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/fire_dragonsteel.png new file mode 100644 index 000000000..b02db8b7d Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/fire_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/metal_golem/ice_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/ice_dragonsteel.png new file mode 100644 index 000000000..09255a22f Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/ice_dragonsteel.png differ diff --git a/src/main/resources/assets/iceandfire/textures/entity/metal_golem/lightning_dragonsteel.png b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/lightning_dragonsteel.png new file mode 100644 index 000000000..3e25bedc3 Binary files /dev/null and b/src/main/resources/assets/iceandfire/textures/entity/metal_golem/lightning_dragonsteel.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/dog_golem/chaotic.png b/src/main/resources/assets/l2hostility/textures/entity/dog_golem/chaotic.png new file mode 100644 index 000000000..b9f1cb2ac Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/dog_golem/chaotic.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/dog_golem/miraculous.png b/src/main/resources/assets/l2hostility/textures/entity/dog_golem/miraculous.png new file mode 100644 index 000000000..ccfac5666 Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/dog_golem/miraculous.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/chaotic.png b/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/chaotic.png new file mode 100644 index 000000000..65b5a6b19 Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/chaotic.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/miraculous.png b/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/miraculous.png new file mode 100644 index 000000000..28dcc6160 Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/humanoid_golem/miraculous.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/metal_golem/chaotic.png b/src/main/resources/assets/l2hostility/textures/entity/metal_golem/chaotic.png new file mode 100644 index 000000000..b63e868d6 Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/metal_golem/chaotic.png differ diff --git a/src/main/resources/assets/l2hostility/textures/entity/metal_golem/miraculous.png b/src/main/resources/assets/l2hostility/textures/entity/metal_golem/miraculous.png new file mode 100644 index 000000000..b0b72303c Binary files /dev/null and b/src/main/resources/assets/l2hostility/textures/entity/metal_golem/miraculous.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud.png b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud.png new file mode 100644 index 000000000..b6658ed95 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark.png b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark.png new file mode 100644 index 000000000..fe1f07c11 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark_emissive.png new file mode 100644 index 000000000..483b3ef56 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_dark_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_emissive.png new file mode 100644 index 000000000..69f8ccf17 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/cloud_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/molten_metal.png b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/molten_metal.png new file mode 100644 index 000000000..a7da2f945 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/dog_golem/molten_metal.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud.png b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud.png new file mode 100644 index 000000000..a7b2813d4 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark.png b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark.png new file mode 100644 index 000000000..ebb3585c9 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark_emissive.png new file mode 100644 index 000000000..b996c0125 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_dark_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_emissive.png new file mode 100644 index 000000000..6232144ab Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/cloud_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/molten_metal.png b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/molten_metal.png new file mode 100644 index 000000000..a6ff7146f Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/humanoid_golem/molten_metal.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud.png b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud.png new file mode 100644 index 000000000..e85b2eff0 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark.png b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark.png new file mode 100644 index 000000000..057baa923 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark_emissive.png new file mode 100644 index 000000000..42ccb6ba7 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_dark_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_emissive.png b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_emissive.png new file mode 100644 index 000000000..d463cb9c7 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/cloud_emissive.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/molten_metal.png b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/molten_metal.png new file mode 100644 index 000000000..bc5629c94 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/entity/metal_golem/molten_metal.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png b/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png new file mode 100644 index 000000000..596a99a0d Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png differ diff --git a/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png.mcmeta b/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png.mcmeta new file mode 100644 index 000000000..ceecb036f --- /dev/null +++ b/src/main/resources/assets/legendary_monsters/textures/item/cloud_cube.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/legendary_monsters/textures/item/upgrades/thunderstorm.png b/src/main/resources/assets/legendary_monsters/textures/item/upgrades/thunderstorm.png new file mode 100644 index 000000000..77bbfe9b3 Binary files /dev/null and b/src/main/resources/assets/legendary_monsters/textures/item/upgrades/thunderstorm.png differ diff --git a/src/main/resources/assets/modulargolems/lang/ja_jp.json b/src/main/resources/assets/modulargolems/lang/ja_jp.json new file mode 100644 index 000000000..5d19623b5 --- /dev/null +++ b/src/main/resources/assets/modulargolems/lang/ja_jp.json @@ -0,0 +1,592 @@ +{ + "attribute.name.golem_jump": "ゴーレムのジャンプ強度", + "attribute.name.golem_regen": "ゴーレムの再生速度", + "attribute.name.golem_size": "ゴーレムのサイズ", + "attribute.name.golem_sweep": "スイープ攻撃範囲", + "curios.identifier.golem_route": "ゴーレムの巡回経路", + "curios.identifier.golem_skin": "ヒューマノイドゴーレムのスキン", + "effect.modulargolems.atomic_boost": "アトミックブースト", + "effect.modulargolems.atomic_boost.description": "ゴーレムの攻撃力と移動速度を増加させる", + "effect.modulargolems.hepatizon_effect": "ヘパティゾン効果", + "effect.modulargolems.hepatizon_effect.description": "ゴーレムの防御力を増加させる", + "effect.modulargolems.maledictus_rage": "マレディクタスの激怒", + "effect.modulargolems.maledictus_rage.description": "ゴーレムの攻撃力を増加させる", + "effect.modulargolems.manyullyn_effect": "マニュリリン効果", + "effect.modulargolems.manyullyn_effect.description": "ゴーレムの攻撃力を増加させる", + "effect.modulargolems.mechanical_force": "メカニカルフォース", + "effect.modulargolems.mechanical_force.description": "ゴーレムの攻撃力を増加させる", + "effect.modulargolems.mechanical_mobility": "メカニカルモビリティ", + "effect.modulargolems.mechanical_mobility.description": "ゴーレムの移動速度を増加させる", + "entity.modulargolems.dog_golem": "犬型ゴーレム", + "entity.modulargolems.humanoid_golem": "人型ゴーレム", + "entity.modulargolems.metal_golem": "金属ゴーレム", + "golem_material.alexscaves.candy": "キャンディ", + "golem_material.alexscaves.magnetic": "マグネティック", + "golem_material.alexscaves.nuclear": "ニュークリア", + "golem_material.allthemodium.allthemodium": "オールザモディウム", + "golem_material.allthemodium.unobtainium": "アンオブテイニウム", + "golem_material.allthemodium.vibranium": "ヴィブラニウム", + "golem_material.blazegear.brimsteel": "ブリムスティール", + "golem_material.botania.elementium": "エレメンティウム", + "golem_material.botania.manasteel": "マナスチール", + "golem_material.botania.terrasteel": "テラステール", + "golem_material.cataclysm.ancient_metal": "古代金属", + "golem_material.cataclysm.cursium": "カーシウム", + "golem_material.cataclysm.ender_guardian": "エンダーガーディアン", + "golem_material.cataclysm.ignitium": "イグニチウム", + "golem_material.cataclysm.storm": "ストーム", + "golem_material.cataclysm.witherite": "ウィザライト", + "golem_material.create.andesite_alloy": "安山岩合金", + "golem_material.create.brass": "真鍮", + "golem_material.create.cardboard": "段ボール", + "golem_material.create.railway": "鉄道", + "golem_material.create.zinc": "亜鉛", + "golem_material.goety.cursed_metal": "呪われた金属", + "golem_material.goety.dark_metal": "ダークメタル", + "golem_material.goety_revelation.apocalyptium": "黙示録ノ合金", + "golem_material.iceandfire.fire_dragonsteel": "火竜鋼", + "golem_material.iceandfire.ice_dragonsteel": "氷竜鋼", + "golem_material.iceandfire.lightning_dragonsteel": "雷竜鋼", + "golem_material.l2complements.eternium": "エターニウム", + "golem_material.l2complements.poseidite": "ポセイダイト", + "golem_material.l2complements.shulkerate": "シュルカレート", + "golem_material.l2complements.totemic_gold": "トーテミックゴールド", + "golem_material.l2hostility.chaotic": "カオティック", + "golem_material.l2hostility.miraculous": "ミラクルス", + "golem_material.legendary_monsters.cloud": "クラウド", + "golem_material.legendary_monsters.molten_metal": "溶解金属", + "golem_material.modulargolems.copper": "銅", + "golem_material.modulargolems.gold": "金", + "golem_material.modulargolems.iron": "鉄", + "golem_material.modulargolems.netherite": "ネザライト", + "golem_material.modulargolems.sculk": "スカルク", + "golem_material.mowziesmobs.wroughtnaut": "ロウトナウト", + "golem_material.tconstruct.amethyst_bronze": "アメジスト銅", + "golem_material.tconstruct.cobalt": "コバルト", + "golem_material.tconstruct.hepatizon": "ヘパティゾン", + "golem_material.tconstruct.manyullyn": "マンユリン", + "golem_material.tconstruct.rose_gold": "ローズゴールド", + "golem_material.twilightforest.fiery": "ファイアリー", + "golem_material.twilightforest.ironwood": "アイアンウッド", + "golem_material.twilightforest.knightmetal": "ナイトメタル", + "golem_material.twilightforest.steeleaf": "スティールリーフ", + "golem_part.dog_golem.body": "胴体: %s", + "golem_part.dog_golem.legs": "脚: %s", + "golem_part.humanoid_golem.arms": "腕: %s", + "golem_part.humanoid_golem.body": "胴体: %s", + "golem_part.humanoid_golem.legs": "脚: %s", + "golem_part.metal_golem.body": "胴体: %s", + "golem_part.metal_golem.left": "左: %s", + "golem_part.metal_golem.leg": "脚: %s", + "golem_part.metal_golem.right": "右: %s", + "golem_type.modulargolems.dog_golem": "犬型ゴーレム", + "golem_type.modulargolems.humanoid_golem": "人型ゴーレム", + "golem_type.modulargolems.metal_golem": "金属ゴーレム", + "item.modulargolems.ancient_remnant_sandstorm": "古代の遺物強化", +"item.modulargolems.apostle": "使徒覚醒強化", +"item.modulargolems.attack_high": "攻撃強化 V", +"item.modulargolems.azure_cube": "蒼鋼のキューブ", +"item.modulargolems.barbaric_vanguard_boots": "野蛮の先兵ブーツ", +"item.modulargolems.barbaric_vanguard_chestplate": "野蛮の先兵チェストプレート", +"item.modulargolems.barbaric_vanguard_helmet": "野蛮の先兵ヘルメット", +"item.modulargolems.barbaric_vanguard_shinguard": "野蛮の先兵レガース", +"item.modulargolems.beacon_boots": "光明のブーツ", +"item.modulargolems.bell": "鐘の強化", +"item.modulargolems.black_config_card": "黒の設定カード", +"item.modulargolems.blue_config_card": "青の設定カード", +"item.modulargolems.brown_config_card": "茶の設定カード", +"item.modulargolems.candy_construct": "キャンディ構造体", +"item.modulargolems.candy_mixture": "キャンディ混合物", +"item.modulargolems.carminite": "カーミナイト強化", +"item.modulargolems.cauldron": "メタ強化:大釜", +"item.modulargolems.cleanse": "ポーション強化:浄化", +"item.modulargolems.cloud_cube": "雲のキューブ", +"item.modulargolems.coating": "亜鉛強化", +"item.modulargolems.command_wand": "コマンド杖", +"item.modulargolems.curse": "ポーション強化:呪い", +"item.modulargolems.cyan_config_card": "シアンの設定カード", +"item.modulargolems.diamond": "ダイヤモンド強化", +"item.modulargolems.diamond_expansion_template": "ダイヤ拡張テンプレート", +"item.modulargolems.diamond_golem_axe": "ダイヤゴーレム斧", +"item.modulargolems.diamond_golem_spear": "ダイヤゴーレム槍", +"item.modulargolems.diamond_golem_sword": "ダイヤゴーレム剣", +"item.modulargolems.dog_golem_body": "犬ゴーレム胴体", +"item.modulargolems.dog_golem_holder": "犬ゴーレムホルダー", +"item.modulargolems.dog_golem_legs": "犬ゴーレム脚部", +"item.modulargolems.dummy_furnace": "ダミー炉", +"item.modulargolems.dummy_iron_consumer": "ダミー鉄消費機", +"item.modulargolems.dummy_uranium_consumer": "ダミーウラン消費機", +"item.modulargolems.emerald": "エメラルド強化", +"item.modulargolems.empty_upgrade": "空の強化", +"item.modulargolems.enchanted_gold": "魔法の金リンゴ強化", +"item.modulargolems.ender_guardian_void_rune": "エンダーガーディアン強化", +"item.modulargolems.ender_sight": "エンダーサイト強化", +"item.modulargolems.fiery": "炎の強化", +"item.modulargolems.fire_blast": "使徒強化:火の爆発", +"item.modulargolems.fire_immune": "火耐性強化", +"item.modulargolems.fire_tornado": "使徒強化:火の竜巻", +"item.modulargolems.float": "浮遊強化", +"item.modulargolems.force_field": "ウィザーアーマー強化", +"item.modulargolems.freezing": "ポーション強化:凍結", +"item.modulargolems.gold": "金リンゴ強化", +"item.modulargolems": "ゴーレム外観", +"item.modulargolems.golem_slicing_axe": "ゴーレムスライス斧", +"item.modulargolems.gray_config_card": "灰の設定カード", +"item.modulargolems.green_config_card": "緑の設定カード", +"item.modulargolems.harbinger_chestplate": "前触れチェストプレート", +"item.modulargolems.harbinger_helmet": "前触れヘルメット", +"item.modulargolems.harbinger_shinguard": "前触れレガース", +"item.modulargolems.harbinger_upgrade_template": "前触れ強化テンプレート", +"item.modulargolems.hell_blast": "使徒強化:地獄の爆発", +"item.modulargolems.hell_bolt": "使徒強化:地獄の稲妻", +"item.modulargolems.hell_cloud": "使徒強化:地獄の雲", +"item.modulargolems.hostile_wand": "敵対杖", +"item.modulargolems.hostility_core": "敵対コア", +"item.modulargolems.hostility_potion": "敵対強化:ポーション", +"item.modulargolems.hostility_protection": "敵対強化:防護", +"item.modulargolems.hostility_reflect": "敵対強化:反射", +"item.modulargolems.hostility_regen": "敵対強化:再生", +"item.modulargolems.hostility_speed": "敵対強化:迅速", +"item.modulargolems.hostility_tank": "敵対強化:耐久", +"item.modulargolems.humanoid_golem_arms": "ヒューマノイドゴーレム腕部", +"item.modulargolems.humanoid_golem_body": "ヒューマノイドゴーレム胴体", +"item.modulargolems.humanoid_golem_holder": "ヒューマノイドゴーレムホルダー", +"item.modulargolems.humanoid_golem_legs": "ヒューマノイドゴーレム脚部", +"item.modulargolems.incarcerate": "ポーション強化:封縛", +"item.modulargolems.incomplete_dog_golem_body": "未完成犬ゴーレム胴体", +"item.modulargolems.incomplete_dog_golem_legs": "未完成犬ゴーレム脚部", +"item.modulargolems.incomplete_humanoid_golem_arms": "未完成ヒューマノイドゴーレム腕部", +"item.modulargolems.incomplete_humanoid_golem_body": "未完成ヒューマノイドゴーレム胴体", +"item.modulargolems.incomplete_humanoid_golem_legs": "未完成ヒューマノイドゴーレム脚部", +"item.modulargolems.incomplete_metal_golem_arm": "未完成金属ゴーレム腕部", +"item.modulargolems.incomplete_metal_golem_body": "未完成金属ゴーレム胴体", +"item.modulargolems.incomplete_metal_golem_legs": "未完成金属ゴーレム脚部", +"item.modulargolems.iron_golem_axe": "鉄ゴーレム斧", +"item.modulargolems.iron_golem_spear": "鉄ゴーレム槍", +"item.modulargolems.iron_golem_sword": "鉄ゴーレム剣", +"item.modulargolems.ironwood": "アイアンウッド強化", +"item.modulargolems.knightmetal": "ナイトメタル強化", +"item.modulargolems.leviathan_blast_portal": "リヴァイアサン強化", +"item.modulargolems.light_blue_config_card": "水色の設定カード", +"item.modulargolems.light_gray_config_card": "薄灰色の設定カード", +"item.modulargolems.lime_config_card": "ライムの設定カード", +"item.modulargolems.magenta_config_card": "マゼンタの設定カード", +"item.modulargolems.magnetic_alloy": "磁性合金", +"item.modulargolems.magnetic_construct": "磁力構造体", +"item.modulargolems.metal_golem_arm": "金属ゴーレム腕部", +"item.modulargolems.metal_golem_body": "金属ゴーレム胴体", +"item.modulargolems.metal_golem_holder": "金属ゴーレムホルダー", +"item.modulargolems.metal_golem_legs": "金属ゴーレム脚部", +"item.modulargolems.metal_golem_template": "金属ゴーレムテンプレート", +"item.modulargolems.monstrosity_chestplate": "モンストロシティチェストプレート", +"item.modulargolems.monstrosity_helmet": "モンストロシティヘルメット", +"item.modulargolems.monstrosity_shinguard": "モンストロシティレガース", +"item.modulargolems.monstrosity_upgrade_template": "モンストロシティ強化テンプレート", +"item.modulargolems.mount_upgrade": "マウント強化", +"item.modulargolems.naga": "ナーガ強化", +"item.modulargolems.netherite": "ネザライト強化", +"item.modulargolems.netherite_expansion_template": "ネザライト拡張テンプレート", +"item.modulargolems.netherite_golem_axe": "ネザライトゴーレム斧", +"item.modulargolems.netherite_golem_spear": "ネザライトゴーレム槍", +"item.modulargolems.netherite_golem_sword": "ネザライトゴーレム剣", +"item.modulargolems.netherite_monstrosity_earthquake": "ネザライトの怪物強化", +"item.modulargolems.nuclear_construct": "原子力構造体", +"item.modulargolems.omnipotent_wand_command": "全能杖:指令", +"item.modulargolems.omnipotent_wand_retrieval": "全能杖:収集", +"item.modulargolems.omnipotent_wand_rider": "全能杖:騎乗", +"item.modulargolems.omnipotent_wand_squad": "全能杖:隊列", +"item.modulargolems.omnipotent_wand_summon": "全能杖:召喚", +"item.modulargolems.orange_config_card": "オレンジの設定カード", +"item.modulargolems.patrol_path_recorder": "巡回経路レコーダー", +"item.modulargolems.pickup": "拾得強化", +"item.modulargolems.pickup_mending": "拾得強化:修繕", +"item.modulargolems.pickup_no_destroy": "拾得強化:破壊無効", +"item.modulargolems.pink_config_card": "ピンクの設定カード", +"item.modulargolems.player": "プレイヤー無効強化", +"item.modulargolems.purple_config_card": "紫の設定カード", +"item.modulargolems.push": "エクステンド強化", +"item.modulargolems.quartz": "クォーツ強化", +"item.modulargolems.recycle": "リサイクル強化", +"item.modulargolems.red_config_card": "赤の設定カード", +"item.modulargolems.retrieval_wand": "収集杖", +"item.modulargolems.rider_wand": "騎乗杖", +"item.modulargolems.roman_guard_chestplate": "ローマンガードチェストプレート", +"item.modulargolems.roman_guard_helmet": "ローマンガードヘルメット", +"item.modulargolems.roman_guard_shinguard": "ローマンガードレガース", +"item.modulargolems.scylla_lightning_upgrade": "スキュラ強化", +"item.modulargolems.size_upgrade": "サイズ強化", +"item.modulargolems.slow": "ポーション強化:鈍化", +"item.modulargolems.soul_collection": "ソウル収集強化", +"item.modulargolems.soul_flame": "ポーション強化:魂の炎", +"item.modulargolems.speed": "速度強化", +"item.modulargolems.speed_high": "速度強化 V", +"item.modulargolems.sponge": "スポンジ強化", +"item.modulargolems.squad_wand": "隊列杖", +"item.modulargolems.steeleaf": "スティールリーフ強化", +"item.modulargolems.storm_construct": "嵐構造体", +"item.modulargolems.summon_wand": "召喚杖", +"item.modulargolems.swim": "泳ぎ強化", +"item.modulargolems.talented": "メタ強化:才能", +"item.modulargolems.target_filter_default": "ターゲットフィルター:デフォルトターゲット", +"item.modulargolems.target_filter_name": "ターゲットフィルター:データパック", +"item.modulargolems.target_filter_type": "ターゲットフィルター:エンティティタイプ", +"item.modulargolems.target_filter_uuid": "ターゲットフィルター:エンティティUUID", +"item.modulargolems.teleport": "テレポート強化", +"item.modulargolems.the_abhorrent": "使徒称号:忌まわしき者", +"item.modulargolems.the_atrocious": "使徒称号:凶悪な者", +"item.modulargolems.the_profane": "使徒称号:冒涜の者", +"item.modulargolems.the_terrible": "使徒称号:恐るべき者", +"item.modulargolems.thunder_immune": "雷耐性強化", +"item.modulargolems.thunderstorm": "雷雨強化", +"item.modulargolems.void_construct": "虚無構造体", +"item.modulargolems.void_cube": "虚無のキューブ", +"item.modulargolems.weak": "ポーション強化:弱体化", +"item.modulargolems.white_config_card": "白の設定カード", +"item.modulargolems.wind_spirit_boots": "風霊のブーツ", +"item.modulargolems.wind_spirit_chestplate": "風霊のチェストプレート", +"item.modulargolems.wind_spirit_helmet": "風霊のヘルメット", +"item.modulargolems.wind_spirit_shinguard": "風霊のレガース", +"item.modulargolems.wither": "ポーション強化:ウィザー", +"item.modulargolems.wroughtnaut": "ラウトノート打撃強化", +"item.modulargolems.wroughtnaut_ingot": "ラウトノートインゴット", +"item.modulargolems.yellow_config_card": "黄の設定カード", +"itemGroup.l2library.golem_items": "モジュラーゴーレム - アイテム", +"itemGroup.l2library.golem_upgrades": "モジュラーゴーレム - 強化", +"itemGroup.l2library.golems": "モジュラーゴーレム - ゴーレム&パーツ", +"modifier.modulargolems.add_slot": "スロット追加", +"modifier.modulargolems.add_slot.desc": "スロットを %s 増やす", +"modifier.modulargolems.add_slot_diamond": "ダイヤモンド拡張", +"modifier.modulargolems.add_slot_diamond.desc": "スロットを 1 つ増やす。ゴーレムごとに一度のみ使用可能。", +"modifier.modulargolems.add_slot_netherite": "ネザライト拡張", +"modifier.modulargolems.add_slot_netherite.desc": "スロットを 1 つ増やす。ゴーレムごとに一度のみ使用可能。", +"modifier.modulargolems.ancient_anchor": "古代アンカー", +"modifier.modulargolems.ancient_anchor.desc": "落下攻撃を与え、衝撃波を発生させて対象を気絶させる", +"modifier.modulargolems.ancient_remnant_reformation": "古代の遺物再形成", +"modifier.modulargolems.ancient_remnant_reformation.desc": "鍛造: 胴体素材を消費して自身を修復するが、最大体力を消費する。消費分はインゴットで回復可能。", +"modifier.modulargolems.ancient_remnant_sandstorm": "古代の遺物砂嵐", +"modifier.modulargolems.ancient_remnant_sandstorm.desc": "目標位置に砂嵐を召喚し、複数の対象を攻撃する", +"modifier.modulargolems.apostle": "使徒", +"modifier.modulargolems.apostle.desc": "使徒強化はスロットを消費しない", +"modifier.modulargolems.armor_penetration": "アーマー貫通", +"modifier.modulargolems.armor_penetration.desc": "攻撃が %s%% の確率で防具と盾を貫通する", +"modifier.modulargolems.armor_up": "アーマー強化", +"modifier.modulargolems.atomic_fueling": "原子燃料供給", +"modifier.modulargolems.atomic_fueling.desc": "[%s] を消費して %s HP 回復し、%s 秒間 攻撃力と移動速度を %s 上昇させる。ゴーレムは被放射効果を無効化する。", +"modifier.modulargolems.bell": "ベル", +"modifier.modulargolems.bell.desc": "ゴーレムは攻撃する際にベルを鳴らし、すべての敵を引き寄せて点火する", +"modifier.modulargolems.blazing": "灼熱", +"modifier.modulargolems.blazing.desc": "ターゲットに近づくと火の玉を発射する", +"modifier.modulargolems.carminite": "カーミナイト", +"modifier.modulargolems.carminite.desc": "ダメージを受けると %s 秒間不可視かつ無敵になる", +"modifier.modulargolems.cauldron": "大釜", +"modifier.modulargolems.cauldron.desc": "ポーション強化を連続して行ってもスロットを消費しなくなる", +"modifier.modulargolems.cleanse": "ポーション強化:浄化", +"modifier.modulargolems.cloud_forming": "雲形成", +"modifier.modulargolems.cloud_forming.desc": "より体力の高い対象に対してより多くのダメージを与える", +"modifier.modulargolems.coating": "コーティング", +"modifier.modulargolems.coating.desc": "受けるダメージを %s 減少させる", +"modifier.modulargolems.conduit": "コンジット", +"modifier.modulargolems.conduit.desc": "水中にいる間: 受けるダメージを %s%% に減らす。%s 秒ごとに水中/雨中の対象に %s コンジットダメージを遠隔で与える。以下のステータスを強化:", +"modifier.modulargolems.curse": "ポーション強化:呪い", +"modifier.modulargolems.damage_cap": "ダメージ上限", +"modifier.modulargolems.damage_cap.desc": "受けるダメージは最大体力の %s%% 以内に制限される", +"modifier.modulargolems.damage_up": "ダメージ強化", +"modifier.modulargolems.emerald": "エメラルド", +"modifier.modulargolems.emerald.desc": "イリジャーに対して %s%% 追加ダメージを与える", +"modifier.modulargolems.ender_guardian_void_rune": "エンダーガーディアン虚無ルーン", +"modifier.modulargolems.ender_guardian_void_rune.desc": "渦と虚無ルーンを召喚し、複数の対象を攻撃する", +"modifier.modulargolems.ender_sight": "エンダーサイト", +"modifier.modulargolems.ender_sight.desc": "ゴーレムは壁や天井を透視できる", +"modifier.modulargolems.explosion_resistant": "爆発耐性", +"modifier.modulargolems.explosion_resistant.desc": "受ける爆発ダメージを元の%s%%に減少させ、ブロックを破壊しなくなる。", +"modifier.modulargolems.fallen_attack": "落下攻撃", +"modifier.modulargolems.fiery": "炎", +"modifier.modulargolems.fiery.desc": "火耐性を持たないモブに%s%%の火ダメージを与える。", +"modifier.modulargolems.fire_blast": "火の爆発", +"modifier.modulargolems.fire_blast.desc": "前方に火の爆発トラップを召喚する。", +"modifier.modulargolems.fire_dragonsteel_attack": "火竜鋼の攻撃", +"modifier.modulargolems.fire_dragonsteel_attack.desc": "対象を点火し、ノックバックさせる。", +"modifier.modulargolems.fire_immune": "火耐性", +"modifier.modulargolems.fire_immune.desc": "火ダメージに免疫を持ち、溶岩上も浮遊する。", +"modifier.modulargolems.fire_tornado": "火の竜巻", +"modifier.modulargolems.fire_tornado.desc": "目標位置に火の竜巻トラップを召喚する。", +"modifier.modulargolems.float": "浮遊", +"modifier.modulargolems.float.desc": "ゴーレムが水や溶岩で沈まずに浮遊する。", +"modifier.modulargolems.free_movement": "自由移動", +"modifier.modulargolems.free_movement.desc": "ゴーレムはブロックやキャラメルに引っかからなくなる。", +"modifier.modulargolems.freezing": "ポーション強化:凍結", +"modifier.modulargolems.freezing.desc": "アイスブレードとアイスソーンのエンチャント効果を得る。凍結ダメージに免疫を持つ。", +"modifier.modulargolems.gum_shooter": "ガムシューター", +"modifier.modulargolems.gum_shooter.desc": "対象にガムボールを発射し、%sダメージを与える。", +"modifier.modulargolems.harbinger_death_beam": "前触れデスビーム", +"modifier.modulargolems.harbinger_death_beam.desc": "遠くにいる対象にデスビームを発射する。", +"modifier.modulargolems.harbinger_missile": "前触れミサイル", +"modifier.modulargolems.harbinger_missile.desc": "遠くにいる対象にホーミングミサイルを発射する。", +"modifier.modulargolems.haunted": "憑依", +"modifier.modulargolems.haunted.desc": "敵を倒したときに幽霊装甲の使いを召喚することがある。倒した対象が装甲をまとっているほど召喚率が高まる。", +"modifier.modulargolems.hell_blast": "地獄の爆発", +"modifier.modulargolems.hell_blast.desc": "対象に地獄の爆発を発射する。", +"modifier.modulargolems.hell_bolt": "地獄の稲妻", +"modifier.modulargolems.hell_bolt.desc": "対象に地獄の稲妻を発射する。", +"modifier.modulargolems.hell_cloud": "地獄の雲", +"modifier.modulargolems.hell_cloud.desc": "目標位置に地獄の雲を召喚する。", +"modifier.modulargolems.hepatizon_defense": "ヘパティゾン防御", +"modifier.modulargolems.hepatizon_defense.desc": "ダメージを受けた後、一時的にゴーレムの防御力を上昇させる。", +"modifier.modulargolems.hostility_adaptive": "敵対修飾子:適応", +"modifier.modulargolems.hostility_core": "敵対コア", +"modifier.modulargolems.hostility_core.desc": "他のすべての敵対強化がスロットを消費しなくなる。", +"modifier.modulargolems.hostility_dispell": "敵対修飾子:解呪", +"modifier.modulargolems.hostility_potion": "敵対強化:ポーション", +"modifier.modulargolems.hostility_potion.desc": "各種類のポーション強化の最初のレベルはスロットを消費しない。", +"modifier.modulargolems.hostility_protection": "敵対修飾子:防護", +"modifier.modulargolems.hostility_reflect": "敵対修飾子:反射", +"modifier.modulargolems.hostility_regen": "敵対修飾子:再生", +"modifier.modulargolems.hostility_speed": "敵対修飾子:迅速", +"modifier.modulargolems.hostility_tank": "敵対修飾子:耐久", +"modifier.modulargolems.ice_dragonsteel_armor": "氷竜鋼アーマー", +"modifier.modulargolems.ice_dragonsteel_armor.desc": "攻撃を受けたとき、攻撃者を凍結させ、鈍化させ、ノックバックさせる。", +"modifier.modulargolems.ice_dragonsteel_attack": "氷竜鋼攻撃", +"modifier.modulargolems.ice_dragonsteel_attack.desc": "対象を凍結させ、鈍化させ、ノックバックさせる。", +"modifier.modulargolems.ignis_attack": "イグニス攻撃", +"modifier.modulargolems.ignis_attack.desc": "ブレイジングブランド効果を重ね、対象にヒットした際に体力を回復する。体力が半分以下になると、直接ダメージが防具を貫通する。", +"modifier.modulargolems.ignis_fireball": "イグニス火球", +"modifier.modulargolems.ignis_fireball.desc": "遠くにいる対象にイグニス火球を発射する。", +"modifier.modulargolems.immunity": "無敵", +"modifier.modulargolems.immunity.desc": "虚無ダメージを除くすべてのダメージに免疫を持つ。モブは無敵状態のゴーレムを攻撃しない。", +"modifier.modulargolems.incarcerate": "ポーション強化:封縛", +"modifier.modulargolems.leviathan_blast_portal": "リヴァイアサン爆破ポータル", +"modifier.modulargolems.leviathan_blast_portal.desc": "目標位置に爆破ポータルを生成し、複数の対象を攻撃する。", +"modifier.modulargolems.lightning_dragonsteel_attack": "雷竜鋼攻撃", +"modifier.modulargolems.lightning_dragonsteel_attack.desc": "雷の稲妻を召喚して対象を攻撃する。", +"modifier.modulargolems.magic_immune": "魔法無効", +"modifier.modulargolems.magic_immune.desc": "魔法ダメージに免疫を持つ。", +"modifier.modulargolems.magic_resistant": "魔法耐性", +"modifier.modulargolems.magic_resistant.desc": "受ける魔法ダメージを元の%s%%に減少させる。", +"modifier.modulargolems.maledictus_attack": "マレディクタス攻撃", +"modifier.modulargolems.maledictus_attack.desc": "ゴーレムの近接攻撃が防具を貫通する。ダメージを与えるたびに激怒カウンターが蓄積し、最大%s層まで重なる。", +"modifier.modulargolems.maledictus_earthquake": "マレディクタス地震", +"modifier.modulargolems.maledictus_earthquake.desc": "ジャンプして着地時に地震を発生させ、ハルバードを召喚する。", +"modifier.modulargolems.mana_boosting": "マナブースト", +"modifier.modulargolems.mana_boosting.desc": "マナを%s消費して%s%%の追加ダメージを与える。", +"modifier.modulargolems.mana_burst": "マナバースト", +"modifier.modulargolems.mana_burst.desc": "遠くの対象にマナバーストを発射し、%s%%の攻撃ダメージを与え、%sマナを消費する。", +"modifier.modulargolems.mana_mending": "マナ修繕", +"modifier.modulargolems.mana_mending.desc": "マナ/HP効率%sで%sの再生効果を得る。", +"modifier.modulargolems.mana_production": "マナ生成", +"modifier.modulargolems.mana_production.desc": "1秒ごとに%sのマナを生成する。", +"modifier.modulargolems.manyullyn_attack": "マンユリン攻撃", +"modifier.modulargolems.manyullyn_attack.desc": "ダメージを与えた後、一時的にゴーレムの攻撃力を上昇させる。", +"modifier.modulargolems.manyullyn_defense": "マンユリン防御", +"modifier.modulargolems.manyullyn_defense.desc": "ダメージを受けた後、一時的にゴーレムの防御力を上昇させる。", +"modifier.modulargolems.mechanical_engine": "機械エンジン", +"modifier.modulargolems.mechanical_engine.desc": "燃料を消費してゴーレムに動力を供給する。", +"modifier.modulargolems.mechanical_force": "機械力", +"modifier.modulargolems.mechanical_force.desc": "燃料を燃焼している間、攻撃ダメージを%s%%増加させる。", +"modifier.modulargolems.mechanical_mobility": "機械機動力", +"modifier.modulargolems.mechanical_mobility.desc": "燃料を燃焼している間、移動速度を%s%%増加させる。", +"modifier.modulargolems.naga": "ナーガ", +"modifier.modulargolems.netherite_monstrosity_earthquake": "ネザライトの怪物地震", +"modifier.modulargolems.netherite_monstrosity_earthquake.desc": "ジャンプして着地時に地震を発生させる。", +"modifier.modulargolems.pickup": "拾得", +"modifier.modulargolems.pickup.desc": "ゴーレムは%sブロック以内のアイテムと経験値を拾い、プレイヤーに渡す。詳細はパチュリを参照。保管先がない場合はアイテムを破壊することがある。", +"modifier.modulargolems.pickup_mending": "拾得強化:修繕", +"modifier.modulargolems.pickup_mending.desc": "ゴーレムが経験値を拾うと、自身を修繕しようとする。", +"modifier.modulargolems.pickup_no_destroy": "拾得強化:破壊無効", +"modifier.modulargolems.pickup_no_destroy.desc": "ゴーレムがアイテムを拾おうとして保管先がない場合、拾わずにスキップする。大量のアイテムがある領域ではラグが発生することがある。", +"modifier.modulargolems.pixie_attack": "ピクシー攻撃", +"modifier.modulargolems.pixie_attack.desc": "攻撃時に%s%%の確率でピクシーを召喚する。ピクシーのダメージ+%s。", +"modifier.modulargolems.pixie_counterattack": "ピクシー反撃", +"modifier.modulargolems.pixie_counterattack.desc": "攻撃を受けた際に%s%%の確率でピクシーを召喚する。", +"modifier.modulargolems.player_immune": "プレイヤー攻撃無効", +"modifier.modulargolems.player_immune.desc": "味方の攻撃を受けない。", +"modifier.modulargolems.polarize": "極性操作", +"modifier.modulargolems.polarize.desc": "近接時は敵を引き寄せ、遠距離/静止時は敵を押しのける。常に%sの感電ダメージを与える。", +"modifier.modulargolems.poseidite": "ポセイダイト", +"modifier.modulargolems.poseidite.desc": "水に弱いまたは水属性のモブに対して%s%%追加ダメージを与える。", +"modifier.modulargolems.projectile_reject": "投射物無効", +"modifier.modulargolems.projectile_reject.desc": "投射物を跳ね返す。投射物ダメージを受けない。", +"modifier.modulargolems.push": "押し", +"modifier.modulargolems.radiation": "放射線", +"modifier.modulargolems.radiation.desc": "対象に%sの放射能を付与する。被放射状態の対象へのダメージは放射レベル1ごとに%s増加する。", +"modifier.modulargolems.recycle": "リサイクル", +"modifier.modulargolems.recycle.desc": "ゴーレムが倒されるとホルダーをドロップする。プレイヤーが近くにいれば、ホルダーはインベントリに戻る。", +"modifier.modulargolems.reformation": "再形成", +"modifier.modulargolems.reformation.desc": "鉄インゴットを消費して%sの吸収バリアを得て、HPを%s回復する。ゴーレムは最大%sの吸収バリアしか保持できない。", +"modifier.modulargolems.regeneration_up": "再生強化", +"modifier.modulargolems.ridding_speed_up": "マウント強化", +"modifier.modulargolems.ridding_speed_up.desc": "ゴーレムは攻撃せず、攻撃対象にもならない。狙われていないモブからの攻撃も受けない。", +"modifier.modulargolems.scylla_lightning": "スキュラ雷撃", +"modifier.modulargolems.scylla_lightning.desc": "複数の対象に雷槍を発射する。", +"modifier.modulargolems.scylla_wave": "スキュラ波動", +"modifier.modulargolems.scylla_wave.desc": "攻撃を受けると攻撃者を押し返す波動を召喚する。", +"modifier.modulargolems.size_up": "サイズ強化", +"modifier.modulargolems.slow": "ポーション強化:鈍化", +"modifier.modulargolems.sonic_boom": "ソニックブーム", +"modifier.modulargolems.sonic_boom.desc": "ゴーレムがソニックブーム攻撃を使用できる。範囲攻撃可能な場合、複数の対象にヒットする。", +"modifier.modulargolems.soul_collection": "ソウル収集", +"modifier.modulargolems.soul_collection.desc": "倒したエンティティのソウルを収集し、所有者に渡す。", +"modifier.modulargolems.soul_flame": "ポーション強化:魂の炎", +"modifier.modulargolems.soul_flame.desc": "ソウルフレイムブレードとソウルフレイムソーンのエンチャント効果を得る。ソウルフレイムダメージに免疫を持つ。", +"modifier.modulargolems.soul_repair": "ソウル修復", +"modifier.modulargolems.soul_repair.desc": "プレイヤーの魂のエネルギーでゴーレムの装備を修復する。体力が低いときは魂のエネルギーでゴーレムを回復する。", +"modifier.modulargolems.speed_up": "速度強化", +"modifier.modulargolems.sticky_caramel": "粘着キャラメル", +"modifier.modulargolems.sticky_caramel.desc": "攻撃対象に溶けたキャラメルを付着させる。", +"modifier.modulargolems.swim": "泳ぎ", +"modifier.modulargolems.swim.desc": "ゴーレムが泳げる。", +"modifier.modulargolems.talented": "才能", +"modifier.modulargolems.talented.desc": "青い矢印が付いた各種類の強化の最初のものはスロットを消費しなくなる(最大4つまで)。", +"modifier.modulargolems.teleport": "テレポート", +"modifier.modulargolems.teleport.desc": "物理ダメージを回避するためにランダムにテレポートする。攻撃時はターゲットに向かってテレポートする。クールダウンは%s秒。", +"modifier.modulargolems.tf_damage": "TFダメージボーナス", +"modifier.modulargolems.tf_damage.desc": "黄昏の森で%s%%追加ダメージを与える。", +"modifier.modulargolems.tf_healing": "TF回復ボーナス", +"modifier.modulargolems.tf_healing.desc": "黄昏の森で回復量が%s%%増加する。", +"modifier.modulargolems.the_abhorrent": "忌まわしき者", +"modifier.modulargolems.the_abhorrent.desc": "ヒット時に対象の無敵判定時間を減少させる。", +"modifier.modulargolems.the_atrocious": "凶悪な者", +"modifier.modulargolems.the_atrocious.desc": "使徒修飾スキルのクールダウンを短縮する。", +"modifier.modulargolems.the_profane": "冒涜の者", +"modifier.modulargolems.the_profane.desc": "ヒット時に対象からランダムに%s個のポジティブ効果を解除する。", +"modifier.modulargolems.the_risen": "蘇りし者", +"modifier.modulargolems.the_risen.desc": "死亡時に0体力のホルダーアイテムをドロップする。ホルダーは体力0でも回復可能。", +"modifier.modulargolems.the_terrible": "恐るべき者", +"modifier.modulargolems.the_terrible.desc": "弓の構えが速くなる。最大%s体の対象に向けてそれぞれ%s本の矢を放つ。", +"modifier.modulargolems.thorn": "棘", +"modifier.modulargolems.thorn.desc": "受けたダメージの%s%%を反射する。", +"modifier.modulargolems.thunder_immune": "雷耐性", +"modifier.modulargolems.thunder_immune.desc": "雷撃ダメージに免疫を持つ。雷を誘引し、被撃時に10秒間火耐性を得て%s体力を回復する。", +"modifier.modulargolems.thunderstorm": "雷雨", +"modifier.modulargolems.thunderstorm.desc": "複数の対象を攻撃する雷雨を召喚する。被攻撃時にゴーレムの周囲で電撃を発生させる。", +"modifier.modulargolems.totemic_gold": "トーテミックゴールド", +"modifier.modulargolems.totemic_gold.desc": "アンデッド系モブに対して%s%%の追加ダメージを与える。", +"modifier.modulargolems.toughness_up": "タフネス強化", +"modifier.modulargolems.weak": "ポーション強化:弱体化", +"modifier.modulargolems.wither": "ポーション強化:ウィザー", +"modifier.modulargolems.wroughtnaut": "ラウトノート打撃", +"modifier.modulargolems.wroughtnaut.desc": "落下攻撃を行い、衝撃波を生成する。", +"modulargolems.config.blacklist": "ブラックリストを使用中。クリックでホワイトリストに切り替え。", +"modulargolems.config.friendly": "友好リスト", +"modulargolems.config.hostile": "敵対リスト", +"modulargolems.config.loading": "読み込み中...", +"modulargolems.config.lock": "インタラクションをロック", +"modulargolems.config.match_item": "アイテムのみ一致。クリックでNBTも一致させる。", +"modulargolems.config.match_tag": "アイテムとNBTを一致。クリックでアイテムのみ一致させる。", +"modulargolems.config.mode": "デフォルトモード", +"modulargolems.config.mode_tooltip": "召喚時のデフォルトモード。既存のゴーレムには影響せず、回収したゴーレムは再召喚時にこのモードを適用します。", +"modulargolems.config.no": "設定カード未設定", +"modulargolems.config.pos": "召喚位置", +"modulargolems.config.pos_original": "元の位置", +"modulargolems.config.pos_original_tooltip": "ゴーレムが回収された場合、元の位置に召喚します。新規ゴーレムには効果がなく、位置が遠すぎると召喚に失敗します。", +"modulargolems.config.pos_target": "指定位置", +"modulargolems.config.pos_target_tooltip": "プレイヤーが指差した位置にゴーレムを召喚します。", +"modulargolems.config.reset": "リセット", +"modulargolems.config.set": "ここに挿入して設定", +"modulargolems.config.whitelist": "ホワイトリストを使用中。クリックでブラックリストに切り替え。", +"modulargolems.msg.add_target": "フィルターに%sを追加", +"modulargolems.msg.botania_mana": "マナ: %s/%s", +"modulargolems.msg.botania_no_ring": "マナの帯が装備されていません。", +"modulargolems.msg.call_attack": "%s体のゴーレムが%sを攻撃します。", +"modulargolems.msg.destroy_exp": "ゴーレム%sは保管場所がないため%sの経験値を破棄しました。", +"modulargolems.msg.destroy_item": "ゴーレム%sは保管場所がないため%s個のアイテムを破壊しました。", +"modulargolems.msg.remove_target": "フィルターから%sを削除", +"modulargolems.msg.summon_failed": "%sの召喚に失敗しました。対象位置が遠すぎます。", +"modulargolems.msg.summon_far": "%sを召喚しました。位置: (%s, %s, %s)", +"modulargolems.slot.arrow": "矢スロット", +"modulargolems.slot.arrow_desc": "ここに矢を置くとオフハンドを盾用に空けられます。", +"modulargolems.slot.backup": "サブ武器スロット", +"modulargolems.slot.backup_desc": "ここにサブ武器を置きます。", +"modulargolems.slot.backup_info": "弓と剣をそれぞれメインハンドとバックアップスロットに装備している場合、ゴーレムは敵との距離に応じて武器を切り替えます。", +"modulargolems.slot.main": "メインハンドスロット", + "modulargolems.slot.main_desc": "ここに武器を配置します。何でも受け付けます。", + "modulargolems.slot.off": "オフハンドスロット", + "modulargolems.tab.attribute": "ゴーレム属性", + "modulargolems.tab.equipment": "ゴーレム装備", + "modulargolems.tab.path": "巡回経路設定", + "modulargolems.tab.pickup": "拾得フィルター設定", + "modulargolems.tab.target": "ターゲットフィルター設定", + "modulargolems.tab.toggle": "一般設定", + "modulargolems.tab.tracker_alive": "フィールド内のゴーレム", + "modulargolems.tab.tracker_dead": "ゴーレム死亡記録", + "modulargolems.tooltip.beacon_boots": "周囲の味方を全員%sと%sの効果で回復・強化します。", + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "+%s デスレーザーのダメージ", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "+%s ホーミングミサイルのダメージ", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "+%s モンストロシティ地震のダメージ", + "modulargolems.tooltip.craft_material": "ゴーレムクラフト材", +"modulargolems.tooltip.follow": "追従", +"modulargolems.tooltip.following": "ゴーレムがあなたを追従します", +"modulargolems.tooltip.golem_equipment": "%sにのみ有効", +"modulargolems.tooltip.guard": "徘徊", +"modulargolems.tooltip.guarding": "ゴーレムが(%s, %s, %s)周辺を徘徊します", +"modulargolems.tooltip.health": "体力: %s/%s", +"modulargolems.tooltip.meltdown": "メルトダウン: %s", +"modulargolems.tooltip.modifier": "合計%s個の修飾子 (%s個の強化から)", +"modulargolems.tooltip.patrol": "巡回", +"modulargolems.tooltip.patrolling": "ゴーレムが指定ルートを巡回します", +"modulargolems.tooltip.potion_attack": "攻撃した敵や攻撃してきた敵に%sを付与します", +"modulargolems.tooltip.potion_defense": "ゴーレムが%sを得る", +"modulargolems.tooltip.repair_material": "ゴーレム修理素材", +"modulargolems.tooltip.shift": "SHIFTキーを押して修飾子の詳細を表示", +"modulargolems.tooltip.slicing_enemy": "金属ゴーレムがこの斧で特定の敵を倒すと、ランダムな金属ゴーレム部品を1つドロップします", +"modulargolems.tooltip.slicing_golem": "金属ゴーレムがこの斧で他プレイヤーのゴーレムを倒すと、すべての部品をドロップし、各強化が%sの確率でドロップします", +"modulargolems.tooltip.slot": "残りの強化スロット: %s", +"modulargolems.tooltip.squad": "隊列", +"modulargolems.tooltip.stand": "待機", +"modulargolems.tooltip.standing": "ゴーレムが(%s, %s, %s)で待機します", +"modulargolems.tooltip.target.default": "デフォルトのアイアンゴーレム敵対ターゲット: クリーパーを除くすべての敵", +"modulargolems.tooltip.target.name": "アイテムの名前を変更し、右クリックでエンティティタイプまたはエンティティタイプタグとしてリストに追加します", +"modulargolems.tooltip.target.remove": "スニーク右クリックでリストの最後のエントリを削除します", +"modulargolems.tooltip.target.shift": "SHIFTキーを押して使用方法を表示", +"modulargolems.tooltip.target.type_add": "エンティティを右クリックしてエンティティタイプをリストに追加します", +"modulargolems.tooltip.target.type_remove": "スニーク右クリックでリストからエンティティタイプを削除します", +"modulargolems.tooltip.target.uuid_add": "エンティティを右クリックしてエンティティUUIDをリストに追加します", +"modulargolems.tooltip.target.uuid_remove": "スニーク右クリックでリストからエンティティUUIDを削除します", +"modulargolems.tooltip.team_up": "ゴーレムがキャプテンを追従します", +"modulargolems.tooltip.wander": "徘徊", +"modulargolems.tooltip.wandering": "ゴーレムが自由に移動します", +"modulargolems.tracker.alive": "生存", +"modulargolems.tracker.dead": "死亡", +"modulargolems.tracker.dim": "次元: %s", +"modulargolems.tracker.killed": "%sにより倒されました", +"modulargolems.tracker.pos": "位置: (%s, %s, %s)", +"modulargolems.tracker.present": "読み込み済み", +"modulargolems.tracker.recycle_dead": "死亡(リサイクル強化付き)", +"modulargolems.tracker.recycle_killed": "%sにより倒された(リサイクル強化付き)", +"modulargolems.tracker.retrieved": "回収済み", +"modulargolems.tracker.retrieved_other": "%sに回収された", +"modulargolems.tracker.time": "アンロード済み", +"modulargolems.wand.add_node": "経路にノードを追加しました", +"modulargolems.wand.clear_node": "経路からすべてのノードを削除しました", +"modulargolems.wand.command_right": "ゴーレムをターゲットしてモードを切り替えます。エンティティをターゲットして周囲のゴーレムに攻撃を命令します。", +"modulargolems.wand.command_shift": "ゴーレムをクリックしてインベントリを設定し、ステータスを表示します。", +"modulargolems.wand.config": "ゴーレムを右クリックして設定します。再度右クリックで解除します。オフハンド時はこの設定を持つゴーレムのみが対象になります。", +"modulargolems.wand.config_init": "右クリックで設定を初期化します", +"modulargolems.wand.config_other": "あなたのカードではありません。編集できません", +"modulargolems.wand.err_dim": "異なる次元にはノードを追加できません", +"modulargolems.wand.err_dist": "16ブロック以上離れた場所にノードを追加できません", +"modulargolems.wand.mode": "現在のモード: %s", +"modulargolems.wand.node_count": "経路のノード数: %s", +"modulargolems.wand.path_record": "ブロックを右クリックして経路に追加、再度右クリックで削除します。SHIFT+右クリックでクリアします。経路はループします。", +"modulargolems.wand.remove_node": "経路からノードを削除しました", +"modulargolems.wand.retrieve_right": "周囲のすべてのゴーレムを回収します。", +"modulargolems.wand.retrieve_shift": "遠くのゴーレムをターゲットして回収します。", +"modulargolems.wand.rider": "犬ゴーレムをターゲットして騎乗します。自分のゴーレムでない場合は、所有者が騎乗中に限り騎乗できます。騎乗中に何かを右クリックすると降ります。", +"modulargolems.wand.right_click": "右クリック時:", +"modulargolems.wand.shift_click": "スニーク右クリック時:", +"modulargolems.wand.squad": "設定済みのゴーレムをクリックしてキャプテンに設定します。キャプテンをクリックするとキャプテン状態を解除します。", +"modulargolems.wand.summon_right": "杖で指した遠方の位置に1体のゴーレムを召喚します。", +"modulargolems.wand.summon_shift": "インベントリ内のすべてのゴーレムを召喚します。", +"modulargolems.wand.switch": "スクロールまたは上下キーでモードを切り替えます。", +"patchouli.modulargolems.landing": "Tinker風ゴーレム組み立て&強化MODへようこそ", +"patchouli.modulargolems.title": "モジュラーゴーレムガイド", +"potion.potency.10": "XI", +"potion.potency.11": "XII", +"potion.potency.5": "VI", +"potion.potency.6": "VII", +"potion.potency.7": "VIII", +"potion.potency.8": "IX", +"potion.potency.9": "X", +"task.modulargolems.summon_golems": "ゴーレム召喚者", +"task.modulargolems.summon_golems.condition.has_golem_wand": "全能杖を装備している", +"task.modulargolems.summon_golems.desc": "メイドが周囲の敵対モブを攻撃するゴーレムを召喚します" +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/lang/pt_br.json b/src/main/resources/assets/modulargolems/lang/pt_br.json new file mode 100644 index 000000000..2de0611ad --- /dev/null +++ b/src/main/resources/assets/modulargolems/lang/pt_br.json @@ -0,0 +1,645 @@ +{ + "advancements.modulargolems.advancements.golems.anvil_fix.description": "Repare um golem de metal com lingotes em uma bigorna", + "advancements.modulargolems.advancements.golems.anvil_fix.title": "Curando as Feridas", + "advancements.modulargolems.advancements.golems.apply.description": "Aplique lingotes de metal em partes de golem em uma bigorna.", + "advancements.modulargolems.advancements.golems.apply.title": "Peça de Heavy Metal", + "advancements.modulargolems.advancements.golems.apply_sculk.description": "Faça uma parte de golem de sculk.", + "advancements.modulargolems.advancements.golems.apply_sculk.title": "Más Memórias", + "advancements.modulargolems.advancements.golems.command.description": "Crie uma varinha de comando", + "advancements.modulargolems.advancements.golems.command.title": "Proteja Sua Casa", + "advancements.modulargolems.advancements.golems.craft.description": "Crie um Suporte de Golem com partes de golem de metal.", + "advancements.modulargolems.advancements.golems.craft.title": "Um Golem Novinho em Folha", + "advancements.modulargolems.advancements.golems.dog.description": "Crie um Golem Canino.", + "advancements.modulargolems.advancements.golems.dog.title": "Cachorrinho Real Frio", + "advancements.modulargolems.advancements.golems.full.description": "Use todos os espaços de melhoria", + "advancements.modulargolems.advancements.golems.full.title": "Sem Mais Espaço", + "advancements.modulargolems.advancements.golems.fully_equipped.description": "Dê a um Golem Humanoide um conjunto completo de armadura, uma espada e um escudo.", + "advancements.modulargolems.advancements.golems.fully_equipped.title": "Totalmente Equipado", + "advancements.modulargolems.advancements.golems.hot_fix.description": "Repare um golem de metal com lingotes diretamente", + "advancements.modulargolems.advancements.golems.hot_fix.title": "Reparo em Batalha", + "advancements.modulargolems.advancements.golems.humanoid.description": "Crie um Golem Humanoide.", + "advancements.modulargolems.advancements.golems.humanoid.title": "Você, mas mais Forte", + "advancements.modulargolems.advancements.golems.kill_creeper.description": "Deixe um golem matar um Creeper", + "advancements.modulargolems.advancements.golems.kill_creeper.title": "Operação Antiterrorismo", + "advancements.modulargolems.advancements.golems.kill_guardian.description": "Deixe um golem matar um Guardião", + "advancements.modulargolems.advancements.golems.kill_guardian.title": "Lenda da Atlântida", + "advancements.modulargolems.advancements.golems.kill_warden.description": "Deixe um golem matar um Warden", + "advancements.modulargolems.advancements.golems.kill_warden.title": "Navio de Teseu", + "advancements.modulargolems.advancements.golems.max.description": "Aplique 12 melhorias em um golem", + "advancements.modulargolems.advancements.golems.max.title": "Além do Limite", + "advancements.modulargolems.advancements.golems.oops.description": "Deixe o Golem Humanoide quebrar uma peça de equipamento", + "advancements.modulargolems.advancements.golems.oops.title": "Ops...", + "advancements.modulargolems.advancements.golems.recycle.description": "Aplique uma melhoria de reciclagem em um golem", + "advancements.modulargolems.advancements.golems.recycle.title": "Golem Imortal", + "advancements.modulargolems.advancements.golems.retrieve.description": "Crie uma varinha de recuperação", + "advancements.modulargolems.advancements.golems.retrieve.title": "Todos Voltam", + "advancements.modulargolems.advancements.golems.root.description": "Crie seu exército!", + "advancements.modulargolems.advancements.golems.root.title": "Bem-vindo ao Modular Golems", + "advancements.modulargolems.advancements.golems.sponge.description": "Aplique uma melhoria de esponja em um golem", + "advancements.modulargolems.advancements.golems.sponge.title": "Golem Encharcado", + "advancements.modulargolems.advancements.golems.start.description": "Crie um Molde de Golem e use um Cortador de Pedras para cortá-lo em uma parte de golem", + "advancements.modulargolems.advancements.golems.start.title": "O Começo de Tudo", + "advancements.modulargolems.advancements.golems.summon.description": "Crie uma varinha de invocação", + "advancements.modulargolems.advancements.golems.summon.title": "Batalhão Aéreo", + "advancements.modulargolems.advancements.golems.summon_mass.description": "Invoque pelo menos 24 golems de uma vez", + "advancements.modulargolems.advancements.golems.summon_mass.title": "Exército Portátil", + "advancements.modulargolems.advancements.golems.swim.description": "Aplique uma melhoria de natação em um golem", + "advancements.modulargolems.advancements.golems.swim.title": "Guerreiro Submarino", + "advancements.modulargolems.advancements.golems.thunder.description": "Deixe um golem com imunidade a trovão ser atingido por um raio", + "advancements.modulargolems.advancements.golems.thunder.title": "Para-raios Ambulante", + "advancements.modulargolems.advancements.golems.upgrade.description": "Obtenha uma melhoria", + "advancements.modulargolems.advancements.golems.upgrade.title": "Melhore seu Golem", + "attribute.name.golem_jump": "Força do Pulo do Golem", + "attribute.name.golem_regen": "Regeneração do Golem", + "attribute.name.golem_size": "Tamanho do Golem", + "attribute.name.golem_sweep": "Alcance de Varredura", + "curios.identifier.golem_route": "Caminho de Patrulha do Golem", + "curios.identifier.golem_skin": "Aparência do Golem Humanoide", + "effect.modulargolems.atomic_boost": "Impulso Atômico", + "effect.modulargolems.atomic_boost.description": "Aumenta o dano de ataque e a velocidade de movimento do golem", + "effect.modulargolems.hepatizon_effect": "Efeito de Hepatizon", + "effect.modulargolems.hepatizon_effect.description": "Aumenta a armadura do golem", + "effect.modulargolems.maledictus_rage": "Fúria de Maledictus", + "effect.modulargolems.maledictus_rage.description": "Aumenta o dano de ataque do golem", + "effect.modulargolems.manyullyn_effect": "Efeito de Manyullyn", + "effect.modulargolems.manyullyn_effect.description": "Aumenta o dano de ataque do golem", + "effect.modulargolems.mechanical_force": "Força Mecânica", + "effect.modulargolems.mechanical_force.description": "Aumenta o dano de ataque do golem", + "effect.modulargolems.mechanical_mobility": "Mobilidade Mecânica", + "effect.modulargolems.mechanical_mobility.description": "Aumenta a velocidade de movimento do golem", + "entity.modulargolems.dog_golem": "Golem Canino", + "entity.modulargolems.humanoid_golem": "Golem Humanoide", + "entity.modulargolems.metal_golem": "Golem de Metal", + "golem_material.alexscaves.candy": "Doce", + "golem_material.alexscaves.magnetic": "Magnético", + "golem_material.alexscaves.nuclear": "Nuclear", + "golem_material.allthemodium.allthemodium": "Allthemodium", + "golem_material.allthemodium.unobtainium": "Unobtainium", + "golem_material.allthemodium.vibranium": "Vibranium", + "golem_material.blazegear.brimsteel": "Brimsteel", + "golem_material.botania.elementium": "Elementium", + "golem_material.botania.manasteel": "Manasteel", + "golem_material.botania.terrasteel": "Terrasteel", + "golem_material.cataclysm.ancient_metal": "Metal Antigo", + "golem_material.cataclysm.cursium": "Cursium", + "golem_material.cataclysm.ender_guardian": "Guardião do End", + "golem_material.cataclysm.ignitium": "Ignitium", + "golem_material.cataclysm.storm": "Tempestade", + "golem_material.cataclysm.witherite": "Witherite", + "golem_material.create.andesite_alloy": "Liga de Andesito", + "golem_material.create.brass": "Latão", + "golem_material.create.cardboard": "Papelão", + "golem_material.create.railway": "Ferrovia", + "golem_material.create.zinc": "Zinco", + "golem_material.goety.cursed_metal": "Metal Amaldiçoado", + "golem_material.goety.dark_metal": "Metal Sombrio", + "golem_material.goety_revelation.apocalyptium": "Apocalyptium", + "golem_material.iceandfire.fire_dragonsteel": "Aço de Dragão de Fogo", + "golem_material.iceandfire.ice_dragonsteel": "Aço de Dragão de Gelo", + "golem_material.iceandfire.lightning_dragonsteel": "Aço de Dragão de Raio", + "golem_material.l2complements.eternium": "Eternium", + "golem_material.l2complements.poseidite": "Poseidite", + "golem_material.l2complements.shulkerate": "Shulkerate", + "golem_material.l2complements.totemic_gold": "Ouro Totêmico", + "golem_material.l2hostility.chaotic": "Caótico", + "golem_material.l2hostility.miraculous": "Milagroso", + "golem_material.legendary_monsters.cloud": "Nuvem", + "golem_material.legendary_monsters.molten_metal": "Metal Derretido", + "golem_material.modulargolems.copper": "Cobre", + "golem_material.modulargolems.gold": "Ouro", + "golem_material.modulargolems.iron": "Ferro", + "golem_material.modulargolems.netherite": "Netherita", + "golem_material.modulargolems.sculk": "Sculk", + "golem_material.mowziesmobs.wroughtnaut": "Wroughtnaut", + "golem_material.tconstruct.amethyst_bronze": "Bronze de Ametista", + "golem_material.tconstruct.cobalt": "Cobalto", + "golem_material.tconstruct.hepatizon": "Hepatizon", + "golem_material.tconstruct.manyullyn": "Manyullyn", + "golem_material.tconstruct.rose_gold": "Ouro Rosa", + "golem_material.twilightforest.fiery": "Ígneo", + "golem_material.twilightforest.ironwood": "Madeira de Ferro", + "golem_material.twilightforest.knightmetal": "Metal de Cavaleiro", + "golem_material.twilightforest.steeleaf": "Folha de Aço", + "golem_part.dog_golem.body": "Corpo: %s", + "golem_part.dog_golem.legs": "Pernas: %s", + "golem_part.humanoid_golem.arms": "Braços: %s", + "golem_part.humanoid_golem.body": "Corpo: %s", + "golem_part.humanoid_golem.legs": "Pernas: %s", + "golem_part.metal_golem.body": "Corpo: %s", + "golem_part.metal_golem.left": "Esquerdo: %s", + "golem_part.metal_golem.leg": "Perna: %s", + "golem_part.metal_golem.right": "Direito: %s", + "golem_type.modulargolems.dog_golem": "Golem Canino", + "golem_type.modulargolems.humanoid_golem": "Golem Humanoide", + "golem_type.modulargolems.metal_golem": "Golem de Metal", + "item.modulargolems.ancient_remnant_sandstorm": "Melhoria de Remanescente Antigo", + "item.modulargolems.apostle": "Melhoria de Ascensão do Apóstolo", + "item.modulargolems.attack_high": "Melhoria de Ataque V", + "item.modulargolems.azure_cube": "Cubo Lázuli", + "item.modulargolems.barbaric_vanguard_boots": "Botas da Vanguarda Bárbara", + "item.modulargolems.barbaric_vanguard_chestplate": "Peitoral da Vanguarda Bárbara", + "item.modulargolems.barbaric_vanguard_helmet": "Elmo da Vanguarda Bárbara", + "item.modulargolems.barbaric_vanguard_shinguard": "Caneleira da Vanguarda Bárbara", + "item.modulargolems.bell": "Melhoria de Sino", + "item.modulargolems.black_config_card": "Cartão de Configuração Preto", + "item.modulargolems.blue_config_card": "Cartão de Configuração Azul", + "item.modulargolems.brown_config_card": "Cartão de Configuração Marrom", + "item.modulargolems.candy_construct": "Constructo de Doce", + "item.modulargolems.candy_mixture": "Mistura de Doce", + "item.modulargolems.carminite": "Melhoria de Carminita", + "item.modulargolems.cauldron": "Meta Melhoria: Caldeirão", + "item.modulargolems.cleanse": "Melhoria de Poção: Purificar", + "item.modulargolems.cloud_cube": "Cubo de Nuvem", + "item.modulargolems.coating": "Melhoria de Zinco", + "item.modulargolems.command_wand": "Varinha de Comando", + "item.modulargolems.curse": "Melhoria de Poção: Maldição", + "item.modulargolems.cyan_config_card": "Cartão de Configuração Ciano", + "item.modulargolems.diamond": "Melhoria de Diamante", + "item.modulargolems.diamond_expansion_template": "Molde de Expansão de Diamante", + "item.modulargolems.diamond_golem_axe": "Machado de Golem de Diamante", + "item.modulargolems.diamond_golem_spear": "Lança de Golem de Diamante", + "item.modulargolems.diamond_golem_sword": "Espada de Golem de Diamante", + "item.modulargolems.dog_golem_body": "Corpo de Golem Canino", + "item.modulargolems.dog_golem_holder": "Suporte de Golem Canino", + "item.modulargolems.dog_golem_legs": "Pernas de Golem Canino", + "item.modulargolems.dummy_furnace": "Fornalha Falsa", + "item.modulargolems.dummy_iron_consumer": "Consumidor de Ferro Falso", + "item.modulargolems.dummy_uranium_consumer": "Consumidor de Urânio Falso", + "item.modulargolems.emerald": "Melhoria de Esmeralda", + "item.modulargolems.empty_upgrade": "Melhoria Vazia", + "item.modulargolems.enchanted_gold": "Melhoria de Maçã Dourada Encantada", + "item.modulargolems.ender_guardian_void_rune": "Melhoria de Guardião do End", + "item.modulargolems.ender_sight": "Melhoria de Visão do End", + "item.modulargolems.fiery": "Melhoria Ígnea", + "item.modulargolems.fire_blast": "Melhoria de Apóstolo: Explosão de Fogo", + "item.modulargolems.fire_immune": "Melhoria de Imunidade ao Fogo", + "item.modulargolems.fire_tornado": "Melhoria de Apóstolo: Tornado de Fogo", + "item.modulargolems.float": "Melhoria de Flutuação", + "item.modulargolems.force_field": "Melhoria de Armadura de Wither", + "item.modulargolems.freezing": "Melhoria de Poção: Congelamento", + "item.modulargolems.gold": "Melhoria de Maçã Dourada", + "item.modulargolems.golem_beacon_level_1": "Sinalizador de Golem Nível 1", + "item.modulargolems.golem_beacon_level_2": "Sinalizador de Golem Nível 2", + "item.modulargolems.golem_beacon_level_3": "Sinalizador de Golem Nível 3", + "item.modulargolems.golem_beacon_level_4": "Sinalizador de Golem Nível 4", + "item.modulargolems.golem_beacon_level_5": "Sinalizador de Golem Nível 5", + "item.modulargolems.golem_facade": "Fachada de Golem", + "item.modulargolems.golem_slicing_axe": "Machado Fatiador de Golem", + "item.modulargolems.gray_config_card": "Cartão de Configuração Cinza", + "item.modulargolems.green_config_card": "Cartão de Configuração Verde", + "item.modulargolems.harbinger_chestplate": "Peitoral do Arauto", + "item.modulargolems.harbinger_helmet": "Elmo do Arauto", + "item.modulargolems.harbinger_shinguard": "Caneleira do Arauto", + "item.modulargolems.harbinger_upgrade_template": "Molde de Melhoria do Arauto", + "item.modulargolems.hell_blast": "Melhoria de Apóstolo: Explosão Infernal", + "item.modulargolems.hell_bolt": "Melhoria de Apóstolo: Raio Infernal", + "item.modulargolems.hell_cloud": "Melhoria de Apóstolo: Nuvem Infernal", + "item.modulargolems.hostile_wand": "Varinha Hostil", + "item.modulargolems.hostility_core": "Núcleo de Hostilidade", + "item.modulargolems.hostility_potion": "Melhoria de Hostilidade: Poção", + "item.modulargolems.hostility_protection": "Melhoria de Hostilidade: Proteção", + "item.modulargolems.hostility_reflect": "Melhoria de Hostilidade: Reflexiva", + "item.modulargolems.hostility_regen": "Melhoria de Hostilidade: Regeneração", + "item.modulargolems.hostility_speed": "Melhoria de Hostilidade: Rápida", + "item.modulargolems.hostility_tank": "Melhoria de Hostilidade: Tanque", + "item.modulargolems.humanoid_golem_arms": "Braços de Golem Humanoide", + "item.modulargolems.humanoid_golem_body": "Corpo de Golem Humanoide", + "item.modulargolems.humanoid_golem_holder": "Suporte de Golem Humanoide", + "item.modulargolems.humanoid_golem_legs": "Pernas de Golem Humanoide", + "item.modulargolems.incarcerate": "Melhoria de Poção: Encarceramento", + "item.modulargolems.incomplete_dog_golem_body": "Corpo de Golem Canino Incompleto", + "item.modulargolems.incomplete_dog_golem_legs": "Pernas de Golem Canino Incompletas", + "item.modulargolems.incomplete_humanoid_golem_arms": "Braços de Golem Humanoide Incompletos", + "item.modulargolems.incomplete_humanoid_golem_body": "Corpo de Golem Humanoide Incompleto", + "item.modulargolems.incomplete_humanoid_golem_legs": "Pernas de Golem Humanoide Incompletas", + "item.modulargolems.incomplete_metal_golem_arm": "Braço de Golem de Metal Incompleto", + "item.modulargolems.incomplete_metal_golem_body": "Corpo de Golem de Metal Incompleto", + "item.modulargolems.incomplete_metal_golem_legs": "Pernas de Golem de Metal Incompletas", + "item.modulargolems.iron_golem_axe": "Machado de Golem de Ferro", + "item.modulargolems.iron_golem_spear": "Lança de Golem de Ferro", + "item.modulargolems.iron_golem_sword": "Espada de Golem de Ferro", + "item.modulargolems.ironwood": "Melhoria de Madeira de Ferro", + "item.modulargolems.knightmetal": "Melhoria de Metal de Cavaleiro", + "item.modulargolems.leviathan_blast_portal": "Melhoria de Leviatã", + "item.modulargolems.light_blue_config_card": "Cartão de Configuração Azul-Claro", + "item.modulargolems.light_gray_config_card": "Cartão de Configuração Cinza-Claro", + "item.modulargolems.lime_config_card": "Cartão de Configuração Lima", + "item.modulargolems.magenta_config_card": "Cartão de Configuração Magenta", + "item.modulargolems.magnetic_alloy": "Liga Magnética", + "item.modulargolems.magnetic_construct": "Constructo Magnético", + "item.modulargolems.metal_golem_arm": "Braço de Golem de Metal", + "item.modulargolems.metal_golem_body": "Corpo de Golem de Metal", + "item.modulargolems.metal_golem_holder": "Suporte de Golem de Metal", + "item.modulargolems.metal_golem_legs": "Pernas de Golem de Metal", + "item.modulargolems.metal_golem_template": "Molde de Golem de Metal", + "item.modulargolems.monstrosity_chestplate": "Peitoral da Monstruosidade", + "item.modulargolems.monstrosity_helmet": "Elmo da Monstruosidade", + "item.modulargolems.monstrosity_shinguard": "Caneleira da Monstruosidade", + "item.modulargolems.monstrosity_upgrade_template": "Molde de Melhoria da Monstruosidade", + "item.modulargolems.mount_upgrade": "Melhoria de Montaria", + "item.modulargolems.naga": "Melhoria de Naga", + "item.modulargolems.netherite": "Melhoria de Netherita", + "item.modulargolems.netherite_expansion_template": "Molde de Expansão de Netherita", + "item.modulargolems.netherite_golem_axe": "Machado de Golem de Netherita", + "item.modulargolems.netherite_golem_spear": "Lança de Golem de Netherita", + "item.modulargolems.netherite_golem_sword": "Espada de Golem de Netherita", + "item.modulargolems.netherite_monstrosity_earthquake": "Melhoria de Monstruosidade de Netherita", + "item.modulargolems.nuclear_construct": "Constructo Nuclear", + "item.modulargolems.omnipotent_wand_command": "Varinha Onipotente: Comando", + "item.modulargolems.omnipotent_wand_retrieval": "Varinha Onipotente: Recuperação", + "item.modulargolems.omnipotent_wand_rider": "Varinha Onipotente: Cavaleiro", + "item.modulargolems.omnipotent_wand_squad": "Varinha Onipotente: Esquadrão", + "item.modulargolems.omnipotent_wand_summon": "Varinha Onipotente: Invocação", + "item.modulargolems.orange_config_card": "Cartão de Configuração Laranja", + "item.modulargolems.patrol_path_recorder": "Gravador de Caminho de Patrulha", + "item.modulargolems.pickup": "Melhoria de Coleta", + "item.modulargolems.pickup_mending": "Aprimoramento de Coleta: Reparo", + "item.modulargolems.pickup_no_destroy": "Aprimoramento de Coleta: Não Destruir", + "item.modulargolems.pink_config_card": "Cartão de Configuração Rosa", + "item.modulargolems.player": "Melhoria de Imunidade a Jogador", + "item.modulargolems.purple_config_card": "Cartão de Configuração Roxo", + "item.modulargolems.push": "Melhoria de Extensão", + "item.modulargolems.quartz": "Melhoria de Quartzo", + "item.modulargolems.recycle": "Melhoria de Reciclagem", + "item.modulargolems.red_config_card": "Cartão de Configuração Vermelho", + "item.modulargolems.retrieval_wand": "Varinha de Recuperação", + "item.modulargolems.rider_wand": "Varinha de Cavaleiro", + "item.modulargolems.roman_guard_chestplate": "Peitoral da Guarda Romana", + "item.modulargolems.roman_guard_helmet": "Elmo da Guarda Romana", + "item.modulargolems.roman_guard_shinguard": "Caneleira da Guarda Romana", + "item.modulargolems.scylla_lightning_upgrade": "Melhoria de Scylla", + "item.modulargolems.size_upgrade": "Melhoria de Tamanho", + "item.modulargolems.slow": "Melhoria de Poção: Lentidão", + "item.modulargolems.soul_collection": "Melhoria de Coleta de Almas", + "item.modulargolems.soul_flame": "Melhoria de Poção: Chama da Alma", + "item.modulargolems.speed": "Melhoria de Velocidade", + "item.modulargolems.speed_high": "Melhoria de Velocidade V", + "item.modulargolems.sponge": "Melhoria de Esponja", + "item.modulargolems.squad_wand": "Varinha de Esquadrão", + "item.modulargolems.steeleaf": "Melhoria de Folha de Aço", + "item.modulargolems.storm_construct": "Constructo de Tempestade", + "item.modulargolems.summon_wand": "Varinha de Invocação", + "item.modulargolems.swim": "Melhoria de Natação", + "item.modulargolems.talented": "Meta Melhoria: Talentoso", + "item.modulargolems.target_filter_default": "Filtro de Alvo: Alvo Padrão", + "item.modulargolems.target_filter_name": "Filtro de Alvo: Datapack", + "item.modulargolems.target_filter_type": "Filtro de Alvo: Tipo de Entidade", + "item.modulargolems.target_filter_uuid": "Filtro de Alvo: UUID da Entidade", + "item.modulargolems.teleport": "Melhoria de Teleporte", + "item.modulargolems.the_abhorrent": "Título de Apóstolo: O Abominável", + "item.modulargolems.the_atrocious": "Título de Apóstolo: O Atroz", + "item.modulargolems.the_profane": "Título de Apóstolo: O Profano", + "item.modulargolems.the_terrible": "Título de Apóstolo: O Terrível", + "item.modulargolems.thunder_immune": "Melhoria de Imunidade a Trovão", + "item.modulargolems.thunderstorm": "Melhoria de Trovoada", + "item.modulargolems.void_construct": "Constructo do Vazio", + "item.modulargolems.void_cube": "Cubo do Vazio", + "item.modulargolems.weak": "Melhoria de Poção: Fraqueza", + "item.modulargolems.white_config_card": "Cartão de Configuração Branco", + "item.modulargolems.wind_spirit_boots": "Botas do Espírito do Vento", + "item.modulargolems.wind_spirit_chestplate": "Peitoral do Espírito do Vento", + "item.modulargolems.wind_spirit_helmet": "Elmo do Espírito do Vento", + "item.modulargolems.wind_spirit_shinguard": "Caneleira do Espírito do Vento", + "item.modulargolems.wither": "Melhoria de Poção: Wither", + "item.modulargolems.wroughtnaut": "Melhoria de Impacto Wroughtnaut", + "item.modulargolems.wroughtnaut_ingot": "Lingote de Wroughtnaut", + "item.modulargolems.yellow_config_card": "Cartão de Configuração Amarelo", + "itemGroup.l2library.golem_items": "Modular Golems - Itens", + "itemGroup.l2library.golem_upgrades": "Modular Golems - Melhorias", + "itemGroup.l2library.golems": "Modular Golems - Golems e Peças", + "modifier.modulargolems.add_slot": "Adicionar Slot", + "modifier.modulargolems.add_slot.desc": "Adiciona %s slot de melhoria de golem", + "modifier.modulargolems.add_slot_diamond": "Expansão de Diamante", + "modifier.modulargolems.add_slot_diamond.desc": "Adiciona 1 slot de melhoria. Apenas uma vez por golem.", + "modifier.modulargolems.add_slot_netherite": "Expansão de Netherita", + "modifier.modulargolems.add_slot_netherite.desc": "Adiciona 1 slot de melhoria. Apenas uma vez por golem.", + "modifier.modulargolems.ancient_anchor": "Âncora Antiga", + "modifier.modulargolems.ancient_anchor.desc": "Causa dano de queda, ondas de choque e atordoa alvos", + "modifier.modulargolems.ancient_remnant_reformation": "Reformação do Remanescente Antigo", + "modifier.modulargolems.ancient_remnant_reformation.desc": "Reforjar: Consome material do corpo para se reparar ao custo de vida máxima. O consumo pode ser restaurado com lingotes.", + "modifier.modulargolems.ancient_remnant_sandstorm": "Tempestade de Areia do Remanescente Antigo", + "modifier.modulargolems.ancient_remnant_sandstorm.desc": "Invoca uma tempestade de areia na posição do alvo. Ataca múltiplos alvos", + "modifier.modulargolems.apostle": "Apóstolo", + "modifier.modulargolems.apostle.desc": "Melhorias de Apóstolo não consumirão slot", + "modifier.modulargolems.armor_penetration": "Penetração de Armadura", + "modifier.modulargolems.armor_penetration.desc": "O ataque tem %s%% de chance de ignorar armaduras e escudos", + "modifier.modulargolems.armor_up": "Aumento de Armadura", + "modifier.modulargolems.atomic_fueling": "Abastecimento Atômico", + "modifier.modulargolems.atomic_fueling.desc": "Consome [%s] para curar %s de Vida, e aumenta o ataque e a velocidade em %s por %s segundos. Torna o golem imune ao efeito de irradiação.", + "modifier.modulargolems.bell": "Sino", + "modifier.modulargolems.bell.desc": "Quando o golem quer atacar, ele tocará seu sino, atraindo todos os inimigos e iluminando-os.", + "modifier.modulargolems.blazing": "Em Chamas", + "modifier.modulargolems.blazing.desc": "Atira bolas de fogo ao se aproximar do alvo.", + "modifier.modulargolems.carminite": "Carminita", + "modifier.modulargolems.carminite.desc": "Após ser ferido, fica invisível e invencível por %s segundos", + "modifier.modulargolems.cauldron": "Caldeirão", + "modifier.modulargolems.cauldron.desc": "Melhorias de poção repetidas não consumirão mais slots de melhoria.", + "modifier.modulargolems.cleanse": "Melhoria de Poção: Purificar", + "modifier.modulargolems.cloud_forming": "Formação de Nuvem", + "modifier.modulargolems.cloud_forming.desc": "Causa mais dano a alvos com mais vida", + "modifier.modulargolems.coating": "Revestimento", + "modifier.modulargolems.coating.desc": "Reduz o dano recebido em %s", + "modifier.modulargolems.conduit": "Condutor", + "modifier.modulargolems.conduit.desc": "Quando na água: Reduz o dano recebido para %s%%. A cada %s segundos, causa %s de dano de condutor ao alvo na água/chuva remotamente. Aumenta as seguintes estatísticas:", + "modifier.modulargolems.curse": "Melhoria de Poção: Maldição", + "modifier.modulargolems.damage_cap": "Limite de Dano", + "modifier.modulargolems.damage_cap.desc": "O dano recebido é limitado a %s%% da vida máxima.", + "modifier.modulargolems.damage_up": "Aumento de Dano", + "modifier.modulargolems.emerald": "Esmeralda", + "modifier.modulargolems.emerald.desc": "Causa %s%% a mais de dano a illagers", + "modifier.modulargolems.ender_guardian_void_rune": "Runa do Vazio do Guardião do End", + "modifier.modulargolems.ender_guardian_void_rune.desc": "Invoca um vórtice e uma runa do vazio em direção a múltiplos alvos", + "modifier.modulargolems.ender_sight": "Visão do End", + "modifier.modulargolems.ender_sight.desc": "Golem pode ver através de paredes e tetos.", + "modifier.modulargolems.explosion_resistant": "Resistente a Explosão", + "modifier.modulargolems.explosion_resistant.desc": "Dano de explosão recebido reduzido a %s%% do original, e não quebrará blocos.", + "modifier.modulargolems.fallen_attack": "Ataque Caído", + "modifier.modulargolems.fiery": "Ígneo", + "modifier.modulargolems.fiery.desc": "Causa %s%% de dano de fogo a criaturas não imunes a fogo", + "modifier.modulargolems.fire_blast": "Explosão de Fogo", + "modifier.modulargolems.fire_blast.desc": "Invoca Armadilha de Explosão de Fogo na frente", + "modifier.modulargolems.fire_dragonsteel_attack": "Ataque de Aço de Dragão de Fogo", + "modifier.modulargolems.fire_dragonsteel_attack.desc": "Incendeia e empurra o alvo", + "modifier.modulargolems.fire_immune": "Imune a Fogo", + "modifier.modulargolems.fire_immune.desc": "Imune a dano de fogo. Flutua na Lava.", + "modifier.modulargolems.fire_tornado": "Tornado de Fogo", + "modifier.modulargolems.fire_tornado.desc": "Invoca Armadilha de Tornado de Fogo na posição do alvo", + "modifier.modulargolems.float": "Flutuar", + "modifier.modulargolems.float.desc": "Golem flutua na água e na lava em vez de afundar", + "modifier.modulargolems.free_movement": "Movimento Livre", + "modifier.modulargolems.free_movement.desc": "Golem não ficará preso por blocos ou caramelo", + "modifier.modulargolems.freezing": "Melhoria de Poção: Congelamento", + "modifier.modulargolems.freezing.desc": "Obtém os efeitos dos encantamentos Lâmina de Gelo e Espinhos de Gelo. Imune a dano de congelamento.", + "modifier.modulargolems.gum_shooter": "Atirador de Goma", + "modifier.modulargolems.gum_shooter.desc": "Atira bolas de goma em alvos causando %s de dano", + "modifier.modulargolems.harbinger_death_beam": "Raio da Morte do Arauto", + "modifier.modulargolems.harbinger_death_beam.desc": "Quando o alvo está longe, atira um Raio da Morte em direção ao alvo.", + "modifier.modulargolems.harbinger_missile": "Míssil do Arauto", + "modifier.modulargolems.harbinger_missile.desc": "Quando o alvo está longe, atira um Míssil Teleguiado em direção ao alvo.", + "modifier.modulargolems.haunted": "Assombrado", + "modifier.modulargolems.haunted.desc": "Pode invocar um servo de armadura assombrada ao matar inimigos. Maior chance de invocar quando o alvo morto está de armadura", + "modifier.modulargolems.hell_blast": "Explosão Infernal", + "modifier.modulargolems.hell_blast.desc": "Atira explosão infernal em direção aos alvos", + "modifier.modulargolems.hell_bolt": "Raio Infernal", + "modifier.modulargolems.hell_bolt.desc": "Atira raio infernal em direção aos alvos", + "modifier.modulargolems.hell_cloud": "Nuvem Infernal", + "modifier.modulargolems.hell_cloud.desc": "Invoca nuvem infernal na posição do alvo", + "modifier.modulargolems.hepatizon_defense": "Defesa de Hepatizon", + "modifier.modulargolems.hepatizon_defense.desc": "Aumenta a armadura do golem temporariamente após receber dano", + "modifier.modulargolems.hostility_adaptive": "Modificador de Hostilidade: Adaptativo", + "modifier.modulargolems.hostility_core": "Núcleo de Hostilidade", + "modifier.modulargolems.hostility_core.desc": "Todas as outras melhorias de hostilidade não consomem slots de melhoria", + "modifier.modulargolems.hostility_dispell": "Modificador de Hostilidade: Dissipar", + "modifier.modulargolems.hostility_potion": "Melhoria de Hostilidade: Poções", + "modifier.modulargolems.hostility_potion.desc": "O primeiro nível de cada tipo de melhoria de poção não consome slot de melhoria", + "modifier.modulargolems.hostility_protection": "Modificador de Hostilidade: Proteção", + "modifier.modulargolems.hostility_reflect": "Modificador de Hostilidade: Reflexivo", + "modifier.modulargolems.hostility_regen": "Modificador de Hostilidade: Regeneração", + "modifier.modulargolems.hostility_speed": "Modificador de Hostilidade: Rápido", + "modifier.modulargolems.hostility_tank": "Modificador de Hostilidade: Tanque", + "modifier.modulargolems.ice_dragonsteel_armor": "Armadura de Aço de Dragão de Gelo", + "modifier.modulargolems.ice_dragonsteel_armor.desc": "Congela, retarda e empurra o atacante quando atacado", + "modifier.modulargolems.ice_dragonsteel_attack": "Ataque de Aço de Dragão de Gelo", + "modifier.modulargolems.ice_dragonsteel_attack.desc": "Congela, retarda e empurra o alvo", + "modifier.modulargolems.ignis_attack": "Ataque de Ignis", + "modifier.modulargolems.ignis_attack.desc": "Acumula o efeito Marca Flamejante e regenera vida ao atingir o alvo. Quando a vida está abaixo da metade, o dano direto ignora a armadura.", + "modifier.modulargolems.ignis_fireball": "Bola de Fogo de Ignis", + "modifier.modulargolems.ignis_fireball.desc": "Quando o alvo está longe, atira bolas de fogo de Ignis em direção ao alvo.", + "modifier.modulargolems.immunity": "Imunidade", + "modifier.modulargolems.immunity.desc": "Imune a todo dano, exceto dano do vazio. Criaturas não atacarão golem invulnerável.", + "modifier.modulargolems.incarcerate": "Melhoria de Poção: Encarceramento", + "modifier.modulargolems.leviathan_blast_portal": "Portal de Explosão do Leviatã", + "modifier.modulargolems.leviathan_blast_portal.desc": "Cria um portal de explosão na posição do alvo. Ataca múltiplos alvos", + "modifier.modulargolems.lightning_dragonsteel_attack": "Ataque de Aço de Dragão de Raio", + "modifier.modulargolems.lightning_dragonsteel_attack.desc": "Invoca um raio para atacar o alvo", + "modifier.modulargolems.magic_immune": "Imune a Magia", + "modifier.modulargolems.magic_immune.desc": "Imune a dano mágico", + "modifier.modulargolems.magic_resistant": "Resistente a Magia", + "modifier.modulargolems.magic_resistant.desc": "Dano mágico recebido reduzido a %s%% do original", + "modifier.modulargolems.maledictus_attack": "Ataque de Maledictus", + "modifier.modulargolems.maledictus_attack.desc": "O dano corpo a corpo do golem ignora armadura. Acumula contador de fúria após causar dano, até %s camadas", + "modifier.modulargolems.maledictus_earthquake": "Terremoto de Maledictus", + "modifier.modulargolems.maledictus_earthquake.desc": "Pula e causa um terremoto ao aterrissar, invocando alabardas", + "modifier.modulargolems.mana_boosting": "Impulso de Mana", + "modifier.modulargolems.mana_boosting.desc": "Causa %s%% de dano extra custando %s de mana", + "modifier.modulargolems.mana_burst": "Explosão de Mana", + "modifier.modulargolems.mana_burst.desc": "Atira uma explosão de mana em alvos distantes causando %s%% do dano de ataque, custando %s de mana", + "modifier.modulargolems.mana_mending": "Reparo de Mana", + "modifier.modulargolems.mana_mending.desc": "Obtém %s de regeneração com uma eficiência de %s mana/vida", + "modifier.modulargolems.mana_production": "Produção de Mana", + "modifier.modulargolems.mana_production.desc": "Gera %s de mana por segundo", + "modifier.modulargolems.manyullyn_attack": "Ataque de Manyullyn", + "modifier.modulargolems.manyullyn_attack.desc": "Aumenta o ataque do golem temporariamente após infligir dano", + "modifier.modulargolems.manyullyn_defense": "Defesa de Manyullyn", + "modifier.modulargolems.manyullyn_defense.desc": "Aumenta o ataque do golem temporariamente após receber dano", + "modifier.modulargolems.mechanical_engine": "Motor Mecânico", + "modifier.modulargolems.mechanical_engine.desc": "Consome combustíveis para energizar o golem.", + "modifier.modulargolems.mechanical_force": "Força Mecânica", + "modifier.modulargolems.mechanical_force.desc": "Ao queimar combustíveis, aumenta o dano de ataque em %s%%", + "modifier.modulargolems.mechanical_mobility": "Mobilidade Mecânica", + "modifier.modulargolems.mechanical_mobility.desc": "Ao queimar combustíveis, aumenta a velocidade em %s%%", + "modifier.modulargolems.naga": "Naga", + "modifier.modulargolems.netherite_monstrosity_earthquake": "Terremoto da Monstruosidade de Netherita", + "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "Pula e causa um terremoto ao aterrissar", + "modifier.modulargolems.pickup": "Coleta", + "modifier.modulargolems.pickup.desc": "Golems coletarão itens e experiência em um raio de %s blocos e os entregarão a você. Veja o Patchouli para a documentação completa. O golem pode destruir itens se não encontrar onde armazená-los", + "modifier.modulargolems.pickup_mending": "Aprimoramento de Coleta: Reparo", + "modifier.modulargolems.pickup_mending.desc": "Quando um golem coleta experiência, ele tentará se curar com a experiência.", + "modifier.modulargolems.pickup_no_destroy": "Aprimoramento de Coleta: Não Destruir", + "modifier.modulargolems.pickup_no_destroy.desc": "Quando um golem tenta coletar um item e não encontra onde colocá-lo, ele não coletará o item. Isso pode causar lag se o golem estiver em uma região com muitos itens.", + "modifier.modulargolems.pixie_attack": "Ataque de Pixie", + "modifier.modulargolems.pixie_attack.desc": "Invoca uma pixie com %s%% de chance ao atacar. Dano da Pixie +%s.", + "modifier.modulargolems.pixie_counterattack": "Contra-ataque de Pixie", + "modifier.modulargolems.pixie_counterattack.desc": "Invoca uma pixie com %s%% de chance ao ser atacado.", + "modifier.modulargolems.player_immune": "Imune a Jogador", + "modifier.modulargolems.player_immune.desc": "Imune a fogo amigo.", + "modifier.modulargolems.polarize": "Polarizar", + "modifier.modulargolems.polarize.desc": "Puxa inimigos no modo corpo a corpo e empurra inimigos no modo à distância/parado, causa %s de dano elétrico constantemente.", + "modifier.modulargolems.poseidite": "Poseidite", + "modifier.modulargolems.poseidite.desc": "Causa %s%% a mais de dano a criaturas sensíveis à água ou baseadas em água", + "modifier.modulargolems.projectile_reject": "Rejeição de Projétil", + "modifier.modulargolems.projectile_reject.desc": "Deflete projéteis. Não recebe dano de projéteis.", + "modifier.modulargolems.push": "Empurrar", + "modifier.modulargolems.radiation": "Radiação", + "modifier.modulargolems.radiation.desc": "Inflige %s nos alvos atacados. O dano ao alvo irradiado aumenta em %s por nível de radiação.", + "modifier.modulargolems.recycle": "Reciclar", + "modifier.modulargolems.recycle.desc": "Derruba o suporte do golem com 0 de vida ao ser morto. O suporte retornará ao inventário se o jogador estiver presente.", + "modifier.modulargolems.reformation": "Reformação", + "modifier.modulargolems.reformation.desc": "Consome lingote de ferro para ganhar %s de absorção e curar %s. O golem pode ter no máximo %s de absorção", + "modifier.modulargolems.regeneration_up": "Aumento de Regeneração", + "modifier.modulargolems.ridding_speed_up": "Melhoria de Montaria", + "modifier.modulargolems.ridding_speed_up.desc": "O golem não atacará e não será alvo de ataques. Não será ferido por criaturas que não o estejam alvejando", + "modifier.modulargolems.scylla_lightning": "Raio de Scylla", + "modifier.modulargolems.scylla_lightning.desc": "Atira uma lança de raio em múltiplos alvos", + "modifier.modulargolems.scylla_wave": "Onda de Scylla", + "modifier.modulargolems.scylla_wave.desc": "Quando atacado, invoca ondas para empurrar os atacantes para longe", + "modifier.modulargolems.size_up": "Aumento de Tamanho", + "modifier.modulargolems.slow": "Melhoria de Poção: Lentidão", + "modifier.modulargolems.sonic_boom": "Onda Sônica", + "modifier.modulargolems.sonic_boom.desc": "O golem pode usar o Ataque de Onda Sônica. Se o golem puder realizar ataques em área, a Onda Sônica pode atingir múltiplos alvos.", + "modifier.modulargolems.soul_collection": "Coleta de Almas", + "modifier.modulargolems.soul_collection.desc": "Coleta almas de entidades mortas e as entrega ao dono", + "modifier.modulargolems.soul_flame": "Melhoria de Poção: Chama da Alma", + "modifier.modulargolems.soul_flame.desc": "Obtém os efeitos dos encantamentos Lâmina da Chama da Alma e Espinhos da Chama da Alma. Imune a dano de chama da alma.", + "modifier.modulargolems.soul_repair": "Reparo de Alma", + "modifier.modulargolems.soul_repair.desc": "Repara os equipamentos do golem com a energia da alma do jogador. Também cura o golem com energia da alma quando a vida está baixa", + "modifier.modulargolems.speed_up": "Aumento de Velocidade", + "modifier.modulargolems.sticky_caramel": "Caramelo Pegajoso", + "modifier.modulargolems.sticky_caramel.desc": "Coloca caramelo derretido nos alvos atacados", + "modifier.modulargolems.swim": "Nadar", + "modifier.modulargolems.swim.desc": "O golem pode nadar", + "modifier.modulargolems.talented": "Talentoso", + "modifier.modulargolems.talented.desc": "A primeira de cada tipo de melhoria com seta azul não consumirá mais slots de melhoria (até 4)", + "modifier.modulargolems.teleport": "Teleporte", + "modifier.modulargolems.teleport.desc": "Teleporta aleatoriamente para evitar dano físico. Teleporta em direção ao alvo ao atacar. O teleporte tem %s segundos de intervalo.", + "modifier.modulargolems.tf_damage": "Bônus de Dano da TF", + "modifier.modulargolems.tf_damage.desc": "Causa %s%% de dano extra na floresta do crepúsculo", + "modifier.modulargolems.tf_healing": "Bônus de Cura da TF", + "modifier.modulargolems.tf_healing.desc": "A cura se torna %s%% maior na floresta do crepúsculo", + "modifier.modulargolems.the_abhorrent": "O Abominável", + "modifier.modulargolems.the_abhorrent.desc": "Reduz os frames de invulnerabilidade do alvo ao ser atingido", + "modifier.modulargolems.the_atrocious": "O Atroz", + "modifier.modulargolems.the_atrocious.desc": "Reduz o intervalo da habilidade do modificador de Apóstolo", + "modifier.modulargolems.the_profane": "O Profano", + "modifier.modulargolems.the_profane.desc": "O golem remove %s efeitos positivos aleatórios do alvo ao atingir", + "modifier.modulargolems.the_risen": "O Ressurgido", + "modifier.modulargolems.the_risen.desc": "O golem derruba o item de suporte com 0 de vida ao morrer. O item de suporte do golem ainda pode curar quando não tem vida", + "modifier.modulargolems.the_terrible": "O Terrível", + "modifier.modulargolems.the_terrible.desc": "O golem puxa o arco mais rápido. Atira %s flechas em até %s alvos", + "modifier.modulargolems.thorn": "Espinhos", + "modifier.modulargolems.thorn.desc": "Reflete %s%% do dano", + "modifier.modulargolems.thunder_immune": "Imune a Trovão", + "modifier.modulargolems.thunder_immune.desc": "Imune a dano de raio. Atrai Raios. Quando atingido, ganha resistência ao fogo por 10 segundos e cura %s de vida.", + "modifier.modulargolems.thunderstorm": "Trovoada", + "modifier.modulargolems.thunderstorm.desc": "Invoca uma trovoada para atacar múltiplos alvos. Quando atacado, invoca rajadas elétricas ao redor do golem.", + "modifier.modulargolems.totemic_gold": "Ouro Totêmico", + "modifier.modulargolems.totemic_gold.desc": "Causa %s%% a mais de dano a mortos-vivos", + "modifier.modulargolems.toughness_up": "Aumento de Resistência", + "modifier.modulargolems.weak": "Melhoria de Poção: Fraqueza", + "modifier.modulargolems.wither": "Melhoria de Poção: Wither", + "modifier.modulargolems.wroughtnaut": "Impacto de Wroughtnaut", + "modifier.modulargolems.wroughtnaut.desc": "Realiza um ataque em queda e cria uma onda de choque", + "modulargolems.config.blacklist": "Usando lista negra. Clique para mudar para lista branca.", + "modulargolems.config.friendly": "Lista Amigável", + "modulargolems.config.hostile": "Lista Hostil", + "modulargolems.config.loading": "Carregando...", + "modulargolems.config.lock": "Bloquear Interação", + "modulargolems.config.match_item": "Corresponder apenas ao item. Clique para corresponder ao NBT.", + "modulargolems.config.match_tag": "Corresponder ao item e NBT. Clique para corresponder apenas ao item.", + "modulargolems.config.mode": "Modo Padrão", + "modulargolems.config.mode_tooltip": "O modo padrão que o golem terá quando invocado. Não afeta golem já no mundo. Golems recuperados terão este modo em vez do antigo quando invocados.", + "modulargolems.config.no": "Nenhum cartão de configuração atribuído", + "modulargolems.config.pos": "Invocar para", + "modulargolems.config.pos_original": "Posição Original", + "modulargolems.config.pos_original_tooltip": "Se o golem for recuperado, invoca este golem para a posição original. Não terá efeito se o golem for novo. Se a posição original estiver muito longe, a invocação falhará.", + "modulargolems.config.pos_target": "Posição Apontada", + "modulargolems.config.pos_target_tooltip": "Invoca o golem para a posição que o jogador aponta.", + "modulargolems.config.reset": "Resetar", + "modulargolems.config.set": "Insira para definir a configuração", + "modulargolems.config.whitelist": "Usando lista branca. Clique para mudar para lista negra.", + "modulargolems.msg.add_target": "Adicionar %s ao filtro", + "modulargolems.msg.botania_mana": "Mana: %s/%s", + "modulargolems.msg.botania_no_ring": "Nenhuma Faixa de Mana Equipada", + "modulargolems.msg.call_attack": "%s Golems atacarão %s", + "modulargolems.msg.destroy_exp": "Golem %s destruiu %s de experiência porque não encontrou lugar para armazenar.", + "modulargolems.msg.destroy_item": "Golem %s destruiu %s itens porque não encontrou lugar para armazenar.", + "modulargolems.msg.remove_target": "Remover %s do filtro", + "modulargolems.msg.summon_failed": "Falha ao invocar %s, pois a posição do alvo está muito longe", + "modulargolems.msg.summon_far": "Invocou %s, em (%s,%s,%s)", + "modulargolems.slot.arrow": "Slot de Flecha", + "modulargolems.slot.arrow_desc": "Coloque flechas aqui para liberar a mão secundária para escudos", + "modulargolems.slot.backup": "Slot de Arma Secundária", + "modulargolems.slot.backup_desc": "Coloque armas secundárias aqui.", + "modulargolems.slot.backup_info": "Se você tiver arco e espada, um na mão principal e um no slot de reserva, seu golem pode alternar entre eles dependendo da distância dos inimigos.", + "modulargolems.slot.main": "Slot da Mão Principal", + "modulargolems.slot.main_desc": "Coloque armas aqui. Aceita qualquer coisa.", + "modulargolems.slot.off": "Slot da Mão Secundária", + "modulargolems.tab.attribute": "Atributos do Golem", + "modulargolems.tab.equipment": "Equipamentos do Golem", + "modulargolems.tab.path": "Configuração do Caminho de Patrulha", + "modulargolems.tab.pickup": "Configuração do Filtro de Coleta", + "modulargolems.tab.target": "Configuração do Filtro de Alvo", + "modulargolems.tab.toggle": "Configuração Geral", + "modulargolems.tab.tracker_alive": "Golems no Mundo", + "modulargolems.tab.tracker_dead": "Registro de Morte de Golem", + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "+%s Dano de Laser da Morte", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "+%s Dano de Míssil Teleguiado", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "+%s Dano de Terremoto da Monstruosidade", + "modulargolems.tooltip.craft_material": "Material de criação do golem", + "modulargolems.tooltip.follow": "Seguir", + "modulargolems.tooltip.following": "O golem seguirá você", + "modulargolems.tooltip.golem_equipment": "Eficaz apenas em %s", + "modulargolems.tooltip.guard": "Vagar", + "modulargolems.tooltip.guarding": "O golem vagará por (%s, %s, %s)", + "modulargolems.tooltip.health": "Vida: %s/%s", + "modulargolems.tooltip.meltdown": "Colapso: %s", + "modulargolems.tooltip.modifier": "Total de %s modificadores de %s melhorias", + "modulargolems.tooltip.patrol": "Patrulhar", + "modulargolems.tooltip.patrolling": "O golem patrulhará de uma maneira designada", + "modulargolems.tooltip.potion_attack": "Inflige %s a inimigos que atacam ou são atacados.", + "modulargolems.tooltip.potion_defense": "O golem ganha %s.", + "modulargolems.tooltip.repair_material": "Material de reparo do golem", + "modulargolems.tooltip.shift": "Pressione SHIFT para ver detalhes dos modificadores", + "modulargolems.tooltip.slicing_enemy": "Quando o golem de metal mata certos inimigos com este machado, derruba uma parte aleatória do golem de metal", + "modulargolems.tooltip.slicing_golem": "Quando o golem de metal mata golems de outros jogadores com este machado, derruba todas as partes e cada melhoria tem %s de chance de cair", + "modulargolems.tooltip.slot": "Slot de Melhoria Restante: %s", + "modulargolems.tooltip.squad": "Esquadrão", + "modulargolems.tooltip.stand": "Parar", + "modulargolems.tooltip.standing": "O golem ficará em (%s, %s, %s)", + "modulargolems.tooltip.target.default": "Alvos hostis padrão do Golem de Ferro: todos os inimigos, exceto creeper.", + "modulargolems.tooltip.target.name": "Renomeie o item e clique com o botão direito para adicionar o nome como tipo de entidade ou tag de tipo de entidade à lista", + "modulargolems.tooltip.target.remove": "Clique com Shift + botão direito para remover a última entrada da lista", + "modulargolems.tooltip.target.shift": "Pressione SHIFT para mostrar o uso", + "modulargolems.tooltip.target.type_add": "Clique com o botão direito em uma entidade para adicionar o tipo de entidade à lista", + "modulargolems.tooltip.target.type_remove": "Clique com Shift + botão direito em uma entidade para remover o tipo de entidade da lista", + "modulargolems.tooltip.target.uuid_add": "Clique com o botão direito em uma entidade para adicionar o UUID da entidade à lista", + "modulargolems.tooltip.target.uuid_remove": "Clique com Shift + botão direito em uma entidade para remover o UUID da entidade da lista", + "modulargolems.tooltip.team_up": "O golem seguirá seu capitão", + "modulargolems.tooltip.wander": "Vagar", + "modulargolems.tooltip.wandering": "O golem se moverá livremente", + "modulargolems.tracker.alive": "Vivo", + "modulargolems.tracker.dead": "Morto", + "modulargolems.tracker.dim": "Dimensão: %s", + "modulargolems.tracker.killed": "Morto por %s", + "modulargolems.tracker.pos": "Posição: (%s,%s,%s)", + "modulargolems.tracker.present": "Carregado", + "modulargolems.tracker.recycle_dead": "Morto (com melhoria de reciclagem)", + "modulargolems.tracker.recycle_killed": "Morto por %s (com melhoria de reciclagem)", + "modulargolems.tracker.retrieved": "Recuperado", + "modulargolems.tracker.retrieved_other": "Recuperado por %s", + "modulargolems.tracker.time": "Descarregado", + "modulargolems.wand.add_node": "Nó adicionado ao caminho", + "modulargolems.wand.clear_node": "Todos os nós removidos do caminho", + "modulargolems.wand.command_right": "Mire em um golem para alternar os modos. Mire em uma entidade para comandar os golems próximos a atacá-la.", + "modulargolems.wand.command_shift": "Clique em um golem para configurar o inventário e ver as estatísticas.", + "modulargolems.wand.config": "Clique com o botão direito em um golem para definir a configuração. Clique com o botão direito novamente para remover. Na mão secundária, as varinhas só afetarão golems com esta configuração.", + "modulargolems.wand.config_init": "Clique com o botão direito para inicializar a configuração", + "modulargolems.wand.config_other": "Não é o seu cartão. Você não pode editá-lo", + "modulargolems.wand.err_dim": "Você não pode adicionar nós entre dimensões", + "modulargolems.wand.err_dist": "Você não pode adicionar nós a mais de 16 blocos de distância", + "modulargolems.wand.mode": "Modo Atual: %s", + "modulargolems.wand.node_count": "O caminho tem %s nós", + "modulargolems.wand.path_record": "Clique com o botão direito em um bloco para adicionar ao caminho, clique novamente para remover. Clique com Shift + botão direito para limpar. O caminho forma um ciclo.", + "modulargolems.wand.remove_node": "Nó removido do caminho", + "modulargolems.wand.retrieve_right": "Recupere todos os seus golems ao redor.", + "modulargolems.wand.retrieve_shift": "Mire em um golem distante para recuperá-lo.", + "modulargolems.wand.rider": "Mire no seu golem canino para montá-lo. Se não for seu golem, você pode montar quando o dono estiver montado. Quando montado, clique com o botão direito em qualquer coisa para desmontar.", + "modulargolems.wand.right_click": "Com clique direito:", + "modulargolems.wand.shift_click": "Com Shift + clique direito:", + "modulargolems.wand.squad": "Clique em um golem com configuração para defini-lo como capitão. Clique em um capitão para remover seu status de capitão.", + "modulargolems.wand.summon_right": "Invoque um golem para uma posição distante apontada pela varinha.", + "modulargolems.wand.summon_shift": "Invoque todos os golems do seu inventário.", + "modulargolems.wand.switch": "Role ou use as teclas de seta para cima/baixo para alternar entre os modos", + "patchouli.modulargolems.landing": "Bem-vindo ao mod de montagem e melhoria de golems estilo Tinker", + "patchouli.modulargolems.title": "Guia de Golems Modulares", + "potion.potency.10": "XI", + "potion.potency.11": "XII", + "potion.potency.5": "VI", + "potion.potency.6": "VII", + "potion.potency.7": "VIII", + "potion.potency.8": "IX", + "potion.potency.9": "X", + "task.modulargolems.summon_golems": "Invocador de Golems", + "task.modulargolems.summon_golems.condition.has_golem_wand": "Segure a Varinha Onipotente", + "task.modulargolems.summon_golems.desc": "A empregada invocará golems para atacar criaturas hostis ao redor" +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/lang/ru_ru.json b/src/main/resources/assets/modulargolems/lang/ru_ru.json new file mode 100644 index 000000000..187395caf --- /dev/null +++ b/src/main/resources/assets/modulargolems/lang/ru_ru.json @@ -0,0 +1,475 @@ +{ + "advancements.modulargolems.advancements.golems.anvil_fix.description": "Отремонтируйте металлического голема с помощью слитков в наковальне", + "advancements.modulargolems.advancements.golems.anvil_fix.title": "Лечение ран", + "advancements.modulargolems.advancements.golems.apply.description": "Примените металлические слитки к частям голема в наковальне.", + "advancements.modulargolems.advancements.golems.apply.title": "Тяжелый металлический элемент", + "advancements.modulargolems.advancements.golems.apply_sculk.description": "Создайте часть голема из скалька.", + "advancements.modulargolems.advancements.golems.apply_sculk.title": "Плохие воспоминания", + "advancements.modulargolems.advancements.golems.command.description": "Создайте командный жезл", + "advancements.modulargolems.advancements.golems.command.title": "Защити свой дом", + "advancements.modulargolems.advancements.golems.craft.description": "Создайте держатель голема с использованием металлических частей голема.", + "advancements.modulargolems.advancements.golems.craft.title": "Новый голем", + "advancements.modulargolems.advancements.golems.dog.description": "Создайте собаку-голема.", + "advancements.modulargolems.advancements.golems.dog.title": "Рояльная холодная собачка", + "advancements.modulargolems.advancements.golems.full.description": "Используйте все слоты улучшений", + "advancements.modulargolems.advancements.golems.full.title": "Больше нет места", + "advancements.modulargolems.advancements.golems.fully_equipped.description": "Дайте человекоподобному голему полный комплект брони, меч и щит.", + "advancements.modulargolems.advancements.golems.fully_equipped.title": "Полностью экипирован", + "advancements.modulargolems.advancements.golems.hot_fix.description": "Отремонтируйте металлического голема с помощью слитков напрямую", + "advancements.modulargolems.advancements.golems.hot_fix.title": "Ремонт в бою", + "advancements.modulargolems.advancements.golems.humanoid.description": "Создайте человекоподобного голема.", + "advancements.modulargolems.advancements.golems.humanoid.title": "Вы, но крепче", + "advancements.modulargolems.advancements.golems.kill_creeper.description": "Дайте голему убить Крипера", + "advancements.modulargolems.advancements.golems.kill_creeper.title": "Анти-террористическая операция", + "advancements.modulargolems.advancements.golems.kill_guardian.description": "Дайте голему убить Стража", + "advancements.modulargolems.advancements.golems.kill_guardian.title": "Легенда Атлантиды", + "advancements.modulargolems.advancements.golems.kill_warden.description": "Дайте голему убить Хранителя", + "advancements.modulargolems.advancements.golems.kill_warden.title": "Корабль Тесея", + "advancements.modulargolems.advancements.golems.max.description": "Примените 12 улучшений на голема", + "advancements.modulargolems.advancements.golems.max.title": "Выше и дальше", + "advancements.modulargolems.advancements.golems.oops.description": "Дайте человекоподобному голему сломать кусок оборудования", + "advancements.modulargolems.advancements.golems.oops.title": "Ой...", + "advancements.modulargolems.advancements.golems.recycle.description": "Примените улучшение переработки на голема", + "advancements.modulargolems.advancements.golems.recycle.title": "Бессмертный голем", + "advancements.modulargolems.advancements.golems.retrieve.description": "Создайте жезл возвращения", + "advancements.modulargolems.advancements.golems.retrieve.title": "Все возвращаются", + "advancements.modulargolems.advancements.golems.root.description": "Создайте свою армию!", + "advancements.modulargolems.advancements.golems.root.title": "Добро пожаловать в Modular Golems", + "advancements.modulargolems.advancements.golems.sponge.description": "Примените улучшение губки на голема", + "advancements.modulargolems.advancements.golems.sponge.title": "Затопленный голем", + "advancements.modulargolems.advancements.golems.start.description": "Создайте шаблон голема и используйте камнерез для его разделения на части голема", + "advancements.modulargolems.advancements.golems.start.title": "Начало всего", + "advancements.modulargolems.advancements.golems.summon.description": "Создайте жезл призыва", + "advancements.modulargolems.advancements.golems.summon.title": "Воздушный батальон", + "advancements.modulargolems.advancements.golems.summon_mass.description": "Призовите хотя бы 24 голема одновременно", + "advancements.modulargolems.advancements.golems.summon_mass.title": "Переносной военный отряд", + "advancements.modulargolems.advancements.golems.swim.description": "Примените улучшение плавания на голема", + "advancements.modulargolems.advancements.golems.swim.title": "Подводный воин", + "advancements.modulargolems.advancements.golems.thunder.description": "Дайте голему, устойчивому к молниям, быть пораженным молнией", + "advancements.modulargolems.advancements.golems.thunder.title": "Ходячий молниеотвод", + "advancements.modulargolems.advancements.golems.upgrade.description": "Получите улучшение", + "advancements.modulargolems.advancements.golems.upgrade.title": "Улучшите вашего голема", + "attribute.name.golem_jump": "Сила прыжка голема", + "attribute.name.golem_regen": "Регенерация голема", + "attribute.name.golem_size": "Размер голема", + "attribute.name.golem_sweep": "Диапазон атаки", + "curios.identifier.golem_route": "Патрульный путь голема", + "curios.identifier.golem_skin": "Кожа человекоподобного голема", + "effect.modulargolems.atomic_boost": "Атомный импульс", + "effect.modulargolems.atomic_boost.description": "Увеличивает урон атаки и скорость движения голема", + "effect.modulargolems.mechanical_force": "Механическая сила", + "effect.modulargolems.mechanical_force.description": "Увеличивает урон атаки голема", + "effect.modulargolems.mechanical_mobility": "Механическая мобильность", + "effect.modulargolems.mechanical_mobility.description": "Увеличивает скорость движения голема", + "entity.modulargolems.dog_golem": "Собака-голем", + "entity.modulargolems.humanoid_golem": "Человекоподобный голем", + "entity.modulargolems.metal_golem": "Металлический голем", + "golem_material.alexscaves.candy": "Конфеты", + "golem_material.alexscaves.magnetic": "Магнитный", + "golem_material.alexscaves.nuclear": "Ядерный", + "golem_material.blazegear.brimsteel": "Пламенная сталь", + "golem_material.botania.elementium": "Элементиум", + "golem_material.botania.manasteel": "Манасталь", + "golem_material.botania.terrasteel": "Террасталь", + "golem_material.cataclysm.ignitium": "Игнитиум", + "golem_material.cataclysm.witherite": "Визериум", + "golem_material.create.andesite_alloy": "Андецитовый сплав", + "golem_material.create.brass": "Латунь", + "golem_material.create.railway": "Железнодорожный", + "golem_material.create.zinc": "Цинк", + "golem_material.l2complements.eternium": "Этерниум", + "golem_material.l2complements.poseidite": "Посейдит", + "golem_material.l2complements.shulkerate": "Шулкерит", + "golem_material.l2complements.totemic_gold": "Тотемное золото", + "golem_material.modulargolems.copper": "Медь", + "golem_material.modulargolems.gold": "Золото", + "golem_material.modulargolems.iron": "Железо", + "golem_material.modulargolems.netherite": "Незерит", + "golem_material.modulargolems.sculk": "Скальк", + "golem_material.twilightforest.fiery": "Огненный", + "golem_material.twilightforest.ironwood": "Железное дерево", + "golem_material.twilightforest.knightmetal": "Рыцарский металл", + "golem_material.twilightforest.steeleaf": "Стальной лист", + "golem_part.dog_golem.body": "Тело: %s", + "golem_part.dog_golem.legs": "Ноги: %s", + "golem_part.humanoid_golem.arms": "Руки: %s", + "golem_part.humanoid_golem.body": "Тело: %s", + "golem_part.humanoid_golem.legs": "Ноги: %s", + "golem_part.metal_golem.body": "Тело: %s", + "golem_part.metal_golem.left": "Левая часть: %s", + "golem_part.metal_golem.leg": "Нога: %s", + "golem_part.metal_golem.right": "Правая часть: %s", + "golem_type.modulargolems.dog_golem": "Собака-голем", + "golem_type.modulargolems.humanoid_golem": "Человекоподобный голем", + "golem_type.modulargolems.metal_golem": "Металлический голем", + "item.modulargolems.ancient_remnant_sandstorm": "Улучшение Древнего Остатка", + "item.modulargolems.attack_high": "Атака V", + "item.modulargolems.barbaric_vanguard_chestplate": "Незеритовый нагрудник голема", + "item.modulargolems.barbaric_vanguard_helmet": "Незеритовый шлем голема", + "item.modulargolems.barbaric_vanguard_shinguard": "Незеритовый набедренник голема", + "item.modulargolems.bell": "Улучшение Колокольчика", + "item.modulargolems.black_config_card": "Черная Конфигурационная Карта", + "item.modulargolems.blue_config_card": "Синяя Конфигурационная Карта", + "item.modulargolems.brown_config_card": "Коричневая Конфигурационная Карта", + "item.modulargolems.candy_construct": "Кондитерская Структура", + "item.modulargolems.candy_mixture": "Кондитерская Смесь", + "item.modulargolems.carminite": "Улучшение Карминита", + "item.modulargolems.cauldron": "Мета-улучшение: Котёл", + "item.modulargolems.cleanse": "Зелье-улучшение: Чистка", + "item.modulargolems.coating": "Цинковое улучшение", + "item.modulargolems.command_wand": "Жезл команды", + "item.modulargolems.curse": "Зелье-улучшение: Проклятие", + "item.modulargolems.cyan_config_card": "Голубая Конфигурационная Карта", + "item.modulargolems.diamond": "Алмазное улучшение", + "item.modulargolems.diamond_golem_axe": "Алмазный Топор Голема", + "item.modulargolems.diamond_golem_spear": "Алмазное Копьё Голема", + "item.modulargolems.diamond_golem_sword": "Алмазный Меч Голема", + "item.modulargolems.dog_golem_body": "Тело Собаки-Голема", + "item.modulargolems.dog_golem_holder": "Держатель Собаки-Голема", + "item.modulargolems.dog_golem_legs": "Ноги Собаки-Голема", + "item.modulargolems.dummy_furnace": "Фальшивая Печь", + "item.modulargolems.dummy_iron_consumer": "Фальшивый Железный Потребитель", + "item.modulargolems.dummy_uranium_consumer": "Фальшивый Урановый Потребитель", + "item.modulargolems.emerald": "Изумрудное улучшение", + "item.modulargolems.empty_upgrade": "Пустое улучшение", + "item.modulargolems.enchanted_gold": "Улучшение Зачарованного Золотого Яблока", + "item.modulargolems.ender_guardian_void_rune": "Улучшение Конца Стража", + "item.modulargolems.ender_sight": "Улучшение Видения Конца", + "item.modulargolems.fiery": "Огненное улучшение", + "item.modulargolems.fire_immune": "Улучшение огнестойкости", + "item.modulargolems.float": "Улучшение плавучести", + "item.modulargolems.force_field": "Улучшение брони Нежити", + "item.modulargolems.freezing": "Зелье-улучшение: Заморозка", + "item.modulargolems.gold": "Улучшение золотого яблока", + "item.modulargolems.golem_beacon_level_1": "Башня Големов Уровень 1", + "item.modulargolems.golem_beacon_level_2": "Башня Големов Уровень 2", + "item.modulargolems.golem_beacon_level_3": "Башня Големов Уровень 3", + "item.modulargolems.golem_beacon_level_4": "Башня Големов Уровень 4", + "item.modulargolems.golem_beacon_level_5": "Башня Големов Уровень 5", + "item.modulargolems.gray_config_card": "Серая Конфигурационная Карта", + "item.modulargolems.green_config_card": "Зелёная Конфигурационная Карта", + "item.modulargolems.hostility_core": "Ядро Враждебности", + "item.modulargolems.hostility_potion": "Улучшение враждебности: Зелье", + "item.modulargolems.hostility_protection": "Улучшение враждебности: Защита", + "item.modulargolems.hostility_reflect": "Улучшение враждебности: Отражение", + "item.modulargolems.hostility_regen": "Улучшение враждебности: Регенерация", + "item.modulargolems.hostility_speed": "Улучшение враждебности: Скорость", + "item.modulargolems.hostility_tank": "Улучшение враждебности: Танк", + "item.modulargolems.humanoid_golem_arms": "Руки Человекоподобного Голема", + "item.modulargolems.humanoid_golem_body": "Тело Человекоподобного Голема", + "item.modulargolems.humanoid_golem_holder": "Держатель Человекоподобного Голема", + "item.modulargolems.humanoid_golem_legs": "Ноги Человекоподобного Голема", + "item.modulargolems.incarcerate": "Зелье-улучшение: Пленение", + "item.modulargolems.incomplete_dog_golem_body": "Незавершённое Тело Собаки-Голема", + "item.modulargolems.incomplete_dog_golem_legs": "Незавершённые Ноги Собаки-Голема", + "item.modulargolems.incomplete_humanoid_golem_arms": "Незавершённые Руки Человекоподобного Голема", + "item.modulargolems.incomplete_humanoid_golem_body": "Незавершённое Тело Человекоподобного Голема", + "item.modulargolems.incomplete_humanoid_golem_legs": "Незавершённые Ноги Человекоподобного Голема", + "item.modulargolems.incomplete_metal_golem_arm": "Незавершённая Рука Металлического Голема", + "item.modulargolems.incomplete_metal_golem_body": "Незавершённое Тело Металлического Голема", + "item.modulargolems.incomplete_metal_golem_legs": "Незавершённые Ноги Металлического Голема", + "item.modulargolems.iron_golem_axe": "Железный Топор Голема", + "item.modulargolems.iron_golem_spear": "Железное Копьё Голема", + "item.modulargolems.iron_golem_sword": "Железный Меч Голема", + "item.modulargolems.ironwood": "Улучшение Железного Дерева", + "item.modulargolems.knightmetal": "Улучшение Рыцарского Металла", + "item.modulargolems.leviathan_blast_portal": "Улучшение Левиафана", + "item.modulargolems.light_blue_config_card": "Светло-Синяя Конфигурационная Карта", + "item.modulargolems.light_gray_config_card": "Светло-Серая Конфигурационная Карта", + "item.modulargolems.lime_config_card": "Лаймовая Конфигурационная Карта", + "item.modulargolems.magenta_config_card": "Фуксия Конфигурационная Карта", + "item.modulargolems.magnetic_alloy": "Магнитный Сплав", + "item.modulargolems.magnetic_construct": "Магнитная Структура", + "item.modulargolems.metal_golem_arm": "Рука Металлического Голема", + "item.modulargolems.metal_golem_body": "Тело Металлического Голема", + "item.modulargolems.metal_golem_holder": "Держатель Металлического Голема", + "item.modulargolems.metal_golem_legs": "Ноги Металлического Голема", + "item.modulargolems.metal_golem_template": "Шаблон Металлического Голема", + "item.modulargolems.mount_upgrade": "Улучшение Верховой Езды", + "item.modulargolems.naga": "Улучшение Наги", + "item.modulargolems.netherite": "Улучшение Незерита", + "item.modulargolems.netherite_golem_axe": "Незеритовый Топор Голема", + "item.modulargolems.netherite_golem_spear": "Незеритовое Копьё Голема", + "item.modulargolems.netherite_golem_sword": "Незеритовый Меч Голема", + "item.modulargolems.netherite_monstrosity_earthquake": "Улучшение Незеритового Чудовища", + "item.modulargolems.nuclear_construct": "Ядерная Структура", + "item.modulargolems.omnipotent_wand_command": "Всеобъемлющий Жезл: Команда", + "item.modulargolems.omnipotent_wand_retrieval": "Всеобъемлющий Жезл: Возвращение", + "item.modulargolems.omnipotent_wand_rider": "Всеобъемлющий Жезл: Всадник", + "item.modulargolems.omnipotent_wand_squad": "Всеобъемлющий Жезл: Отряд", + "item.modulargolems.omnipotent_wand_summon": "Всеобъемлющий Жезл: Призыв", + "item.modulargolems.orange_config_card": "Оранжевая Конфигурационная Карта", + "item.modulargolems.patrol_path_recorder": "Записывающее Устройство Патрульного Пути", + "item.modulargolems.pickup": "Улучшение Подбора", + "item.modulargolems.pickup_mending": "Улучшение Подбора: Исправление", + "item.modulargolems.pickup_no_destroy": "Улучшение Подбора: Без Разрушения", + "item.modulargolems.pink_config_card": "Розовая Конфигурационная Карта", + "item.modulargolems.player": "Улучшение иммунитета к игрокам", + "item.modulargolems.purple_config_card": "Фиолетовая Конфигурационная Карта", + "item.modulargolems.push": "Улучшение Расширения", + "item.modulargolems.quartz": "Улучшение Кварца", + "item.modulargolems.recycle": "Улучшение Переработки", + "item.modulargolems.red_config_card": "Красная Конфигурационная Карта", + "item.modulargolems.retrieval_wand": "Жезл Возвращения", + "item.modulargolems.rider_wand": "Жезл Всадника", + "item.modulargolems.roman_guard_chestplate": "Железный нагрудник голема", + "item.modulargolems.roman_guard_helmet": "Железный шлем голема", + "item.modulargolems.roman_guard_shinguard": "Железный набедренник голема", + "item.modulargolems.size_upgrade": "Улучшение Размера", + "item.modulargolems.slow": "Зелье-улучшение: Замедление", + "item.modulargolems.soul_flame": "Зелье-улучшение: Огненная Душа", + "item.modulargolems.speed": "Улучшение Скорости", + "item.modulargolems.speed_high": "Улучшение Скорости V", + "item.modulargolems.sponge": "Улучшение Губки", + "item.modulargolems.squad_wand": "Жезл Отряда", + "item.modulargolems.steeleaf": "Улучшение Стиллифа", + "item.modulargolems.summon_wand": "Жезл Призыва", + "item.modulargolems.swim": "Улучшение Плавания", + "item.modulargolems.talented": "Мета-улучшение: Талантливый", + "item.modulargolems.target_filter_default": "Фильтр Цели: По Умолчанию", + "item.modulargolems.target_filter_name": "Фильтр Цели: Datapack", + "item.modulargolems.target_filter_type": "Фильтр Цели: Тип Сущности", + "item.modulargolems.target_filter_uuid": "Фильтр Цели: UUID Сущности", + "item.modulargolems.teleport": "Улучшение Телепортации", + "item.modulargolems.thunder_immune": "Улучшение иммунитета к молниям", + "item.modulargolems.weak": "Зелье-улучшение: Слабость", + "item.modulargolems.white_config_card": "Белая Конфигурационная Карта", + "item.modulargolems.wind_spirit_chestplate": "Алмазный нагрудник голема", + "item.modulargolems.wind_spirit_helmet": "Алмазный шлем голема", + "item.modulargolems.wind_spirit_shinguard": "Алмазный набедренник голема", + "item.modulargolems.wither": "Зелье-улучшение: Нежить", + "item.modulargolems.yellow_config_card": "Жёлтая Конфигурационная Карта", + "itemGroup.l2library.golems": "Модульные Големы", + "modifier.modulargolems.ancient_remnant_sandstorm": "Древний Остаток Песчаной Бури", + "modifier.modulargolems.ancient_remnant_sandstorm.desc": "Когда цель находится далеко, вызывает песчаную бурю в позиции цели", + "modifier.modulargolems.armor_up": "Увеличение Брони", + "modifier.modulargolems.atomic_fueling": "Атомное Топливо", + "modifier.modulargolems.atomic_fueling.desc": "Потребляет [%s] чтобы восстановить %s HP и увеличивает атаку и скорость на %s на %s секунд. Делает голема невосприимчивым к радиационному эффекту.", + "modifier.modulargolems.bell": "Колокол", + "modifier.modulargolems.bell.desc": "Когда голем хочет атаковать, он звонит в колокол, привлекая всех врагов и освещая их.", + "modifier.modulargolems.blazing": "Огненный", + "modifier.modulargolems.blazing.desc": "Стреляет огненными шарами при приближении к цели.", + "modifier.modulargolems.carminite": "Карминит", + "modifier.modulargolems.carminite.desc": "После получения урона становится невидимым и неуязвимым на %s секунд", + "modifier.modulargolems.cauldron": "Котёл", + "modifier.modulargolems.cauldron.desc": "Повторяющиеся зельевые улучшения больше не будут потреблять слоты улучшений.", + "modifier.modulargolems.cleanse": "Зелье-улучшение: Чистка", + "modifier.modulargolems.coating": "Покрытие", + "modifier.modulargolems.coating.desc": "Уменьшает получаемый урон на %s", + "modifier.modulargolems.conduit": "Кондуктор", + "modifier.modulargolems.conduit.desc": "Когда в воде: уменьшает получаемый урон до %s%%. Каждые %s секунд наносит %s урона кондуктором удалённо в воде/дожде. Увеличивает следующие характеристики:", + "modifier.modulargolems.curse": "Зелье-улучшение: Проклятие", + "modifier.modulargolems.damage_cap": "Ограничение Урона", + "modifier.modulargolems.damage_cap.desc": "Урон ограничен в пределах %s%% от максимального здоровья.", + "modifier.modulargolems.damage_up": "Увеличение Урона", + "modifier.modulargolems.emerald": "Изумруд", + "modifier.modulargolems.emerald.desc": "Наносит на %s%% больше урона иллагерам", + "modifier.modulargolems.ender_guardian_void_rune": "Руна Пустоты Эндера", + "modifier.modulargolems.ender_guardian_void_rune.desc": "Вызывает руну пустоты в направлении цели", + "modifier.modulargolems.ender_sight": "Зрение Эндера", + "modifier.modulargolems.ender_sight.desc": "Голем может видеть через стены и потолки.", + "modifier.modulargolems.explosion_resistant": "Устойчивость к Взрывам", + "modifier.modulargolems.explosion_resistant.desc": "Урон от взрывов уменьшен до %s%% от оригинала и не будет разрушать блоки.", + "modifier.modulargolems.fiery": "Огненный", + "modifier.modulargolems.fiery.desc": "Наносит на %s%% больше урона огнём существам, не имеющим иммунитета к огню", + "modifier.modulargolems.fire_immune": "Иммунитет к Огню", + "modifier.modulargolems.fire_immune.desc": "Имеет иммунитет к урону от огня. Плавает в лаве.", + "modifier.modulargolems.float": "Плавучесть", + "modifier.modulargolems.float.desc": "Голем плавает в воде и лаве вместо того, чтобы тонуть", + "modifier.modulargolems.free_movement": "Свободное Движение", + "modifier.modulargolems.free_movement.desc": "Голем не застревает в блоках или карамеле", + "modifier.modulargolems.freezing": "Зелье-улучшение: Заморозка", + "modifier.modulargolems.freezing.desc": "Получает эффекты чар Ледяного Клинка и Ледяных Шипов. Имеет иммунитет к замораживающему урону.", + "modifier.modulargolems.gum_shooter": "Стрелок Жвачкой", + "modifier.modulargolems.gum_shooter.desc": "Стреляет жвачками по целям, нанося %s урона", + "modifier.modulargolems.harbinger_death_beam": "Луч Смерти Гарбингера", + "modifier.modulargolems.harbinger_death_beam.desc": "Когда цель находится далеко, стреляет Лучом Смерти в сторону цели.", + "modifier.modulargolems.harbinger_missile": "Ракета Гарбингера", + "modifier.modulargolems.harbinger_missile.desc": "Когда цель находится далеко, стреляет самонаводящейся ракетой в сторону цели.", + "modifier.modulargolems.hostility_core": "Ядро Враждебности", + "modifier.modulargolems.hostility_core.desc": "Все другие улучшения враждебности не потребляют слоты улучшений", + "modifier.modulargolems.hostility_potion": "Улучшение враждебности: Зелье", + "modifier.modulargolems.hostility_potion.desc": "Первый уровень каждого типа зельевых улучшений не потребляет слот улучшения", + "modifier.modulargolems.hostility_protection": "Улучшение враждебности: Защита", + "modifier.modulargolems.hostility_reflect": "Улучшение враждебности: Отражение", + "modifier.modulargolems.hostility_regen": "Улучшение враждебности: Регенерация", + "modifier.modulargolems.hostility_speed": "Улучшение враждебности: Скорость", + "modifier.modulargolems.hostility_tank": "Улучшение враждебности: Танк", + "modifier.modulargolems.ignis_attack": "Атака Игнис", + "modifier.modulargolems.ignis_attack.desc": "Накапливает эффект Огненного Бренда и восстанавливает здоровье при ударе цели. Когда здоровье ниже половины, прямой урон игнорирует броню.", + "modifier.modulargolems.ignis_fireball": "Огненный Шар Игниса", + "modifier.modulargolems.ignis_fireball.desc": "Когда цель находится далеко, стреляет огненными шарами Игниса в сторону цели.", + "modifier.modulargolems.immunity": "Иммунитет", + "modifier.modulargolems.immunity.desc": "Имеет иммунитет ко всем видам урона, кроме урона от пустоты. Мобы не будут атаковать невосприимчивого голема.", + "modifier.modulargolems.incarcerate": "Зелье-улучшение: Пленение", + "modifier.modulargolems.leviathan_blast_portal": "Портал Взрыва Левиафана", + "modifier.modulargolems.leviathan_blast_portal.desc": "Когда цель находится далеко, создает портал взрыва на позиции цели", + "modifier.modulargolems.magic_immune": "Иммунитет к магии", + "modifier.modulargolems.magic_immune.desc": "Имеет иммунитет к магическому урону", + "modifier.modulargolems.magic_resistant": "Магическая Сопротивляемость", + "modifier.modulargolems.magic_resistant.desc": "Уменьшает получаемый магический урон до %s%% от оригинала", + "modifier.modulargolems.mana_boosting": "Усиление Маны", + "modifier.modulargolems.mana_boosting.desc": "Наносит на %s%% больше урона за счет затраты %s маны", + "modifier.modulargolems.mana_burst": "Вспышка Маны", + "modifier.modulargolems.mana_burst.desc": "Стреляет вспышкой маны по удалённым целям, нанося %s%% урона атаки, затрачивая %s маны", + "modifier.modulargolems.mana_mending": "Исправление Маны", + "modifier.modulargolems.mana_mending.desc": "Получает %s регенерации с эффективностью %s маны/HP", + "modifier.modulargolems.mana_production": "Производство Маны", + "modifier.modulargolems.mana_production.desc": "Генерирует %s маны в секунду", + "modifier.modulargolems.mechanical_engine": "Механический Двигатель", + "modifier.modulargolems.mechanical_engine.desc": "Потребляет топливо для питания голема.", + "modifier.modulargolems.mechanical_force": "Механическая Сила", + "modifier.modulargolems.mechanical_force.desc": "При сжигании топлива увеличивает урон атаки на %s%%", + "modifier.modulargolems.mechanical_mobility": "Механическая Мобильность", + "modifier.modulargolems.mechanical_mobility.desc": "При сжигании топлива увеличивает скорость на %s%%", + "modifier.modulargolems.naga": "Нага", + "modifier.modulargolems.netherite_monstrosity_earthquake": "Землетрясение Незеритового Чудовища", + "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "Прыгивает и вызывает землетрясение на суше", + "modifier.modulargolems.pickup": "Подбор", + "modifier.modulargolems.pickup.desc": "Голем подбирает предметы и опыт в радиусе %s блоков и передает их вам. Полная документация доступна в Patchouli. Голем может уничтожить предметы, если ему некуда их поместить", + "modifier.modulargolems.pickup_mending": "Улучшение Подбора: Исправление", + "modifier.modulargolems.pickup_mending.desc": "Когда голем подбирает опыт, он попытается вылечить себя с помощью этого опыта.", + "modifier.modulargolems.pickup_no_destroy": "Улучшение Подбора: Без Разрушения", + "modifier.modulargolems.pickup_no_destroy.desc": "Когда голем пытается подобрать предмет и не может найти место для его хранения, он не подберет этот предмет. Это может вызвать задержки, если голем находится в регионе с большим количеством предметов.", + "modifier.modulargolems.pixie_attack": "Атака Пикси", + "modifier.modulargolems.pixie_attack.desc": "С вероятностью %s%% при атаке вызывает пикси. Урон пикси +%s.", + "modifier.modulargolems.pixie_counterattack": "Контратака Пикси", + "modifier.modulargolems.pixie_counterattack.desc": "С вероятностью %s%% при атаке вызывает пикси.", + "modifier.modulargolems.player_immune": "Иммунитет к игрокам", + "modifier.modulargolems.player_immune.desc": "Имеет иммунитет к дружественному огню.", + "modifier.modulargolems.polarize": "Поляризация", + "modifier.modulargolems.polarize.desc": "Притягивает врагов в режиме ближнего боя и отталкивает врагов в режиме дальнего боя/стояния, нанося %s электрического урона постоянно.", + "modifier.modulargolems.poseidite": "Посейдит", + "modifier.modulargolems.poseidite.desc": "Наносит на %s%% больше урона существам, чувствительным к воде или водным существам", + "modifier.modulargolems.projectile_reject": "Отклонение Проектов", + "modifier.modulargolems.projectile_reject.desc": "Отклоняет снаряды. Не получает урон от снарядов.", + "modifier.modulargolems.push": "Толчок", + "modifier.modulargolems.radiation": "Радиация", + "modifier.modulargolems.radiation.desc": "Наносит %s целям атаки. Урон радиационной цели увеличивается на %s за уровень радиации.", + "modifier.modulargolems.recycle": "Переработка", + "modifier.modulargolems.recycle.desc": "Выпадает держатель голема с 0 здоровья при смерти. Держатель вернется в инвентарь, если игрок присутствует.", + "modifier.modulargolems.reformation": "Реформация", + "modifier.modulargolems.reformation.desc": "Потребляет железный слиток для получения %s абсорбции и лечения %s. Голем может иметь максимум %s абсорбции", + "modifier.modulargolems.regeneration_up": "Увеличение Регенерации", + "modifier.modulargolems.ridding_speed_up": "Улучшение Верховой Езды", + "modifier.modulargolems.ridding_speed_up.desc": "Голем не будет атаковать и не будет целью для атак.", + "modifier.modulargolems.size_up": "Увеличение Размера", + "modifier.modulargolems.slow": "Зелье-улучшение: Замедление", + "modifier.modulargolems.sonic_boom": "Сверхзвуковая Волна", + "modifier.modulargolems.sonic_boom.desc": "Голем может использовать атаку сверхзвуковой волной. Если голем может выполнять атаки по области, то сверхзвуковая волна может поразить несколько целей.", + "modifier.modulargolems.soul_flame": "Зелье-улучшение: Огненная Душа", + "modifier.modulargolems.soul_flame.desc": "Получает эффекты чар Лезвия Огненной Души и Шипов Огненной Души. Имеет иммунитет к урону от огненной души.", + "modifier.modulargolems.speed_up": "Увеличение Скорости", + "modifier.modulargolems.sticky_caramel": "Липкая Карамель", + "modifier.modulargolems.sticky_caramel.desc": "Наносит расплавленную карамель на цели атаки", + "modifier.modulargolems.swim": "Плавание", + "modifier.modulargolems.swim.desc": "Голем умеет плавать", + "modifier.modulargolems.talented": "Талантливый", + "modifier.modulargolems.talented.desc": "Первая из каждого типа улучшений с синей стрелкой больше не потребляет слоты улучшений (до 4)", + "modifier.modulargolems.teleport": "Телепортация", + "modifier.modulargolems.teleport.desc": "Телепортируется случайным образом, чтобы избежать физического урона. Телепортируется к цели при атаке. Телепорт имеет %ss перезарядку.", + "modifier.modulargolems.tf_damage": "Бонус Урона в Лесу Сумерек", + "modifier.modulargolems.tf_damage.desc": "Наносит на %s%% больше урона в Лесу Сумерек", + "modifier.modulargolems.tf_healing": "Бонус Исцеления в Лесу Сумерек", + "modifier.modulargolems.tf_healing.desc": "Исцеление становится на %s%% более эффективным в Лесу Сумерек", + "modifier.modulargolems.thorn": "Шип", + "modifier.modulargolems.thorn.desc": "Отражает %s%% урона", + "modifier.modulargolems.thunder_immune": "Иммунитет к молниям", + "modifier.modulargolems.thunder_immune.desc": "Имеет иммунитет к урону от молний. Притягивает молнии. При ударе получает сопротивление огню на 10 секунд и восстанавливает %s здоровья.", + "modifier.modulargolems.totemic_gold": "Тотемное Золото", + "modifier.modulargolems.totemic_gold.desc": "Наносит на %s%% больше урона нежити", + "modifier.modulargolems.toughness_up": "Увеличение Твердости", + "modifier.modulargolems.weak": "Зелье-улучшение: Слабость", + "modifier.modulargolems.wither": "Зелье-улучшение: Нежить", + "modulargolems.config.blacklist": "Используется черный список. Нажмите, чтобы переключиться на белый список.", + "modulargolems.config.friendly": "Дружественный Список", + "modulargolems.config.hostile": "Враждебный Список", + "modulargolems.config.loading": "Загрузка...", + "modulargolems.config.lock": "Блокировка Взаимодействия", + "modulargolems.config.match_item": "Сравнивать только предметы. Нажмите, чтобы сравнивать NBT.", + "modulargolems.config.match_tag": "Сравнивать предметы и NBT. Нажмите, чтобы сравнивать только предметы.", + "modulargolems.config.mode": "Режим По Умолчанию", + "modulargolems.config.mode_tooltip": "Режим по умолчанию, который голем будет использовать при вызове. Не влияет на големов в мире уже. Вызванные големы будут принимать этот режим вместо старого при вызове.", + "modulargolems.config.no": "Не назначен конфигурационный картридж", + "modulargolems.config.pos": "Вызвать в", + "modulargolems.config.pos_original": "Оригинальная Позиция", + "modulargolems.config.pos_original_tooltip": "Если голем был вызван, вызовите этого голема в оригинальную позицию. Это не возымеет эффекта, если голем новый. Если оригинальная позиция слишком далеко, вызов не удался.", + "modulargolems.config.pos_target": "Выбранная Позиция", + "modulargolems.config.pos_target_tooltip": "Вызвать голема в позицию, указываемую игроком.", + "modulargolems.config.reset": "Сброс", + "modulargolems.config.set": "Вставить в конфигурационный набор", + "modulargolems.config.whitelist": "Используется белый список. Нажмите, чтобы переключиться на черный список.", + "modulargolems.msg.add_target": "Добавлен %s в фильтр", + "modulargolems.msg.botania_mana": "Мана: %s/%s", + "modulargolems.msg.botania_no_ring": "Не надето Кольцо Маны", + "modulargolems.msg.call_attack": "%s Големов атакуют %s", + "modulargolems.msg.destroy_exp": "Голем %s уничтожил %s опыта, так как не нашел места для хранения.", + "modulargolems.msg.destroy_item": "Голем %s уничтожил %s предметов, так как не нашел места для хранения.", + "modulargolems.msg.remove_target": "Удален %s из фильтра", + "modulargolems.msg.summon_failed": "Не удалось вызвать %s, так как целевая позиция слишком далеко", + "modulargolems.msg.summon_far": "Вызван %s, в (%s,%s,%s)", + "modulargolems.slot.arrow": "Слот для стрел", + "modulargolems.slot.arrow_desc": "Поместите стрелы сюда, чтобы освободить вторую руку для щита", + "modulargolems.slot.backup": "Слот для вторичного оружия", + "modulargolems.slot.backup_desc": "Поместите вторичные оружия сюда.", + "modulargolems.slot.backup_info": "Если у вас есть лук и меч, один в основной руке и один в слоте для вторичного оружия, ваш голем может переключаться между ними в зависимости от расстояния до врагов.", + "modulargolems.slot.main": "Основной Слот", + "modulargolems.slot.main_desc": "Поместите оружие сюда. Принимает все что угодно.", + "modulargolems.slot.off": "Слот для второй руки", + "modulargolems.tab.attribute": "Атрибуты Голема", + "modulargolems.tab.equipment": "Оборудование Голема", + "modulargolems.tab.path": "Настройка Патрульного Пути", + "modulargolems.tab.pickup": "Настройка Фильтра Подбора", + "modulargolems.tab.target": "Настройка Фильтра Цели", + "modulargolems.tab.toggle": "Общие Настройки", + "modulargolems.tooltip.craft_material": "Материал для создания голема", + "modulargolems.tooltip.follow": "Следовать", + "modulargolems.tooltip.following": "Голем будет следовать за вами", + "modulargolems.tooltip.golem_equipment": "Эффективно только на %s", + "modulargolems.tooltip.guard": "Бродить", + "modulargolems.tooltip.guarding": "Голем будет бродить вокруг (%s, %s, %s)", + "modulargolems.tooltip.health": "Здоровье: %s/%s", + "modulargolems.tooltip.modifier": "Всего %s модификаторов из %s улучшений", + "modulargolems.tooltip.patrol": "Патрулирование", + "modulargolems.tooltip.patrolling": "Голем будет патрулировать по заданному маршруту", + "modulargolems.tooltip.potion_attack": "Наносит %s врагам, атакующим или атакуемым.", + "modulargolems.tooltip.potion_defense": "Голем получает %s.", + "modulargolems.tooltip.repair_material": "Материал для ремонта голема", + "modulargolems.tooltip.shift": "Нажмите SHIFT, чтобы показать детали модификаторов", + "modulargolems.tooltip.slot": "Оставшиеся слоты улучшений: %s", + "modulargolems.tooltip.squad": "Отряд", + "modulargolems.tooltip.stand": "Стой", + "modulargolems.tooltip.standing": "Голем будет стоять на месте (%s, %s, %s)", + "modulargolems.tooltip.target.default": "Цели по умолчанию для железного голема: все враги, кроме криперов.", + "modulargolems.tooltip.target.name": "Переименуйте предмет и правой кнопкой мыши добавьте имя как тип существа или тег типа существа в список", + "modulargolems.tooltip.target.remove": "Shift + правая кнопка мыши, чтобы удалить последнюю запись из списка", + "modulargolems.tooltip.target.shift": "Нажмите SHIFT, чтобы показать использование", + "modulargolems.tooltip.target.type_add": "Правой кнопкой мыши по существу, чтобы добавить тип существа в список", + "modulargolems.tooltip.target.type_remove": "Shift + правой кнопкой мыши по существу, чтобы удалить тип существа из списка", + "modulargolems.tooltip.target.uuid_add": "Правой кнопкой мыши по существу, чтобы добавить UUID существа в список", + "modulargolems.tooltip.target.uuid_remove": "Shift + правой кнопкой мыши по существу, чтобы удалить UUID существа из списка", + "modulargolems.tooltip.team_up": "Голем будет следовать за своим капитаном", + "modulargolems.tooltip.wander": "Бродить", + "modulargolems.tooltip.wandering": "Голем будет свободно перемещаться", + "modulargolems.wand.add_node": "Добавлен узел к пути", + "modulargolems.wand.command_right": "Выберите голема, чтобы изменить режим. Выберите существо, чтобы приказать близлежащим големам атаковать его.", + "modulargolems.wand.command_shift": "Щелкните по голему, чтобы настроить инвентарь и просмотреть статистику.", + "modulargolems.wand.config": "Щелкните правой кнопкой мыши по голему, чтобы установить конфигурацию. Щелкните снова, чтобы удалить. Когда находится в другой руке, жезлы будут нацеливаться только на големов с этой конфигурацией.", + "modulargolems.wand.config_init": "Щелкните правой кнопкой мыши, чтобы инициализировать конфигурацию", + "modulargolems.wand.config_other": "Не ваша карта. Вы не можете редактировать её", + "modulargolems.wand.mode": "Текущий Режим: %s", + "modulargolems.wand.node_count": "Путь имеет %s узлов", + "modulargolems.wand.path_record": "Щелкните правой кнопкой мыши по блоку, чтобы добавить его к пути, щелкните снова, чтобы удалить. Путь образует цикл.", + "modulargolems.wand.remove_node": "Удален узел из пути", + "modulargolems.wand.retrieve_right": "Вызовите всех окружающих вас големов.", + "modulargolems.wand.retrieve_shift": "Выберите далекого голема, чтобы вызвать его.", + "modulargolems.wand.rider": "Выберите вашего голема-собаку, чтобы ездить на нем. Если это не ваш голем, вы можете ездить, когда его владелец едет. Когда установлен, щелкните правой кнопкой мыши по чему-либо, чтобы спешиться.", + "modulargolems.wand.right_click": "При щелчке правой кнопкой мыши:", + "modulargolems.wand.shift_click": "При щелчке правой кнопкой мыши с зажатой клавишей Shift:", + "modulargolems.wand.squad": "Щелкните по голему с конфигурацией, чтобы назначить его капитаном. Щелкните по капитану, чтобы удалить его статус капитана.", + "modulargolems.wand.summon_right": "Вызовите одного голема в далекую позицию, указанную жезлом.", + "modulargolems.wand.summon_shift": "Вызовите всех големов из вашего инвентаря.", + "modulargolems.wand.switch": "Прокрутите или используйте клавиши со стрелками вверх/вниз, чтобы переключаться между режимами", + "patchouli.modulargolems.landing": "Добро пожаловать в мод сборки и улучшения големов, подобный Tinker", + "patchouli.modulargolems.title": "Руководство по Модульным Големам" +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/lang/zh_cn.json b/src/main/resources/assets/modulargolems/lang/zh_cn.json index f2f544e47..3df39d325 100644 --- a/src/main/resources/assets/modulargolems/lang/zh_cn.json +++ b/src/main/resources/assets/modulargolems/lang/zh_cn.json @@ -1,4 +1,378 @@ { + "advancements.modulargolems.advancements.golems.anvil_fix.description": "在铁砧中用锭修复金属傀儡", + "advancements.modulargolems.advancements.golems.anvil_fix.title": "完好如初", + "advancements.modulargolems.advancements.golems.apply.description": "在铁砧中为傀儡零件镀上金属", + "advancements.modulargolems.advancements.golems.apply.title": "呼~好重!", + "advancements.modulargolems.advancements.golems.apply_sculk.description": "制作一个幽匿傀儡部件", + "advancements.modulargolems.advancements.golems.apply_sculk.title": "可怕的回忆", + "advancements.modulargolems.advancements.golems.command.description": "制作命令手杖", + "advancements.modulargolems.advancements.golems.command.title": "保卫家园", + "advancements.modulargolems.advancements.golems.craft.description": "用金属傀儡零件制作一个傀儡", + "advancements.modulargolems.advancements.golems.craft.title": "崭新出炉!", + "advancements.modulargolems.advancements.golems.dog.description": "创造一个犬形傀儡", + "advancements.modulargolems.advancements.golems.dog.title": "高贵的冷血动物", + "advancements.modulargolems.advancements.golems.full.description": "将傀儡的升级槽用尽", + "advancements.modulargolems.advancements.golems.full.title": "好吧,真的不能再多了", + "advancements.modulargolems.advancements.golems.fully_equipped.description": "给人形傀儡全套盔甲、一把剑和一面盾牌", + "advancements.modulargolems.advancements.golems.fully_equipped.title": "全副武装", + "advancements.modulargolems.advancements.golems.hot_fix.description": "使用金属锭直接修复一个傀儡", + "advancements.modulargolems.advancements.golems.hot_fix.title": "应急处理", + "advancements.modulargolems.advancements.golems.humanoid.description": "创造一个人形傀儡", + "advancements.modulargolems.advancements.golems.humanoid.title": "坚硬的\u0027你\u0027", + "advancements.modulargolems.advancements.golems.kill_creeper.description": "让傀儡击杀苦力怕", + "advancements.modulargolems.advancements.golems.kill_creeper.title": "反恐行动", + "advancements.modulargolems.advancements.golems.kill_guardian.description": "让傀儡击杀守卫者", + "advancements.modulargolems.advancements.golems.kill_guardian.title": "亚特兰蒂斯的传说", + "advancements.modulargolems.advancements.golems.kill_warden.description": "让傀儡击杀监守者", + "advancements.modulargolems.advancements.golems.kill_warden.title": "忒修斯之船", + "advancements.modulargolems.advancements.golems.oops.description": "让人形傀儡的一件装备损坏", + "advancements.modulargolems.advancements.golems.oops.title": "哦,我的上帝!", + "advancements.modulargolems.advancements.golems.recycle.description": "对一个傀儡使用回收升级", + "advancements.modulargolems.advancements.golems.recycle.title": "不坏之躯", + "advancements.modulargolems.advancements.golems.retrieve.description": "制作一根回收手杖", + "advancements.modulargolems.advancements.golems.retrieve.title": "都回来吧", + "advancements.modulargolems.advancements.golems.root.description": "创造属于你的军队!", + "advancements.modulargolems.advancements.golems.root.title": "欢迎来到傀儡装配", + "advancements.modulargolems.advancements.golems.sponge.description": "对傀儡使用海绵升级", + "advancements.modulargolems.advancements.golems.sponge.title": "浸水金属", + "advancements.modulargolems.advancements.golems.start.description": "制作傀儡配料并使用切石机将其切割成傀儡零件", + "advancements.modulargolems.advancements.golems.start.title": "一切的开端", + "advancements.modulargolems.advancements.golems.swim.description": "对傀儡使用游泳升级", + "advancements.modulargolems.advancements.golems.swim.title": "水下巡航", + "advancements.modulargolems.advancements.golems.thunder.description": "让一个免疫雷电的傀儡被闪电击中", + "advancements.modulargolems.advancements.golems.thunder.title": "行走的避雷针", + "advancements.modulargolems.advancements.golems.upgrade.description": "获取一个升级模块", + "advancements.modulargolems.advancements.golems.upgrade.title": "是时候升级了", + "advancements.modulargolems.advancements.golems.summon.description": "制作召唤手杖", + "advancements.modulargolems.advancements.golems.summon.title": "空降部队", + "advancements.modulargolems.advancements.golems.summon_mass.description": "一次召唤至少24只傀儡", + "advancements.modulargolems.advancements.golems.summon_mass.title": "一车面包人", + "advancements.modulargolems.advancements.golems.max.description": "在同一傀儡身上安装12个升级", + "advancements.modulargolems.advancements.golems.max.title": "超越极限", + "item.modulargolems.candy_mixture": "糖果机块", + "item.modulargolems.candy_construct": "糖果机核", + "item.modulargolems.magnetic_alloy": "磁力合金", + "item.modulargolems.magnetic_construct": "磁力机核", + "item.modulargolems.nuclear_construct": "核能机核", + "effect.modulargolems.atomic_boost": "核能强化", + "effect.modulargolems.atomic_boost.description": "提升攻击伤害和移动速度", + "golem_material.alexscaves.candy": "糖果", + "golem_material.alexscaves.magnetic": "磁力", + "golem_material.alexscaves.nuclear": "核能", + "modifier.modulargolems.atomic_fueling": "反应充能", + "modifier.modulargolems.atomic_fueling.desc": "可消耗[%s]回复%s的生命值,并提升%s的攻击伤害和移动速度,持续%s秒。免疫辐照效果", + "modifier.modulargolems.free_movement": "穿行", + "modifier.modulargolems.free_movement.desc": "不会被方块和焦糖减速", + "modifier.modulargolems.gum_shooter": "糖果机", + "modifier.modulargolems.gum_shooter.desc": "可发射糖果子弹,造成%s点伤害", + "modifier.modulargolems.polarize": "磁力极化", + "modifier.modulargolems.polarize.desc": "可根据攻击模式改变技能效果:近战模式牵引周围的目标,远程模式排斥周围的目标。触发时持续造成%s点伤害", + "modifier.modulargolems.radiation": "辐照", + "modifier.modulargolems.radiation.desc": "对攻击的目标施加%s效果。对受到辐照效果的目标造成的伤害每级提升%s", + "modifier.modulargolems.reformation": "磁力重组", + "modifier.modulargolems.reformation.desc": "可消耗铁锭获得%s点伤害吸收,并回复%s点生命值。最多叠加%s点伤害吸收", + "modifier.modulargolems.sticky_caramel": "粘性焦糖", + "modifier.modulargolems.sticky_caramel.desc": "在攻击目标脚下生成焦糖", + "golem_material.allthemodium.allthemodium": "ATM", + "golem_material.allthemodium.unobtainium": "难得素", + "golem_material.allthemodium.vibranium": "振金", + "golem_material.blazegear.brimsteel": "烈焰钢", + "modifier.modulargolems.blazing": "烈焰", + "modifier.modulargolems.blazing.desc": "可对远处的目标发射火球", + "golem_material.botania.manasteel": "魔钢", + "golem_material.botania.terrasteel": "泰拉钢", + "golem_material.botania.elementium": "源质钢", + "modifier.modulargolems.mana_mending": "魔力修复", + "modifier.modulargolems.mana_mending.desc": "可消耗%2$s魔力回复自身1点生命值,每秒最多回复%1$s点生命值", + "modifier.modulargolems.mana_boosting": "魔力增幅", + "modifier.modulargolems.mana_boosting.desc": "可消耗%2$s魔力提升%1$s%%攻击伤害", + "modifier.modulargolems.mana_production": "魔力制造", + "modifier.modulargolems.mana_production.desc": "每秒回复%s魔力", + "modifier.modulargolems.mana_burst": "魔力脉冲", + "modifier.modulargolems.mana_burst.desc": "可消耗%2$s魔力向远处的目标发射魔力脉冲,造成%s%%的伤害", + "modifier.modulargolems.pixie_attack": "精灵袭击", + "modifier.modulargolems.pixie_attack.desc": "攻击时有%s%%几率召唤一个精灵袭击目标,且精灵的攻击伤害+%s", + "modifier.modulargolems.pixie_counterattack": "精灵反击", + "modifier.modulargolems.pixie_counterattack.desc": "被攻击时有%s%%几率召唤一个精灵反击目标", + "modulargolems.msg.botania_mana": "魔力: %s/%s", + "modulargolems.msg.botania_no_ring": "未装备魔力之戒", + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "+%s 激光伤害", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "+%s 导弹伤害", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "+%s 巨兽撼地伤害", + "modulargolems.tooltip.cataclysm.ignis_armor_fireball": "+%s 焰魔火球伤害", + "modulargolems.tooltip.cataclysm.ignis_armor_soul": "永续灵魂形态", + "modulargolems.tooltip.cataclysm.ignis_armor_strike": "+%s 烈焰轰击伤害", + "modulargolems.tooltip.cataclysm.maledictus_bypass_cd": "下落攻击召唤的幻影战戟可无视目标无敌帧", + "modulargolems.tooltip.cataclysm.maledictus_fast_skill": "幻戟坠击冷却时间减半", + "modulargolems.tooltip.cataclysm.maledictus_revive": "受到致命伤害时以%s%%生命值复活,冷却%s秒", + "modulargolems.tooltip.cataclysm.maledictus_revive_actual_cd": "实际冷却:%s秒", + "modulargolems.tooltip.cataclysm.maledictus_revive_cd": "每件额外咒魂护甲或部件使冷却减少%s秒,复活生命值提升%s%%", + "modulargolems.tooltip.cataclysm.maledictus_revive_in_cd": "冷却中:剩余%s秒", + "item.modulargolems.harbinger_chestplate": "先行者傀儡胸甲", + "item.modulargolems.harbinger_helmet": "先行者傀儡头盔", + "item.modulargolems.harbinger_shinguard": "先行者傀儡护腿", + "item.modulargolems.harbinger_upgrade_template": "先行者傀儡升级模板", + "item.modulargolems.monstrosity_chestplate": "恶兽傀儡胸甲", + "item.modulargolems.monstrosity_helmet": "恶兽傀儡头盔", + "item.modulargolems.monstrosity_shinguard": "恶兽傀儡护腿", + "item.modulargolems.monstrosity_upgrade_template": "恶兽傀儡升级模板", + "item.modulargolems.ignis_chestplate": "腾炎傀儡胸甲", + "item.modulargolems.ignis_helmet": "腾炎傀儡头盔", + "item.modulargolems.ignis_shinguard": "腾炎傀儡护腿", + "item.modulargolems.maledictus_chestplate": "咒魂傀儡胸甲", + "item.modulargolems.maledictus_helmet": "咒魂傀儡头盔", + "item.modulargolems.maledictus_shinguard": "咒魂傀儡护腿", + "golem_material.cataclysm.ignitium": "腾炎", + "golem_material.cataclysm.witherite": "凋零合金", + "golem_material.cataclysm.cursium": "咒魂", + "effect.modulargolems.maledictus_rage": "恶咒", + "effect.modulargolems.maledictus_rage.description": "提升傀儡攻击伤害", + "golem_material.cataclysm.ender_guardian": "末地守卫", + "golem_material.cataclysm.storm": "风暴", + "golem_material.cataclysm.ancient_metal": "远古金属", + "item.modulargolems.ender_guardian_void_rune": "末影守卫升级", + "item.modulargolems.leviathan_blast_portal": "利维坦升级", + "item.modulargolems.ancient_remnant_sandstorm": "远古遗魂升级", + "item.modulargolems.netherite_monstrosity_earthquake": "下界合金巨兽升级", + "item.modulargolems.scylla_lightning_upgrade": "斯库拉升级", + "item.modulargolems.azure_cube": "蔚蓝立方", + "item.modulargolems.void_cube": "虚空机块", + "item.modulargolems.storm_construct": "风暴机核", + "item.modulargolems.void_construct": "虚空机核", + "modifier.modulargolems.harbinger_death_beam": "先驱者激光", + "modifier.modulargolems.harbinger_death_beam.desc": "目标距离较远时,可对目标发射激光", + "modifier.modulargolems.harbinger_missile": "先驱者导弹", + "modifier.modulargolems.harbinger_missile.desc": "目标距离较远时,可对目标发射追踪导弹", + "modifier.modulargolems.ignis_attack": "焰魔之刃", + "modifier.modulargolems.ignis_attack.desc": "对攻击的目标叠加炽热烙印效果并吸血。生命值低于上限的50%时造成的伤害穿透护甲", + "modifier.modulargolems.ignis_fireball": "焰魔火球", + "modifier.modulargolems.ignis_fireball.desc": "目标距离较远时,可对目标发射焰魔火球", + "modifier.modulargolems.ender_guardian_void_rune": "虚空符文", + "modifier.modulargolems.ender_guardian_void_rune.desc": "可对多个目标释放漩涡和虚空符文", + "modifier.modulargolems.leviathan_blast_portal": "深渊冲击波", + "modifier.modulargolems.leviathan_blast_portal.desc": "可在多个目标位置释放深渊冲击波", + "modifier.modulargolems.ancient_remnant_sandstorm": "遗魂沙暴", + "modifier.modulargolems.ancient_remnant_sandstorm.desc": "可在多个目标位置召唤沙暴。对受到沙漠诅咒效果的目标造成的伤害提升", + "modifier.modulargolems.netherite_monstrosity_earthquake": "巨兽撼地", + "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "可起跳进行下落攻击,落地时造成范围伤害", + "modifier.modulargolems.maledictus_attack": "咒灵之刃", + "modifier.modulargolems.maledictus_attack.desc": "近战造成的伤害穿透护甲。造成伤害后提升伤害,最多叠加%s层", + "modifier.modulargolems.maledictus_earthquake": "幻戟坠击", + "modifier.modulargolems.maledictus_earthquake.desc": "可起跳进行下落攻击,落地时造成范围伤害并召唤幻影战戟", + "modifier.modulargolems.scylla_lightning": "鸣雷槊", + "modifier.modulargolems.scylla_lightning.desc": "可对多个目标发射鸣雷槊", + "modifier.modulargolems.scylla_wave": "霆浪锚", + "modifier.modulargolems.scylla_wave.desc": "受到伤害时召唤海浪推开目标", + "modifier.modulargolems.ancient_remnant_reformation": "遗骸重组", + "modifier.modulargolems.ancient_remnant_reformation.desc": "熔锻:可消耗自身材料回复生命值,但会减少生命值上限并缩小体型。可通过修复材料复原", + "modifier.modulargolems.ignis_jump": "烈焰轰击", + "modifier.modulargolems.ignis_jump.desc": "可起跳进行下落攻击,落地时在附近所有目标位置释放烈焰轰击", + "golem_material.composite_material.allay_steel": "悦灵钢", + "golem_material.composite_material.dungeon_steel": "地牢钢", + "golem_material.composite_material.etherite": "以太合金", + "golem_material.composite_material.primitive": "荒古坚材", + "golem_material.composite_material.obsidian_steel": "黑曜石钢", + "item.modulargolems.etherite": "以太镀层升级", + "modifier.modulargolems.dungeon_absorption": "损害吸收", + "modifier.modulargolems.dungeon_absorption.desc": "近战造成伤害时,回复所造成伤害%s%%的生命值", + "modifier.modulargolems.dungeon_link": "生命链接", + "modifier.modulargolems.dungeon_link.desc": "以非修复的方式回复生命值时,按%s%%的比例回复所有者的生命值", + "modifier.modulargolems.obsidian": "坚韧外壳", + "modifier.modulargolems.obsidian.desc": "受到的最终伤害减少%s点", + "modifier.modulargolems.primitive_blast": "荒古之力", + "modifier.modulargolems.primitive_blast.desc": "提升生命值上限%s%%的攻击伤害", + "modifier.modulargolems.primitive_curse": "荒古诅咒", + "modifier.modulargolems.primitive_curse.desc": "受到的伤害减少%1$s%%,但升级槽%2$s", + "modifier.modulargolems.resonant_attack": "共鸣震慑", + "modifier.modulargolems.resonant_attack.desc": "造成伤害后,对%1$s格内的同种目标追加造成原伤害%2$s%%的魔法伤害", + "modifier.modulargolems.resonant_heal": "生声不息", + "modifier.modulargolems.resonant_heal.desc": "以非修复的方式回复生命值时,按%1$s%%的比例回复%2$s格内同技能友方的生命值,受友方技能等级影响", + "modifier.modulargolems.etherite_plating": "以太镀层", + "modifier.modulargolems.etherite_plating.desc1": "根据技能等级获得以下效果:", + "modifier.modulargolems.etherite_plating.desc2": " · 免疫弹射物伤害", + "modifier.modulargolems.etherite_plating.desc3": " · 免疫常规减益", + "modifier.modulargolems.etherite_plating.desc4": " · 免疫环境伤害", + "modifier.modulargolems.etherite_plating.desc5": " · 周期性自我修复", + "golem_material.create.cardboard": "纸板", + "golem_material.create.zinc": "锌", + "golem_material.create.andesite_alloy": "安山合金", + "golem_material.create.brass": "黄铜", + "golem_material.create.railway": "火车", + "modifier.modulargolems.coating": "镀层升级", + "modifier.modulargolems.coating.desc": "受到的最终伤害减少%s点", + "modifier.modulargolems.push": "击退提升", + "modifier.modulargolems.mechanical_engine": "蒸汽动力", + "modifier.modulargolems.mechanical_engine.desc": "可消耗燃料强化自身", + "modifier.modulargolems.mechanical_force": "工业长路", + "modifier.modulargolems.mechanical_force.desc": "消耗燃料时提升%s%%攻击伤害", + "modifier.modulargolems.mechanical_mobility": "汽鸣铁道", + "modifier.modulargolems.mechanical_mobility.desc": "消耗燃料时提升%s%%移动速度", + "item.modulargolems.coating": "镀层升级", + "item.modulargolems.push": "机械手升级", + "effect.modulargolems.mechanical_force": "工业长路", + "effect.modulargolems.mechanical_force.description": "提升傀儡攻击伤害", + "effect.modulargolems.mechanical_mobility": "汽鸣铁道", + "effect.modulargolems.mechanical_mobility.description": "提升傀儡移动速度", + "golem_material.goety.cursed_metal": "诅咒金属", + "golem_material.goety.dark_metal": "黑暗金属", + "item.modulargolems.fire_blast": "使徒升级: 炎爆", + "item.modulargolems.fire_tornado": "使徒升级: 燃烧龙卷风", + "item.modulargolems.hell_cloud": "使徒升级: 狱云", + "item.modulargolems.hell_blast": "使徒升级: 狱火爆弹", + "item.modulargolems.hell_bolt": "使徒升级: 狱火束", + "item.modulargolems.apostle": "使徒晋升升级", + "modifier.modulargolems.fallen_attack": "堕落之刃", + "modifier.modulargolems.haunted": "缠魂", + "modifier.modulargolems.haunted.desc": "击败目标时有概率召唤缠魂盔甲仆从。目标的盔甲越多概率越高", + "modifier.modulargolems.soul_repair": "灵魂修补", + "modifier.modulargolems.soul_repair.desc": "可使用召唤者的灵魂能量修复装备。生命值较低时也可使用灵魂能量回复生命值", + "modifier.modulargolems.fire_blast": "炎爆", + "modifier.modulargolems.fire_blast.desc": "可在前方召唤炎爆陷阱", + "modifier.modulargolems.fire_tornado": "燃烧龙卷风", + "modifier.modulargolems.fire_tornado.desc": "可在目标位置召唤燃烧龙卷风", + "modifier.modulargolems.hell_cloud": "狱云", + "modifier.modulargolems.hell_cloud.desc": "可在目标位置召唤狱云", + "modifier.modulargolems.apostle": "使徒", + "modifier.modulargolems.apostle.desc": "使徒升级不再消耗升级槽", + "modifier.modulargolems.hell_blast": "狱火爆弹", + "modifier.modulargolems.hell_blast.desc": "可对多个目标发射狱火爆弹", + "modifier.modulargolems.hell_bolt": "狱火束", + "modifier.modulargolems.hell_bolt.desc": "可对多个目标发射狱火束", + "item.modulargolems.soul_collection": "灵魂收割升级", + "modifier.modulargolems.soul_collection": "灵魂收割", + "modifier.modulargolems.soul_collection.desc": "击杀目标时为所有者提供灵魂能量", + "golem_material.goety_revelation.apocalyptium": "神金", + "item.modulargolems.apocalyptium_helmet": "神金傀儡头盔", + "item.modulargolems.apocalyptium_chestplate": "神金傀儡胸甲", + "item.modulargolems.apocalyptium_shinguard": "神金傀儡护腿", + "item.modulargolems.apocalyptium_boots": "神金傀儡靴子", + "item.modulargolems.stellar_apocalypse": "星辰之怒", + "modulargolems.tooltip.revelation.dash": "可向目标发起冲锋,进行冲刺攻击", + "modulargolems.tooltip.revelation.soul_boost": "+%s%% 灵魂修补效率", + "modulargolems.tooltip.revelation.soul_reap": "近战造成真实伤害,造成伤害时获取灵魂", + "item.modulargolems.the_abhorrent": "使徒头衔: 憎恶本质", + "item.modulargolems.the_atrocious": "使徒头衔: 十恶不赦", + "item.modulargolems.the_profane": "使徒头衔: 天启饥荒", + "item.modulargolems.the_terrible": "使徒头衔: 可怖之物", + "modifier.modulargolems.the_abhorrent": "憎恶本质", + "modifier.modulargolems.the_abhorrent.desc": "攻击时减少目标的无敌帧时长", + "modifier.modulargolems.the_atrocious": "十恶不赦", + "modifier.modulargolems.the_atrocious.desc": "减少使徒升级的技能冷却", + "modifier.modulargolems.the_profane": "天启饥荒", + "modifier.modulargolems.the_profane.desc": "攻击时随机移除目标的%s个正面效果", + "modifier.modulargolems.the_risen": "不灭重生", + "modifier.modulargolems.the_risen.desc": "死亡时掉落0点生命值的可修复物品形态,且在物品栏中生命值为0点时也可回复生命值", + "modifier.modulargolems.the_terrible": "可怖之物", + "modifier.modulargolems.the_terrible.desc": "拉弓速度更快。可对至多%2$s个目标分别射出%1$s支箭", + "entity.modulargolems.metal_golem": "大型金属傀儡", + "entity.modulargolems.humanoid_golem": "人形金属傀儡", + "entity.modulargolems.dog_golem": "犬形金属傀儡", + "entity.modulargolems.beacon_laser": "信标激光", + "golem_type.modulargolems.metal_golem": "大型金属傀儡", + "golem_type.modulargolems.humanoid_golem": "人形金属傀儡", + "golem_type.modulargolems.dog_golem": "犬形金属傀儡", + "golem_material.modulargolems.copper": "铜", + "golem_material.modulargolems.gold": "金", + "golem_material.modulargolems.iron": "铁", + "golem_material.modulargolems.netherite": "下界合金", + "golem_material.modulargolems.sculk": "幽匿", + "golem_part.metal_golem.body": "身体: %s", + "golem_part.metal_golem.left": "左手: %s", + "golem_part.metal_golem.leg": "双腿: %s", + "golem_part.metal_golem.right": "右手: %s", + "golem_part.humanoid_golem.arms": "双臂: %s", + "golem_part.humanoid_golem.body": "躯干: %s", + "golem_part.humanoid_golem.legs": "双腿: %s", + "golem_part.dog_golem.body": "躯干: %s", + "golem_part.dog_golem.legs": "四肢: %s", + "modifier.modulargolems.fire_immune": "火焰免疫", + "modifier.modulargolems.fire_immune.desc": "免疫火焰伤害,可浮在熔岩表面", + "modifier.modulargolems.thunder_immune": "闪电免疫", + "modifier.modulargolems.thunder_immune.desc": "免疫雷击伤害,吸引闪电。被雷击时获得10秒防火效果,并回复%s点生命值", + "modifier.modulargolems.magic_immune": "魔法免疫", + "modifier.modulargolems.magic_immune.desc": "免疫魔法伤害", + "modifier.modulargolems.recycle": "傀儡回收", + "modifier.modulargolems.recycle.desc": "死亡时掉落0点生命值的可修复物品形态。如果玩家存在,物品直接进入玩家物品栏", + "modifier.modulargolems.armor_up": "防御提升", + "modifier.modulargolems.toughness_up": "韧性提升", + "modifier.modulargolems.damage_up": "伤害提升", + "modifier.modulargolems.regeneration_up": "回复升级", + "modifier.modulargolems.magic_resistant": "魔法抗性", + "modifier.modulargolems.magic_resistant.desc": "受到的魔法伤害x%s%%", + "modifier.modulargolems.float": "漂浮升级", + "modifier.modulargolems.float.desc": "可浮在水面", + "modifier.modulargolems.explosion_resistant": "爆炸抗性", + "modifier.modulargolems.explosion_resistant.desc": "受到的爆炸伤害减少至%s%%,且波及到自身的爆炸不会破坏方块", + "modifier.modulargolems.damage_cap": "伤害限制", + "modifier.modulargolems.damage_cap.desc": "单次受到的伤害不会超过生命值上限的%s%%", + "modifier.modulargolems.immunity": "不灭", + "modifier.modulargolems.immunity.desc": "免疫虚空伤害以外的所有伤害。所有目标不会攻击自身", + "modifier.modulargolems.projectile_reject": "弹射物反射", + "modifier.modulargolems.projectile_reject.desc": "反射弹射物。免疫弹射物伤害", + "modifier.modulargolems.swim": "游泳", + "modifier.modulargolems.swim.desc": "可在液体中游泳", + "modifier.modulargolems.player_immune": "友伤免疫", + "modifier.modulargolems.player_immune.desc": "免疫所有者及其从属造成的伤害", + "modifier.modulargolems.sonic_boom": "音爆", + "modifier.modulargolems.sonic_boom.desc": "可使用音爆攻击。若能进行范围攻击,则音爆造成范围伤害", + "modifier.modulargolems.bell": "钟声", + "modifier.modulargolems.bell.desc": "切换攻击目标时,可敲钟吸引大范围的目标并对其施加发光效果", + "modifier.modulargolems.ender_sight": "透视", + "modifier.modulargolems.ender_sight.desc": "可看穿墙壁和天花板", + "modifier.modulargolems.speed_up": "移动速度提升", + "modifier.modulargolems.emerald": "袭击者杀手", + "modifier.modulargolems.emerald.desc": "对袭击者造成的伤害提升%s%%", + "modifier.modulargolems.dynamic_reduction": "动态减伤", + "modifier.modulargolems.dynamic_reduction.desc": "在一定时间内受到的伤害不会超过生命值上限的20%", + "modifier.modulargolems.slow": "药水升级:缓慢", + "modifier.modulargolems.weak": "药水升级:虚弱", + "modifier.modulargolems.wither": "药水升级:凋零", + "modifier.modulargolems.pickup": "拾取升级", + "modifier.modulargolems.pickup.desc": "允许捡起附近的物品/经验并交给你。详细机制请查阅帕秋莉说明书。如果找不到位置存放物品/经验,则会将其销毁", + "modifier.modulargolems.pickup_mending": "拾取附属:经验修补", + "modifier.modulargolems.pickup_mending.desc": "在拾取经验时,会试图使用经验修补自身", + "modifier.modulargolems.pickup_no_destroy": "拾取附属:取消销毁", + "modifier.modulargolems.pickup_no_destroy.desc": "找不到位置存放物品时,不会销毁物品也不会拾取物品。注意:在大量掉落物的区域使用这个升级可能会造成卡顿", + "modifier.modulargolems.talented": "多才多艺", + "modifier.modulargolems.talented.desc": "前4种蓝色升级在首次安装时不消耗升级槽", + "modifier.modulargolems.cauldron": "炼药锅", + "modifier.modulargolems.cauldron.desc": "重复的药水升级不消耗升级槽", + "modifier.modulargolems.ridding_speed_up": "坐骑升级", + "modifier.modulargolems.ridding_speed_up.desc": "不会攻击也不会成为攻击对象。免疫不以自身为攻击对象的目标造成的伤害", + "modifier.modulargolems.size_up": "体型升级", + "modifier.modulargolems.armor_penetration": "护甲穿透", + "modifier.modulargolems.armor_penetration.desc": "造成的伤害有%s%%概率穿透护甲和盾牌", + "modifier.modulargolems.add_slot": "额外升级", + "modifier.modulargolems.add_slot.desc": "提供%s个额外的升级槽", + "modifier.modulargolems.add_slot_diamond": "升级扩充: 钻石", + "modifier.modulargolems.add_slot_diamond.desc": "升级槽+1。仅允许使用一次", + "modifier.modulargolems.add_slot_netherite": "升级扩充: 下界合金", + "modifier.modulargolems.add_slot_netherite.desc": "升级槽+1。仅允许使用一次", + "golem_material.l2hostility.chaotic": "混沌", + "golem_material.l2hostility.miraculous": "奇迹", + "modifier.modulargolems.hostility_adaptive": "恶意词条:适应", + "modifier.modulargolems.hostility_dispell": "恶意词条:破魔", + "modifier.modulargolems.hostility_core": "恶意核心", + "modifier.modulargolems.hostility_core.desc": "其他恶意升级不消耗升级槽", + "modifier.modulargolems.hostility_potion": "恶意升级:药水", + "modifier.modulargolems.hostility_potion.desc": "每种药水升级在首次安装时不消耗升级槽", + "modifier.modulargolems.hostility_protection": "恶意升级:保护", + "modifier.modulargolems.hostility_reflect": "恶意升级:反射", + "modifier.modulargolems.hostility_regen": "恶意升级:再生", + "modifier.modulargolems.hostility_speed": "恶意升级:神速", + "modifier.modulargolems.hostility_tank": "恶意升级:重装", + "golem_material.iceandfire.fire_dragonsteel": "龙炎钢", + "golem_material.iceandfire.ice_dragonsteel": "龙霜钢", + "golem_material.iceandfire.lightning_dragonsteel": "龙霆钢", + "modifier.modulargolems.fire_dragonsteel_attack": "龙炎斩", + "modifier.modulargolems.fire_dragonsteel_attack.desc": "攻击时点燃并击退目标", + "modifier.modulargolems.ice_dragonsteel_armor": "龙霜棘", + "modifier.modulargolems.ice_dragonsteel_armor.desc": "受到伤害时冻结并击退攻击者", + "modifier.modulargolems.ice_dragonsteel_attack": "龙霜斩", + "modifier.modulargolems.ice_dragonsteel_attack.desc": "攻击时冻结并击退目标", + "modifier.modulargolems.lightning_dragonsteel_attack": "龙霆斩", + "modifier.modulargolems.lightning_dragonsteel_attack.desc": "攻击时同时召唤闪电攻击目标", + "block.modulargolems.golem_workbench": "傀儡装配台", "item.modulargolems.metal_golem_template": "傀儡胚料", "item.modulargolems.metal_golem_holder": "大型金属傀儡", "item.modulargolems.humanoid_golem_holder": "人形金属傀儡", @@ -25,7 +399,7 @@ "item.modulargolems.attack_high": "伤害升级V", "item.modulargolems.speed": "速度升级", "item.modulargolems.speed_high": "速度升级V", - "item.modulargolems.cleanse": "药水升级:净化", + "item.modulargolems.cleanse": "净化升级", "item.modulargolems.curse": "药水升级:诅咒", "item.modulargolems.emerald": "绿宝石升级", "item.modulargolems.incarcerate": "药水升级:禁锢", @@ -38,7 +412,7 @@ "item.modulargolems.talented": "辅助升级:多才多艺", "item.modulargolems.cauldron": "辅助升级:炼药锅", "item.modulargolems.mount_upgrade": "坐骑升级", - "item.modulargolems.size_upgrade": "体形升级", + "item.modulargolems.size_upgrade": "体型升级", "item.modulargolems.omnipotent_wand_command": "万能手杖:命令", "item.modulargolems.omnipotent_wand_retrieval": "万能手杖:回收", "item.modulargolems.omnipotent_wand_rider": "万能手杖:骑乘", @@ -57,6 +431,24 @@ "item.modulargolems.target_filter_uuid": "生物过滤器: 实体ID", "item.modulargolems.target_filter_default": "生物过滤器: 默认攻击目标", "item.modulargolems.patrol_path_recorder": "巡逻手册", + "item.modulargolems.golem_facade": "傀儡皮肤", + "item.modulargolems.golem_slicing_axe": "斩铁巨斧", + "item.modulargolems.diamond_expansion_template": "扩充模版 - 钻石", + "item.modulargolems.netherite_expansion_template": "扩充模版 - 下界合金", + "item.modulargolems.hostile_wand": "敌对傀儡调试器", + "item.modulargolems.barbaric_vanguard_boots": "蛮荒傀儡镣铐", + "item.modulargolems.wind_spirit_boots": "风行傀儡靴子", + "item.modulargolems.beacon_boots": "信标傀儡靴子", + "item.modulargolems.diamond_dog_golem_armor": "钻石制傀儡狼铠", + "item.modulargolems.gold_dog_golem_armor": "金制傀儡狼铠", + "item.modulargolems.iron_dog_golem_armor": "铁制傀儡狼铠", + "item.modulargolems.netherite_dog_golem_armor": "下界合金制傀儡狼铠", + "item.modulargolems.iron_mecha_bow": "铁质机械弓", + "item.modulargolems.netherite_mecha_bow": "下界合金机械弓", + "item.modulargolems.beacon_cannon": "信标炮", + "item.modulargolems.sonic_cannon": "回响炮", + "item.modulargolems.mechanical_arm": "维修机械手", + "item.modulargolems.flame_thrower": "炼狱火枪", "item.modulargolems.metal_golem_arm": "大型金属傀儡-手臂", "item.modulargolems.metal_golem_body": "大型金属傀儡-身体", "item.modulargolems.metal_golem_legs": "大型金属傀儡-双腿", @@ -89,15 +481,15 @@ "item.modulargolems.red_config_card": "配置卡片红色", "item.modulargolems.white_config_card": "配置卡片白色", "item.modulargolems.yellow_config_card": "配置卡片黄色", - "item.modulargolems.barbaric_vanguard_chestplate": "蛮荒护甲", - "item.modulargolems.barbaric_vanguard_helmet": "蛮荒头盔", - "item.modulargolems.barbaric_vanguard_shinguard": "蛮荒护腿", - "item.modulargolems.roman_guard_chestplate": "罗马护甲", - "item.modulargolems.roman_guard_helmet": "罗马头盔", - "item.modulargolems.roman_guard_shinguard": "罗马护腿", - "item.modulargolems.wind_spirit_chestplate": "风行护甲", - "item.modulargolems.wind_spirit_helmet": "风行头盔", - "item.modulargolems.wind_spirit_shinguard": "风行护腿", + "item.modulargolems.barbaric_vanguard_chestplate": "蛮荒傀儡胸甲", + "item.modulargolems.barbaric_vanguard_helmet": "蛮荒傀儡头盔", + "item.modulargolems.barbaric_vanguard_shinguard": "蛮荒傀儡护腿", + "item.modulargolems.roman_guard_chestplate": "罗马傀儡胸甲", + "item.modulargolems.roman_guard_helmet": "罗马傀儡头盔", + "item.modulargolems.roman_guard_shinguard": "罗马傀儡护腿", + "item.modulargolems.wind_spirit_chestplate": "风行傀儡胸甲", + "item.modulargolems.wind_spirit_helmet": "风行傀儡头盔", + "item.modulargolems.wind_spirit_shinguard": "风行傀儡护腿", "item.modulargolems.iron_golem_spear": "铁傀儡长枪", "item.modulargolems.iron_golem_axe": "铁傀儡战斧", "item.modulargolems.iron_golem_sword": "铁傀儡大剑", @@ -107,101 +499,68 @@ "item.modulargolems.netherite_golem_spear": "下界合金傀儡长枪", "item.modulargolems.netherite_golem_axe": "下界合金傀儡战斧", "item.modulargolems.netherite_golem_sword": "下界合金傀儡大剑", - "modifier.modulargolems.hostility_core": "恶意核心", - "modifier.modulargolems.hostility_core.desc": "其他恶意升级不消耗升级槽", - "modifier.modulargolems.hostility_potion": "恶意升级:药水", - "modifier.modulargolems.hostility_potion.desc": "每个第一级的药水升级不消耗升级槽", - "modifier.modulargolems.hostility_protection": "恶意升级:保护", - "modifier.modulargolems.hostility_reflect": "恶意升级:反射", - "modifier.modulargolems.hostility_regen": "恶意升级:再生", - "modifier.modulargolems.hostility_speed": "恶意升级:神速", - "modifier.modulargolems.hostility_tank": "恶意升级:重装", - "entity.modulargolems.metal_golem": "大型金属傀儡", - "entity.modulargolems.humanoid_golem": "人形金属傀儡", - "entity.modulargolems.dog_golem": "犬形金属傀儡", - "golem_type.modulargolems.metal_golem": "大型金属傀儡", - "golem_type.modulargolems.humanoid_golem": "人形金属傀儡", - "golem_type.modulargolems.dog_golem": "犬形金属傀儡", - "golem_material.modulargolems.copper": "铜", - "golem_material.modulargolems.gold": "金", - "golem_material.modulargolems.iron": "铁", - "golem_material.modulargolems.netherite": "下界合金", - "golem_material.modulargolems.sculk": "幽匿", - "golem_part.metal_golem.body": "身体: %s", - "golem_part.metal_golem.left": "左手: %s", - "golem_part.metal_golem.leg": "双腿: %s", - "golem_part.metal_golem.right": "右手: %s", - "golem_part.humanoid_golem.arms": "双臂: %s", - "golem_part.humanoid_golem.body": "躯干: %s", - "golem_part.humanoid_golem.legs": "双腿: %s", - "golem_part.dog_golem.body": "躯干: %s", - "golem_part.dog_golem.legs": "四肢: %s", - "modifier.modulargolems.fire_immune": "火焰免疫", - "modifier.modulargolems.fire_immune.desc": "免疫火焰伤害,漂浮于岩浆上。", - "modifier.modulargolems.thunder_immune": "闪电免疫", - "modifier.modulargolems.thunder_immune.desc": "免疫闪电伤害,吸引闪电。被雷劈时获得10秒防火,并回复%s血量。", - "modifier.modulargolems.magic_immune": "魔法免疫", - "modifier.modulargolems.magic_immune.desc": "免疫魔法伤害", - "modifier.modulargolems.recycle": "傀儡回收", - "modifier.modulargolems.recycle.desc": "傀儡死亡时掉落0血量的可修复物品形态。如果玩家存在,物品直接加入玩家背包", - "modifier.modulargolems.armor_up": "防御提升", - "modifier.modulargolems.toughness_up": "韧性提升", - "modifier.modulargolems.damage_up": "伤害提升", - "modifier.modulargolems.regeneration_up": "回复升级", - "modifier.modulargolems.magic_resistant": "魔法抗性", - "modifier.modulargolems.magic_resistant.desc": "受到的魔法伤害x%s%%", - "modifier.modulargolems.float": "漂浮升级", - "modifier.modulargolems.float.desc": "让傀儡浮在水面", - "modifier.modulargolems.explosion_resistant": "爆炸抗性", - "modifier.modulargolems.explosion_resistant.desc": "受到的爆炸伤害x%s%%,波及到傀儡的爆炸不破坏方块", - "modifier.modulargolems.damage_cap": "伤害限制", - "modifier.modulargolems.damage_cap.desc": "一次受到的伤害不会超过最高血量的%s%%", - "modifier.modulargolems.immunity": "不灭", - "modifier.modulargolems.immunity.desc": "免疫虚空伤害以外的所有伤害。怪物不会攻击这个傀儡。", - "modifier.modulargolems.projectile_reject": "弹射物反射", - "modifier.modulargolems.projectile_reject.desc": "反射弹射物,不受弹射物伤害", - "modifier.modulargolems.swim": "游泳", - "modifier.modulargolems.swim.desc": "让傀儡能游泳", - "modifier.modulargolems.player_immune": "友伤免疫", - "modifier.modulargolems.player_immune.desc": "免疫玩家及其从属造成的伤害", - "modifier.modulargolems.sonic_boom": "音爆", - "modifier.modulargolems.sonic_boom.desc": "傀儡能使用音爆攻击。若傀儡能范围攻击,则音爆造成范围伤害。", - "modifier.modulargolems.bell": "钟声", - "modifier.modulargolems.bell.desc": "傀儡切换攻击目标时,敲钟并吸引范围内的敌人,同时施加发光效果。", - "modifier.modulargolems.ender_sight": "透视", - "modifier.modulargolems.ender_sight.desc": "傀儡能看穿墙壁和天花板", - "modifier.modulargolems.speed_up": "移动速度提升", - "modifier.modulargolems.emerald": "掠夺者杀手", - "modifier.modulargolems.emerald.desc": "对掠夺者造成+%s%%伤害", - "modifier.modulargolems.slow": "药水升级:缓慢", - "modifier.modulargolems.weak": "药水升级:虚弱", - "modifier.modulargolems.wither": "药水升级:凋零", - "modifier.modulargolems.pickup": "拾取升级", - "modifier.modulargolems.pickup.desc": "傀儡会捡起附近的物品和经验并交给你。详细机制请查阅帕秋莉说明书。如果傀儡找不到地方放物品/经验,傀儡会把物品/经验销毁", - "modifier.modulargolems.pickup_mending": "拾取附属:经验修补", - "modifier.modulargolems.pickup_mending.desc": "傀儡拾取经验时,会试图使用经验修补自身。", - "modifier.modulargolems.pickup_no_destroy": "拾取附属:取消销毁", - "modifier.modulargolems.pickup_no_destroy.desc": "傀儡找不到地方放物品时不会销毁物品,也不会拾取物品。注意:在大量掉落物的区域使用这个升级可能会造成卡顿", - "modifier.modulargolems.talented": "多才多艺", - "modifier.modulargolems.talented.desc": "前4种蓝色升级的第一个升级不消耗升级槽", - "modifier.modulargolems.cauldron": "炼药锅", - "modifier.modulargolems.cauldron.desc": "重复的药水升级不消耗升级槽", - "modifier.modulargolems.ridding_speed_up": "坐骑升级", - "modifier.modulargolems.ridding_speed_up.desc": "傀儡不会攻击也不会成为攻击对象", - "modifier.modulargolems.size_up": "体型升级", + "item.modulargolems.ironwood_golem_spear": "铁木傀儡长枪", + "item.modulargolems.ironwood_golem_axe": "铁木傀儡战斧", + "item.modulargolems.ironwood_golem_sword": "铁木傀儡大剑", + "item.modulargolems.knightmetal_golem_spear": "骑士傀儡长枪", + "item.modulargolems.knightmetal_golem_axe": "骑士傀儡战斧", + "item.modulargolems.knightmetal_golem_sword": "骑士傀儡大剑", + "item.modulargolems.fiery_golem_spear": "炽铁傀儡长枪", + "item.modulargolems.fiery_golem_axe": "炽铁傀儡战斧", + "item.modulargolems.fiery_golem_sword": "炽铁傀儡大剑", + "item.modulargolems.steeleaf_golem_spear": "钢叶傀儡长枪", + "item.modulargolems.steeleaf_golem_axe": "钢叶傀儡战斧", + "item.modulargolems.steeleaf_golem_sword": "钢叶傀儡大剑", + "golem_material.l2complements.eternium": "永恒", + "golem_material.l2complements.poseidite": "海神", + "golem_material.l2complements.shulkerate": "潜影", + "golem_material.l2complements.totemic_gold": "生命", + "item.modulargolems.force_field": "凋灵护甲升级", + "item.modulargolems.freezing": "药水升级:寒流", + "item.modulargolems.soul_flame": "药水升级:魂火", + "item.modulargolems.teleport": "瞬移升级", + "modifier.modulargolems.conduit": "潮涌之力", + "modifier.modulargolems.conduit.desc": "当自身在水中/雨中时:受到的伤害减少至%s%%,每%s秒对附近水中/雨中的单个目标造成%s点潮涌伤害,提升以下属性:", + "modifier.modulargolems.freezing": "药水升级:寒流", + "modifier.modulargolems.freezing.desc": "攻击/被攻击时,对目标/攻击者施加寒流效果。免疫冰冻伤害", + "modifier.modulargolems.soul_flame": "药水升级:魂火", + "modifier.modulargolems.soul_flame.desc": "攻击/被攻击时,对目标/攻击者施加魂火效果。免疫魂火伤害", + "modifier.modulargolems.teleport": "瞬移", + "modifier.modulargolems.teleport.desc": "被攻击时可随机传送躲避非魔法伤害,攻击时可使用传送快速接近目标。传送存在%s秒冷却", + "modifier.modulargolems.cleanse": "净化升级", + "modifier.modulargolems.curse": "药水升级:诅咒", + "modifier.modulargolems.incarcerate": "药水升级:禁锢", + "modifier.modulargolems.poseidite": "海神", + "modifier.modulargolems.poseidite.desc": "对怕水生物和水生生物造成的伤害提升%s%%", + "modifier.modulargolems.totemic_gold": "生命", + "modifier.modulargolems.totemic_gold.desc": "对亡灵生物造成的伤害提升%s%%", + "golem_material.legendary_monsters.molten_metal": "熔融金属", + "modifier.modulargolems.ancient_anchor": "荒古锚", + "modifier.modulargolems.ancient_anchor.desc": "可起跳进行下落攻击,落地时释放冲击波眩晕目标并造成范围伤害", + "golem_material.legendary_monsters.cloud": "浮云", + "item.modulargolems.cloud_cube": "浮云立方", + "item.modulargolems.thunderstorm": "雷暴升级", + "modifier.modulargolems.thunderstorm": "雷暴", + "modifier.modulargolems.thunderstorm.desc": "可召唤雷暴攻击多个目标。受到伤害时向周围释放电磁脉冲", + "modifier.modulargolems.cloud_forming": "聚云", + "modifier.modulargolems.cloud_forming.desc": "造成的伤害根据目标的生命值上限提升", "attribute.name.golem_regen": "生命回复", "attribute.name.golem_sweep": "范围攻击", "attribute.name.golem_size": "傀儡体型", "attribute.name.golem_jump": "傀儡跳跃", - "itemGroup.l2library.golems": "模块化傀儡", - "modulargolems.tooltip.health": "血量: %s/%s", + "attribute.name.dynamic_reduction": "动态减伤时间", + "itemGroup.l2library.golems": "傀儡装配 - 傀儡", + "itemGroup.l2library.golem_items": "傀儡装配 - 物品", + "itemGroup.l2library.golem_upgrades": "傀儡装配 - 升级", + "modulargolems.tooltip.health": "生命值: %s/%s", "modulargolems.tooltip.slot": "剩余升级槽: %s", - "modulargolems.tooltip.shift": "按 SHIFT 显示技能细节", + "modulargolems.tooltip.meltdown": "熔锻: %s", + "modulargolems.tooltip.shift": "按SHIFT显示技能细节", "modulargolems.tooltip.following": "傀儡会跟随玩家", "modulargolems.tooltip.guarding": "傀儡会在(%s, %s, %s)附近行动", "modulargolems.tooltip.standing": "傀儡会停在(%s, %s, %s)", - "modulargolems.tooltip.potion_attack": "对攻击傀儡和被傀儡攻击的敌人施加:%s", - "modulargolems.tooltip.potion_defense": "傀儡获得:%s", + "modulargolems.tooltip.potion_attack": "攻击/被攻击时,对目标/攻击者施加:%s", + "modulargolems.tooltip.potion_defense": "获得常驻效果:%s", "modulargolems.tooltip.follow": "跟随", "modulargolems.tooltip.golem_equipment": "只对%s生效", "modulargolems.tooltip.guard": "巡逻", @@ -213,6 +572,34 @@ "modulargolems.tooltip.wander": "自由行动", "modulargolems.tooltip.wandering": "傀儡会自由随机移动", "modulargolems.tooltip.modifier": "总计%s个技能,%s个升级", + "modulargolems.tooltip.craft_material": "傀儡制作材料", + "modulargolems.tooltip.repair_material": "傀儡修补材料", + "modulargolems.tooltip.slicing_enemy": "大型傀儡持此斧击杀特定目标时随机掉落一个对应材料的大型傀儡部件", + "modulargolems.tooltip.slicing_golem": "大型傀儡持此斧击杀非所有者的傀儡时掉落所有部件,且每个升级有%s概率掉落", + "modulargolems.tooltip.beacon_boots": "对周围的友方施加%s, %s并治疗", + "modulargolems.tooltip.no_slot": "移除这个升级会导致傀儡升级槽为负", + "modulargolems.tooltip.remove_template": "扩充模版不可移除", + "modulargolems.tooltip.disintegrate": "分解傀儡", + "modulargolems.tooltip.return_items": "分解傀儡并返还下列物品:", + "modulargolems.tooltip.return_many": "分解傀儡并返还%s个物品", + "modulargolems.tooltip.fix_first": "分解前请先修复傀儡!", + "modulargolems.tooltip.sub_ingot": "替换身体时,傀儡的每个扩充模版都需要额外消耗一个身体材料。当前需要:", + "modulargolems.tooltip.sub_slot": "替换后升级槽为负", + "modulargolems.tooltip.diff_stat": "属性/技能差异", + "modulargolems.tooltip.bow_stiffness": "弓强度: %s", + "modulargolems.tooltip.multi_shot": "可同时射出至多%s支箭", + "modulargolems.tooltip.bow_pierce": "射出的箭可穿透%s个实体", + "modulargolems.tooltip.shoulder_weapon": "傀儡肩部装备", + "modulargolems.tooltip.beacon_cannon": "可发射信标激光造成魔法伤害", + "modulargolems.tooltip.mechanical_arm": "可使用材料自动修复傀儡。且可被[蒸汽动力]技能加速", + "modulargolems.tooltip.sonic_cannon": "可发射三道音爆,造成深渊回响伤害", + "modulargolems.tooltip.sonic_cannon_resonance": "安装幽匿部件的傀儡使用效果更强", + "modulargolems.tooltip.flamethrower": "根据弹药在如下3种攻击方式中切换:", + "modulargolems.tooltip.flamethrower_firecharge": " · [火焰弹]可发射火球,命中时产生爆炸", + "modulargolems.tooltip.flamethrower_flame": " · [烈焰粉]可发射小火球,每个弹药装填16发。支持无限魔咒", + "modulargolems.tooltip.flamethrower_tnt": " · [TNT]可发射点燃的TNT,命中时产生爆炸", + "modulargolems.tooltip.shield_break": "破盾武器", + "modulargolems.tooltip.player_skin_button": "更改皮肤:玩家/贴图(右键点击重置)", "modulargolems.tooltip.target.name": "重命名物品,然后拿在手中右键,把物品名字作为实体类型ID/实体类型标签ID加入过滤器", "modulargolems.tooltip.target.remove": "蹲下右键移除最后一行", "modulargolems.tooltip.target.shift": "按SHIFT显示用法", @@ -220,28 +607,31 @@ "modulargolems.tooltip.target.type_remove": "蹲下右键实体把实体类型从过滤器中移除", "modulargolems.tooltip.target.uuid_add": "右键实体把实体ID加入过滤器", "modulargolems.tooltip.target.uuid_remove": "蹲下右键实体把实体ID从过滤器中移除", - "modulargolems.tooltip.target.default": "包含默认铁傀儡攻击目标:除了爬行者以外的所有敌人", + "modulargolems.tooltip.target.default": "包含默认铁傀儡攻击目标:除了爬行者以外的所有敌对目标", "modulargolems.wand.mode": "目前模式: %s", "modulargolems.wand.switch": "使用滚轮或者上下键切换模式", "modulargolems.wand.right_click": "右键时:", "modulargolems.wand.shift_click": "蹲下右键时:", - "modulargolems.wand.command_right": "指向傀儡改变行动模式,指向其他生物使周围所有你的傀儡优先攻击该目标", + "modulargolems.wand.command_right": "指向傀儡改变行动模式,指向其他目标时,使附近所有的傀儡优先攻击该目标", "modulargolems.wand.command_shift": "打开傀儡详情界面,配置傀儡装备,查看数值等", - "modulargolems.wand.retrieve_right": "回收周围所有你的傀儡", - "modulargolems.wand.retrieve_shift": "指向远处的一个傀儡,将其回收", + "modulargolems.wand.retrieve_right": "指向远处的一个傀儡,将其回收", + "modulargolems.wand.retrieve_shift": "回收附近所有的傀儡", "modulargolems.wand.summon_right": "把一个傀儡召唤至指向的远处的方块", "modulargolems.wand.summon_shift": "召唤背包中所有傀儡", - "modulargolems.wand.rider": "右键一个犬型傀儡以骑在它身上。如果不是你的傀儡,那个傀儡的主人骑乘时你才能骑上去。在傀儡上右键任意地方取消骑乘。", - "modulargolems.wand.config": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对持有相同配置卡的傀儡生效", + "modulargolems.wand.rider": "右键一个犬型傀儡以骑在它身上。如果不是你的傀儡,需要傀儡的所有者骑乘时你才能骑乘。在傀儡上右键任意位置取消骑乘", + "modulargolems.wand.config": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对相同配置卡的傀儡生效", "modulargolems.wand.config_init": "右键初始化配置卡", - "modulargolems.wand.config_other": "这不是你的卡片,你不能编辑", - "modulargolems.wand.squad": "设置傀儡为当前配置卡的队长。点队长取消其队长状态", - "modulargolems.wand.path_record": "右键方块添加路径点,再次右键同方块移除。路径点首尾相连成环", + "modulargolems.wand.config_other": "这不是你的配置卡,你不能编辑", + "modulargolems.wand.squad": "设置傀儡为当前配置卡的队长。选择队长则取消其队长状态", + "modulargolems.wand.path_record": "右键方块添加路径点,再次右键同方块移除。潜行右键清空。路径点需首尾相连成环", "modulargolems.wand.add_node": "已添加路径点", "modulargolems.wand.node_count": "包含%s个路径点", "modulargolems.wand.remove_node": "已移除路径点", + "modulargolems.wand.clear_node": "已移除所有路径点", + "modulargolems.wand.err_dim": "你不能跨维度添加路径点", + "modulargolems.wand.err_dist": "路径点之间的距离不能超过16格", "modulargolems.msg.destroy_exp": "%s销毁了%s经验", - "modulargolems.msg.destroy_item": "%s找不到地方放,销毁了%s个物品", + "modulargolems.msg.destroy_item": "%s找不到位置存放物品,销毁了%s个物品", "modulargolems.msg.call_attack": "%s个傀儡将会攻击%s", "modulargolems.msg.summon_failed": "召唤%s失败,因为目标地点太远", "modulargolems.msg.summon_far": "将%s召唤于(%s,%s,%s)", @@ -256,7 +646,7 @@ "modulargolems.config.pos_original_tooltip": "如果傀儡是被收回的,把傀儡召唤至上次收回的地点。如果傀儡是新做的则不生效。如果上次收回地点太远,则召唤失败", "modulargolems.config.pos_target": "指向位置", "modulargolems.config.pos_target_tooltip": "把傀儡召唤至玩家指向的地点", - "modulargolems.config.set": "把傀儡放在这设置卡片", + "modulargolems.config.set": "\u003c-将傀儡放进这里设置配置卡", "modulargolems.config.blacklist": "使用黑名单。点击切换至白名单", "modulargolems.config.lock": "锁定交互", "modulargolems.config.match_item": "匹配物品。点击启用匹配NBT", @@ -271,50 +661,86 @@ "modulargolems.tab.toggle": "通用配置", "modulargolems.tab.target": "攻击目标过滤器", "modulargolems.tab.path": "巡逻配置", + "modulargolems.tab.tracker_alive": "世界中的傀儡", + "modulargolems.tab.tracker_dead": "傀儡死亡记录", + "modulargolems.tab.tracker_retrieve": "返回玩家记录", + "modulargolems.tab.upgrades": "傀儡升级", + "modulargolems.tab.disintegrate": "置换/分解", "modulargolems.slot.main": "主手槽", "modulargolems.slot.off": "副手槽", - "modulargolems.slot.backup": "第二武器槽", + "modulargolems.slot.backup": "副武器槽", "modulargolems.slot.arrow": "箭矢槽", - "modulargolems.slot.arrow_desc": "把箭放在这可以腾出副手持盾", - "modulargolems.slot.backup_desc": "把第二把武器放在这", - "modulargolems.slot.backup_info": "如果主手槽和第二武器槽分别持有近战武器和弓,傀儡会根据敌人的距离灵活切换武器战斗", - "modulargolems.slot.main_desc": "在这放武器。当然什么都可以放", + "modulargolems.slot.arrow_desc": "可以把箭放在这里供远程武器使用", + "modulargolems.slot.backup_desc": "可以把副武器放在这里", + "modulargolems.slot.backup_info": "如果主手槽和副武器槽分别放置近战和远程武器,傀儡会根据目标的距离灵活切换武器战斗", + "modulargolems.slot.main_desc": "可以放置任意物品", + "modulargolems.slot.main_desc_metal": "可以放置傀儡武器", + "modulargolems.slot.shoulder": "肩部装备槽", + "modulargolems.tracker.alive": "存活", + "modulargolems.tracker.dead": "死亡", + "modulargolems.tracker.dim": "维度: %s", + "modulargolems.tracker.killed": "被%s杀死", + "modulargolems.tracker.pos": "位置: (%s,%s,%s)", + "modulargolems.tracker.present": "存在于加载区块", + "modulargolems.tracker.recycle_dead": "死亡(有回收升级)", + "modulargolems.tracker.recycle_killed": "被%s杀死(有回收升级)", + "modulargolems.tracker.retrieved": "被回收", + "modulargolems.tracker.retrieved_other": "被%s回收", + "modulargolems.tracker.time": "在被卸载的区块", + "modulargolems.tracker.dimensional": "回到空间背包", + "modulargolems.tracker.ender": "回到末影背包", + "modulargolems.tracker.inventory": "回到物品栏", + "modulargolems.gui.player_skin": "玩家/贴图皮肤", + "modulargolems.gui.player_skin.confirm": "确认", + "modulargolems.gui.player_skin.cancel": "取消", + "modulargolems.gui.player_skin.hint": "输入玩家名或资源包贴图文件路径", "patchouli.modulargolems.landing": "金属傀儡的组装和升级手册", - "patchouli.modulargolems.title": "模块化傀儡", + "patchouli.modulargolems.title": "傀儡装配", "curios.identifier.golem_skin": "人形傀儡皮肤", - "golem_material.create.zinc": "锌", - "golem_material.create.andesite_alloy": "安山合金", - "golem_material.create.brass": "黄铜", - "golem_material.create.railway": "火车", - "modifier.modulargolems.coating": "镀层升级", - "modifier.modulargolems.coating.desc": "受到的伤害减少%s", - "modifier.modulargolems.push": "击退提升", - "modifier.modulargolems.mechanical_engine": "蒸汽动力", - "modifier.modulargolems.mechanical_engine.desc": "消耗燃料强化傀儡", - "modifier.modulargolems.mechanical_force": "工业长路", - "modifier.modulargolems.mechanical_force.desc": "消耗燃料时+%s%%攻击伤害", - "modifier.modulargolems.mechanical_mobility": "汽鸣铁道", - "modifier.modulargolems.mechanical_mobility.desc": "消耗燃料时+%s%%速度", - "item.modulargolems.coating": "镀层升级", - "item.modulargolems.push": "机械手升级", - "effect.modulargolems.mechanical_force": "工业长路", - "effect.modulargolems.mechanical_force.description": "提升傀儡攻击伤害", - "effect.modulargolems.mechanical_mobility": "汽鸣铁道", - "effect.modulargolems.mechanical_mobility.description": "提升傀儡移动速度", + "curios.identifier.golem_route": "巡逻手册", + "config.jade.plugin_modulargolems.player_skin": "玩家/贴图皮肤", + "top.modulargolems.player_skin": "玩家皮肤: %s", + "top.modulargolems.file_skin": "贴图皮肤: %s", + "golem_material.mowziesmobs.wroughtnaut": "千锻钢", + "item.modulargolems.wroughtnaut": "千锻震升级", + "item.modulargolems.wroughtnaut_ingot": "千锻钢锭", + "modifier.modulargolems.wroughtnaut": "千锻震", + "modifier.modulargolems.wroughtnaut.desc": "可起跳进行下落攻击,落地时向前方扇形区域释放冲击波并造成范围伤害", + "golem_material.tconstruct.amethyst_bronze": "紫水晶青铜", + "golem_material.tconstruct.cobalt": "钴", + "golem_material.tconstruct.hepatizon": "黑色科林斯青铜", + "golem_material.tconstruct.manyullyn": "玛玉灵", + "golem_material.tconstruct.rose_gold": "玫瑰金", + "effect.modulargolems.hepatizon_effect": "重复保护", + "effect.modulargolems.hepatizon_effect.description": "提升傀儡的伤害减免", + "effect.modulargolems.manyullyn_effect": "贪婪", + "effect.modulargolems.manyullyn_effect.description": "提升傀儡的攻击伤害", + "modifier.modulargolems.hepatizon_defense": "重复保护", + "modifier.modulargolems.hepatizon_defense.desc": "受到伤害后,暂时获得伤害减免", + "modifier.modulargolems.manyullyn_attack": "贪婪", + "modifier.modulargolems.manyullyn_attack.desc": "造成伤害后,暂时提升攻击伤害", + "modifier.modulargolems.manyullyn_defense": "动力", + "modifier.modulargolems.manyullyn_defense.desc": "受到伤害后,暂时提升攻击伤害", + "task.modulargolems.summon_golems.condition.has_golem_wand": "主手持有万能手杖", + "task.modulargolems.summon_golems.desc": "女仆会主动召唤傀儡攻击附近的敌对目标", + "task.modulargolems.summon_golems": "傀儡师", + "modulargolems.tooltip.maid_skin_button": "更改皮肤:女仆(右键点击重置)", + "config.jade.plugin_modulargolems.maid_model": "女仆皮肤", + "top.modulargolems.maid_model": "女仆皮肤: %s", "golem_material.twilightforest.fiery": "炽铁", "golem_material.twilightforest.ironwood": "铁木", "golem_material.twilightforest.knightmetal": "骑士", "golem_material.twilightforest.steeleaf": "钢叶", "modifier.modulargolems.fiery": "炽热", - "modifier.modulargolems.fiery.desc": "对不免疫火焰伤害的生物造成 %s%% 火焰伤害", + "modifier.modulargolems.fiery.desc": "对不免疫火焰伤害的目标造成的伤害提升%s%%", "modifier.modulargolems.thorn": "荆棘", - "modifier.modulargolems.thorn.desc": "反射 %s%% 伤害", + "modifier.modulargolems.thorn.desc": "受到直接物理伤害时,对攻击者反弹%s%%的荆棘伤害", "modifier.modulargolems.tf_damage": "暮色伤害加成", - "modifier.modulargolems.tf_damage.desc": "在暮色森林里造成%s%%伤害", + "modifier.modulargolems.tf_damage.desc": "在暮色森林中,造成的伤害提升%s%%", "modifier.modulargolems.tf_healing": "暮色再生加成", - "modifier.modulargolems.tf_healing.desc": "在暮色森林里回复%s%%原本回复量", + "modifier.modulargolems.tf_healing.desc": "在暮色森林中,生命值回复提升%s%%", "modifier.modulargolems.carminite": "砷铅铁升级", - "modifier.modulargolems.carminite.desc": "受伤后%s秒内隐身并免疫伤害", + "modifier.modulargolems.carminite.desc": "受到伤害后,%s秒内隐身并免疫伤害", "modifier.modulargolems.naga": "娜迦升级", "item.modulargolems.carminite": "砷铅铁升级", "item.modulargolems.fiery": "炽铁升级", @@ -322,119 +748,20 @@ "item.modulargolems.knightmetal": "骑士升级", "item.modulargolems.naga": "娜迦升级", "item.modulargolems.steeleaf": "钢叶升级", - "advancements.modulargolems.advancements.golems.anvil_fix.description": "在铁砧中用锭修复金属傀儡。", - "advancements.modulargolems.advancements.golems.anvil_fix.title": "完好如初", - "advancements.modulargolems.advancements.golems.apply.description": "在铁砧中为傀儡零件镀上金属。", - "advancements.modulargolems.advancements.golems.apply.title": "呼~好重!", - "advancements.modulargolems.advancements.golems.apply_sculk.description": "制作一个幽匿傀儡部件", - "advancements.modulargolems.advancements.golems.apply_sculk.title": "可怕的回忆", - "advancements.modulargolems.advancements.golems.command.description": "制作命令手杖", - "advancements.modulargolems.advancements.golems.command.title": "保卫家园", - "advancements.modulargolems.advancements.golems.craft.description": "用金属傀儡零件制作一个傀儡", - "advancements.modulargolems.advancements.golems.craft.title": "崭新出炉!", - "advancements.modulargolems.advancements.golems.dog.description": "创造一个犬型傀儡.", - "advancements.modulargolems.advancements.golems.dog.title": "高贵的冷血动物", - "advancements.modulargolems.advancements.golems.full.description": "对傀儡用尽全部的升级次数", - "advancements.modulargolems.advancements.golems.full.title": "好吧,真的不能再多了", - "advancements.modulargolems.advancements.golems.fully_equipped.description": "给人形傀儡全套盔甲、一把剑和一面盾牌。", - "advancements.modulargolems.advancements.golems.fully_equipped.title": "全副武装", - "advancements.modulargolems.advancements.golems.hot_fix.description": "使用金属锭直接修复一个傀儡", - "advancements.modulargolems.advancements.golems.hot_fix.title": "应急处理", - "advancements.modulargolems.advancements.golems.humanoid.description": "创造一个人形傀儡", - "advancements.modulargolems.advancements.golems.humanoid.title": "坚硬的\u0027你\u0027", - "advancements.modulargolems.advancements.golems.kill_creeper.description": "让傀儡击杀苦力怕", - "advancements.modulargolems.advancements.golems.kill_creeper.title": "反恐行动", - "advancements.modulargolems.advancements.golems.kill_guardian.description": "让傀儡击杀守卫者", - "advancements.modulargolems.advancements.golems.kill_guardian.title": "亚特兰蒂斯的传说", - "advancements.modulargolems.advancements.golems.kill_warden.description": "让傀儡击杀监守者", - "advancements.modulargolems.advancements.golems.kill_warden.title": "忒修斯之船", - "advancements.modulargolems.advancements.golems.oops.description": "让人形傀儡的一件装备损坏", - "advancements.modulargolems.advancements.golems.oops.title": "哦,我的上帝!", - "advancements.modulargolems.advancements.golems.recycle.description": "对一个傀儡使用回收升级", - "advancements.modulargolems.advancements.golems.recycle.title": "不坏之躯", - "advancements.modulargolems.advancements.golems.retrieve.description": "制作一根回收手杖", - "advancements.modulargolems.advancements.golems.retrieve.title": "都回来吧", - "advancements.modulargolems.advancements.golems.root.description": "创造属于你的军队!", - "advancements.modulargolems.advancements.golems.root.title": "欢迎来到傀儡装配", - "advancements.modulargolems.advancements.golems.sponge.description": "对傀儡使用海绵升级", - "advancements.modulargolems.advancements.golems.sponge.title": "浸水金属", - "advancements.modulargolems.advancements.golems.start.description": "制作傀儡配料并使用切石机将其切割成傀儡零件", - "advancements.modulargolems.advancements.golems.start.title": "一切的开端", - "advancements.modulargolems.advancements.golems.swim.description": "对傀儡使用游泳升级", - "advancements.modulargolems.advancements.golems.swim.title": "水下巡航", - "advancements.modulargolems.advancements.golems.thunder.description": "让一个免疫雷电的傀儡被闪电击中", - "advancements.modulargolems.advancements.golems.thunder.title": "行走的避雷针", - "advancements.modulargolems.advancements.golems.upgrade.description": "获取一个升级模块", - "advancements.modulargolems.advancements.golems.upgrade.title": "是时候升级了", - "advancements.modulargolems.advancements.golems.summon.description": "制作召唤手杖", - "advancements.modulargolems.advancements.golems.summon.title": "空降部队", - "advancements.modulargolems.advancements.golems.summon_mass.description": "一次召唤至少24只傀儡", - "advancements.modulargolems.advancements.golems.summon_mass.title": "一车面包人", - "advancements.modulargolems.advancements.golems.max.description": "对傀儡使用12个升级", - "advancements.modulargolems.advancements.golems.max.title": "超越极限", - "golem_material.l2complements.eternium": "永恒", - "golem_material.l2complements.poseidite": "海神", - "golem_material.l2complements.shulkerate": "潜影", - "golem_material.l2complements.totemic_gold": "生命", - "item.modulargolems.force_field": "凋零护甲升级", - "item.modulargolems.freezing": "寒流升级", - "item.modulargolems.soul_flame": "魂火升级", - "item.modulargolems.teleport": "瞬移升级", - "modifier.modulargolems.conduit": "潮涌之力", - "modifier.modulargolems.conduit.desc": "当傀儡在水中时:受到的伤害减少至%s%%、每%s秒远程对水中/雨中目标造成%s点信标伤害、提升下列数值:", - "modifier.modulargolems.freezing": "药水升级:寒流", - "modifier.modulargolems.freezing.desc": "攻击和被攻击时对目标施加寒流效果。傀儡免疫冰冻伤害。", - "modifier.modulargolems.soul_flame": "药水升级:魂火", - "modifier.modulargolems.soul_flame.desc": "攻击和被攻击时对目标施加魂火效果。傀儡免疫魂火伤害。", - "modifier.modulargolems.teleport": "瞬移", - "modifier.modulargolems.teleport.desc": "被攻击时随机传送以躲避非魔法伤害。攻击目标时通过传送来更快接近目标。传送存在%s秒冷却", - "modifier.modulargolems.cleanse": "药水升级:净化", - "modifier.modulargolems.curse": "药水升级:诅咒", - "modifier.modulargolems.incarcerate": "药水升级:禁锢", - "modifier.modulargolems.poseidite": "海神", - "modifier.modulargolems.poseidite.desc": "对怕水生物和水生生物造成+%s%%伤害", - "modifier.modulargolems.totemic_gold": "生命", - "modifier.modulargolems.totemic_gold.desc": "对亡灵生物造成+%s%%伤害", - "golem_material.blazegear.brimsteel": "烈焰钢", - "modifier.modulargolems.blazing": "烈焰", - "modifier.modulargolems.blazing.desc": "对远处的敌人发射火球", - "golem_material.botania.manasteel": "魔钢", - "golem_material.botania.terrasteel": "泰拉钢", - "golem_material.botania.elementium": "源质钢", - "modifier.modulargolems.mana_mending": "魔力修复", - "modifier.modulargolems.mana_mending.desc": "消耗魔力修复自身血量,每秒最多恢复%s点HP,效率为%s魔力/HP", - "modifier.modulargolems.mana_boosting": "魔力增幅", - "modifier.modulargolems.mana_boosting.desc": "消耗魔力增幅自身攻击%s%%,消耗为%s魔力", - "modifier.modulargolems.mana_production": "魔力制造", - "modifier.modulargolems.mana_production.desc": "泰拉钢的力量让傀儡能够被动地每秒制造%s魔力", - "modifier.modulargolems.mana_burst": "魔力脉冲", - "modifier.modulargolems.mana_burst.desc": "向远处的目标发射魔力脉冲,造成%s%%攻击伤害,消耗为%s魔力", - "modifier.modulargolems.pixie_attack": "精灵袭击", - "modifier.modulargolems.pixie_attack.desc": "攻击时有%s%%几率召唤一个精灵袭击目标,并且精灵伤害+%s", - "modifier.modulargolems.pixie_counterattack": "精灵反击", - "modifier.modulargolems.pixie_counterattack.desc": "被攻击时有%s%%几率召唤一个精灵反击目标", - "modulargolems.msg.botania_mana": "魔力: %s/%s", - "modulargolems.msg.botania_no_ring": "未装备魔力之戒", - "golem_material.cataclysm.ignitium": "腾炎", - "golem_material.cataclysm.witherite": "凋零合金", - "item.modulargolems.ender_guardian_void_rune": "末影守卫升级", - "item.modulargolems.leviathan_blast_portal": "利维坦升级", - "item.modulargolems.ancient_remnant_sandstorm": "远古遗魂升级", - "item.modulargolems.netherite_monstrosity_earthquake": "下界合金巨兽升级", - "modifier.modulargolems.harbinger_death_beam": "先驱者激光", - "modifier.modulargolems.harbinger_death_beam.desc": "攻击目标较远时,对目标发射激光", - "modifier.modulargolems.harbinger_missile": "先驱者导弹", - "modifier.modulargolems.harbinger_missile.desc": "攻击目标较远时,对目标发射追踪导弹", - "modifier.modulargolems.ignis_attack": "焰魔之刃", - "modifier.modulargolems.ignis_attack.desc": "对攻击目标叠加炽热烙印效果并吸血。半血以下时伤害穿透护甲", - "modifier.modulargolems.ignis_fireball": "焰魔火球", - "modifier.modulargolems.ignis_fireball.desc": "攻击目标较远时,对目标发射焰魔火球", - "modifier.modulargolems.ender_guardian_void_rune": "虚空符文", - "modifier.modulargolems.ender_guardian_void_rune.desc": "对目标放出虚空符文", - "modifier.modulargolems.leviathan_blast_portal": "深渊冲击波", - "modifier.modulargolems.leviathan_blast_portal.desc": "攻击目标较远时,在目标位置放出深渊冲击波", - "modifier.modulargolems.ancient_remnant_sandstorm": "遗魂沙暴", - "modifier.modulargolems.ancient_remnant_sandstorm.desc": "攻击目标较远时,在目标位置召唤沙暴", - "modifier.modulargolems.netherite_monstrosity_earthquake": "巨兽撼地", - "modifier.modulargolems.netherite_monstrosity_earthquake.desc": "傀儡会起跳砸地造成范围伤害" + "item.modulargolems.ironwood_chestplate": "铁木傀儡胸甲", + "item.modulargolems.ironwood_helmet": "铁木傀儡头盔", + "item.modulargolems.ironwood_shinguard": "铁木傀儡护腿", + "item.modulargolems.ironwood_boots": "铁木傀儡靴子", + "item.modulargolems.knightmetal_chestplate": "骑士傀儡胸甲", + "item.modulargolems.knightmetal_helmet": "骑士傀儡头盔", + "item.modulargolems.knightmetal_shinguard": "骑士傀儡护腿", + "item.modulargolems.knightmetal_boots": "骑士傀儡靴子", + "item.modulargolems.fiery_chestplate": "炽铁傀儡胸甲", + "item.modulargolems.fiery_helmet": "炽铁傀儡头盔", + "item.modulargolems.fiery_shinguard": "炽铁傀儡护腿", + "item.modulargolems.fiery_boots": "炽铁傀儡靴子", + "item.modulargolems.naga_chestplate": "娜迦傀儡胸甲", + "item.modulargolems.naga_helmet": "娜迦傀儡头盔", + "item.modulargolems.naga_shinguard": "娜迦傀儡护腿", + "item.modulargolems.naga_boots": "娜迦傀儡靴子" } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/models/custom/stellar_apocalypse.json b/src/main/resources/assets/modulargolems/models/custom/stellar_apocalypse.json new file mode 100644 index 000000000..1dc8446ba --- /dev/null +++ b/src/main/resources/assets/modulargolems/models/custom/stellar_apocalypse.json @@ -0,0 +1,199 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "#tex", + "particle": "#tex" + }, + "elements": [ + { + "from": [7.5, -2, 7.5], + "to": [8.5, 3, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [4, 6.25, 4.25, 7.5], "texture": "#0"}, + "east": {"uv": [4.25, 6.25, 4.5, 7.5], "texture": "#0"}, + "south": {"uv": [6.25, 4.25, 6.5, 5.5], "texture": "#0"}, + "west": {"uv": [4.5, 6.25, 4.75, 7.5], "texture": "#0"}, + "up": {"uv": [6.5, 5.75, 6.25, 5.5], "texture": "#0"}, + "down": {"uv": [6.25, 6.75, 6, 7], "texture": "#0"} + } + }, + { + "from": [7.5, 3, 5], + "to": [8.5, 5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 3, 7]}, + "faces": { + "north": {"uv": [6.75, 0.25, 7, 0.75], "texture": "#0"}, + "east": {"uv": [5.5, 2.5, 7, 3], "texture": "#0"}, + "south": {"uv": [0.75, 6.75, 1, 7.25], "texture": "#0"}, + "west": {"uv": [5.5, 3, 7, 3.5], "texture": "#0"}, + "up": {"uv": [5.75, 5.75, 5.5, 4.25], "texture": "#0"}, + "down": {"uv": [5, 5.5, 4.75, 7], "texture": "#0"} + } + }, + { + "from": [7, 4, 11], + "to": [9, 5, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 4, 11]}, + "faces": { + "north": {"uv": [6.75, 0.75, 7.25, 1], "texture": "#0"}, + "east": {"uv": [5.5, 6.5, 6.25, 6.75], "texture": "#0"}, + "south": {"uv": [1, 6.75, 1.5, 7], "texture": "#0"}, + "west": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#0"}, + "up": {"uv": [3, 6.5, 2.5, 5.75], "texture": "#0"}, + "down": {"uv": [3.5, 5.75, 3, 6.5], "texture": "#0"} + } + }, + { + "from": [7, 3, 3], + "to": [9, 4, 5], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 3, 5]}, + "faces": { + "north": {"uv": [6.75, 1, 7.25, 1.25], "texture": "#0"}, + "east": {"uv": [6.75, 1.25, 7.25, 1.5], "texture": "#0"}, + "south": {"uv": [1.5, 6.75, 2, 7], "texture": "#0"}, + "west": {"uv": [6.75, 1.5, 7.25, 1.75], "texture": "#0"}, + "up": {"uv": [3, 7, 2.5, 6.5], "texture": "#0"}, + "down": {"uv": [3.5, 6.5, 3, 7], "texture": "#0"} + } + }, + { + "from": [7, 3, 6.5], + "to": [9, 6, 9.5], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4.5, 8]}, + "faces": { + "north": {"uv": [3.5, 5.75, 4, 6.5], "texture": "#0"}, + "east": {"uv": [5.5, 3.5, 6.25, 4.25], "texture": "#0"}, + "south": {"uv": [5.75, 4.25, 6.25, 5], "texture": "#0"}, + "west": {"uv": [4, 5.5, 4.75, 6.25], "texture": "#0"}, + "up": {"uv": [6.25, 5.75, 5.75, 5], "texture": "#0"}, + "down": {"uv": [6, 5.75, 5.5, 6.5], "texture": "#0"} + } + }, + { + "from": [7, -3, 7], + "to": [9, -2, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -4, 7]}, + "faces": { + "north": {"uv": [6.75, 1.75, 7.25, 2], "texture": "#0"}, + "east": {"uv": [2, 6.75, 2.5, 7], "texture": "#0"}, + "south": {"uv": [6.75, 2, 7.25, 2.25], "texture": "#0"}, + "west": {"uv": [6.75, 2.25, 7.25, 2.5], "texture": "#0"}, + "up": {"uv": [4, 7, 3.5, 6.5], "texture": "#0"}, + "down": {"uv": [7, 4.25, 6.5, 4.75], "texture": "#0"} + } + }, + { + "from": [7.5, 5, 6.5], + "to": [8.5, 28, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7, 7]}, + "faces": { + "north": {"uv": [5, 2.5, 5.25, 8.25], "texture": "#0"}, + "east": {"uv": [2.5, 0, 3.25, 5.75], "texture": "#0"}, + "south": {"uv": [5.25, 2.5, 5.5, 8.25], "texture": "#0"}, + "west": {"uv": [3.25, 0, 4, 5.75], "texture": "#0"}, + "up": {"uv": [6.75, 6.75, 6.5, 6], "texture": "#0"}, + "down": {"uv": [6.5, 6.5, 6.25, 7.25], "texture": "#0"} + } + }, + { + "from": [7.5, 28, 7], + "to": [8.5, 29, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 28, 7]}, + "faces": { + "north": {"uv": [7, 0.25, 7.25, 0.5], "texture": "#0"}, + "east": {"uv": [6.75, 3.5, 7.25, 3.75], "texture": "#0"}, + "south": {"uv": [0.5, 7, 0.75, 7.25], "texture": "#0"}, + "west": {"uv": [6.75, 3.75, 7.25, 4], "texture": "#0"}, + "up": {"uv": [5.75, 7.25, 5.5, 6.75], "texture": "#0"}, + "down": {"uv": [6, 6.75, 5.75, 7.25], "texture": "#0"} + } + }, + { + "from": [8, 5, 5.5], + "to": [8, 32, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 30, 7]}, + "faces": { + "north": {"uv": [0, 0, 0, 6.75], "texture": "#0"}, + "east": {"uv": [0, 0, 1.25, 6.75], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 6.75], "texture": "#0"}, + "west": {"uv": [1.25, 0, 2.5, 6.75], "texture": "#0"}, + "up": {"uv": [0, 1.25, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 1.25], "texture": "#0"} + } + }, + { + "from": [8, 3, 2.5], + "to": [8, 8, 13.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 29, 7]}, + "faces": { + "north": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "east": {"uv": [4, 0, 6.75, 1.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "west": {"uv": [4, 1.25, 6.75, 2.5], "texture": "#0"}, + "up": {"uv": [0, 2.75, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2.75], "texture": "#0"} + } + }, + { + "from": [8, -9, 6], + "to": [8, -3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 7]}, + "faces": { + "north": {"uv": [0, 0, 0, 1.5], "texture": "#0"}, + "east": {"uv": [4, 2.5, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1.5], "texture": "#0"}, + "west": {"uv": [4, 4, 5, 5.5], "texture": "#0"}, + "up": {"uv": [0, 1, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 1], "texture": "#0"} + } + }, + { + "from": [7, 3, 11], + "to": [9, 4, 13], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 3, 11]}, + "faces": { + "north": {"uv": [6.75, 4, 7.25, 4.25], "texture": "#0"}, + "east": {"uv": [6.75, 6, 7.25, 6.25], "texture": "#0"}, + "south": {"uv": [6.75, 6.25, 7.25, 6.5], "texture": "#0"}, + "west": {"uv": [6.5, 6.75, 7, 7], "texture": "#0"}, + "up": {"uv": [7, 5.25, 6.5, 4.75], "texture": "#0"}, + "down": {"uv": [7, 5.25, 6.5, 5.75], "texture": "#0"} + } + }, + { + "from": [7, 4, 2], + "to": [9, 5, 5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 4, 5]}, + "faces": { + "north": {"uv": [6.75, 6.5, 7.25, 6.75], "texture": "#0"}, + "east": {"uv": [0, 6.75, 0.75, 7], "texture": "#0"}, + "south": {"uv": [0, 7, 0.5, 7.25], "texture": "#0"}, + "west": {"uv": [6.75, 0, 7.5, 0.25], "texture": "#0"}, + "up": {"uv": [6.5, 6.5, 6, 5.75], "texture": "#0"}, + "down": {"uv": [6.75, 3.5, 6.25, 4.25], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 10.5, 1.7], + "scale": [1, 1.7, 1.7] + }, + "thirdperson_lefthand": { + "translation": [0, 10.5, 1.7], + "scale": [1, 1.7, 1.7] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 1, 8], + "scope": 0, + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/models/custom/table.json b/src/main/resources/assets/modulargolems/models/custom/table.json new file mode 100644 index 000000000..d0e99b688 --- /dev/null +++ b/src/main/resources/assets/modulargolems/models/custom/table.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "texture_size": [64, 64], + "textures": { + "1": "#top", + "2": "#middle", + "3": "#bottom" + }, + "elements": [ + { + "name": "cube2", + "from": [1, 4, 1], + "to": [15, 10, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 11]}, + "faces": { + "north": {"uv": [3.5, 3.5, 7, 5], "texture": "#2"}, + "east": {"uv": [0, 3.5, 3.5, 5], "texture": "#2"}, + "south": {"uv": [10.5, 3.5, 14, 5], "texture": "#2"}, + "west": {"uv": [7, 3.5, 10.5, 5], "texture": "#2"}, + "up": {"uv": [7, 3.5, 3.5, 0], "texture": "#2"}, + "down": {"uv": [10.5, 0, 7, 3.5], "texture": "#2"} + } + }, + { + "name": "cube1", + "from": [0, 0, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 7]}, + "faces": { + "north": {"uv": [4, 4, 8, 5], "texture": "#3"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#3"}, + "south": {"uv": [12, 4, 16, 5], "texture": "#3"}, + "west": {"uv": [8, 4, 12, 5], "texture": "#3"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#3"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#3"} + } + }, + { + "name": "cube3", + "from": [0, 9, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 11, 0]}, + "faces": { + "north": {"uv": [4, 4, 8, 5.75], "texture": "#1"}, + "east": {"uv": [0, 4, 4, 5.75], "texture": "#1"}, + "south": {"uv": [12, 4, 16, 5.75], "texture": "#1"}, + "west": {"uv": [8, 4, 12, 5.75], "texture": "#1"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#1"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#1"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/golems.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/golems.json index 0be1a5337..2e4bf5a34 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/golems.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/golems.json @@ -1,5 +1,6 @@ { "name": "Golem Types and Tools", "description": "Types of golems player can craft and summon, and related handy tools", - "icon": "modulargolems:metal_golem_holder" + "icon": "modulargolems:metal_golem_holder", + "sortnum": 0 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/materials.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/materials.json index ac533d61a..8d31ce83d 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/materials.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/materials.json @@ -1,5 +1,6 @@ { "name": "Materials", "description": "Types of materials player can use to craft golem parts", - "icon": "minecraft:iron_ingot" + "icon": "minecraft:iron_ingot", + "sortnum": 1 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/upgrades.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/upgrades.json index 9cb2824fe..2af958a55 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/upgrades.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/categories/upgrades.json @@ -1,5 +1,6 @@ { "name": "Upgrades", "description": "Types of upgrades player can use to craft golem parts", - "icon": "modulargolems:recycle" + "icon": "modulargolems:recycle", + "sortnum": 2 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/a1_craft.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/a1_craft.json index 21ea27f94..12dacfbe3 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/a1_craft.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/a1_craft.json @@ -1,16 +1,11 @@ { - "name": "Crafting the golem", - "icon": "modulargolems:metal_golem_template", - "category": "modulargolems:golems", - "sortnum": 1, - "pages": [ - { - "type": "patchouli:text", - "text": "To craft a golem, use stone cutter to cut metal golem template into required parts. Then use anvil to apply metal ingots onto the parts. Then assemble the parts into a golem holder in crafting table. You can use parts of different materials to get better golems.$(br2)To summon golem, right click it on a block. You can retrieve the golem by right clicking it with empty hand." - }, - { - "type": "patchouli:text", - "text": "You can fix the damaged golem with ingots matching the body material of the golem in anvil. Each ingot heals 1/4 of the max health. Thus, you can use cheap body material and expensive material for other parts to have high health while make it cheap to fix.$(br2)When the golem dies, it will only drop 1 ingot from each part. You can use the $(l:upgrades/vanilla_recycle)Recycle Upgrade$(/l) to let the golem drop repairable holder on death." - } - ] + "name": "Crafting the golem", + "icon": "modulargolems:metal_golem_template", + "category": "modulargolems:golems", + "sortnum": 1, + "pages": [ + "To craft a golem, use stone cutter to cut metal golem template into required parts. Then use anvil to apply metal ingots onto the parts. Then assemble the parts into a golem holder in crafting table. You can use parts of different materials to get better golems.$(br2)To summon golem, right click it on a block. You can retrieve the golem by right clicking it with empty hand.", + "You can fix the damaged golem with ingots matching the body material of the golem in anvil. Each ingot heals 1/4 of the max health. Thus, you can use cheap body material and expensive material for other parts to have high health while make it cheap to fix.$(br2)When the golem dies, it will only drop 1 ingot from each part. You can use the $(l:upgrades/vanilla_recycle)Recycle Upgrade$(/l) to let the golem drop repairable holder on death.", + "You can change golem parts by combining new part with golem holder in crafting table in specific orientation. You will lose the old part in this process but keep everything else." + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b2_humanoid_golem.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b2_humanoid_golem.json index 53af4652d..e7f603e53 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b2_humanoid_golem.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b2_humanoid_golem.json @@ -14,15 +14,9 @@ "text": "Humanoid golem can perform area attack if and only if it holds a sword-like item.$(br2)Humanoid golem can use shield, trident, bow, and crossbow." }, { - "type": "patchouli:spotlight", - "item": "minecraft:zombie_head,minecraft:skeleton_skull,minecraft:wither_skeleton_skull", - "text": "Equip a zombie head / skeleton skull / wither skeleton skull named as a player in Golem Skin slot to use player skin.$(br2)Requires the player to have a valid Minecraft account, and requires internet connection to download skins from Minecraft Server." - }, - { - "type": "patchouli:spotlight", - "item": "minecraft:player_head,minecraft:piglin_head", - "text": "Equip a player head / piglin skull in Golem Skin slot, named as the texture location of a humanoid texture, to use a custom texture for the golem.$(br2)Use player head for slim player model, and piglin head for normal player model." + "type": "patchouli:text", + "text": "Use the $(l)Skin Button$() in the Humanoid Golem equipment screen to change its skin.$(br2)Supported input formats:$(br2)$(li)$(l)Player Name$() - Use the Minecraft skin of a player$(li)$(l)Resource Path$() - Use a custom texture from resource packs, e.g.:$(br)modulargolems:textures/iws2000.png$(li)$(l)Entity id() - Use texture from vanilla zombie / skeleton / piglin variants, e.g.:$(br)minecraft:drowned$(br2)Right-click the button to reset to default skin." }, - "If Touhou Little Maid is installed, Garage Kit can be plced in Golem Skin slot to use the Maid model as well." + "If Touhou Little Maid is installed, use the $(l)Maid Skin Button$() in the equipment screen to switch to a maid model." ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b3_dog_golem.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b3_dog_golem.json index a122c45d6..b182fb0f0 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b3_dog_golem.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/b3_dog_golem.json @@ -6,7 +6,7 @@ "pages": [ { "type": "patchouli:text", - "text": "Dog golem is a wolf-like golem. It runs fast and has high attack. Right click the golem with an item or shift click it to sit it down. Right click the golem with empty hand to retrieve the golem.$(br2)You can ride it using $(l:golems/c4_rider_wand)Rider Wand$(/l), or right click dog with humanoid golem to add passenger. Use $(l:upgrades/vanilla_size)Size Upgrade$(/l) to allow more passengers." + "text": "Dog golem is a wolf-like golem. It runs fast and has high attack. Right click the golem with an item or shift click it to sit it down. Right click the golem with empty hand to retrieve the golem.$(br2)You can ride it using $(l:golems/c4_rider_wand)Rider Wand$(/l), or right click dog with humanoid golem to add passenger. Use $(l:upgrades/vanilla_size)Size Upgrade$(/l) to allow more passengers. Lv.2 Size Upgrade allows a Metal Golem as passenger." },{ "type": "patchouli:crafting", "recipe": "modulargolems:dog_golem_holder", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c1_retrieval_wand.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c1_retrieval_wand.json index 01fce59b4..b045cb83b 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c1_retrieval_wand.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c1_retrieval_wand.json @@ -1,16 +1,10 @@ { - "name": "Retrieval Wand", - "icon": "modulargolems:retrieval_wand", - "category": "modulargolems:golems", - "sortnum": 20, - "pages": [ - { - "type": "patchouli:text", - "text": "Right click golems to retrieve golem back into inventory, as if the player right clicks it by empty hand.$(br2)Right click in air to retrieve all golems in a radious of 20 blocks.$(br2)Shift right click to retrieve golems the player points to, up to 64 blocks far." - },{ - "type": "patchouli:crafting", - "recipe": "modulargolems:retrieval_wand", - "text": "Wand for massive golem retrieval." - } - ] + "name": "Retrieval Wand", + "icon": "modulargolems:retrieval_wand", + "category": "modulargolems:golems", + "sortnum": 20, + "pages": [ + "Right click golems to retrieve golem back into inventory, as if the player right clicks it by empty hand.$(br2)Right click to retrieve golems the player points to, up to 64 blocks far.$(br2)Shift right click in air to retrieve all golems in a radious of 20 blocks.", + "When L2Backpack is present:$(br2)When player has Ender Backpack equipped, golems will be retrieved to ender backpack.$(br2)When player has their own dimensional backpack in inventory or ender backpack, golem with respective config color will be retrieved to dimensional backpack." + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c3_summon_wand.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c3_summon_wand.json index a095ea8de..37839be6b 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c3_summon_wand.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/c3_summon_wand.json @@ -1,16 +1,10 @@ { - "name": "Summon Wand", - "icon": "modulargolems:summon_wand", - "category": "modulargolems:golems", - "sortnum": 22, - "pages": [ - { - "type": "patchouli:text", - "text": "Right click to summon a golem on target block, from your off hand or inventory.$(br2)Shift right click to summon all golems from your inventory around you." - },{ - "type": "patchouli:crafting", - "recipe": "modulargolems:summon_wand", - "text": "Wand for massive golem summon." - } - ] + "name": "Summon Wand", + "icon": "modulargolems:summon_wand", + "category": "modulargolems:golems", + "sortnum": 22, + "pages": [ + "Right click to summon a golem on target block, from your off hand or inventory.$(br2)Shift right click to summon all golems from your inventory around you.", + "When L2Backpack is present:$(br2)This wand can also summon golems from Ender Backpack equipped.$(br2) If player has their own dimensional backpacks in inventory or ender backpack, this wand can also summon golems with same config color as the dimensional backpack those golems are in." + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d1_config_card.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d1_config_card.json index bf7d95eb4..72f9391b6 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d1_config_card.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d1_config_card.json @@ -25,7 +25,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:patrol_path_recorder", - "text": "You can configure golem patrol path in config. Craft Patrol Path Recorder and record a circular path by clicking with it. When Create is installed, it will render the path and direction of movement a well. The path is fur guidance only. Golem will not always step on the exact block." + "text": "You can configure golem patrol path in config. Craft Patrol Path Recorder and record a circular path by clicking blocks with it.$(br2)Blocks have to be less than 16 blocks apart. Longer paths is marked in red and may result in golems teleporting to destination. $(br2)The path is for guidance only. Golem will not always step on the exact block." } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d2_golem_facade.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d2_golem_facade.json new file mode 100644 index 000000000..3849533c0 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d2_golem_facade.json @@ -0,0 +1,9 @@ +{ + "name": "Golem Facade", + "icon": "modulargolems:golem_facade", + "category": "modulargolems:golems", + "sortnum": 32, + "pages": [ + "You can use a Golem Facade to make a golem look like if it's made with another material.$(br2)Craft with empty upgrade template and an ingot of desired material in anvil, then put it on golem skin curios slot." + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d3_slicing_axe.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d3_slicing_axe.json new file mode 100644 index 000000000..f98c8ef4a --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/golems/d3_slicing_axe.json @@ -0,0 +1,15 @@ +{ + "name": "Golem Slicing Axe", + "icon": "modulargolems:golem_slicing_axe", + "category": "modulargolems:golems", + "sortnum": 33, + "pages": [ + + { + "type": "patchouli:spotlight", + "item": "modulargolems:golem_slicing_axe", + "text": "When a metal golem kills other players‘ golems without recycle upgrade with this axe, all parts will be dropped and there is a chance for each of the upgrades to drop.$(br2)Edit the target filter in config card to allow golems to attack other golems. Note that golems cannot attack golems you own." + }, + "When a metal golem kills certain mobs with this axe, one random metal golem part with matching material will drop:$(li)Vanilla: Iron Golem, Warden$(li)Cataclysm: Netherite Monstrosity, Ignis, Harbinger, Maledictus, Scylla, Ancient Remnant$(li)Mowzie's Mobs: Ferrous Wroughtnaut$(li)Legendary Monsters: Ancient Guardian, Cloud Golem" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_candy.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_candy.json new file mode 100644 index 000000000..9c959657e --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_candy.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_candy_cavity", + "name": "Candy", + "icon": "modulargolems:candy_construct", + "category": "modulargolems:materials", + "sortnum": 1301, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:candy_construct", + "text": "Main material to craft Candy golem parts. Shoots candy and cheap to fix." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:candy\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_magnetic.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_magnetic.json new file mode 100644 index 000000000..930c90777 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_magnetic.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_magnetic_caves", + "name": "Magnetic", + "icon": "modulargolems:magnetic_construct", + "category": "modulargolems:materials", + "sortnum": 1302, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:magnetic_construct", + "text": "Main material to craft Magnetic golem parts. Pull targets in melee mode and push targets in ranged mode. Consume iron to protect itself." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_nuclear.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_nuclear.json new file mode 100644 index 000000000..56c08a8ae --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ac_nuclear.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_toxic_caves", + "name": "Nuclear", + "icon": "modulargolems:nuclear_construct", + "category": "modulargolems:materials", + "sortnum": 1303, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:nuclear_construct", + "text": "Main material to craft Nuclear golem parts. Inflict radiation and consumes uranium to heal and boost stats" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_allthemodium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_allthemodium.json new file mode 100644 index 000000000..693c20936 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_allthemodium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "Allthemodium", + "icon": "allthemodium:allthemodium_ingot", + "category": "modulargolems:materials", + "sortnum": 1201, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:allthemodium_ingot", + "text": "Main material to craft Allthemodium golem parts. Insane stats, more slots, and builtin utility" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_unobtainium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_unobtainium.json new file mode 100644 index 000000000..3e86b095b --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_unobtainium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "Unobtainium", + "icon": "allthemodium:unobtainium_ingot", + "category": "modulargolems:materials", + "sortnum": 1203, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:unobtainium_ingot", + "text": "Main material to craft Unobtainium golem parts. Insane stats, more slots, and builtin utility" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_vibranium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_vibranium.json new file mode 100644 index 000000000..765f161c9 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/atm_vibranium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "Vibranium", + "icon": "allthemodium:vibranium_ingot", + "category": "modulargolems:materials", + "sortnum": 1202, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:vibranium_ingot", + "text": "Main material to craft Vibranium golem parts. Insane stats, more slots, and builtin utility" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_cardboard.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_cardboard.json new file mode 100644 index 000000000..d3684ce54 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_cardboard.json @@ -0,0 +1,29 @@ +{ + "flag": "&mod:create,modulargolems:create:cardboard", + "name": "Cardboard", + "icon": "create:cardboard", + "category": "modulargolems:materials", + "sortnum": 305, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "create:cardboard", + "text": "Main material to craft Cardboard golem parts. It's the cheapest golem you can find. Cardboard golems have low health and attack, yet has high movement speed and attack knockback." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_arm\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_legs\",material:\"create:cardboard\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"create:cardboard\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"create:cardboard\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:dog_golem_legs\",material:\"create:cardboard\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_railway.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_railway.json index c8723f9a6..5738ba60f 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_railway.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/cr_railway.json @@ -3,7 +3,7 @@ "name": "Railway", "icon": "create:railway_casing", "category": "modulargolems:materials", - "sortnum": 303, + "sortnum": 304, "pages": [ { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ancient_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ancient_metal.json new file mode 100644 index 000000000..2aee11a52 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ancient_metal.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:find_cursed_pyramid", + "name": "Ancient Metal", + "icon": "cataclysm:ancient_metal_ingot", + "category": "modulargolems:materials", + "sortnum": 706, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "cataclysm:ancient_metal_ingot", + "text": "Main material to craft Ancient Metal golem parts. Summon sandstorm to attack.$(br2)Reforge: When health is low, it will consume max health to repair itself up to 8/5/5 times. Can be replenished by repair materials." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_cursium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_cursium.json new file mode 100644 index 000000000..d5a262a7a --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_cursium.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_maledictus", + "name": "Cursium", + "icon": "cataclysm:cursium_ingot", + "category": "modulargolems:materials", + "sortnum": 703, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "cataclysm:cursium_ingot", + "text": "Main material to craft Cursium golem parts. Body part provides the ability to perform jump attack summoning halberds, and arm parts allows golem to bypass armor and increase attack damage after consecutive attack." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:cursium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ender_guardian.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ender_guardian.json new file mode 100644 index 000000000..7e3c3823b --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ender_guardian.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ender_golem", + "name": "Ender Guardian", + "icon": "modulargolems:void_construct", + "category": "modulargolems:materials", + "sortnum": 705, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:void_construct", + "text": "Main material to craft Ender Guardian golem parts. Summon vortex and void runes to attack." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ignitium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ignitium.json index 452bef8fe..77ad538e6 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ignitium.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_ignitium.json @@ -1,9 +1,10 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ignis", "name": "Ignitium", "icon": "cataclysm:ignitium_ingot", "category": "modulargolems:materials", - "sortnum": 501, + "sortnum": 701, "pages": [ { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_storm.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_storm.json new file mode 100644 index 000000000..bb3934e7e --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_storm.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_scylla", + "name": "Storm", + "icon": "modulargolems:storm_construct", + "category": "modulargolems:materials", + "sortnum": 704, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:storm_construct", + "text": "Main material to craft Storm golem parts. Shoot lighting spear to attack multiple targets, and summon waves to push away attackers." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:storm\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_witherite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_witherite.json index 756bf37ee..f027ec2b4 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_witherite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/ct_witherite.json @@ -1,9 +1,10 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_harbinger", "name": "Witherite", "icon": "cataclysm:witherite_ingot", "category": "modulargolems:materials", - "sortnum": 501, + "sortnum": 702, "pages": [ { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_apocalyptium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_apocalyptium.json new file mode 100644 index 000000000..5a19ca84f --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_apocalyptium.json @@ -0,0 +1,30 @@ +{ + "flag": "&mod:goety_revelation,modulargolems:goety_revelation:apocalyptium", + "advancement": "goety_revelation:kill_apollyon", + "name": "Apocalyptium", + "icon": "goety_revelation:apocalyptium_ingot", + "category": "modulargolems:materials", + "sortnum": 1003, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety_revelation:apocalyptium_ingot", + "text": "Main material to craft Apocalyptium golem parts. Apocalyptium golem is the resemblance of godhood and a container for higher spirits. It will revive itself on death once it enters your inventory." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_cursed_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_cursed_metal.json new file mode 100644 index 000000000..fe6576481 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_cursed_metal.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:goety", + "name": "Cursed Metal", + "icon": "goety:cursed_ingot", + "category": "modulargolems:materials", + "sortnum": 1001, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety:cursed_ingot", + "text": "Main material to craft Cursed Metal golem parts. Curse Metal golem parts feature fire immunity and armor penetration." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety:cursed_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_dark_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_dark_metal.json new file mode 100644 index 000000000..1bb888def --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/goety_dark_metal.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:goety", + "name": "Dark Metal", + "icon": "goety:dark_ingot", + "category": "modulargolems:materials", + "sortnum": 1002, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety:dark_ingot", + "text": "Main material to craft Dark Metal golem parts. Dark Metal golem is resistant to fire, explosion, magic damage, has high regeneration, can heal and repair itself and its equipments with owner's soul energy, and can convert defeated enemies into haunted armor servants." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety:dark_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_fire.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_fire.json new file mode 100644 index 000000000..c0952408d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_fire.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "Fire Dragonsteel", + "icon": "iceandfire:dragonsteel_fire_ingot", + "category": "modulargolems:materials", + "sortnum": 901, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_fire_ingot", + "text": "Main material to craft Fire Dragonsteel golem parts. Fire Dragonsteel golem has high health and attack, immune to fire, and ignites target." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_ice.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_ice.json new file mode 100644 index 000000000..b727662fa --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_ice.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "Ice Dragonsteel", + "icon": "iceandfire:dragonsteel_ice_ingot", + "category": "modulargolems:materials", + "sortnum": 902, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_ice_ingot", + "text": "Main material to craft Ice Dragonsteel golem parts. Ice Dragonsteel golem has high health and attack, also freeze targets and attackers." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_lightning.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_lightning.json new file mode 100644 index 000000000..65f313e73 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/iaf_lightning.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "Lightning Dragonsteel", + "icon": "iceandfire:dragonsteel_lightning_ingot", + "category": "modulargolems:materials", + "sortnum": 903, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_lightning_ingot", + "text": "Main material to craft Lightning Dragonsteel golem parts. Lightning Dragonsteel golem has high health and attack, immune to lightning, and summon lightning when attacking targets" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_chaotic.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_chaotic.json new file mode 100644 index 000000000..ce0beddb3 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_chaotic.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", + "name": "Chaotic", + "icon": "l2hostility:chaos_ingot", + "category": "modulargolems:materials", + "sortnum": 1101, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "l2hostility:chaos_ingot", + "text": "Main material to craft Chaotic golem parts. Chaotic golem has high stats and a lot of useful builtin modifiers." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:dog_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_miraculous.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_miraculous.json new file mode 100644 index 000000000..a44524b85 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lh_miraculous.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:l2hostility", + "advancement": "l2hostility:miracle", + "name": "Miraculous", + "icon": "l2hostility:hostility/miracle", + "category": "modulargolems:materials", + "sortnum": 1102, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "l2hostility:miracle_ingot", + "text": "Main material to craft Miraculous golem parts. Miraculous golem gains the power of Adpative and Dispell trait, making it effective against high level hostility enemies." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:dog_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_cloud.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_cloud.json new file mode 100644 index 000000000..676fe51e6 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_cloud.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:legendary_monsters", + "advancement": "legendary_monsters:defeat_cloud_golem", + "name": "Cloud", + "icon": "modulargolems:cloud_cube", + "category": "modulargolems:materials", + "sortnum": 1202, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:cloud_cube", + "text": "Main material to craft Cloud golem parts. Cloud golem can summon lightning strikes against multiple targets, and can create electric shockwaves when attacked." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:dog_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_molten_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_molten_metal.json new file mode 100644 index 000000000..00d358b55 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/lm_molten_metal.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:legendary_monsters", + "advancement": "legendary_monsters:defeat_the_ancient_guardian", + "name": "Molten Metal", + "icon": "legendary_monsters:molten_metal_ingot", + "category": "modulargolems:materials", + "sortnum": 1201, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "legendary_monsters:molten_metal_ingot", + "text": "Main material to craft Molten Metal golem parts. Molten Metal golem is immune to fire and projectiles, and can create shockwaves that stun enemies" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/mowzies_wroughtnaut.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/mowzies_wroughtnaut.json new file mode 100644 index 000000000..27ed6e3e7 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/mowzies_wroughtnaut.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:mowziesmobs", + "advancement": "mowziesmobs:kill_ferrous_wroughtnaut", + "name": "Wroughtnaut", + "icon": "modulargolems:wroughtnaut_ingot", + "category": "modulargolems:materials", + "sortnum": 1101, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:wroughtnaut_ingot", + "text": "Main material to craft Wroughtnaut golem parts. Wroughtnaut golem has high resistance to magic, has a chance to penetrate armor, and can create shockwaves" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_arm\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:dog_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_fiery.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_fiery.json index 3e25e77ae..81305e8fb 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_fiery.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_fiery.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Fiery", "icon": "twilightforest:fiery_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_ironwood.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_ironwood.json index a4c600ea2..6f6c337db 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_ironwood.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_ironwood.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Ironwood", "icon": "twilightforest:ironwood_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_knightmetal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_knightmetal.json index 17660a072..e6bb68b00 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_knightmetal.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_knightmetal.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Knightmetal", "icon": "twilightforest:knightmetal_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_steeleaf.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_steeleaf.json index 8cb8201d7..3ba277081 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_steeleaf.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tf_steeleaf.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Steeleaf", "icon": "twilightforest:steeleaf_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_amethyst_bronze.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_amethyst_bronze.json new file mode 100644 index 000000000..a85912be0 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_amethyst_bronze.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "Amethyst Bronze", + "icon": "tconstruct:amethyst_bronze_ingot", + "category": "modulargolems:materials", + "sortnum": 802, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:amethyst_bronze_ingot", + "text": "Main material to craft amethyst bronze golem parts. Amethyst bronze golem parts feature cheap material yet very high stats for price." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_cobalt.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_cobalt.json new file mode 100644 index 000000000..aa9360a23 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_cobalt.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "Cobalt", + "icon": "tconstruct:cobalt_ingot", + "category": "modulargolems:materials", + "sortnum": 804, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:cobalt_ingot", + "text": "Main material to craft Cobalt golem parts. Cobalt golem parts feature high stats and movement speed." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_hepatizon.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_hepatizon.json new file mode 100644 index 000000000..5e0fd5cb0 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_hepatizon.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "Hepatizon", + "icon": "tconstruct:hepatizon_ingot", + "category": "modulargolems:materials", + "sortnum": 803, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:hepatizon_ingot", + "text": "Main material to craft Hepatizon golem parts. Hepatizon golem parts feature high stats, and allows golem to gain temporary damage resistance after taking damage." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_manyullyn.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_manyullyn.json new file mode 100644 index 000000000..7e26d6896 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_manyullyn.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "Manyullyn", + "icon": "tconstruct:manyullyn_ingot", + "category": "modulargolems:materials", + "sortnum": 802, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:manyullyn_ingot", + "text": "Main material to craft Manyullyn golem parts. Manyullyn golem parts feature high stats, and allows golem to increase attack during combat." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_rose_gold.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_rose_gold.json new file mode 100644 index 000000000..c6f99ccc2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/materials/tinker_rose_gold.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "Rose Gold", + "icon": "tconstruct:rose_gold_ingot", + "category": "modulargolems:materials", + "sortnum": 805, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:rose_gold_ingot", + "text": "Main material to craft Rose Gold golem parts. Rose Gold golem parts have very low stats, but provide one extra upgrade slot." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "Use JEI (press R) to check part stats of each part made of this material." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ancient_remnant.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ancient_remnant.json index 4708b9ddd..1c6a6b9fd 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ancient_remnant.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ancient_remnant.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_remnant", "name": "Ancient Remnant Upgrade", "icon": "modulargolems:ancient_remnant_sandstorm", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:ancient_remnant_sandstorm", - "text": "Summon sandstorm at target position. Max: 1" + "text": "Summon sandstorm at target position. Attacks [level x 3] targets at a time. Increase damage to targets with Curse of Desert effect. Max: 3" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ender_guardian.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ender_guardian.json index fa9d32ae7..1594129bc 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ender_guardian.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_ender_guardian.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ender_guardian", "name": "Ender Guardian Upgrade", "icon": "modulargolems:ender_guardian_void_rune", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:ender_guardian_void_rune", - "text": "Summon void rune toward target. Max: 1" + "text": "Summon vortex and void rune toward Level*2 targets. Max: 5" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_leviathan.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_leviathan.json index 8cc06612e..324d807b6 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_leviathan.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_leviathan.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_leviathan", "name": "Leviathan Upgrade", "icon": "modulargolems:leviathan_blast_portal", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:leviathan_blast_portal", - "text": "Create blast portal at target position. Max: 1" + "text": "Create blast portal at target position. Attacks [level x 3] targets at a time. Max: 3" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_netherite_monstrosity.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_netherite_monstrosity.json index bcdceaa14..c55677285 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_netherite_monstrosity.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_netherite_monstrosity.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_monstrosity", "name": "Netherite Monstrosity Upgrade", "icon": "modulargolems:netherite_monstrosity_earthquake", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_scylla.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_scylla.json new file mode 100644 index 000000000..0ce4cb3f5 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/ct_scylla.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_scylla", + "name": "Scylla Upgrade", + "icon": "modulargolems:scylla_lightning_upgrade", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:scylla_lightning_upgrade", + "text": "Launch lightning spear toward Level*3 targets. Max: 3" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_apostle.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_apostle.json new file mode 100644 index 000000000..4634728f7 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_apostle.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Ascension Upgrade", + "icon": "modulargolems:apostle", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:apostle", + "text": "Apostle Upgrades now no longer consume upgrade slot" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_blast.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_blast.json new file mode 100644 index 000000000..5a8bbde87 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_blast.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Upgrade: Fire Blast", + "icon": "modulargolems:fire_blast", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:fire_blast", + "text": "Summon Fire Blast Trap every 10 seconds. Higher level increase radius of the trap. Max: 3$(li)Diameter: 4 - 6 blocks $(li)Damage: same as golem attack damage $(li)Targeting: 1 - 3" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_tornado.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_tornado.json new file mode 100644 index 000000000..51485eff3 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_fire_tornado.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Upgrade: Fire Tornado", + "icon": "modulargolems:fire_tornado", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:fire_tornado", + "text": "Summon Fire Tornado Trap toward target position every 10 seconds. Higher level increase damage and duration. Max: 5$(li)Duration: 8 - 12 seconds $(li)Damage: 12 - 24 $(li)Targeting: 3 - 7" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_blast.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_blast.json new file mode 100644 index 000000000..9b27ece42 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_blast.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Upgrade: Hell Blast", + "icon": "modulargolems:hell_blast", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_blast", + "text": "Shoot Hell Blast toward targets every 10 seconds. Targets multiple enemies at the same time in range of 16 blocks. Higher level increase damage and maximum target count. Can target 2 enemies per level. Max: 3$(li)Damage: 20 - 40" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_bolt.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_bolt.json new file mode 100644 index 000000000..5e1a39ad9 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_bolt.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Upgrade: Hell Bolt", + "icon": "modulargolems:hell_bolt", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_bolt", + "text": "Shoot Hell Bolts toward targets every 10 seconds. Targets multiple enemies at the same time in range of 35 blocks. Higher level increase damage and maximum target count. Can target 4 enemies per level. Max: 3$(li)Damage: 10 - 20" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_cloud.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_cloud.json new file mode 100644 index 000000000..4b25ef6e1 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_hell_cloud.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "Apostle Upgrade: Hell Cloud", + "icon": "modulargolems:hell_cloud", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_cloud", + "text": "Summon Hell Cloud on target position every 10 seconds. Higher level increase radius, duration, and damage. Max: 5$(li)Radius: 4 - 6 blocks $(li)Duration: 6 - 10 seconds $(li)Damage: 4 - 8 $(li)Targeting: 3 - 7" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_soul.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_soul.json new file mode 100644 index 000000000..482264e27 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/goety_soul.json @@ -0,0 +1,13 @@ +{ + "flag": "mod:goety", + "name": "Soul Collection Upgrade", + "icon": "modulargolems:soul_collection", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:soul_collection", + "text": "Give owner soul energy when golem kills enemies. Amplifies the soul energy gained by modifier level. Max level: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_abhorrent.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_abhorrent.json new file mode 100644 index 000000000..cb3ef316c --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_abhorrent.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "Title: The Abhorrent", + "icon": "modulargolems:the_abhorrent", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_abhorrent", + "text": "Golem will reduce target invulnerability frames on hit. Each level reduces 5 ticks of invul frames.$(br2)Max level: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_atrocious.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_atrocious.json new file mode 100644 index 000000000..7c9fb0a45 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_atrocious.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "Title: The Atrocious", + "icon": "modulargolems:the_atrocious", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_atrocious", + "text": "Reduce skill cooldown from apostle upgrades by half.$(br2)Max level: 1" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_profane.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_profane.json new file mode 100644 index 000000000..de3a353aa --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_profane.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "Title: The Profane", + "icon": "modulargolems:the_profane", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_profane", + "text": "When golem damaged target, golem will remove 1 positive effects on target per level. $(br2)Max level: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_terrible.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_terrible.json new file mode 100644 index 000000000..cb1ee20b3 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/gr_terrible.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "Title: The Terrible", + "icon": "modulargolems:the_terrible", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_terrible", + "text": "Increase Golem bow draw speed by 100% per level. Does not affect half seconds shooting cooldown.$(br2)Golem can target at most 4 x level + 4 enemies when shooting with bows.$(br2)If golem is using vanilla bow, golem can shoot 2 + level arrows at each targets.$(br2)Max level: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_core.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_core.json index 652d63a09..c0aab1ceb 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_core.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_core.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Core", "icon": "modulargolems:hostility_core", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_potion.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_potion.json index 70ffbd42e..6ed781ffd 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_potion.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_potion.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Potion", "icon": "modulargolems:hostility_potion", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_protection.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_protection.json index fbe5dab6a..62e2ec8a1 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_protection.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_protection.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Protection", "icon": "modulargolems:hostility_protection", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_reflect.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_reflect.json index 9c0e7bf8d..bc16147bd 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_reflect.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_reflect.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Reflective", "icon": "modulargolems:hostility_reflect", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_regen.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_regen.json index 8d273aea9..541ca2f41 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_regen.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_regen.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Regeneration", "icon": "modulargolems:hostility_regen", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_speed.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_speed.json index 9f80a9276..982e93463 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_speed.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_speed.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Speedy", "icon": "modulargolems:hostility_speed", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_tank.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_tank.json index 68c83d5ad..ab5f86a7b 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_tank.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lh_tank.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "Hostility Upgrade: Tanky", "icon": "modulargolems:hostility_tank", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lm_thunder.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lm_thunder.json new file mode 100644 index 000000000..33f61aac0 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/lm_thunder.json @@ -0,0 +1,13 @@ +{ + "flag": "mod:legendary_monsters", + "name": "Thunderstorm Upgrade", + "icon": "modulargolems:thunderstorm", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:thunderstorm", + "text": "Summon thunderstorm to attack multiple targets. When being attacked, summon electric bursts around the golem.Max:4 $(li)thunderstorm damage:7/10/13/16 $(li)thunderstorm count:16/24/32/40 $(li)electric bursts damage:40%/60%/80%/100%melee damage" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/mowzies_wroughtnaut.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/mowzies_wroughtnaut.json new file mode 100644 index 000000000..1d596bf2b --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/mowzies_wroughtnaut.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:mowziesmobs", + "advancement": "mowziesmobs:kill_ferrous_wroughtnaut", + "name": "Wroughtnaut Slamming Upgrade", + "icon": "modulargolems:wroughtnaut", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:wroughtnaut", + "text": "Perform falling attack and create shockwave" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_carminite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_carminite.json index cbcc883d7..bc438085c 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_carminite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_carminite.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Carminite Upgrade", "icon": "modulargolems:carminite", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_fiery.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_fiery.json index 68eee7485..d8697eacc 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_fiery.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_fiery.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Fiery Upgrade", "icon": "modulargolems:fiery", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_ironwood.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_ironwood.json index e6a3da1a8..667b26873 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_ironwood.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_ironwood.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Ironwood Upgrade", "icon": "modulargolems:ironwood", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_knightmetal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_knightmetal.json index 63d7de7e0..b710615d7 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_knightmetal.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_knightmetal.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Knight Metal Upgrade", "icon": "modulargolems:knightmetal", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_naga.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_naga.json index 67dfdbd4c..9d1975dce 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_naga.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_naga.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Naga Upgrade", "icon": "modulargolems:naga", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_steeleaf.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_steeleaf.json index 6f1375be7..c86be1ad6 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_steeleaf.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/tf_steeleaf.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "Steeleaf Upgrade", "icon": "modulargolems:steeleaf", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/vanilla_ride.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/vanilla_ride.json index bb2adce33..4490423f9 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/vanilla_ride.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/en_us/entries/upgrades/vanilla_ride.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:mount_upgrade", - "text": "For dog golem only. Make golem unable to attack or targeted for attack. Increase health, speed, and jump strength." + "text": "For dog golem only. Make golem unable to attack or targeted for attack. Immune to mob attack that is not targeting it. Increase health, speed, and jump strength." } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/golems.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/golems.json index e0ff8e8ac..b1673e487 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/golems.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/golems.json @@ -1,5 +1,6 @@ { "name": "傀儡种类和工具", "description": "可制作的傀儡种类,以及各种手杖", - "icon": "modulargolems:metal_golem_holder" + "icon": "modulargolems:metal_golem_holder", + "sortnum": 0 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/materials.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/materials.json index 7143f0a3d..4ce1424e1 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/materials.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/materials.json @@ -1,5 +1,6 @@ { "name": "材料种类", "description": "可以用于制作傀儡的材料", - "icon": "minecraft:iron_ingot" + "icon": "minecraft:iron_ingot", + "sortnum": 1 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/upgrades.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/upgrades.json index e42b465e6..a38ee39f7 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/upgrades.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/categories/upgrades.json @@ -1,5 +1,6 @@ { - "name": "升级模块", + "name": "升级模板", "description": "强化你的傀儡", - "icon": "modulargolems:recycle" + "icon": "modulargolems:recycle", + "sortnum": 2 } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a1_craft.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a1_craft.json index 004f95112..73434abda 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a1_craft.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a1_craft.json @@ -1,16 +1,11 @@ { - "name": "如何创造傀儡", - "icon": "modulargolems:metal_golem_template", - "category": "modulargolems:golems", - "sortnum": 1, - "pages": [ - { - "type": "patchouli:text", - "text": "制作一个傀儡,首先要用切石机把金属傀儡模板切割成你需要的部件,其次在铁砧上用金属锭对切割好的部件进行加工,最后在工作台上将加工后的部件合成为完整的傀儡。因此你可以使用不同的材料来打造更为强大的傀儡。$(br2)手持完整的傀儡右键任意方块进行召唤,空手右键回收傀儡。" - }, - { - "type": "patchouli:text", - "text": "铁砧中放入对应金属锭可修复受损的傀儡,每块金属锭可以恢复傀儡25%的最大生命值。因此,傀儡的躯干可选用廉价的材料,其他部位则用珍贵的材料制作。这样制作出的傀儡不仅拥有出色的属性,修复成本也相对低廉。$(br2)傀儡死亡时每个部位只会掉落一块金属锭,因此你可以用$(l:upgrades/vanilla_recycle)回收升级$(/l)强化傀儡,使其死亡时变为待修复的傀儡而非金属锭。" - } - ] + "name": "如何创造傀儡", + "icon": "modulargolems:metal_golem_template", + "category": "modulargolems:golems", + "sortnum": 1, + "pages": [ + "制作一个傀儡,首先要用切石机把金属傀儡胚料切割成你需要的部件,其次在铁砧上用金属锭对切割好的部件进行加工,最后在工作台上将加工后的部件合成为完整的傀儡。因此你可以使用不同的材料来打造更为强大的傀儡。$(br2)手持完整的傀儡右键任意方块进行召唤,空手右键回收傀儡。", + "铁砧中放入傀儡躯干对应金属锭可修复受损的傀儡,每块金属锭可以恢复傀儡25%的最大生命值。因此,傀儡的躯干可选用廉价的材料,其他部位则用珍贵的材料制作。这样制作出的傀儡不仅拥有出色的属性,修复成本也相对低廉。$(br2)傀儡死亡时每个部位只会掉落一块金属锭,因此你可以用$(l:upgrades/vanilla_recycle)回收升级$(/l)强化傀儡,使其死亡时变为待修复的傀儡而非金属锭。", + "你可以在工作台中以特定方式组合傀儡物品和带有材料的部件来替换傀儡部件,但是在这个过程中你会损失旧的部件(不要尝试预先用玫瑰金等材料来白嫖升级槽)。" + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a2_upgrade.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a2_upgrade.json index d446e885a..08bf43283 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a2_upgrade.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/a2_upgrade.json @@ -6,7 +6,7 @@ "pages": [ { "type": "patchouli:text", - "text": "在铁砧中放入升级模块可对傀儡进行次数有限的升级,升级后的傀儡将获得特殊增益,不同的增益都具有自己的等级上限。$(br2)用砂轮可以去除所有傀儡升级。通过爆炸破坏物品形态傀儡可以回收升级组件。" + "text": "在铁砧中放入升级模板可对傀儡进行次数有限的升级,升级后的傀儡将获得特殊增益,不同的增益都具有自己的等级上限。$(br2)用砂轮可以去除傀儡的所有升级。通过爆炸破坏物品形态傀儡可以回收所有升级模板。" }, { "type": "patchouli:text", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b1_metal_golem.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b1_metal_golem.json index 08e3c0fd8..a2e32af09 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b1_metal_golem.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b1_metal_golem.json @@ -6,7 +6,7 @@ "pages": [ { "type": "patchouli:text", - "text": "大型金属傀儡和原版铁傀儡十分相似。可以在铁砧上或直接使用对应金属锭修复。$(br2)使用命令手杖可以给大型傀儡装备特殊盔甲。" + "text": "大型金属傀儡和原版铁傀儡十分相似。可以在铁砧上或直接使用对应金属锭修复。$(br2)使用命令手杖可以给大型傀儡装备特殊盔甲与武器。" },{ "type": "patchouli:crafting", "recipe": "modulargolems:metal_golem_holder" diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b2_humanoid_golem.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b2_humanoid_golem.json index 2161d4880..3e86329f8 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b2_humanoid_golem.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b2_humanoid_golem.json @@ -6,22 +6,16 @@ "pages": [ { "type": "patchouli:text", - "text": "人形傀儡和玩家十分相似。理所当然它可以装备盔甲,近战武器,弓,弩,三叉戟,盾牌。手持装备右键傀儡将其给予,空手右键傀儡以查看装备信息。shift加右键会卸下傀儡身上的所有装备,空手进行该操作会同时回收傀儡本身。" + "text": "人形傀儡和玩家十分相似。理所当然它可以装备盔甲,近战武器,弓,弩,三叉戟,盾牌等。手持装备右键傀儡将其给予,shift加右键会卸下傀儡身上的所有装备,空手进行该操作会同时回收傀儡本身。" },{ "type": "patchouli:crafting", "recipe": "modulargolems:humanoid_golem_holder", - "text": "手持剑类装备的傀儡将对敌人造成范围伤害。$(br2)人形傀儡装备盾牌后可以格挡除了来自背后和斧类武器以外的所有伤害。$(br2)装备弓/弩时需要消耗箭,推荐使用无限弓。" + "text": "手持剑类装备可进行范围攻击。$(br2)装备盾牌后可以格挡除了来自背后和破盾攻击以外的所有伤害。$(br2)装备弓/弩时也会消耗箭,推荐使用无限弓。" }, { - "type": "patchouli:spotlight", - "item": "minecraft:zombie_head,minecraft:skeleton_skull,minecraft:wither_skeleton_skull", - "text": "在傀儡皮肤槽中放入命名为玩家名字的僵尸/骷髅/凋零骷髅头颅来使用玩家皮肤。$(br2)要求该名字的玩家账号是正版账号,且游戏有网络连接才能从我的世界服务器下载皮肤。" - }, - { - "type": "patchouli:spotlight", - "item": "minecraft:player_head,minecraft:piglin_head", - "text": "在傀儡皮肤槽中放入命名为贴图路径的玩家/猪灵头颅来使用自定义人形模型贴图皮肤。$(br2)使用纤瘦模型时使用玩家头颅。使用正常模型时使用猪灵头颅。$(br2)猪灵头颅也可以用于显示其他材料的人形傀儡贴图皮肤来伪装" + "type": "patchouli:text", + "text": "在人形傀儡装备界面中可以使用$(l)皮肤切换按钮$()来更换傀儡的皮肤。$(br2)支持以下输入格式:$(br2)$(li)$(l)玩家名$() - 使用该正版玩家的 Minecraft 皮肤$(li)$(l)资源路径$() - 使用资源包中的自定义贴图,格式示例:$(br)modulargolems:textures/iws2000.png$(li)$(l)实体ID() - 使用原版僵尸/骷髅/猪灵变种皮肤,格式示例:$(br)minecraft:drowned$(br2)右键点击按钮可重置为默认皮肤。" }, - "如果安装了车万女仆,也可以在傀儡皮肤槽中放入手办来使用女仆模型" + "如果安装了车万女仆,也可以在人形傀儡装备界面中通过$(l)女仆皮肤按钮$()来切换女仆模型。" ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b3_dog_golem.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b3_dog_golem.json index ee9b7a13b..ceb77c48e 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b3_dog_golem.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/b3_dog_golem.json @@ -6,11 +6,11 @@ "pages": [ { "type": "patchouli:text", - "text": "犬型傀儡类似狗,移动速度高,攻击力高,但是血量偏低,而且不能范围攻击。$(br2)蹲下或者用物品右键犬型傀儡能让它坐下。空手右键犬型傀儡能回收傀儡。$(br2)通过$(l:golems/c4_rider_wand)骑乘手杖$(/l)你可以骑上犬型傀儡,也可以用人形傀儡右键犬型傀儡让人形骑上去。使用$(l:upgrades/vanilla_size)体型升级$(/l)可以增加最大骑乘人数" + "text": "犬型傀儡类似狼,移动速度高,攻击力较高,但是不能范围攻击。$(br2)蹲下或者用物品右键犬型傀儡能让它坐下。空手右键犬型傀儡能回收傀儡。$(br2)通过$(l:golems/c4_rider_wand)骑乘手杖$(/l)你可以骑上犬型傀儡,也可以用人形傀儡右键犬型傀儡让人形骑上去。使用$(l:upgrades/vanilla_size)体型升级$(/l)可以增加最大骑乘人数。2级体型升级允许无体型升级的大傀儡骑乘" },{ "type": "patchouli:crafting", "recipe": "modulargolems:dog_golem_holder", - "text": "犬型傀儡很便宜,但是血量也不高。与其他傀儡不同,犬型傀儡的不同部件的制造成本不一样,数值也不一样。" + "text": "犬型傀儡很便宜,与其他傀儡不同,犬型傀儡的不同部件的制造成本不一样,数值也不一样。" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c1_retrieval_wand.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c1_retrieval_wand.json index 7a4bdd715..a33e13686 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c1_retrieval_wand.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c1_retrieval_wand.json @@ -1,16 +1,10 @@ { - "name": "回收手杖", - "icon": "modulargolems:retrieval_wand", - "category": "modulargolems:golems", - "sortnum": 20, - "pages": [ - { - "type": "patchouli:text", - "text": "右键傀儡把傀儡收回背包。$(br2)右键空中把半径20格内的全部傀儡收回背包。$(br2)Shift右键收回准星指向的最多64格远的傀儡。" - },{ - "type": "patchouli:crafting", - "recipe": "modulargolems:retrieval_wand", - "text": "批量回收傀儡的道具。" - } - ] + "name": "回收手杖", + "icon": "modulargolems:retrieval_wand", + "category": "modulargolems:golems", + "sortnum": 20, + "pages": [ + "右键傀儡把傀儡收回背包。$(br2)右键收回准星指向的最多64格远的傀儡。$(br2)Shift右键空中把半径20格内的全部傀儡收回背包。", + "安装了莱特兰背包时:$(br2)如果玩家装备有末影背包,则优先将傀儡回收至末影背包内。$(br2)如果玩家物品栏或者末影背包内有属于玩家的空间背包,则持有对应颜色配置卡的傀儡会优先回收到对应空间背包内。" + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c2_command_wand.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c2_command_wand.json index 923f91759..62d7a75ad 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c2_command_wand.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c2_command_wand.json @@ -7,9 +7,9 @@ { "type": "patchouli:spotlight", "item": "modulargolems:command_wand", - "text": "攻击实体或者右键远处的实体使周围所有你的傀儡优先攻击改目标。$(br2)蹲下右键傀儡调整傀儡的装备和饰品,或查看傀儡数值" + "text": "攻击实体或者右键远处的实体使周围所有你的傀儡优先攻击该目标。$(br2)蹲下右键傀儡调整傀儡的装备和饰品,或查看傀儡数值" }, - "右键傀儡切换傀儡行为模式,一共6种:$(li)跟随模式:默认模式。傀儡跟随玩家。$(li)巡逻模式:切换至巡逻模式时的地点为巡逻点。傀儡会在附近巡逻。傀儡不能改变纬度。$(li)站立模式:切换至站立模式时的傀儡会停留原地。傀儡不能改变纬度。$(li)自由行动:傀儡会随机自由移动", + "右键傀儡切换傀儡行为模式,一共6种:$(li)跟随模式:默认模式。傀儡跟随玩家。$(li)巡逻模式:切换至巡逻模式时的地点为巡逻点。傀儡会在附近巡逻。傀儡不能改变维度。$(li)站立模式:站立模式时傀儡会停留原地。同样不能改变维度。$(li)自由行动:傀儡会随机自由移动", "$(li)编队模式:傀儡会跟随相同配置卡的队长。如果自己就是队长或者找不到队长就自由行动。$(li)固定路线模式:傀儡会根据配置卡中的路径移动" ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c3_summon_wand.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c3_summon_wand.json index 0b549f6d3..bd7ed5334 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c3_summon_wand.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/c3_summon_wand.json @@ -1,16 +1,10 @@ { - "name": "召唤手杖", - "icon": "modulargolems:summon_wand", - "category": "modulargolems:golems", - "sortnum": 22, - "pages": [ - { - "type": "patchouli:text", - "text": "右键从副手或者背包召唤一个傀儡到目标方块。$(br2)蹲下右键从背包尽可能地召唤傀儡到身旁。" - },{ - "type": "patchouli:crafting", - "recipe": "modulargolems:summon_wand", - "text": "批量召唤傀儡的道具。" - } - ] + "name": "召唤手杖", + "icon": "modulargolems:summon_wand", + "category": "modulargolems:golems", + "sortnum": 22, + "pages": [ + "右键从副手或者背包召唤一个傀儡到目标方块。$(br2)蹲下右键从背包尽可能地召唤傀儡到身旁。", + "安装了莱特兰背包时:$(br2)也可以从玩家装备了的末影背包中召唤傀儡$(br2)如果玩家物品栏或者末影背包内有属于玩家的空间背包,也可以从空间背包中召唤持有对应颜色配置卡的傀儡。" + ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d1_config_card.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d1_config_card.json index c9594b0ac..288b3ea43 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d1_config_card.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d1_config_card.json @@ -7,11 +7,11 @@ { "type": "patchouli:spotlight", "item": "modulargolems:white_config_card", - "text": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对持有相同配置卡的傀儡生效。$(br2)重命名物品并右键可以把配置名字设为物品名字。相同所有者且相同颜色的配置卡本质上都是同一个配置卡。" + "text": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对持有相同配置卡的傀儡生效。$(br2)重命名物品并右键可以把配置名字设为物品名字。相同所有者且相同颜色的配置卡共享其中的配置。" }, { "type": "patchouli:text", - "text": "在配置界面中,放入傀儡可以让傀儡绑定此配置。你可以选择傀儡被召唤时的模式,也可以选择傀儡将会被召唤到指向地点还是上次收回的地点。$(br2)注意如果收回的地点在64格以外则不会生效,且如果默认模式是跟随,则还是会在指向地点召唤。" + "text": "在配置界面中,放入傀儡可以让傀儡绑定此配置。你可以选择傀儡被召唤时的行动模式,也可以选择傀儡将会被召唤到指向地点还是上次收回的地点。$(br2)注意如果收回的地点在64格以外则不会生效,且如果默认模式是跟随,则还是会在指向地点召唤。" }, { "type": "patchouli:text", "text": "你也可以锁定傀儡交互,以避免不小心把傀儡拾起或者换掉装备。这时副手拿卡片也没用。如果卡片不小心弄丢了,可以做个同色的来解锁傀儡。$(br2)你也可以配置拾取升级的物品过滤器,以避免傀儡拾取不想要的物品或者不小心销毁重要物品。" @@ -19,12 +19,12 @@ { "type": "patchouli:spotlight", "item": "modulargolems:target_filter_type,modulargolems:target_filter_uuid,modulargolems:target_filter_name,modulargolems:target_filter_default", - "text": "你可以配置傀儡的主动攻击目标和友好列表。友好列表内的生物不会被攻击,主动攻击目标内的生物会主动被攻击,其他生物只有试图攻击傀儡和玩家的时候才会被攻击。$(br2)初始配置中存在默认攻击配置。你可以移除它们并放入你自己的配置,以允许傀儡攻击其他傀儡和其他玩家" + "text": "你可以配置傀儡的主动攻击目标和友好列表。友好列表内的生物不会被攻击,也不会被误伤,主动攻击目标内的生物会被主动攻击,其他生物只有试图攻击傀儡和玩家的时候才会被攻击。$(br2)初始配置中存在默认攻击配置。你可以移除它们并放入你自己的配置,以允许傀儡攻击其他傀儡和其他玩家" }, { "type": "patchouli:spotlight", "item": "modulargolems:patrol_path_recorder", - "text": "你可以配置傀儡在固定移动路线模式下的移动路径。手持巡逻手册右键方块记录路径。安装了机械动力时,同时会在世界中渲染路径点。固定移动路径模式下的傀儡发现攻击目标的时候会偏移路径进行战斗。" + "text": "你可以配置傀儡在固定移动路线模式下的移动路径。手持巡逻手册右键方块记录路径。$(br2)路径点之间的距离不能超过16,超过的路径会标红,且傀儡可能会直接传送到终点。$(br2)固定移动路径模式下的傀儡发现攻击目标的时候会偏移路径进行战斗。" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d2_golem_facade.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d2_golem_facade.json new file mode 100644 index 000000000..2469859f0 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d2_golem_facade.json @@ -0,0 +1,9 @@ +{ + "name": "傀儡皮肤", + "icon": "modulargolems:golem_facade", + "category": "modulargolems:golems", + "sortnum": 32, + "pages": [ + "你可以使用傀儡皮肤让傀儡看起来是用另一种材料做的。$(br2)在铁砧中用任意数量的空白升级和目标傀儡材料合成傀儡皮肤,然后放入“傀儡皮肤”饰品栏中" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d3_slicing_axe.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d3_slicing_axe.json new file mode 100644 index 000000000..6ec2b28e6 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/golems/d3_slicing_axe.json @@ -0,0 +1,15 @@ +{ + "name": "斩铁巨斧", + "icon": "modulargolems:golem_slicing_axe", + "category": "modulargolems:golems", + "sortnum": 33, + "pages": [ + + { + "type": "patchouli:spotlight", + "item": "modulargolems:golem_slicing_axe", + "text": "当大型傀儡持此斧击败其他玩家或无主的没有回收升级的傀儡时,其掉落所有部件,且每个升级模板有50%概率掉落。$(br2)编辑配置卡中的目标选择器以让傀儡能攻击其他傀儡。注意你自己的傀儡无论如何也不能攻击你自己的傀儡" + }, + "当大型傀儡持此斧击杀部分生物时,掉落一个对应材料的大型傀儡部件:$(li)原版:铁傀儡,监守者$(li)灾变:下界合金巨兽,焰魔,先驱者,咒翼灵骸,斯库拉,远古遗骸$(li)Mowzie生物:钢铁守护者$(li)传奇生物:荒古守卫者,浮云傀儡" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_candy.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_candy.json new file mode 100644 index 000000000..ff63dfb17 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_candy.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_candy_cavity", + "name": "糖果", + "icon": "modulargolems:candy_construct", + "category": "modulargolems:materials", + "sortnum": 1301, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:candy_construct", + "text": "制造糖果傀儡的主要材料。修复原料便宜,能发射糖果子弹,看起来很好吃(不是" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:candy\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:candy\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:candy\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:candy\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_magnetic.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_magnetic.json new file mode 100644 index 000000000..856f0f062 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_magnetic.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_magnetic_caves", + "name": "磁力", + "icon": "modulargolems:magnetic_construct", + "category": "modulargolems:materials", + "sortnum": 1302, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:magnetic_construct", + "text": "制造磁力傀儡的主要材料。近战模式吸引敌人,远程模式排斥敌人。可消耗铁锭修复自身并创造护盾。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:magnetic\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:magnetic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_nuclear.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_nuclear.json new file mode 100644 index 000000000..2f95012b2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ac_nuclear.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:alexscaves", + "advancement": "alexscaves:alexscaves/discover_toxic_caves", + "name": "核能", + "icon": "modulargolems:nuclear_construct", + "category": "modulargolems:materials", + "sortnum": 1303, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:nuclear_construct", + "text": "制造核能傀儡的主要材料。攻击施加辐射并且可消耗铀晶碎片快速恢复生命值并提高攻击力与移速" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_arm\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:metal_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"alexscaves:nuclear\"},{part:\"modulargolems:dog_golem_legs\",material:\"alexscaves:nuclear\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_allthemodium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_allthemodium.json new file mode 100644 index 000000000..253313910 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_allthemodium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "ATM", + "icon": "allthemodium:allthemodium_ingot", + "category": "modulargolems:materials", + "sortnum": 1201, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:allthemodium_ingot", + "text": "制造ATM傀儡部件的主要材料。高额数值,更多额外升级槽位,以及实用的内置词条" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:allthemodium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:allthemodium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_unobtainium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_unobtainium.json new file mode 100644 index 000000000..723cb095d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_unobtainium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "难得素", + "icon": "allthemodium:unobtainium_ingot", + "category": "modulargolems:materials", + "sortnum": 1203, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:unobtainium_ingot", + "text": "制造难得素傀儡部件的主要材料。顶尖的数值,巨量额外升级槽位,以及强力的内置词条" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:unobtainium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:unobtainium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_vibranium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_vibranium.json new file mode 100644 index 000000000..b76cc510d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/atm_vibranium.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:allthemodium", + "name": "振金", + "icon": "allthemodium:vibranium_ingot", + "category": "modulargolems:materials", + "sortnum": 1202, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "allthemodium:vibranium_ingot", + "text": "制造振金傀儡部件的主要材料。极高的数值,大量额外升级槽位,以及更多的内置词条" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_arm\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:metal_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"allthemodium:vibranium\"},{part:\"modulargolems:dog_golem_legs\",material:\"allthemodium:vibranium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_andesite_alloy.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_andesite_alloy.json index 171134ee0..665b5ada0 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_andesite_alloy.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_andesite_alloy.json @@ -8,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "create:andesite_alloy", - "text": "制作安山合金傀儡部件的主要材料,修复成本低廉,可为傀儡提供额外魔法抗性。消耗燃料可以提升速度和攻击伤害。$(br2)可以自动从该傀儡或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" + "text": "制作安山合金傀儡部件的主要材料,修复成本低廉,可为傀儡提供额外魔法抗性。消耗燃料可以提升速度和攻击伤害。$(br2)可以自动从傀儡自身或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_brass.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_brass.json index 8cc0ce35d..ed14d477c 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_brass.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_brass.json @@ -8,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "create:brass_ingot", - "text": "制作黄铜傀儡部件的主要材料。可为傀儡提供更高的魔法抗性。消耗燃料可以提升速度和攻击伤害。$(br2)可以自动从该傀儡或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" + "text": "制作黄铜傀儡部件的主要材料。可为傀儡提供更高的魔法抗性。消耗燃料可以提升速度和攻击伤害。$(br2)可以自动从傀儡自身或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_cardboard.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_cardboard.json new file mode 100644 index 000000000..927ffb985 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_cardboard.json @@ -0,0 +1,29 @@ +{ + "flag": "&mod:create,modulargolems:create:cardboard", + "name": "纸板", + "icon": "create:cardboard", + "category": "modulargolems:materials", + "sortnum": 305, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "create:cardboard", + "text": "制作纸板傀儡的主要材料。纸板傀儡是最便宜的傀儡。攻击和血量极低,但是有优秀的移动速度和攻击击退" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_arm\",material:\"create:cardboard\"},{part:\"modulargolems:metal_golem_legs\",material:\"create:cardboard\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"create:cardboard\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"create:cardboard\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"create:cardboard\"},{part:\"modulargolems:dog_golem_legs\",material:\"create:cardboard\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_railway.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_railway.json index 7dddc11c0..7350654ee 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_railway.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/cr_railway.json @@ -3,12 +3,12 @@ "name": "列车机壳", "icon": "create:railway_casing", "category": "modulargolems:materials", - "sortnum": 303, + "sortnum": 304, "pages": [ { "type": "patchouli:spotlight", "item": "create:railway_casing", - "text": "制作列车傀儡部件的主要材料,可为傀儡提供高魔法抗性,火焰抗性,范围攻击以及强力击退。消耗燃料可以显著提升速度和攻击伤害。看呐!火车头创向了怪物!$(br2)可以自动从该傀儡或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" + "text": "制作列车傀儡部件的主要材料,可为傀儡提供高额魔法抗性,火焰抗性,范围攻击以及强力击退。消耗燃料可以显著提升速度和攻击伤害。看呐!火车头创向了怪物!$(br2)可以自动从傀儡自身或者同队的傀儡队长身上装备的空间背包(来自莱特兰背包)中消耗燃料。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ancient_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ancient_metal.json new file mode 100644 index 000000000..071bec8f2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ancient_metal.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:find_cursed_pyramid", + "name": "远古金属", + "icon": "cataclysm:ancient_metal_ingot", + "category": "modulargolems:materials", + "sortnum": 706, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "cataclysm:ancient_metal_ingot", + "text": "制造远古金属傀儡的主要材料。能召唤沙暴进行攻击。$(br2)熔锻:傀儡低血量时消耗最大血量上限来回复血量,最多8/5/5次。可以用修复材料填补" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:ancient_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:ancient_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_cursium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_cursium.json new file mode 100644 index 000000000..3ded26efc --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_cursium.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_maledictus", + "name": "咒魂", + "icon": "cataclysm:cursium_ingot", + "category": "modulargolems:materials", + "sortnum": 703, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "cataclysm:cursium_ingot", + "text": "制作咒魂傀儡部件的主要材料。身体部件让傀儡能使用下坠攻击召唤战戟。手臂部件让傀儡近战穿透护甲并通过连续攻击提升伤害" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:cursium\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:cursium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:cursium\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:cursium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ender_guardian.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ender_guardian.json new file mode 100644 index 000000000..b2abde948 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ender_guardian.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ender_golem", + "name": "末地守卫", + "icon": "modulargolems:void_construct", + "category": "modulargolems:materials", + "sortnum": 705, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:void_construct", + "text": "制作末地守卫傀儡部件的主要材料。召唤漩涡困住敌人并用虚空符文攻击。能同时攻击多个目标" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:ender_guardian\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:ender_guardian\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ignitium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ignitium.json index 0be4804f2..2cb1b78f6 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ignitium.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_ignitium.json @@ -1,14 +1,15 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ignis", "name": "腾炎", "icon": "cataclysm:ignitium_ingot", "category": "modulargolems:materials", - "sortnum": 501, + "sortnum": 701, "pages": [ { "type": "patchouli:spotlight", "item": "cataclysm:ignitium_ingot", - "text": "制作腾炎傀儡部件的主要材料。身体部件允许傀儡发射焰魔火球。手部部件允许傀儡叠加炽热烙印效果并吸血" + "text": "制作腾炎傀儡部件的主要材料。身体部件允许傀儡发射焰魔火球。手部部件允许傀儡攻击叠加炽热烙印效果并吸血" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_storm.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_storm.json new file mode 100644 index 000000000..a652c98e4 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_storm.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_scylla", + "name": "风暴", + "icon": "modulargolems:storm_construct", + "category": "modulargolems:materials", + "sortnum": 704, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:storm_construct", + "text": "制作风暴傀儡部件的主要材料。发射鸣雷槊同时攻击多个目标,受到伤害时召唤海浪推开敌人" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_arm\",material:\"cataclysm:storm\"},{part:\"modulargolems:metal_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"cataclysm:storm\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"cataclysm:storm\"},{part:\"modulargolems:dog_golem_legs\",material:\"cataclysm:storm\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_witherite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_witherite.json index 596848ba1..3795dde15 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_witherite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/ct_witherite.json @@ -1,9 +1,10 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_harbinger", "name": "凋零合金", "icon": "cataclysm:witherite_ingot", "category": "modulargolems:materials", - "sortnum": 501, + "sortnum": 701, "pages": [ { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_apocalyptium.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_apocalyptium.json new file mode 100644 index 000000000..08366cc05 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_apocalyptium.json @@ -0,0 +1,30 @@ +{ + "flag": "&mod:goety_revelation,modulargolems:goety_revelation:apocalyptium", + "advancement": "goety_revelation:kill_apollyon", + "name": "神灵金属", + "icon": "goety_revelation:apocalyptium_ingot", + "category": "modulargolems:materials", + "sortnum": 1003, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety_revelation:apocalyptium_ingot", + "text": "制作神金傀儡的主要材料。以傀儡为基底重塑神性,你将获得不死不灭的强大助力。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety_revelation:apocalyptium\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety_revelation:apocalyptium\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_cursed_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_cursed_metal.json new file mode 100644 index 000000000..9b968a602 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_cursed_metal.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:goety", + "name": "诅咒金属", + "icon": "goety:cursed_ingot", + "category": "modulargolems:materials", + "sortnum": 1001, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety:cursed_ingot", + "text": "制作诅咒金属傀儡部件的主要材料。诅咒金属傀儡防火且能削弱敌方护甲" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety:cursed_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety:cursed_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety:cursed_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety:cursed_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_dark_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_dark_metal.json new file mode 100644 index 000000000..9489c3d1e --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/goety_dark_metal.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:goety", + "name": "黑暗金属", + "icon": "goety:dark_ingot", + "category": "modulargolems:materials", + "sortnum": 1002, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "goety:dark_ingot", + "text": "制作黑暗金属傀儡部件的主要材料。黑暗金属傀儡对火焰/爆炸/魔法伤害有抗性,有极快的再生速度,能消耗召唤者的灵魂能量修复自身和装备,且击败敌人会为召唤者提供灵魂能量,还有机会将击败的敌人转化为缠魂仆胄" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"goety:dark_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"goety:dark_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"goety:dark_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"goety:dark_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_fire.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_fire.json new file mode 100644 index 000000000..724751ccf --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_fire.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "龙炎钢", + "icon": "iceandfire:dragonsteel_fire_ingot", + "category": "modulargolems:materials", + "sortnum": 901, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_fire_ingot", + "text": "制作龙炎钢傀儡部件的主要材料。龙炎钢傀儡拥有较高的攻防,免疫火焰,并且会点燃攻击目标。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:fire_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:fire_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_ice.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_ice.json new file mode 100644 index 000000000..5d2243c11 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_ice.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "龙霜钢", + "icon": "iceandfire:dragonsteel_ice_ingot", + "category": "modulargolems:materials", + "sortnum": 902, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_ice_ingot", + "text": "制作龙霜钢傀儡部件的主要材料。龙霜钢傀儡拥有较高的攻防,并可以冻结攻击目标和攻击自己的单位" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:ice_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:ice_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_lightning.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_lightning.json new file mode 100644 index 000000000..93b05602c --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/iaf_lightning.json @@ -0,0 +1,29 @@ +{ + "flag": "mod:iceandfire", + "name": "龙霆钢", + "icon": "iceandfire:dragonsteel_lightning_ingot", + "category": "modulargolems:materials", + "sortnum": 903, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "iceandfire:dragonsteel_lightning_ingot", + "text": "制作龙霆钢傀儡部件的主要材料。龙霆钢傀儡拥有较高的攻防,免疫雷电伤害,并且攻击时召唤雷电。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_arm\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:metal_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"iceandfire:lightning_dragonsteel\"},{part:\"modulargolems:dog_golem_legs\",material:\"iceandfire:lightning_dragonsteel\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_poseidite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_poseidite.json index 8eb0af2f0..196eeacf1 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_poseidite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_poseidite.json @@ -8,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "l2complements:poseidite_ingot", - "text": "制造海神傀儡部件的材料。含有海神傀儡身体部件的傀儡能够游泳,在水下也会获得加成。" + "text": "制造海神傀儡部件的材料。海神部件在水/雨中会获得强力加成。腿部部件拥有游泳能力," }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_shulkerate.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_shulkerate.json index fb187f1e9..da501d965 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_shulkerate.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lc_shulkerate.json @@ -8,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "l2complements:shulkerate_ingot", - "text": "制造潜影傀儡部件的主要材料。潜影傀儡部件能提供极其恐怖的血量,同时还会限制受到的伤害,进一步强化生存能力。和生命回复材料或镀膜升级相性极佳。" + "text": "制造潜影傀儡部件的主要材料。潜影傀儡部件能提供极其恐怖的血量,同时还会限制受到的伤害,进一步强化生存能力。和生命回复材料或镀层升级相性极佳。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_chaotic.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_chaotic.json new file mode 100644 index 000000000..d3ed18617 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_chaotic.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", + "name": "混沌", + "icon": "l2hostility:chaos_ingot", + "category": "modulargolems:materials", + "sortnum": 1101, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "l2hostility:chaos_ingot", + "text": "制造混沌傀儡的主要材料。混沌傀儡有优秀的数值和一些自带的高级升级。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:metal_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"l2hostility:chaotic\"},{part:\"modulargolems:dog_golem_legs\",material:\"l2hostility:chaotic\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_miraculous.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_miraculous.json new file mode 100644 index 000000000..f60c441d2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lh_miraculous.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/miracle", + "name": "奇迹", + "icon": "l2hostility:miracle_ingot", + "category": "modulargolems:materials", + "sortnum": 1102, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "l2hostility:miracle_ingot", + "text": "制造奇迹傀儡的主要材料。奇迹傀儡获得了适应和破魔词条的力量,使其更容易对付高等级的恶意敌人。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_arm\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:metal_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"l2hostility:miraculous\"},{part:\"modulargolems:dog_golem_legs\",material:\"l2hostility:miraculous\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_cloud.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_cloud.json new file mode 100644 index 000000000..521bc863d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_cloud.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:legendary_monsters", + "advancement": "legendary_monsters:defeat_cloud_golem", + "name": "浮云", + "icon": "modulargolems:cloud_cube", + "category": "modulargolems:materials", + "sortnum": 1201, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:cloud_cube", + "text": "制造浮云傀儡的主要材料。浮云傀儡可以召唤乌云闪电同时攻击多个敌人,并且受到攻击时可以制造电磁冲击波" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:metal_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"legendary_monsters:cloud\"},{part:\"modulargolems:dog_golem_legs\",material:\"legendary_monsters:cloud\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_molten_metal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_molten_metal.json new file mode 100644 index 000000000..2b2dd351a --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/lm_molten_metal.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:legendary_monsters", + "advancement": "legendary_monsters:defeat_the_ancient_guardian", + "name": "熔融金属", + "icon": "legendary_monsters:molten_metal_ingot", + "category": "modulargolems:materials", + "sortnum": 1201, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "legendary_monsters:molten_metal_ingot", + "text": "制造熔融金属傀儡的主要材料。熔融金属傀儡免疫火焰和弹射物伤害,并且可以通过下落攻击产生能眩晕敌人的冲击波" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_arm\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:metal_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"legendary_monsters:molten_metal\"},{part:\"modulargolems:dog_golem_legs\",material:\"legendary_monsters:molten_metal\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/mowzies_wroughtnaut.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/mowzies_wroughtnaut.json new file mode 100644 index 000000000..003ebad53 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/mowzies_wroughtnaut.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:mowziesmobs", + "advancement": "mowziesmobs:kill_ferrous_wroughtnaut", + "name": "千锻钢", + "icon": "modulargolems:wroughtnaut_ingot", + "category": "modulargolems:materials", + "sortnum": 1101, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:wroughtnaut_ingot", + "text": "制造千锻钢傀儡的主要材料。千锻钢傀儡有极高的魔法抗性,攻击有概率穿透护甲,并且能制造冲击波。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_arm\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:metal_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"mowziesmobs:wroughtnaut\"},{part:\"modulargolems:dog_golem_legs\",material:\"mowziesmobs:wroughtnaut\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_fiery.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_fiery.json index b7d7b166a..bd15d098e 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_fiery.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_fiery.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "炽铁", "icon": "twilightforest:fiery_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_ironwood.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_ironwood.json index 8979292b5..f1e8be468 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_ironwood.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_ironwood.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "铁树", "icon": "twilightforest:ironwood_ingot", "category": "modulargolems:materials", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_knightmetal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_knightmetal.json index 803edaaae..8e238bd9b 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_knightmetal.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_knightmetal.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "骑士金属", "icon": "twilightforest:knightmetal_ingot", "category": "modulargolems:materials", @@ -8,7 +9,7 @@ { "type": "patchouli:spotlight", "item": "twilightforest:knightmetal_ingot", - "text": "制作骑士傀儡主要部件的材料,骑士傀儡部件具有显著的荆棘效果与高属性,推荐用于腿部或躯干" + "text": "制作骑士傀儡主要部件的材料,骑士傀儡部件具有显著的荆棘效果与高属性,但移速慢,推荐用于腿部或躯干" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_steeleaf.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_steeleaf.json index 49f967f61..f8a854850 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_steeleaf.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tf_steeleaf.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "钢叶", "icon": "twilightforest:steeleaf_ingot", "category": "modulargolems:materials", @@ -8,7 +9,7 @@ { "type": "patchouli:spotlight", "item": "twilightforest:steeleaf_ingot", - "text": "制作钢叶傀儡部件的主要材料,钢叶傀儡部件具有显著的攻击力但是生命值较低。推荐用于手臂。" + "text": "制作钢叶傀儡部件的主要材料,钢叶傀儡部件具有显著的攻击力与较好的恢复力,每个部件都会提供一定移速加成,但是生命值较低。推荐用于手臂。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_amethyst_bronze.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_amethyst_bronze.json new file mode 100644 index 000000000..2b34306a2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_amethyst_bronze.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "紫水晶青铜", + "icon": "tconstruct:amethyst_bronze_ingot", + "category": "modulargolems:materials", + "sortnum": 801, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:amethyst_bronze_ingot", + "text": "制作紫水晶青铜傀儡部件的主要材料,紫水晶青铜傀儡部件成本低且性价比高。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:amethyst_bronze\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:amethyst_bronze\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_cobalt.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_cobalt.json new file mode 100644 index 000000000..0a4392d1a --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_cobalt.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "钴", + "icon": "tconstruct:cobalt_ingot", + "category": "modulargolems:materials", + "sortnum": 804, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:cobalt_ingot", + "text": "制作钴傀儡部件的主要材料,钴傀儡部件提供较高的数值,腿部拥有移速加成。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:cobalt\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:cobalt\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_hepatizon.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_hepatizon.json new file mode 100644 index 000000000..b224e6315 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_hepatizon.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "黑色科林斯青铜", + "icon": "tconstruct:hepatizon_ingot", + "category": "modulargolems:materials", + "sortnum": 803, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:hepatizon_ingot", + "text": "制作黑色科林斯青铜傀儡部件的主要材料,其拥有尚可的防御力,且受伤时能提供一定伤害减免。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:hepatizon\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:hepatizon\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_manyullyn.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_manyullyn.json new file mode 100644 index 000000000..5e191f709 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_manyullyn.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "玛玉灵", + "icon": "tconstruct:manyullyn_ingot", + "category": "modulargolems:materials", + "sortnum": 802, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:manyullyn_ingot", + "text": "制作玛玉灵傀儡部件的主要材料,其拥有高额数值,且在战斗中能多段提高伤害。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:manyullyn\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:manyullyn\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_rose_gold.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_rose_gold.json new file mode 100644 index 000000000..984ca96c2 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/tinker_rose_gold.json @@ -0,0 +1,30 @@ +{ + "flag": "mod:tconstruct", + "advancement": "tconstruct:smeltery/melter", + "name": "玫瑰金", + "icon": "tconstruct:rose_gold_ingot", + "category": "modulargolems:materials", + "sortnum": 805, + "pages": [ + { + "type": "patchouli:spotlight", + "item": "tconstruct:rose_gold_ingot", + "text": "制作玫瑰金傀儡部件的主要材料,玫瑰金傀儡部件数值极低,但是会提供额外的升级槽。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:metal_golem_holder{golem_materials:[{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_arm\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:metal_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:humanoid_golem_holder{golem_materials:[{part:\"modulargolems:humanoid_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:humanoid_golem_arms\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:humanoid_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + }, + { + "type": "patchouli:spotlight", + "item": "modulargolems:dog_golem_holder{golem_materials:[{part:\"modulargolems:dog_golem_body\",material:\"tconstruct:rose_gold\"},{part:\"modulargolems:dog_golem_legs\",material:\"tconstruct:rose_gold\"}]}", + "text": "使用JEI物品管理器 (R键默认)来查看以此为原料的傀儡部件的详细属性。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_copper.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_copper.json index 1e9a51a32..a13478386 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_copper.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_copper.json @@ -7,7 +7,7 @@ { "type": "patchouli:spotlight", "item": "minecraft:copper_ingot", - "text": "制作铜质傀儡部件的主要材料,铜质傀儡部件造价低廉,拥有不错的属性且免疫雷电伤害,也能作为移动的避雷针。$(br2)你可以大量地制作铜傀儡作为防御设施,使用铜质躯干的傀儡修复成本极低。" + "text": "制作铜质傀儡部件的主要材料,铜质傀儡部件造价低廉,拥有尚可的属性且免疫雷电伤害,也能作为移动的避雷针。$(br2)你可以大量地制作铜傀儡作为防御设施,使用铜质躯干的傀儡修复成本极低。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_gold.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_gold.json index f7b6cc210..613e9c7c3 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_gold.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_gold.json @@ -7,7 +7,7 @@ { "type": "patchouli:spotlight", "item": "minecraft:gold_ingot", - "text": "制作黄金傀儡部件的主要材料,黄金傀儡部件拥有生命恢复能力,但都极为脆弱。$(br2)如果你想要傀儡拥有自愈能力,黄金躯干或腿是个不错的选择,其他部位则需要选择拥有较高生命值的傀儡部件。" + "text": "制作黄金傀儡部件的主要材料,黄金傀儡部件拥有生命恢复能力,但都极为脆弱且缓慢。$(br2)如果你想要傀儡拥有自愈能力,黄金躯干或腿是个不错的选择,其他部位则建议选择拥有较高生命值的傀儡部件。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_iron.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_iron.json index 4d3cbd168..ee56ecf89 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_iron.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_iron.json @@ -7,7 +7,7 @@ { "type": "patchouli:spotlight", "item": "minecraft:iron_ingot", - "text": "制作铁傀儡部件的主要材料,铁傀儡部件修复成本低且性价比高。$(br2)推荐用于身体或腿部以此让傀儡易于修复。" + "text": "制作铁傀儡部件的主要材料,铁傀儡部件修复成本低且性价比高。$(br2)推荐用于身体以此让傀儡易于修复,同样推荐大量制作来作为防御设施" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_netherite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_netherite.json index 8b926d3ff..408547456 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_netherite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_netherite.json @@ -7,7 +7,7 @@ { "type": "patchouli:spotlight", "item": "minecraft:netherite_ingot", - "text": "制作下界合金傀儡部件的主要材料,下界合金傀儡部件拥有高生命值,火焰免疫和高伤害,攻击敌人甚至可以造成范围伤害。但厚重的下界合金会使傀儡的移动速度减慢。$(br2)推荐用于手臂,当然双腿和躯干同样适用。" + "text": "制作下界合金傀儡部件的主要材料,下界合金傀儡部件拥有高生命值,火焰免疫和高伤害,甚至可以范围攻击。但厚重的下界合金会使傀儡的移动速度减慢。$(br2)推荐用于手臂,当然双腿和躯干同样适用。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_sculk.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_sculk.json index 4054f873e..c59d68564 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_sculk.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/materials/vanilla_sculk.json @@ -7,7 +7,7 @@ { "type": "patchouli:spotlight", "item": "minecraft:echo_shard", - "text": "制作幽匿傀儡部件的主要材料,幽匿傀儡部件拥有极高生命值,火焰免疫,火焰附加和高伤害。一分钱一分货,说的就是这个道理。$(br2)推荐用于腿部以获取极高移动速度和生命值。" + "text": "制作幽匿傀儡部件的主要材料,幽匿傀儡部件拥有高额生命值,火焰免疫和高伤害。一分钱一分货,说的就是这个道理。$(br2)推荐用于腿部以获取极高移动速度和生命值。" }, { "type": "patchouli:spotlight", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ancient_remnant.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ancient_remnant.json index 78b723a6d..a13e6cb6a 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ancient_remnant.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ancient_remnant.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_remnant", "name": "远古遗魂升级", "icon": "modulargolems:ancient_remnant_sandstorm", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:ancient_remnant_sandstorm", - "text": "攻击目标较远时,在目标位置召唤沙暴。最高等级: 1" + "text": "在[等级x3]个目标位置召唤沙暴。提升对收到沙漠诅咒的生物的伤害。最高等级: 3" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ender_guardian.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ender_guardian.json index db2c3f121..4717c6ffd 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ender_guardian.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_ender_guardian.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_ender_guardian", "name": "末影守卫升级", "icon": "modulargolems:ender_guardian_void_rune", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:ender_guardian_void_rune", - "text": "对目标放出虚空符文。最高等级: 1" + "text": "对[等级x2]个目标放出漩涡和虚空符文。最高等级: 5" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_leviathan.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_leviathan.json index 280232797..bd023b643 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_leviathan.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_leviathan.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_leviathan", "name": "利维坦升级", "icon": "modulargolems:leviathan_blast_portal", "category": "modulargolems:upgrades", @@ -7,7 +8,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:leviathan_blast_portal", - "text": "攻击目标较远时,在目标位置放出深渊冲击波。最高等级: 1" + "text": "在[等级x3]个目标位置放出深渊冲击波。最高等级: 3" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_netherite_monstrosity.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_netherite_monstrosity.json index 30ad33f4e..61db93e38 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_netherite_monstrosity.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_netherite_monstrosity.json @@ -1,5 +1,6 @@ { "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_monstrosity", "name": "下界合金巨兽升级", "icon": "modulargolems:netherite_monstrosity_earthquake", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_scylla.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_scylla.json new file mode 100644 index 000000000..fa4911f22 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/ct_scylla.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:cataclysm", + "advancement": "cataclysm:kill_scylla", + "name": "斯库拉升级", + "icon": "modulargolems:scylla_lightning_upgrade", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:scylla_lightning_upgrade", + "text": "对[等级x3]个目标放出鸣雷槊。最高等级: 3" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_apostle.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_apostle.json new file mode 100644 index 000000000..0c4e54ce4 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_apostle.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒晋升升级", + "icon": "modulargolems:apostle", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:apostle", + "text": "使徒升级不再消耗升级槽" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_blast.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_blast.json new file mode 100644 index 000000000..55948ef27 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_blast.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒升级: 炎爆", + "icon": "modulargolems:fire_blast", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:fire_blast", + "text": "每10秒召唤炎爆陷阱。高等级提高范围。最高3级 $(li)直径: 4 - 6格 $(li)伤害: 等同傀儡近战伤害 $(li)目标: 1 - 3" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_tornado.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_tornado.json new file mode 100644 index 000000000..40a5c444d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_fire_tornado.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒升级: 燃烧龙卷风", + "icon": "modulargolems:fire_tornado", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:fire_tornado", + "text": "每10秒向目标位置召唤燃烧龙卷风陷阱。高等级提升伤害和持续时间。最高5级 $(li)持续时间: 8 - 12秒 $(li)伤害: 12 - 24 $(li)目标数: 3 - 7" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_blast.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_blast.json new file mode 100644 index 000000000..2b4776d7c --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_blast.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒升级: 狱火爆弹", + "icon": "modulargolems:hell_blast", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_blast", + "text": "每10秒朝多个目标发射狱火爆弹。同时锁定16格范围内的多个敌人。提升等级能增加最大锁定数量。每级可锁定2个敌人。最高等级: 3$(li)伤害:20-40" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_bolt.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_bolt.json new file mode 100644 index 000000000..4248086b4 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_bolt.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒升级: 狱火束", + "icon": "modulargolems:hell_bolt", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_bolt", + "text": "每10秒朝多个目标发射狱火束。同时锁定35格范围内的多个敌人。提升等级能提升伤害和最大锁定数量。每级可锁定4个敌人。最高等级: 3$(li)伤害:10 - 20" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_cloud.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_cloud.json new file mode 100644 index 000000000..25682bcf1 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_hell_cloud.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety", + "advancement": "goety:goety/kill_a_apostle", + "name": "使徒升级: 狱云", + "icon": "modulargolems:hell_cloud", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:hell_cloud", + "text": "每10秒在目标位置召唤狱云。高等级提高范围和持续时间。最高5级$(li)半径: 4 - 6格 $(li)持续时间: 6 - 10秒 $(li)伤害: 4 - 8 $(li)目标: 3 - 7" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_soul.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_soul.json new file mode 100644 index 000000000..d7dd72d45 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/goety_soul.json @@ -0,0 +1,13 @@ +{ + "flag": "mod:goety", + "name": "灵魂收割升级", + "icon": "modulargolems:soul_collection", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:soul_collection", + "text": "傀儡击杀敌人的时候为主人提供灵魂能量。高等级提升获取的灵魂量。最大等级:4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_abhorrent.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_abhorrent.json new file mode 100644 index 000000000..20184a71d --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_abhorrent.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "使徒头衔: 憎恶本质", + "icon": "modulargolems:the_abhorrent", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_abhorrent", + "text": "傀儡攻击时降低目标无敌帧。每级减少5刻$(br2)最大等级: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_atrocious.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_atrocious.json new file mode 100644 index 000000000..41bf05dce --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_atrocious.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "使徒头衔: 十恶不赦", + "icon": "modulargolems:the_atrocious", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_atrocious", + "text": "减半使徒升级的攻击技能的冷却$(br2)最大等级: 1" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_profane.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_profane.json new file mode 100644 index 000000000..c0357954b --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_profane.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "使徒头衔: 天启饥荒", + "icon": "modulargolems:the_profane", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_profane", + "text": "傀儡攻击时移除对方身上随机的正面效果。每级移除一个。$(br2)最大等级: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_terrible.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_terrible.json new file mode 100644 index 000000000..547548817 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/gr_terrible.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:goety_revelation", + "advancement": "goety_revelation:kill_apollyon", + "name": "使徒头衔: 可怖之物", + "icon": "modulargolems:the_terrible", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:the_terrible", + "text": "提升傀儡拉弓速度。每级提升100%,但不影响半秒的射击冷却。$(br2)傀儡可以同时瞄准[4x等级+4]个敌人。$(br2)如果傀儡使用的是原版弓,傀儡一次能朝每个目标射[2+等级]支箭。$(br2)最高等级: 4" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lc_potion_cleanse.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lc_potion_cleanse.json index 6080b96ef..092f2eedf 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lc_potion_cleanse.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lc_potion_cleanse.json @@ -1,13 +1,13 @@ { "flag": "mod:l2complements", - "name": "药水升级:净化", + "name": "净化升级", "icon": "modulargolems:cleanse", "category": "modulargolems:upgrades", "pages": [ { "type": "patchouli:spotlight", "item": "modulargolems:cleanse", - "text": "傀儡获得永久的净化效果。获得净化效果后傀儡将对所有其他药水效果免疫。最高等级:1" + "text": "傀儡获得永久的净化效果。获得净化效果后傀儡将对其他状态效果免疫。最高等级:1" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_core.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_core.json index 0013b1f5a..b0556e468 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_core.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_core.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意核心升级", "icon": "modulargolems:hostility_core", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_potion.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_potion.json index 0fd3c6dcc..d03442186 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_potion.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_potion.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:药水", "icon": "modulargolems:hostility_potion", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_protection.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_protection.json index 961a6fd46..9979ba81b 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_protection.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_protection.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:保护", "icon": "modulargolems:hostility_protection", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_reflect.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_reflect.json index a9378ecfa..fa0964202 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_reflect.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_reflect.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:反射", "icon": "modulargolems:hostility_reflect", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_regen.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_regen.json index 63fc11aaf..2f51a9ed5 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_regen.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_regen.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:再生", "icon": "modulargolems:hostility_regen", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_speed.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_speed.json index 8ea4ff63e..5aabecbb4 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_speed.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_speed.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:神速", "icon": "modulargolems:hostility_speed", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_tank.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_tank.json index 60e86e85a..ecc2528f7 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_tank.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lh_tank.json @@ -1,5 +1,6 @@ { "flag": "mod:l2hostility", + "advancement": "l2hostility:hostility/ingot", "name": "恶意升级:重装", "icon": "modulargolems:hostility_tank", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lm_thunder.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lm_thunder.json new file mode 100644 index 000000000..dc00b3eec --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/lm_thunder.json @@ -0,0 +1,13 @@ +{ + "flag": "mod:legendary_monsters", + "name": "雷暴升级", + "icon": "modulargolems:thunderstorm", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:thunderstorm", + "text": "傀儡可以召唤湫渃云魔的乌云闪电同时攻击多个目标,且受击会向周围释放电磁冲击波。最大等级: 4 $(li)乌云闪电伤害:7/10/13/16 $(li)每列乌云闪电数量:16/24/32/40个 $(li)电磁冲击波伤害:40%/60%/80%/100%近战伤害" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/mowzies_wroughtnaut.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/mowzies_wroughtnaut.json new file mode 100644 index 000000000..e1b053837 --- /dev/null +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/mowzies_wroughtnaut.json @@ -0,0 +1,14 @@ +{ + "flag": "mod:mowziesmobs", + "advancement": "mowziesmobs:kill_ferrous_wroughtnaut", + "name": "千锻震升级", + "icon": "modulargolems:wroughtnaut", + "category": "modulargolems:upgrades", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "modulargolems:wroughtnaut", + "text": "进行下落攻击并产生冲击波" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_carminite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_carminite.json index c871fff21..20e0bcf36 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_carminite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_carminite.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "砷铅铁升级", "icon": "modulargolems:carminite", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_fiery.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_fiery.json index c18c829d4..3b48212f9 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_fiery.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_fiery.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "炽铁升级", "icon": "modulargolems:fiery", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_ironwood.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_ironwood.json index cee10c1b8..90fad4935 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_ironwood.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_ironwood.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "铁木升级", "icon": "modulargolems:ironwood", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_knightmetal.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_knightmetal.json index ced9b2ef9..eaac5dae3 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_knightmetal.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_knightmetal.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "骑士升级", "icon": "modulargolems:knightmetal", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_naga.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_naga.json index b7f312c2d..b70fd709f 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_naga.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_naga.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "娜迦升级", "icon": "modulargolems:naga", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_steeleaf.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_steeleaf.json index 99c9f57ea..184fac662 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_steeleaf.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/tf_steeleaf.json @@ -1,5 +1,6 @@ { "flag": "mod:twilightforest", + "advancement": "twilightforest:root", "name": "钢叶升级", "icon": "modulargolems:steeleaf", "category": "modulargolems:upgrades", diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_emerald.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_emerald.json index 2a5faee9a..d8ec15106 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_emerald.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_emerald.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:emerald", - "text": "大幅提升傀儡对掠夺者的伤害。最高等级:2" + "text": "大幅提升傀儡对灾厄村民的伤害。最高等级:2" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_netherite.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_netherite.json index 2e07525d7..7c45c1f28 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_netherite.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_netherite.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:netherite", - "text": "为傀儡提供大量护甲值与攻击力。最大等级:2" + "text": "为傀儡提供大量护甲值与护甲韧性。最大等级:2" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_pickup.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_pickup.json index cac09d0f6..222b355e5 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_pickup.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_pickup.json @@ -10,14 +10,14 @@ },{ "type": "patchouli:spotlight", "item": "modulargolems:pickup_no_destroy", - "text": "傀儡拾取物品时会试图把物品传送给玩家。如果傀儡处于停留模式,首先会试图放入1格内的容器。如果容器不存在或者已满且玩家不存在,则会销毁物品(为了防止卡顿)使用取消销毁升级,则会把剩余物品留在原地不拾取。" + "text": "傀儡拾取物品时会尝试把物品传送给玩家。如果傀儡处于停留模式,首先会尝试放入距自身1格内的容器。如果容器不存在或者已满且玩家不存在,则会销毁物品(为了防止卡顿),使用取消销毁升级则会把剩余物品留在原地不拾取。" },{ "type": "patchouli:spotlight", "item": "modulargolems:pickup_mending", - "text": "傀儡拾取经验时首先会试图用经验来修复身上的经验修补装备。之后如果有经验修补升级则会用经验修补自身,之后,傀儡会试图把剩余经验传送给玩家。如果玩家不存在,则销毁经验。" + "text": "傀儡拾取经验时首先会尝试用经验来修复身上的经验修补附魔装备。之后如果有经验修补升级则会用经验修补自身,之后,傀儡会尝试把剩余经验传送给玩家,玩家不存在则销毁经验。" },{ "type": "patchouli:text", - "text": "如果装了莱特兰背包,傀儡在寻找容器前会试图把物品放入背上的空间背包中。$(br2)如果装了附魔工业,如果傀儡站在祛魔池上,傀儡会在把经验传送给玩家前试图把经验注入泄魔池。" + "text": "如果装了莱特兰背包,傀儡在寻找容器和玩家前会尝试把物品放入背上的空间背包中。$(br2)如果装了附魔工业,且傀儡站在祛魔池上,傀儡会在把经验传送给玩家前尝试把经验注入祛魔池。" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_ride.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_ride.json index 5fb13df15..5a9461128 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_ride.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_ride.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:mount_upgrade", - "text": "只对犬型傀儡有效。让傀儡不能攻击,也不能被攻击。大幅提升血量,移动速度,跳跃高度。" + "text": "只对犬型傀儡有效。让傀儡不能攻击,也不能被攻击。免疫来自不以自己为攻击对象的怪物的伤害。大幅提升血量,移动速度,跳跃高度。" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_size.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_size.json index 8a28fc224..3c7587d6d 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_size.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_size.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:size_upgrade", - "text": "提升傀儡体型,速度,血量,攻击范围。体型提升因傀儡而异。最大叠加:2。$(br2)对于狗傀儡,每个体型升级提升1个最大骑乘人数(基础1人,最高级3人)" + "text": "提升傀儡体型,移动速度,生命值,攻击范围。体型提升因傀儡而异。最大等级:2。$(br2)对于犬形傀儡,每个体型升级提升1个最大骑乘人数(基础1人,最高级3人)" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_thunder_immune.json b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_thunder_immune.json index 8f484c7b2..1ffb6a873 100644 --- a/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_thunder_immune.json +++ b/src/main/resources/assets/modulargolems/patchouli_books/golem_guide/zh_cn/entries/upgrades/vanilla_thunder_immune.json @@ -6,7 +6,7 @@ { "type": "patchouli:spotlight", "item": "modulargolems:thunder_immune", - "text": "令傀儡免疫雷电伤害。被雷击中时获得火焰免疫,并回复部分血量。" + "text": "令傀儡免疫雷电伤害并吸引雷电。被雷电击中时获得火焰免疫,并回复部分血量。" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/modulargolems/textures/block/table_bottom.png b/src/main/resources/assets/modulargolems/textures/block/table_bottom.png new file mode 100644 index 000000000..86678a2e3 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/block/table_bottom.png differ diff --git a/src/main/resources/assets/modulargolems/textures/block/table_middle.png b/src/main/resources/assets/modulargolems/textures/block/table_middle.png new file mode 100644 index 000000000..fad0d6fa8 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/block/table_middle.png differ diff --git a/src/main/resources/assets/modulargolems/textures/block/table_particle.png b/src/main/resources/assets/modulargolems/textures/block/table_particle.png new file mode 100644 index 000000000..2609f81f4 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/block/table_particle.png differ diff --git a/src/main/resources/assets/modulargolems/textures/block/table_top.png b/src/main/resources/assets/modulargolems/textures/block/table_top.png new file mode 100644 index 000000000..44fd49c8a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/block/table_top.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond.png new file mode 100755 index 000000000..4cff290b7 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond_overlay.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond_overlay.png new file mode 100755 index 000000000..80291c84f Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/diamond_overlay.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold.png new file mode 100755 index 000000000..3ed34476a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold_overlay.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold_overlay.png new file mode 100755 index 000000000..234e82081 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/gold_overlay.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron.png new file mode 100755 index 000000000..4b59a48a5 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron_overlay.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron_overlay.png new file mode 100755 index 000000000..7cc33f80c Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/iron_overlay.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite.png new file mode 100755 index 000000000..f994b36f5 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite_overlay.png b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite_overlay.png new file mode 100755 index 000000000..f60430997 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_armor/netherite_overlay.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/dog_golem/sculk_emissive.png b/src/main/resources/assets/modulargolems/textures/entity/dog_golem/sculk_emissive.png new file mode 100644 index 000000000..ff414f8de Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/dog_golem/sculk_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/humanoid_golem/sculk_emissive.png b/src/main/resources/assets/modulargolems/textures/entity/humanoid_golem/sculk_emissive.png new file mode 100644 index 000000000..06c3b2480 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/humanoid_golem/sculk_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/metal_golem/netherite_kobe.png b/src/main/resources/assets/modulargolems/textures/entity/metal_golem/netherite_kobe.png new file mode 100644 index 000000000..5d9b1e2ce Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/metal_golem/netherite_kobe.png differ diff --git a/src/main/resources/assets/modulargolems/textures/entity/metal_golem/sculk_emissive.png b/src/main/resources/assets/modulargolems/textures/entity/metal_golem/sculk_emissive.png new file mode 100644 index 000000000..b18a892ec Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/entity/metal_golem/sculk_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/barbaric_vanguard_boots.png b/src/main/resources/assets/modulargolems/textures/equipments/barbaric_vanguard_boots.png new file mode 100644 index 000000000..9290781e1 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/barbaric_vanguard_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/beacon.png b/src/main/resources/assets/modulargolems/textures/equipments/beacon.png deleted file mode 100644 index 923d9d922..000000000 Binary files a/src/main/resources/assets/modulargolems/textures/equipments/beacon.png and /dev/null differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/beacon_boots.png b/src/main/resources/assets/modulargolems/textures/equipments/beacon_boots.png new file mode 100644 index 000000000..cf6eda529 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/beacon_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon.png b/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon.png new file mode 100644 index 000000000..1c1abbef4 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon_emissive.png b/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon_emissive.png new file mode 100644 index 000000000..209bd7ebe Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/beacon_cannon_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower.png b/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower.png new file mode 100644 index 000000000..5ba4b6827 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower_emissive.png b/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower_emissive.png new file mode 100644 index 000000000..9a4e40eb3 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/flame_thrower_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow.png b/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow.png new file mode 100644 index 000000000..3324651b9 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow_pulling.png b/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow_pulling.png new file mode 100644 index 000000000..16dac0055 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/iron_mecha_bow_pulling.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow.png b/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow.png new file mode 100644 index 000000000..a154cae2d Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow_pulling.png b/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow_pulling.png new file mode 100644 index 000000000..9c768bb9b Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/netherite_mecha_bow_pulling.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon.png b/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon.png new file mode 100644 index 000000000..6214f0a2c Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon_emissive.png b/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon_emissive.png new file mode 100644 index 000000000..348d37d3b Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/sonic_cannon_emissive.png differ diff --git a/src/main/resources/assets/modulargolems/textures/equipments/wind_spirit_boots.png b/src/main/resources/assets/modulargolems/textures/equipments/wind_spirit_boots.png new file mode 100644 index 000000000..0879dbea7 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/equipments/wind_spirit_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/container/config_toggle.png b/src/main/resources/assets/modulargolems/textures/gui/container/config_toggle.png index 90f8c9107..469b69072 100644 Binary files a/src/main/resources/assets/modulargolems/textures/gui/container/config_toggle.png and b/src/main/resources/assets/modulargolems/textures/gui/container/config_toggle.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/container/disintegrate.png b/src/main/resources/assets/modulargolems/textures/gui/container/disintegrate.png new file mode 100644 index 000000000..cd459b70f Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/container/disintegrate.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/container/equipments.png b/src/main/resources/assets/modulargolems/textures/gui/container/equipments.png index 764383d9e..b3f4befcc 100644 Binary files a/src/main/resources/assets/modulargolems/textures/gui/container/equipments.png and b/src/main/resources/assets/modulargolems/textures/gui/container/equipments.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/container/equipments_extra.png b/src/main/resources/assets/modulargolems/textures/gui/container/equipments_extra.png deleted file mode 100644 index decf11e58..000000000 Binary files a/src/main/resources/assets/modulargolems/textures/gui/container/equipments_extra.png and /dev/null differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/container/upgrades.png b/src/main/resources/assets/modulargolems/textures/gui/container/upgrades.png new file mode 100644 index 000000000..302bbb6fc Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/container/upgrades.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/button/skin.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/button/skin.png new file mode 100644 index 000000000..f1568db07 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/button/skin.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/follow.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/follow.png new file mode 100644 index 000000000..05653cc0a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/follow.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/guard.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/guard.png new file mode 100644 index 000000000..115297057 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/guard.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/patrol.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/patrol.png new file mode 100644 index 000000000..c86584867 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/patrol.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/squad.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/squad.png new file mode 100644 index 000000000..61503a66a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/squad.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/stand.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/stand.png new file mode 100644 index 000000000..0aa26064a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/stand.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/wander.png b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/wander.png new file mode 100644 index 000000000..93186811c Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/gui/sprites/mode/wander.png differ diff --git a/src/main/resources/assets/modulargolems/textures/gui/tabs.png b/src/main/resources/assets/modulargolems/textures/gui/tabs.png index a76a39def..2964388e4 100644 Binary files a/src/main/resources/assets/modulargolems/textures/gui/tabs.png and b/src/main/resources/assets/modulargolems/textures/gui/tabs.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/diamond_expansion_template.png b/src/main/resources/assets/modulargolems/textures/item/diamond_expansion_template.png new file mode 100644 index 000000000..4b9e37450 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/diamond_expansion_template.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_collar.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_collar.png new file mode 100644 index 000000000..c2a0c1829 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_collar.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_wolf_armor.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_wolf_armor.png new file mode 100644 index 000000000..293b5bbf1 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/diamond_wolf_armor.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_collar.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_collar.png new file mode 100644 index 000000000..838407ba1 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_collar.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_wolf_armor.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_wolf_armor.png new file mode 100644 index 000000000..4b4730781 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/gold_wolf_armor.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_collar.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_collar.png new file mode 100644 index 000000000..0d6edeef7 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_collar.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_wolf_armor.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_wolf_armor.png new file mode 100644 index 000000000..8a839f2c9 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/iron_wolf_armor.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_collar.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_collar.png new file mode 100644 index 000000000..f4837f3c5 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_collar.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_wolf_armor.png b/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_wolf_armor.png new file mode 100644 index 000000000..2e687b38f Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/dog_armor/netherite_wolf_armor.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_boots.png b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_boots.png new file mode 100644 index 000000000..c14abee01 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_chestplate.png b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_chestplate.png index 594db9591..49088f3d0 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_chestplate.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_chestplate.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_helmet.png b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_helmet.png index 0e208e251..664ebd9ef 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_helmet.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_helmet.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_shinguard.png b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_shinguard.png index c56536832..7db237755 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_shinguard.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/barbaric_vanguard_shinguard.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_boots.png b/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_boots.png new file mode 100644 index 000000000..059eeb306 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_cannon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_cannon.png new file mode 100644 index 000000000..912148411 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/beacon_cannon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe.png index 734392bbf..7c5f88ce7 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe_icon.png new file mode 100644 index 000000000..623ec1507 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_axe_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear.png index 7de096c49..afaed241f 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear_icon.png new file mode 100644 index 000000000..776d61476 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_spear_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword.png index 2a66a7234..c24f63d15 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword_icon.png new file mode 100644 index 000000000..b68663ca1 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/diamond_golem_sword_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/flame_thrower.png b/src/main/resources/assets/modulargolems/textures/item/equipments/flame_thrower.png new file mode 100644 index 000000000..0d17db7a4 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/flame_thrower.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe.png b/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe.png new file mode 100644 index 000000000..58b40146a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe_icon.png new file mode 100644 index 000000000..b1bce9912 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/golem_slicing_axe_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe.png index 068f68299..8cb18ee2d 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe_icon.png new file mode 100644 index 000000000..7ec9152d8 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_axe_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear.png index 57929d039..d0370292b 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear_icon.png new file mode 100644 index 000000000..381211abd Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_spear_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword.png index 9bed40194..73c668c10 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword_icon.png new file mode 100644 index 000000000..c50cb1557 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_golem_sword_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/iron_mecha_bow.png b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_mecha_bow.png new file mode 100644 index 000000000..f3d6fdbde Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/iron_mecha_bow.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe.png index ba1e28b81..51408db75 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe_icon.png new file mode 100644 index 000000000..ab3bc978f Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_axe_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear.png index e6f22006c..ed2a8538c 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear_icon.png new file mode 100644 index 000000000..c772c2091 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_spear_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword.png index ddd5c9f94..b77357262 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword_icon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword_icon.png new file mode 100644 index 000000000..77402880d Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_golem_sword_icon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_mecha_bow.png b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_mecha_bow.png new file mode 100644 index 000000000..cf486651e Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/netherite_mecha_bow.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/sonic_cannon.png b/src/main/resources/assets/modulargolems/textures/item/equipments/sonic_cannon.png new file mode 100644 index 000000000..108939420 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/sonic_cannon.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_boots.png b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_boots.png new file mode 100644 index 000000000..a80a5314a Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_boots.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_chestplate.png b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_chestplate.png index ae16166c3..cc5bbd2b4 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_chestplate.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_chestplate.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_helmet.png b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_helmet.png index fed1ce3c7..b1a4e761a 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_helmet.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_helmet.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_shinguard.png b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_shinguard.png index 03aba06f1..86465a334 100644 Binary files a/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_shinguard.png and b/src/main/resources/assets/modulargolems/textures/item/equipments/wind_spirit_shinguard.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/hostile_wand.png b/src/main/resources/assets/modulargolems/textures/item/hostile_wand.png new file mode 100644 index 000000000..c91f5245c Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/hostile_wand.png differ diff --git a/src/main/resources/assets/modulargolems/textures/item/netherite_expansion_template.png b/src/main/resources/assets/modulargolems/textures/item/netherite_expansion_template.png new file mode 100644 index 000000000..725590565 Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/item/netherite_expansion_template.png differ diff --git a/src/main/resources/assets/modulargolems/textures/slot/empty_route_slot.png b/src/main/resources/assets/modulargolems/textures/slot/empty_route_slot.png new file mode 100644 index 000000000..4da6cc98d Binary files /dev/null and b/src/main/resources/assets/modulargolems/textures/slot/empty_route_slot.png differ diff --git a/src/main/resources/assets/modulargolems/textures/slot/empty_skin_slot.png b/src/main/resources/assets/modulargolems/textures/slot/empty_skin_slot.png index 848e4cf09..dcafec323 100644 Binary files a/src/main/resources/assets/modulargolems/textures/slot/empty_skin_slot.png and b/src/main/resources/assets/modulargolems/textures/slot/empty_skin_slot.png differ diff --git a/src/main/resources/assets/mowziesmobs/textures/entity/dog_golem/wroughtnaut.png b/src/main/resources/assets/mowziesmobs/textures/entity/dog_golem/wroughtnaut.png new file mode 100644 index 000000000..c464d960a Binary files /dev/null and b/src/main/resources/assets/mowziesmobs/textures/entity/dog_golem/wroughtnaut.png differ diff --git a/src/main/resources/assets/mowziesmobs/textures/entity/humanoid_golem/wroughtnaut.png b/src/main/resources/assets/mowziesmobs/textures/entity/humanoid_golem/wroughtnaut.png new file mode 100644 index 000000000..8db9cb7d3 Binary files /dev/null and b/src/main/resources/assets/mowziesmobs/textures/entity/humanoid_golem/wroughtnaut.png differ diff --git a/src/main/resources/assets/mowziesmobs/textures/entity/metal_golem/wroughtnaut.png b/src/main/resources/assets/mowziesmobs/textures/entity/metal_golem/wroughtnaut.png new file mode 100644 index 000000000..eba4a5f5a Binary files /dev/null and b/src/main/resources/assets/mowziesmobs/textures/entity/metal_golem/wroughtnaut.png differ diff --git a/src/main/resources/assets/mowziesmobs/textures/item/upgrades/wroughtnaut.png b/src/main/resources/assets/mowziesmobs/textures/item/upgrades/wroughtnaut.png new file mode 100644 index 000000000..6722f1a71 Binary files /dev/null and b/src/main/resources/assets/mowziesmobs/textures/item/upgrades/wroughtnaut.png differ diff --git a/src/main/resources/assets/mowziesmobs/textures/item/wroughtnaut_ingot.png b/src/main/resources/assets/mowziesmobs/textures/item/wroughtnaut_ingot.png new file mode 100644 index 000000000..d0e2f84ee Binary files /dev/null and b/src/main/resources/assets/mowziesmobs/textures/item/wroughtnaut_ingot.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/dog_golem/amethyst_bronze.png b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/amethyst_bronze.png new file mode 100644 index 000000000..055c744df Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/amethyst_bronze.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/dog_golem/cobalt.png b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/cobalt.png new file mode 100644 index 000000000..f89484710 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/cobalt.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/dog_golem/hepatizon.png b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/hepatizon.png new file mode 100644 index 000000000..6a40b6204 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/hepatizon.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/dog_golem/manyullyn.png b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/manyullyn.png new file mode 100644 index 000000000..942545ae4 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/manyullyn.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/dog_golem/rose_gold.png b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/rose_gold.png new file mode 100644 index 000000000..d603813fc Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/dog_golem/rose_gold.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/amethyst_bronze.png b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/amethyst_bronze.png new file mode 100644 index 000000000..f4fcbc481 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/amethyst_bronze.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/cobalt.png b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/cobalt.png new file mode 100644 index 000000000..595ef8cdd Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/cobalt.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/hepatizon.png b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/hepatizon.png new file mode 100644 index 000000000..19d5edb0b Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/hepatizon.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/manyullyn.png b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/manyullyn.png new file mode 100644 index 000000000..68dc2ae76 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/manyullyn.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/rose_gold.png b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/rose_gold.png new file mode 100644 index 000000000..cc7133e45 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/humanoid_golem/rose_gold.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/metal_golem/amethyst_bronze.png b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/amethyst_bronze.png new file mode 100644 index 000000000..7511c9e28 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/amethyst_bronze.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/metal_golem/cobalt.png b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/cobalt.png new file mode 100644 index 000000000..f256ea052 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/cobalt.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/metal_golem/hepatizon.png b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/hepatizon.png new file mode 100644 index 000000000..87e0e405d Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/hepatizon.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/metal_golem/manyullyn.png b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/manyullyn.png new file mode 100644 index 000000000..614025771 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/manyullyn.png differ diff --git a/src/main/resources/assets/tconstruct/textures/entity/metal_golem/rose_gold.png b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/rose_gold.png new file mode 100644 index 000000000..333c488c1 Binary files /dev/null and b/src/main/resources/assets/tconstruct/textures/entity/metal_golem/rose_gold.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/dog_golem/fiery_emissive.png b/src/main/resources/assets/twilightforest/textures/entity/dog_golem/fiery_emissive.png new file mode 100644 index 000000000..f42436a10 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/dog_golem/fiery_emissive.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/humanoid_golem/fiery_emissive.png b/src/main/resources/assets/twilightforest/textures/entity/humanoid_golem/fiery_emissive.png new file mode 100644 index 000000000..a0fb0ce05 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/humanoid_golem/fiery_emissive.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/metal_golem/fiery_emissive.png b/src/main/resources/assets/twilightforest/textures/entity/metal_golem/fiery_emissive.png new file mode 100644 index 000000000..ba2937fa3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/metal_golem/fiery_emissive.png differ diff --git a/src/main/resources/assets/twilightforest/textures/equipments/fiery.png b/src/main/resources/assets/twilightforest/textures/equipments/fiery.png new file mode 100644 index 000000000..767095286 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/equipments/fiery.png differ diff --git a/src/main/resources/assets/twilightforest/textures/equipments/fiery_emissive.png b/src/main/resources/assets/twilightforest/textures/equipments/fiery_emissive.png new file mode 100644 index 000000000..2c6746ec5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/equipments/fiery_emissive.png differ diff --git a/src/main/resources/assets/twilightforest/textures/equipments/ironwood.png b/src/main/resources/assets/twilightforest/textures/equipments/ironwood.png new file mode 100644 index 000000000..50c4d1967 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/equipments/ironwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/equipments/knightmetal.png b/src/main/resources/assets/twilightforest/textures/equipments/knightmetal.png new file mode 100644 index 000000000..8a2fc1a18 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/equipments/knightmetal.png differ diff --git a/src/main/resources/assets/twilightforest/textures/equipments/naga.png b/src/main/resources/assets/twilightforest/textures/equipments/naga.png new file mode 100644 index 000000000..2addcac58 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/equipments/naga.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png new file mode 100644 index 000000000..1be80db42 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_boots.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png new file mode 100644 index 000000000..b64f90847 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_chestplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png new file mode 100644 index 000000000..ba47958c1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_axe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png new file mode 100644 index 000000000..66f38a2a2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_spear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png new file mode 100644 index 000000000..a83fd2512 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_golem_sword.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png new file mode 100644 index 000000000..c3b8a9c2d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_helmet.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png new file mode 100644 index 000000000..654aab518 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png.mcmeta new file mode 100644 index 000000000..9278e23cb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/equipments/fiery_shinguard.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_boots.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_boots.png new file mode 100644 index 000000000..eb78e6d8a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_chestplate.png new file mode 100644 index 000000000..5bcd725f2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_axe.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_axe.png new file mode 100644 index 000000000..3a1b2545e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_spear.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_spear.png new file mode 100644 index 000000000..afe491e64 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_spear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_sword.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_sword.png new file mode 100644 index 000000000..8f2ed6e10 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_golem_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_helmet.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_helmet.png new file mode 100644 index 000000000..3e72d994e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_shinguard.png b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_shinguard.png new file mode 100644 index 000000000..172667329 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/ironwood_shinguard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_boots.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_boots.png new file mode 100644 index 000000000..9f5a48611 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_chestplate.png new file mode 100644 index 000000000..317f9a972 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_axe.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_axe.png new file mode 100644 index 000000000..19e0439ff Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_spear.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_spear.png new file mode 100644 index 000000000..b8d74affe Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_spear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_sword.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_sword.png new file mode 100644 index 000000000..b8b5a2098 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_golem_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_helmet.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_helmet.png new file mode 100644 index 000000000..a7bafdbf9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_shinguard.png b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_shinguard.png new file mode 100644 index 000000000..d577fbd0f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/knightmetal_shinguard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/naga_boots.png b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_boots.png new file mode 100644 index 000000000..bd37fe786 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/naga_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_chestplate.png new file mode 100644 index 000000000..d0775351d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/naga_helmet.png b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_helmet.png new file mode 100644 index 000000000..4511ee4c0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/naga_shinguard.png b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_shinguard.png new file mode 100644 index 000000000..a102e5318 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/naga_shinguard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_axe.png b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_axe.png new file mode 100644 index 000000000..cac1cef0b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_spear.png b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_spear.png new file mode 100644 index 000000000..995fbb9e8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_spear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_sword.png b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_sword.png new file mode 100644 index 000000000..0331192fb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/equipments/steeleaf_golem_sword.png differ diff --git a/src/main/resources/data/modulargolems/l2library_config/menu_layout/disintegrate.json b/src/main/resources/data/modulargolems/l2library_config/menu_layout/disintegrate.json new file mode 100644 index 000000000..13eff64c6 --- /dev/null +++ b/src/main/resources/data/modulargolems/l2library_config/menu_layout/disintegrate.json @@ -0,0 +1,163 @@ +{ + "height": 195, + "comp": { + "extra_mat": { + "x": 124, + "y": 79, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_part_background": { + "x": 58, + "y": 39, + "w": 60, + "h": 60, + "rx": 1, + "ry": 1 + }, + "golem_background": { + "x": 71, + "y": 16, + "w": 34, + "h": 24, + "rx": 1, + "ry": 1 + }, + "golem": { + "x": 80, + "y": 20, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "button": { + "x": 98, + "y": 79, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "arrow": { + "x": 124, + "y": 61, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_up": { + "x": 80, + "y": 43, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_left": { + "x": 62, + "y": 61, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_middle": { + "x": 80, + "y": 61, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_right": { + "x": 98, + "y": 61, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "golem_down": { + "x": 80, + "y": 79, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "result": { + "x": 151, + "y": 61, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + } + }, + "side": { + "slot": { + "x": 176, + "y": 0, + "w": 18, + "h": 18 + }, + "result_slot": { + "x": 176, + "y": 18, + "w": 26, + "h": 26 + }, + "core_slot": { + "x": 176, + "y": 44, + "w": 20, + "h": 20 + }, + "dissembly_on": { + "x": 176, + "y": 64, + "w": 14, + "h": 14 + }, + "dissembly_on_hover": { + "x": 190, + "y": 64, + "w": 14, + "h": 14 + }, + "dissembly_down": { + "x": 204, + "y": 64, + "w": 14, + "h": 14 + }, + "dissembly_down_hover": { + "x": 218, + "y": 64, + "w": 14, + "h": 14 + }, + "dissembly_ban": { + "x": 232, + "y": 64, + "w": 14, + "h": 14 + }, + "dissembly_ban_hover": { + "x": 176, + "y": 78, + "w": 14, + "h": 14 + }, + "arrow_0": { + "x": 176, + "y": 92, + "w": 22, + "h": 15 + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments.json b/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments.json index bb2c5bfce..6c807e0c4 100644 --- a/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments.json +++ b/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments.json @@ -1,21 +1,85 @@ { "height": 184, "comp": { - "hand": { + "left_shoulder": { + "x": 107, + "y": 17, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "right_shoulder": { + "x": 71, + "y": 17, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "left_hand": { + "x": 107, + "y": 35, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "right_hand": { "x": 71, "y": 35, "w": 18, "h": 18, "rx": 1, - "ry": 2 + "ry": 1 }, - "armor": { + "head": { "x": 89, "y": 17, "w": 18, "h": 18, "rx": 1, - "ry": 4 + "ry": 1 + }, + "chest": { + "x": 89, + "y": 35, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "legs": { + "x": 89, + "y": 53, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "feet": { + "x": 89, + "y": 71, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "backup": { + "x": 71, + "y": 53, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "arrow": { + "x": 107, + "y": 53, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 } }, "side": { @@ -48,6 +112,42 @@ "y": 16, "w": 16, "h": 16 + }, + "slotbg_arrow": { + "x": 176, + "y": 32, + "w": 18, + "h": 18 + }, + "slotbg_bow": { + "x": 194, + "y": 32, + "w": 18, + "h": 18 + }, + "slotbg_sword": { + "x": 212, + "y": 32, + "w": 18, + "h": 18 + }, + "slotbg_shoulder": { + "x": 230, + "y": 32, + "w": 18, + "h": 18 + }, + "slotbg_dog_armor": { + "x": 176, + "y": 50, + "w": 18, + "h": 18 + }, + "slot": { + "x": 194, + "y": 50, + "w": 18, + "h": 18 } } } \ No newline at end of file diff --git a/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments_extra.json b/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments_extra.json deleted file mode 100644 index 027e8c040..000000000 --- a/src/main/resources/data/modulargolems/l2library_config/menu_layout/equipments_extra.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "height": 184, - "comp": { - "hand": { - "x": 71, - "y": 35, - "w": 18, - "h": 18, - "rx": 1, - "ry": 2 - }, - "armor": { - "x": 89, - "y": 17, - "w": 18, - "h": 18, - "rx": 1, - "ry": 4 - }, - "backup": { - "x": 125, - "y": 35, - "w": 18, - "h": 18, - "rx": 1, - "ry": 1 - }, - "arrow": { - "x": 125, - "y": 53, - "w": 18, - "h": 18, - "rx": 1, - "ry": 1 - } - }, - "side": { - "altas_helmet": { - "x": 176, - "y": 0, - "w": 16, - "h": 16 - }, - "altas_chestplate": { - "x": 192, - "y": 0, - "w": 16, - "h": 16 - }, - "altas_leggings": { - "x": 208, - "y": 0, - "w": 16, - "h": 16 - }, - "altas_boots": { - "x": 224, - "y": 0, - "w": 16, - "h": 16 - }, - "altas_shield": { - "x": 176, - "y": 16, - "w": 16, - "h": 16 - }, - "slotbg_arrow": { - "x": 176, - "y": 32, - "w": 18, - "h": 18 - }, - "slotbg_sword": { - "x": 194, - "y": 32, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/main/resources/data/modulargolems/l2library_config/menu_layout/upgrades.json b/src/main/resources/data/modulargolems/l2library_config/menu_layout/upgrades.json new file mode 100644 index 000000000..0e0b55b31 --- /dev/null +++ b/src/main/resources/data/modulargolems/l2library_config/menu_layout/upgrades.json @@ -0,0 +1,117 @@ +{ + "height": 195, + "comp": { + "golem_background": { + "x": 71, + "y": 16, + "w": 34, + "h": 24, + "rx": 1, + "ry": 1 + }, + "golem": { + "x": 80, + "y": 20, + "w": 18, + "h": 18, + "rx": 1, + "ry": 1 + }, + "upgrades_background": { + "x": 4, + "y": 39, + "w": 168, + "h": 60, + "rx": 1, + "ry": 1 + }, + "upgrades": { + "x": 8, + "y": 43, + "w": 18, + "h": 18, + "rx": 9, + "ry": 3 + } + }, + "side": { + "slot": { + "x": 176, + "y": 0, + "w": 18, + "h": 18 + }, + "page_prev_on": { + "x": 176, + "y": 18, + "w": 11, + "h": 11 + }, + "page_prev_on_hover": { + "x": 187, + "y": 18, + "w": 11, + "h": 11 + }, + "page_prev_down": { + "x": 198, + "y": 18, + "w": 11, + "h": 11 + }, + "page_prev_down_hover": { + "x": 209, + "y": 18, + "w": 11, + "h": 11 + }, + "page_prev_ban": { + "x": 220, + "y": 18, + "w": 11, + "h": 11 + }, + "page_prev_ban_hover": { + "x": 231, + "y": 18, + "w": 11, + "h": 11 + }, + "page_next_on": { + "x": 242, + "y": 18, + "w": 11, + "h": 11 + }, + "page_next_on_hover": { + "x": 176, + "y": 29, + "w": 11, + "h": 11 + }, + "page_next_down": { + "x": 187, + "y": 29, + "w": 11, + "h": 11 + }, + "page_next_down_hover": { + "x": 198, + "y": 29, + "w": 11, + "h": 11 + }, + "page_next_ban": { + "x": 209, + "y": 29, + "w": 11, + "h": 11 + }, + "page_next_ban_hover": { + "x": 220, + "y": 29, + "w": 11, + "h": 11 + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/modulargolems/patchouli_books/golem_guide/book.json b/src/main/resources/data/modulargolems/patchouli_books/golem_guide/book.json index 81c1db251..5bee2d2ad 100644 --- a/src/main/resources/data/modulargolems/patchouli_books/golem_guide/book.json +++ b/src/main/resources/data/modulargolems/patchouli_books/golem_guide/book.json @@ -3,6 +3,6 @@ "landing_text": "patchouli.modulargolems.landing", "version": 1, "model": "modulargolems:book", - "creative_tab": "l2library:golems", + "creative_tab": "l2library:golem_items", "use_resource_pack": true } \ No newline at end of file diff --git a/src/main/resources/modulargolems.mixins.json b/src/main/resources/modulargolems.mixins.json index 15573aec9..a0ff76850 100644 --- a/src/main/resources/modulargolems.mixins.json +++ b/src/main/resources/modulargolems.mixins.json @@ -1,19 +1,25 @@ { - "required": true, - "priority": 1000, - "package": "dev.xkmc.modulargolems.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "modulargolems.refmap.json", - "mixins": [ - "ExperienceOrbAccessor", - "LivingEntityMixin", - "PlayerMixin", - "ServerLevelMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "minVersion": "0.8" + "required": true, + "priority": 1000, + "package": "dev.xkmc.modulargolems.mixin", + "compatibilityLevel": "JAVA_17", + "refmap": "modulargolems.refmap.json", + "mixins": [ + "AbstractArrowMixin", + "BeltDeployerCallbacksMixin", + "EntityAxeAttackMixin", + "EntityMixin", + "ExperienceOrbAccessor", + "IgnisExplosionMixin", + "LivingEntityMixin", + "PlayerMixin", + "ServerLevelMixin" + ], + "client": [ + "ScreenMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" } diff --git a/src/test/java/organize/LangFileOrganizer.java b/src/test/java/organize/LangFileOrganizer.java index 374c5be99..88fb80c91 100644 --- a/src/test/java/organize/LangFileOrganizer.java +++ b/src/test/java/organize/LangFileOrganizer.java @@ -10,6 +10,7 @@ import java.io.FileWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -29,7 +30,9 @@ public void organize(File f) throws Exception { File target = new File(getTargetFolder() + name + ".json"); check(target); JsonObject dst_json = new JsonObject(); - for (File fj : fi.listFiles()) { + var list = new ArrayList<>(List.of(fi.listFiles())); + list.sort(Comparator.comparing(e -> e.getName())); + for (File fj : list) { if (!fj.getName().endsWith(".json")) continue; JsonObject json = new JsonParser().parse(new FileReader(fj.getPath())).getAsJsonObject(); inject("", json, dst_json); diff --git a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/disintegrate.json b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/disintegrate.json new file mode 100644 index 000000000..f915dd357 --- /dev/null +++ b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/disintegrate.json @@ -0,0 +1,77 @@ +{ + "side": [ + "slot", + "result_slot", + "core_slot", + "dissembly_on", + "dissembly_on_hover", + "dissembly_down", + "dissembly_down_hover", + "dissembly_ban", + "dissembly_ban_hover", + "arrow_0" + ], + "comp": { + "extra_mat": { + "sprite": "empty", + "x": 132, + "y": 36 + }, + "golem_part_background": { + "sprite": "background/golem_part_background", + "x": 88, + "y": 18 + }, + "golem_background": { + "sprite": "background/golem_background", + "x": 88, + "y": -23 + }, + "golem": { + "sprite": "slot", + "x": 88, + "y": -23 + }, + "button": { + "sprite": "empty", + "x": 106, + "y": 36 + }, + "arrow": { + "sprite": "empty", + "x": 132, + "y": 18 + }, + "golem_up": { + "sprite": "empty", + "x": 88, + "y": 0 + }, + "golem_left": { + "sprite": "empty", + "x": 70, + "y": 18 + }, + "golem_middle": { + "sprite": "empty", + "x": 88, + "y": 18 + }, + "golem_right": { + "sprite": "empty", + "x": 106, + "y": 18 + }, + "golem_down": { + "sprite": "empty", + "x": 88, + "y": 36 + }, + "result": { + "sprite": "empty", + "x": 159, + "y": 18 + } + }, + "isContainer": true +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments.json b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments.json index 6d022acc6..8d84f7868 100644 --- a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments.json +++ b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments.json @@ -1,26 +1,68 @@ { - "side": [ - "altas_helmet", - "altas_chestplate", - "altas_leggings", - "altas_boots", - "altas_shield" - ], - "comp": { - "hand": { - "sprite": "slot", - "x": 79, - "y": 18, - "rx": 1, - "ry": 2 - }, - "armor": { - "sprite": "slot", - "x": 97, - "y": 0, - "rx": 1, - "ry": 4 - } - }, - "isContainer": true + "side": [ + "altas_helmet", + "altas_chestplate", + "altas_leggings", + "altas_boots", + "altas_shield", + "slotbg_arrow", + "slotbg_bow", + "slotbg_sword", + "slotbg_shoulder", + "slotbg_dog_armor", + "slot" + ], + "comp": { + "left_shoulder": { + "sprite": "empty", + "x": 115, + "y": 0 + }, + "right_shoulder": { + "sprite": "empty", + "x": 79, + "y": 0 + }, + "left_hand": { + "sprite": "empty", + "x": 115, + "y": 18 + }, + "right_hand": { + "sprite": "empty", + "x": 79, + "y": 18 + }, + "head": { + "sprite": "empty", + "x": 97, + "y": 0 + }, + "chest": { + "sprite": "empty", + "x": 97, + "y": 18 + }, + "legs": { + "sprite": "empty", + "x": 97, + "y": 36 + }, + "feet": { + "sprite": "empty", + "x": 97, + "y": 54 + }, + "backup": { + "sprite": "empty", + "x": 79, + "y": 36 + }, + "arrow": { + "sprite": "empty", + "x": 115, + "y": 36 + } + }, + "isContainer": true } \ No newline at end of file diff --git a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments_extra.json b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments_extra.json deleted file mode 100644 index 436d52798..000000000 --- a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/equipments_extra.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "side": [ - "altas_helmet", - "altas_chestplate", - "altas_leggings", - "altas_boots", - "altas_shield", - "slotbg_arrow", - "slotbg_sword" - ], - "comp": { - "hand": { - "sprite": "slot", - "x": 79, - "y": 18, - "rx": 1, - "ry": 2 - }, - "armor": { - "sprite": "slot", - "x": 97, - "y": 0, - "rx": 1, - "ry": 4 - }, - "backup": { - "sprite": "slot", - "x": 133, - "y": 18 - }, - "arrow": { - "sprite": "slot", - "x": 133, - "y": 36 - } - }, - "isContainer": true -} \ No newline at end of file diff --git a/src/test/resources/modulargolems/gui/-templates/container/modulargolems/upgrades.json b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/upgrades.json new file mode 100644 index 000000000..de6c9d77a --- /dev/null +++ b/src/test/resources/modulargolems/gui/-templates/container/modulargolems/upgrades.json @@ -0,0 +1,42 @@ +{ + "side": [ + "slot", + "page_prev_on", + "page_prev_on_hover", + "page_prev_down", + "page_prev_down_hover", + "page_prev_ban", + "page_prev_ban_hover", + "page_next_on", + "page_next_on_hover", + "page_next_down", + "page_next_down_hover", + "page_next_ban", + "page_next_ban_hover" + ], + "comp": { + "golem_background": { + "sprite": "background/golem_background", + "x": 88, + "y": -23 + }, + "golem": { + "sprite": "slot", + "x": 88, + "y": -23 + }, + "upgrades_background": { + "sprite": "background/upgrades_background", + "x": 88, + "y": 18 + }, + "upgrades": { + "sprite": "slot", + "x": 16, + "y": 0, + "rx": 9, + "ry": 3 + } + }, + "isContainer": true +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/gui/-templates/info.json b/src/test/resources/modulargolems/gui/-templates/info.json index 3dc327dd7..20497d017 100644 --- a/src/test/resources/modulargolems/gui/-templates/info.json +++ b/src/test/resources/modulargolems/gui/-templates/info.json @@ -1,181 +1,231 @@ { - "toggle_slot": { - "ids": [ - "_0", - "_1", - "_2" - ], - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - - "slotbg": { - "ids": [ - "_arrow", - "_sword" - ], - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "altas": { - "ids": [ - "_boost_main", - "_boost_sub", - "_stat_container", - "_head", - "_necklace", - "_body", - "_bracelet", - "_belt", - "_disabled", - "_shield", - "_helmet", - "_chestplate", - "_leggings", - "_boots", - "_golem" - ], - "w": 16, - "h": 16 - }, - "button": { - "ids": [ - "_1", - "_1p", - "_2", - "_2p" - ], - "w": 8, - "h": 8 - }, - "sort": { - "ids": [ - "_1", - "_1p" - ], - "w": 9, - "h": 11 - }, - "delete": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - }, - "upgrade": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - }, - "slider/_top": { - "w": 14, - "h": 1, - "dx": 1, - "dy": 1 - }, - "slider/_bottom": { - "w": 14, - "h": 1, - "dx": 1, - "dy": -1 - }, - "slider/_middle": { - "w": 14, - "h": 1, - "dx": 1, - "dy": 0 - }, - "slider": { - "ids": [ - "_light", - "_dark" - ], - "w": 12, - "h": 15 - }, - "exchange": { - "ids": [ - "_in", - "_out" - ], - "w": 31, - "h": 14 - }, - "slot": { - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "empty_slot": { - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "result_slot": { - "w": 26, - "h": 26, - "dx": 5, - "dy": 5 - }, - "arrow": { - "ids": [ - "_0", - "_1", - "_2", - "_3" - ], - "w": 22, - "h": 16 - }, - "fire": { - "ids": [ - "_0", - "_1" - ], - "w": 14, - "h": 14 - }, - "top": { - "w": 176, - "h": 16 - }, - "bottom": { - "w": 176, - "h": 96 - }, - "bottom_screen": { - "w": 176, - "h": 7 - }, - "middle": { - "w": 176, - "h": 1 - }, - "match": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - }, - "filter": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - } + "toggle_slot": { + "ids": [ + "_0", + "_1", + "_2" + ], + "w": 18, + "h": 18, + "dx": 1, + "dy": 1 + }, + "slotbg": { + "ids": [ + "_arrow", + "_bow", + "_sword", + "_shoulder", + "_dog_armor" + ], + "w": 18, + "h": 18, + "dx": 1, + "dy": 1 + }, + "altas": { + "ids": [ + "_boost_main", + "_boost_sub", + "_stat_container", + "_head", + "_necklace", + "_body", + "_bracelet", + "_belt", + "_disabled", + "_shield", + "_helmet", + "_chestplate", + "_leggings", + "_boots", + "_golem" + ], + "w": 16, + "h": 16 + }, + "button": { + "ids": [ + "_1", + "_1p", + "_2", + "_2p" + ], + "w": 8, + "h": 8 + }, + "sort": { + "ids": [ + "_1", + "_1p" + ], + "w": 9, + "h": 11 + }, + "delete": { + "ids": [ + "_on", + "_off" + ], + "w": 18, + "h": 18 + }, + "upgrade": { + "ids": [ + "_on", + "_off" + ], + "w": 18, + "h": 18 + }, + "slider/_top": { + "w": 14, + "h": 1, + "dx": 1, + "dy": 1 + }, + "slider/_bottom": { + "w": 14, + "h": 1, + "dx": 1, + "dy": -1 + }, + "slider/_middle": { + "w": 14, + "h": 1, + "dx": 1, + "dy": 0 + }, + "slider": { + "ids": [ + "_light", + "_dark" + ], + "w": 12, + "h": 15 + }, + "exchange": { + "ids": [ + "_in", + "_out" + ], + "w": 31, + "h": 14 + }, + "slot": { + "w": 18, + "h": 18, + "dx": 1, + "dy": 1 + }, + "empty": { + "w": 18, + "h": 18, + "dx": 1, + "dy": 1 + }, + "core_slot": { + "w": 20, + "h": 20, + "dx": 1, + "dy": 1 + }, + "result_slot": { + "w": 26, + "h": 26, + "dx": 5, + "dy": 5 + }, + "arrow": { + "ids": [ + "_0", + "_1", + "_2", + "_3" + ], + "w": 22, + "h": 15 + }, + "fire": { + "ids": [ + "_0", + "_1" + ], + "w": 14, + "h": 14 + }, + "top": { + "w": 176, + "h": 16 + }, + "bottom": { + "w": 176, + "h": 96 + }, + "background/golem_part_background": { + "w": 60, + "h": 60 + }, + "background/golem_background": { + "w": 34, + "h": 24 + }, + "background/upgrades_background": { + "w": 168, + "h": 60 + }, + "bottom_screen": { + "w": 176, + "h": 7 + }, + "middle": { + "w": 176, + "h": 1 + }, + "match": { + "ids": [ + "_on", + "_off" + ], + "w": 18, + "h": 18 + }, + "filter": { + "ids": [ + "_on", + "_off" + ], + "w": 18, + "h": 18 + }, + "dissembly": { + "ids": [ + "_on", + "_on_hover", + "_down", + "_down_hover", + "_ban", + "_ban_hover" + ], + "w": 14, + "h": 14 + }, + "page": { + "ids": [ + "_next_on", + "_next_on_hover", + "_next_down", + "_next_down_hover", + "_next_ban", + "_next_ban_hover", + "_prev_on", + "_prev_on_hover", + "_prev_down", + "_prev_down_hover", + "_prev_ban", + "_prev_ban_hover" + ], + "w": 11, + "h": 11 + } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_belt.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_belt.png index 3ab24bb6b..9b71de316 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_belt.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_belt.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_body.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_body.png index ad9755f0d..ce027fb10 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_body.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_body.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_main.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_main.png index c6dc5838c..cb57eac4b 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_main.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_main.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_sub.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_sub.png index 4e498dcdb..c9acfe926 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_sub.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boost_sub.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boots.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boots.png index fd7e05faf..6fdd09d9c 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boots.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_boots.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_bracelet.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_bracelet.png index 3c9057c07..47ca15062 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_bracelet.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_bracelet.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_chestplate.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_chestplate.png index 6e632b9da..ebdca69ca 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_chestplate.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_chestplate.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_golem.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_golem.png index 3ca839e89..6bb9c7e8d 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_golem.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_golem.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_head.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_head.png index e8be58da2..a21fe3ad3 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_head.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_head.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_helmet.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_helmet.png index 3a455f3f5..a51870097 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_helmet.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_helmet.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_leggings.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_leggings.png index 28b2c494a..8f72ad4b0 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_leggings.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_leggings.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_necklace.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_necklace.png index db98a1b7d..8c78c7bb9 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_necklace.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_necklace.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_shield.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_shield.png index fa12e4333..60a7b098d 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_shield.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_shield.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_stat_container.png b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_stat_container.png index 8c9df8ae8..4b6b77513 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/altas/_stat_container.png and b/src/test/resources/modulargolems/gui/-templates/sprites/altas/_stat_container.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0.png index 02b2ae310..3a8087d1e 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0.png and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0_ban.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0_ban.png new file mode 100644 index 000000000..f0a7f4049 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0_ban.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0r.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0r.png index 119e81165..ef8ff2d7e 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0r.png and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_0r.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_1.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_1.png index 25a3f8a0e..6675b28d7 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_1.png and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_1.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_2.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_2.png index 16074a0b7..0883e1ede 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_2.png and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_2.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_3.png b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_3.png index a1dea1cb4..b09ce6ec6 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_3.png and b/src/test/resources/modulargolems/gui/-templates/sprites/arrow/_3.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_background.png b/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_background.png new file mode 100644 index 000000000..b802d10d4 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_background.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_part_background.png b/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_part_background.png new file mode 100644 index 000000000..7702d3e40 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/background/golem_part_background.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/background/upgrades_background.png b/src/test/resources/modulargolems/gui/-templates/sprites/background/upgrades_background.png new file mode 100644 index 000000000..8f30d97cd Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/background/upgrades_background.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/core_slot.png b/src/test/resources/modulargolems/gui/-templates/sprites/core_slot.png new file mode 100644 index 000000000..8e903398d Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/core_slot.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban.png new file mode 100644 index 000000000..a086c43f8 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban_hover.png new file mode 100644 index 000000000..4182984a0 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_ban_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down.png new file mode 100644 index 000000000..5d61e2ac7 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down_hover.png new file mode 100644 index 000000000..8481cf454 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_down_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on.png new file mode 100644 index 000000000..bc8efaf8a Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on_hover.png new file mode 100644 index 000000000..319d1413f Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/dissembly/_on_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/empty.png b/src/test/resources/modulargolems/gui/-templates/sprites/empty.png new file mode 100644 index 000000000..4365d1a4e Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/empty.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/empty_slot.png b/src/test/resources/modulargolems/gui/-templates/sprites/empty_slot.png deleted file mode 100644 index 7ad148664..000000000 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/empty_slot.png and /dev/null differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban.png new file mode 100644 index 000000000..27485fb80 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban_hover.png new file mode 100644 index 000000000..9eb59ce0c Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_ban_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down.png new file mode 100644 index 000000000..b43b61ab7 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down_hover.png new file mode 100644 index 000000000..2e9e8b44b Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_down_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on.png new file mode 100644 index 000000000..9d0f978c6 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on_hover.png new file mode 100644 index 000000000..2ea167581 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_next_on_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban.png new file mode 100644 index 000000000..9bcf48e42 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban_hover.png new file mode 100644 index 000000000..d514f7ccf Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_ban_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down.png new file mode 100644 index 000000000..4425cc66f Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down_hover.png new file mode 100644 index 000000000..2c8285100 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_down_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on.png new file mode 100644 index 000000000..0a3c1ce62 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on_hover.png b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on_hover.png new file mode 100644 index 000000000..b4577c348 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/page/_prev_on_hover.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_arrow.png b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_arrow.png index 98dd3804f..2ba6f255c 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_arrow.png and b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_arrow.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_bow.png b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_bow.png new file mode 100644 index 000000000..a961c4bd3 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_bow.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_dog_armor.png b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_dog_armor.png new file mode 100644 index 000000000..6e10ad177 Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_dog_armor.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_shoulder.png b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_shoulder.png new file mode 100644 index 000000000..3baa0e7ea Binary files /dev/null and b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_shoulder.png differ diff --git a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_sword.png b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_sword.png index 0a1f92012..7d6457327 100644 Binary files a/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_sword.png and b/src/test/resources/modulargolems/gui/-templates/sprites/slotbg/_sword.png differ diff --git "a/src/test/resources/modulargolems/gui/-templates/sprites/test/\345\202\200\345\204\241\346\270\262\346\237\223\350\203\214\346\231\257.png" "b/src/test/resources/modulargolems/gui/-templates/sprites/test/\345\202\200\345\204\241\346\270\262\346\237\223\350\203\214\346\231\257.png" new file mode 100644 index 000000000..39d465623 Binary files /dev/null and "b/src/test/resources/modulargolems/gui/-templates/sprites/test/\345\202\200\345\204\241\346\270\262\346\237\223\350\203\214\346\231\257.png" differ diff --git "a/src/test/resources/modulargolems/gui/-templates/sprites/test/\346\225\260\345\255\227\345\222\214\345\233\276\346\240\207.png" "b/src/test/resources/modulargolems/gui/-templates/sprites/test/\346\225\260\345\255\227\345\222\214\345\233\276\346\240\207.png" new file mode 100644 index 000000000..5e15e290a Binary files /dev/null and "b/src/test/resources/modulargolems/gui/-templates/sprites/test/\346\225\260\345\255\227\345\222\214\345\233\276\346\240\207.png" differ diff --git a/src/test/resources/modulargolems/lang/zh_cn/advancements.json b/src/test/resources/modulargolems/lang/zh_cn/advancements.json index d3bfa54b5..3253ae957 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/advancements.json +++ b/src/test/resources/modulargolems/lang/zh_cn/advancements.json @@ -1,8 +1,8 @@ { "advancements.modulargolems.advancements.golems": { - "anvil_fix.description": "在铁砧中用锭修复金属傀儡。", + "anvil_fix.description": "在铁砧中用锭修复金属傀儡", "anvil_fix.title": "完好如初", - "apply.description": "在铁砧中为傀儡零件镀上金属。", + "apply.description": "在铁砧中为傀儡零件镀上金属", "apply.title": "呼~好重!", "apply_sculk.description": "制作一个幽匿傀儡部件", "apply_sculk.title": "可怕的回忆", @@ -10,11 +10,11 @@ "command.title": "保卫家园", "craft.description": "用金属傀儡零件制作一个傀儡", "craft.title": "崭新出炉!", - "dog.description": "创造一个犬型傀儡.", + "dog.description": "创造一个犬形傀儡", "dog.title": "高贵的冷血动物", - "full.description": "对傀儡用尽全部的升级次数", + "full.description": "将傀儡的升级槽用尽", "full.title": "好吧,真的不能再多了", - "fully_equipped.description": "给人形傀儡全套盔甲、一把剑和一面盾牌。", + "fully_equipped.description": "给人形傀儡全套盔甲、一把剑和一面盾牌", "fully_equipped.title": "全副武装", "hot_fix.description": "使用金属锭直接修复一个傀儡", "hot_fix.title": "应急处理", @@ -48,7 +48,7 @@ "summon.title": "空降部队", "summon_mass.description": "一次召唤至少24只傀儡", "summon_mass.title": "一车面包人", - "max.description": "对傀儡使用12个升级", + "max.description": "在同一傀儡身上安装12个升级", "max.title": "超越极限" } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/alexscaves.json b/src/test/resources/modulargolems/lang/zh_cn/alexscaves.json new file mode 100644 index 000000000..0b2971753 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/alexscaves.json @@ -0,0 +1,28 @@ +{ + "item.modulargolems.candy_mixture": "糖果机块", + "item.modulargolems.candy_construct": "糖果机核", + "item.modulargolems.magnetic_alloy": "磁力合金", + "item.modulargolems.magnetic_construct": "磁力机核", + "item.modulargolems.nuclear_construct": "核能机核", + "effect.modulargolems.atomic_boost": "核能强化", + "effect.modulargolems.atomic_boost.description": "提升攻击伤害和移动速度", + "golem_material.alexscaves.candy": "糖果", + "golem_material.alexscaves.magnetic": "磁力", + "golem_material.alexscaves.nuclear": "核能", + "modifier.modulargolems": { + "atomic_fueling": "反应充能", + "atomic_fueling.desc": "可消耗[%s]回复%s的生命值,并提升%s的攻击伤害和移动速度,持续%s秒。免疫辐照效果", + "free_movement": "穿行", + "free_movement.desc": "不会被方块和焦糖减速", + "gum_shooter": "糖果机", + "gum_shooter.desc": "可发射糖果子弹,造成%s点伤害", + "polarize": "磁力极化", + "polarize.desc": "可根据攻击模式改变技能效果:近战模式牵引周围的目标,远程模式排斥周围的目标。触发时持续造成%s点伤害", + "radiation": "辐照", + "radiation.desc": "对攻击的目标施加%s效果。对受到辐照效果的目标造成的伤害每级提升%s", + "reformation": "磁力重组", + "reformation.desc": "可消耗铁锭获得%s点伤害吸收,并回复%s点生命值。最多叠加%s点伤害吸收", + "sticky_caramel": "粘性焦糖", + "sticky_caramel.desc": "在攻击目标脚下生成焦糖" + } +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/atm.json b/src/test/resources/modulargolems/lang/zh_cn/atm.json new file mode 100644 index 000000000..8fcd90b72 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/atm.json @@ -0,0 +1,5 @@ +{ + "golem_material.allthemodium.allthemodium": "ATM", + "golem_material.allthemodium.unobtainium": "难得素", + "golem_material.allthemodium.vibranium": "振金" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/blazegear.json b/src/test/resources/modulargolems/lang/zh_cn/blazegear.json index ed9c33a68..9ecd46e34 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/blazegear.json +++ b/src/test/resources/modulargolems/lang/zh_cn/blazegear.json @@ -1,5 +1,5 @@ { "golem_material.blazegear.brimsteel": "烈焰钢", "modifier.modulargolems.blazing": "烈焰", - "modifier.modulargolems.blazing.desc": "对远处的敌人发射火球" + "modifier.modulargolems.blazing.desc": "可对远处的目标发射火球" } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/botania.json b/src/test/resources/modulargolems/lang/zh_cn/botania.json index 6352bddd2..1c3ce2d52 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/botania.json +++ b/src/test/resources/modulargolems/lang/zh_cn/botania.json @@ -6,15 +6,15 @@ }, "modifier.modulargolems": { "mana_mending": "魔力修复", - "mana_mending.desc": "消耗魔力修复自身血量,每秒最多恢复%s点HP,效率为%s魔力/HP", + "mana_mending.desc": "可消耗%2$s魔力回复自身1点生命值,每秒最多回复%1$s点生命值", "mana_boosting": "魔力增幅", - "mana_boosting.desc": "消耗魔力增幅自身攻击%s%%,消耗为%s魔力", + "mana_boosting.desc": "可消耗%2$s魔力提升%1$s%%攻击伤害", "mana_production": "魔力制造", - "mana_production.desc": "泰拉钢的力量让傀儡能够被动地每秒制造%s魔力", + "mana_production.desc": "每秒回复%s魔力", "mana_burst": "魔力脉冲", - "mana_burst.desc": "向远处的目标发射魔力脉冲,造成%s%%攻击伤害,消耗为%s魔力", + "mana_burst.desc": "可消耗%2$s魔力向远处的目标发射魔力脉冲,造成%s%%的伤害", "pixie_attack": "精灵袭击", - "pixie_attack.desc": "攻击时有%s%%几率召唤一个精灵袭击目标,并且精灵伤害+%s", + "pixie_attack.desc": "攻击时有%s%%几率召唤一个精灵袭击目标,且精灵的攻击伤害+%s", "pixie_counterattack": "精灵反击", "pixie_counterattack.desc": "被攻击时有%s%%几率召唤一个精灵反击目标" }, diff --git a/src/test/resources/modulargolems/lang/zh_cn/cataclysm.json b/src/test/resources/modulargolems/lang/zh_cn/cataclysm.json index e17b1d346..a806863b9 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/cataclysm.json +++ b/src/test/resources/modulargolems/lang/zh_cn/cataclysm.json @@ -1,28 +1,78 @@ { + "modulargolems.tooltip.cataclysm.harbinger_armor_laer": "+%s 激光伤害", + "modulargolems.tooltip.cataclysm.harbinger_armor_missile": "+%s 导弹伤害", + "modulargolems.tooltip.cataclysm.monstrosity_armor": "+%s 巨兽撼地伤害", + "modulargolems.tooltip.cataclysm.ignis_armor_fireball": "+%s 焰魔火球伤害", + "modulargolems.tooltip.cataclysm.ignis_armor_soul": "永续灵魂形态", + "modulargolems.tooltip.cataclysm.ignis_armor_strike": "+%s 烈焰轰击伤害", + "modulargolems.tooltip.cataclysm.maledictus_bypass_cd": "下落攻击召唤的幻影战戟可无视目标无敌帧", + "modulargolems.tooltip.cataclysm.maledictus_fast_skill": "幻戟坠击冷却时间减半", + "modulargolems.tooltip.cataclysm.maledictus_revive": "受到致命伤害时以%s%%生命值复活,冷却%s秒", + "modulargolems.tooltip.cataclysm.maledictus_revive_actual_cd": "实际冷却:%s秒", + "modulargolems.tooltip.cataclysm.maledictus_revive_cd": "每件额外咒魂护甲或部件使冷却减少%s秒,复活生命值提升%s%%", + "modulargolems.tooltip.cataclysm.maledictus_revive_in_cd": "冷却中:剩余%s秒", + "item.modulargolems.harbinger_chestplate": "先行者傀儡胸甲", + "item.modulargolems.harbinger_helmet": "先行者傀儡头盔", + "item.modulargolems.harbinger_shinguard": "先行者傀儡护腿", + "item.modulargolems.harbinger_upgrade_template": "先行者傀儡升级模板", + "item.modulargolems.monstrosity_chestplate": "恶兽傀儡胸甲", + "item.modulargolems.monstrosity_helmet": "恶兽傀儡头盔", + "item.modulargolems.monstrosity_shinguard": "恶兽傀儡护腿", + "item.modulargolems.monstrosity_upgrade_template": "恶兽傀儡升级模板", + "item.modulargolems.ignis_chestplate": "腾炎傀儡胸甲", + "item.modulargolems.ignis_helmet": "腾炎傀儡头盔", + "item.modulargolems.ignis_shinguard": "腾炎傀儡护腿", + "item.modulargolems.maledictus_chestplate": "咒魂傀儡胸甲", + "item.modulargolems.maledictus_helmet": "咒魂傀儡头盔", + "item.modulargolems.maledictus_shinguard": "咒魂傀儡护腿", "golem_material.cataclysm.ignitium": "腾炎", "golem_material.cataclysm.witherite": "凋零合金", + "golem_material.cataclysm.cursium": "咒魂", + "effect.modulargolems.maledictus_rage": "恶咒", + "effect.modulargolems.maledictus_rage.description": "提升傀儡攻击伤害", + "golem_material.cataclysm.ender_guardian": "末地守卫", + "golem_material.cataclysm.storm": "风暴", + "golem_material.cataclysm.ancient_metal": "远古金属", "item.modulargolems": { "ender_guardian_void_rune": "末影守卫升级", "leviathan_blast_portal": "利维坦升级", "ancient_remnant_sandstorm": "远古遗魂升级", - "netherite_monstrosity_earthquake": "下界合金巨兽升级" + "netherite_monstrosity_earthquake": "下界合金巨兽升级", + "scylla_lightning_upgrade": "斯库拉升级", + "azure_cube": "蔚蓝立方", + "void_cube": "虚空机块", + "storm_construct": "风暴机核", + "void_construct": "虚空机核" }, "modifier.modulargolems": { "harbinger_death_beam": "先驱者激光", - "harbinger_death_beam.desc": "攻击目标较远时,对目标发射激光", + "harbinger_death_beam.desc": "目标距离较远时,可对目标发射激光", "harbinger_missile": "先驱者导弹", - "harbinger_missile.desc": "攻击目标较远时,对目标发射追踪导弹", + "harbinger_missile.desc": "目标距离较远时,可对目标发射追踪导弹", "ignis_attack": "焰魔之刃", - "ignis_attack.desc": "对攻击目标叠加炽热烙印效果并吸血。半血以下时伤害穿透护甲", + "ignis_attack.desc": "对攻击的目标叠加炽热烙印效果并吸血。生命值低于上限的50%时造成的伤害穿透护甲", "ignis_fireball": "焰魔火球", - "ignis_fireball.desc": "攻击目标较远时,对目标发射焰魔火球", + "ignis_fireball.desc": "目标距离较远时,可对目标发射焰魔火球", "ender_guardian_void_rune": "虚空符文", - "ender_guardian_void_rune.desc": "对目标放出虚空符文", + "ender_guardian_void_rune.desc": "可对多个目标释放漩涡和虚空符文", "leviathan_blast_portal": "深渊冲击波", - "leviathan_blast_portal.desc": "攻击目标较远时,在目标位置放出深渊冲击波", + "leviathan_blast_portal.desc": "可在多个目标位置释放深渊冲击波", "ancient_remnant_sandstorm": "遗魂沙暴", - "ancient_remnant_sandstorm.desc": "攻击目标较远时,在目标位置召唤沙暴", + "ancient_remnant_sandstorm.desc": "可在多个目标位置召唤沙暴。对受到沙漠诅咒效果的目标造成的伤害提升", "netherite_monstrosity_earthquake": "巨兽撼地", - "netherite_monstrosity_earthquake.desc": "傀儡会起跳砸地造成范围伤害" + "netherite_monstrosity_earthquake.desc": "可起跳进行下落攻击,落地时造成范围伤害", + "maledictus_attack": "咒灵之刃", + "maledictus_attack.desc": "近战造成的伤害穿透护甲。造成伤害后提升伤害,最多叠加%s层", + "maledictus_earthquake": "幻戟坠击", + "maledictus_earthquake.desc": "可起跳进行下落攻击,落地时造成范围伤害并召唤幻影战戟", + "scylla_lightning": "鸣雷槊", + "scylla_lightning.desc": "可对多个目标发射鸣雷槊", + "scylla_wave": "霆浪锚", + "scylla_wave.desc": "受到伤害时召唤海浪推开目标", + "ancient_remnant_reformation": "遗骸重组", + "ancient_remnant_reformation.desc": "熔锻:可消耗自身材料回复生命值,但会减少生命值上限并缩小体型。可通过修复材料复原", + "ignis_jump": "烈焰轰击", + "ignis_jump.desc": "可起跳进行下落攻击,落地时在附近所有目标位置释放烈焰轰击" } + } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/composite_material.json b/src/test/resources/modulargolems/lang/zh_cn/composite_material.json new file mode 100644 index 000000000..de0afb5f8 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/composite_material.json @@ -0,0 +1,30 @@ +{ + "golem_material.composite_material.allay_steel": "悦灵钢", + "golem_material.composite_material.dungeon_steel": "地牢钢", + "golem_material.composite_material.etherite": "以太合金", + "golem_material.composite_material.primitive": "荒古坚材", + "golem_material.composite_material.obsidian_steel": "黑曜石钢", + "item.modulargolems.etherite": "以太镀层升级", + "modifier.modulargolems": { + "dungeon_absorption": "损害吸收", + "dungeon_absorption.desc": "近战造成伤害时,回复所造成伤害%s%%的生命值", + "dungeon_link": "生命链接", + "dungeon_link.desc": "以非修复的方式回复生命值时,按%s%%的比例回复所有者的生命值", + "obsidian": "坚韧外壳", + "obsidian.desc": "受到的最终伤害减少%s点", + "primitive_blast": "荒古之力", + "primitive_blast.desc": "提升生命值上限%s%%的攻击伤害", + "primitive_curse": "荒古诅咒", + "primitive_curse.desc": "受到的伤害减少%1$s%%,但升级槽%2$s", + "resonant_attack": "共鸣震慑", + "resonant_attack.desc": "造成伤害后,对%1$s格内的同种目标追加造成原伤害%2$s%%的魔法伤害", + "resonant_heal": "生声不息", + "resonant_heal.desc": "以非修复的方式回复生命值时,按%1$s%%的比例回复%2$s格内同技能友方的生命值,受友方技能等级影响", + "etherite_plating": "以太镀层", + "etherite_plating.desc1": "根据技能等级获得以下效果:", + "etherite_plating.desc2": " · 免疫弹射物伤害", + "etherite_plating.desc3": " · 免疫常规减益", + "etherite_plating.desc4": " · 免疫环境伤害", + "etherite_plating.desc5": " · 周期性自我修复" + } +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/create.json b/src/test/resources/modulargolems/lang/zh_cn/create.json index fdde1d3bf..09649485a 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/create.json +++ b/src/test/resources/modulargolems/lang/zh_cn/create.json @@ -1,29 +1,30 @@ { - "golem_material.create": { - "zinc": "锌", - "andesite_alloy": "安山合金", - "brass": "黄铜", - "railway": "火车" - }, - "modifier.modulargolems": { - "coating": "镀层升级", - "coating.desc": "受到的伤害减少%s", - "push": "击退提升", - "mechanical_engine": "蒸汽动力", - "mechanical_engine.desc": "消耗燃料强化傀儡", - "mechanical_force": "工业长路", - "mechanical_force.desc": "消耗燃料时+%s%%攻击伤害", - "mechanical_mobility": "汽鸣铁道", - "mechanical_mobility.desc": "消耗燃料时+%s%%速度" - }, - "item.modulargolems": { - "coating": "镀层升级", - "push": "机械手升级" - }, - "effect.modulargolems": { - "mechanical_force": "工业长路", - "mechanical_force.description": "提升傀儡攻击伤害", - "mechanical_mobility": "汽鸣铁道", - "mechanical_mobility.description": "提升傀儡移动速度" - } + "golem_material.create": { + "cardboard": "纸板", + "zinc": "锌", + "andesite_alloy": "安山合金", + "brass": "黄铜", + "railway": "火车" + }, + "modifier.modulargolems": { + "coating": "镀层升级", + "coating.desc": "受到的最终伤害减少%s点", + "push": "击退提升", + "mechanical_engine": "蒸汽动力", + "mechanical_engine.desc": "可消耗燃料强化自身", + "mechanical_force": "工业长路", + "mechanical_force.desc": "消耗燃料时提升%s%%攻击伤害", + "mechanical_mobility": "汽鸣铁道", + "mechanical_mobility.desc": "消耗燃料时提升%s%%移动速度" + }, + "item.modulargolems": { + "coating": "镀层升级", + "push": "机械手升级" + }, + "effect.modulargolems": { + "mechanical_force": "工业长路", + "mechanical_force.description": "提升傀儡攻击伤害", + "mechanical_mobility": "汽鸣铁道", + "mechanical_mobility.description": "提升傀儡移动速度" + } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/goety.json b/src/test/resources/modulargolems/lang/zh_cn/goety.json new file mode 100644 index 000000000..33e4a127a --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/goety.json @@ -0,0 +1,30 @@ +{ + "golem_material.goety.cursed_metal": "诅咒金属", + "golem_material.goety.dark_metal": "黑暗金属", + "item.modulargolems.fire_blast": "使徒升级: 炎爆", + "item.modulargolems.fire_tornado": "使徒升级: 燃烧龙卷风", + "item.modulargolems.hell_cloud": "使徒升级: 狱云", + "item.modulargolems.hell_blast": "使徒升级: 狱火爆弹", + "item.modulargolems.hell_bolt": "使徒升级: 狱火束", + "item.modulargolems.apostle": "使徒晋升升级", + "modifier.modulargolems.fallen_attack": "堕落之刃", + "modifier.modulargolems.haunted": "缠魂", + "modifier.modulargolems.haunted.desc": "击败目标时有概率召唤缠魂盔甲仆从。目标的盔甲越多概率越高", + "modifier.modulargolems.soul_repair": "灵魂修补", + "modifier.modulargolems.soul_repair.desc": "可使用召唤者的灵魂能量修复装备。生命值较低时也可使用灵魂能量回复生命值", + "modifier.modulargolems.fire_blast": "炎爆", + "modifier.modulargolems.fire_blast.desc": "可在前方召唤炎爆陷阱", + "modifier.modulargolems.fire_tornado": "燃烧龙卷风", + "modifier.modulargolems.fire_tornado.desc": "可在目标位置召唤燃烧龙卷风", + "modifier.modulargolems.hell_cloud": "狱云", + "modifier.modulargolems.hell_cloud.desc": "可在目标位置召唤狱云", + "modifier.modulargolems.apostle": "使徒", + "modifier.modulargolems.apostle.desc": "使徒升级不再消耗升级槽", + "modifier.modulargolems.hell_blast": "狱火爆弹", + "modifier.modulargolems.hell_blast.desc": "可对多个目标发射狱火爆弹", + "modifier.modulargolems.hell_bolt": "狱火束", + "modifier.modulargolems.hell_bolt.desc": "可对多个目标发射狱火束", + "item.modulargolems.soul_collection": "灵魂收割升级", + "modifier.modulargolems.soul_collection": "灵魂收割", + "modifier.modulargolems.soul_collection.desc": "击杀目标时为所有者提供灵魂能量" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/goety_revelation.json b/src/test/resources/modulargolems/lang/zh_cn/goety_revelation.json new file mode 100644 index 000000000..53d9851c0 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/goety_revelation.json @@ -0,0 +1,25 @@ +{ + "golem_material.goety_revelation.apocalyptium": "神金", + "item.modulargolems.apocalyptium_helmet": "神金傀儡头盔", + "item.modulargolems.apocalyptium_chestplate": "神金傀儡胸甲", + "item.modulargolems.apocalyptium_shinguard": "神金傀儡护腿", + "item.modulargolems.apocalyptium_boots": "神金傀儡靴子", + "item.modulargolems.stellar_apocalypse": "星辰之怒", + "modulargolems.tooltip.revelation.dash": "可向目标发起冲锋,进行冲刺攻击", + "modulargolems.tooltip.revelation.soul_boost": "+%s%% 灵魂修补效率", + "modulargolems.tooltip.revelation.soul_reap": "近战造成真实伤害,造成伤害时获取灵魂", + "item.modulargolems.the_abhorrent": "使徒头衔: 憎恶本质", + "item.modulargolems.the_atrocious": "使徒头衔: 十恶不赦", + "item.modulargolems.the_profane": "使徒头衔: 天启饥荒", + "item.modulargolems.the_terrible": "使徒头衔: 可怖之物", + "modifier.modulargolems.the_abhorrent": "憎恶本质", + "modifier.modulargolems.the_abhorrent.desc": "攻击时减少目标的无敌帧时长", + "modifier.modulargolems.the_atrocious": "十恶不赦", + "modifier.modulargolems.the_atrocious.desc": "减少使徒升级的技能冷却", + "modifier.modulargolems.the_profane": "天启饥荒", + "modifier.modulargolems.the_profane.desc": "攻击时随机移除目标的%s个正面效果", + "modifier.modulargolems.the_risen": "不灭重生", + "modifier.modulargolems.the_risen.desc": "死亡时掉落0点生命值的可修复物品形态,且在物品栏中生命值为0点时也可回复生命值", + "modifier.modulargolems.the_terrible": "可怖之物", + "modifier.modulargolems.the_terrible.desc": "拉弓速度更快。可对至多%2$s个目标分别射出%1$s支箭" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/golem.json b/src/test/resources/modulargolems/lang/zh_cn/golem.json index a8c9f518c..d8538f276 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/golem.json +++ b/src/test/resources/modulargolems/lang/zh_cn/golem.json @@ -1,89 +1,100 @@ { - "entity.modulargolems.metal_golem": "大型金属傀儡", - "entity.modulargolems.humanoid_golem": "人形金属傀儡", - "entity.modulargolems.dog_golem": "犬形金属傀儡", - "golem_type.modulargolems.metal_golem": "大型金属傀儡", - "golem_type.modulargolems.humanoid_golem": "人形金属傀儡", - "golem_type.modulargolems.dog_golem": "犬形金属傀儡", - "golem_material": { - "modulargolems": { - "copper": "铜", - "gold": "金", - "iron": "铁", - "netherite": "下界合金", - "sculk": "幽匿" - } - }, - "golem_part": { - "metal_golem": { - "body": "身体: %s", - "left": "左手: %s", - "leg": "双腿: %s", - "right": "右手: %s" + "entity.modulargolems.metal_golem": "大型金属傀儡", + "entity.modulargolems.humanoid_golem": "人形金属傀儡", + "entity.modulargolems.dog_golem": "犬形金属傀儡", + "entity.modulargolems.beacon_laser": "信标激光", + "golem_type.modulargolems.metal_golem": "大型金属傀儡", + "golem_type.modulargolems.humanoid_golem": "人形金属傀儡", + "golem_type.modulargolems.dog_golem": "犬形金属傀儡", + "golem_material": { + "modulargolems": { + "copper": "铜", + "gold": "金", + "iron": "铁", + "netherite": "下界合金", + "sculk": "幽匿" + } }, - "humanoid_golem": { - "arms": "双臂: %s", - "body": "躯干: %s", - "legs": "双腿: %s" + "golem_part": { + "metal_golem": { + "body": "身体: %s", + "left": "左手: %s", + "leg": "双腿: %s", + "right": "右手: %s" + }, + "humanoid_golem": { + "arms": "双臂: %s", + "body": "躯干: %s", + "legs": "双腿: %s" + }, + "dog_golem": { + "body": "躯干: %s", + "legs": "四肢: %s" + } }, - "dog_golem": { - "body": "躯干: %s", - "legs": "四肢: %s" + "modifier.modulargolems": { + "fire_immune": "火焰免疫", + "fire_immune.desc": "免疫火焰伤害,可浮在熔岩表面", + "thunder_immune": "闪电免疫", + "thunder_immune.desc": "免疫雷击伤害,吸引闪电。被雷击时获得10秒防火效果,并回复%s点生命值", + "magic_immune": "魔法免疫", + "magic_immune.desc": "免疫魔法伤害", + "recycle": "傀儡回收", + "recycle.desc": "死亡时掉落0点生命值的可修复物品形态。如果玩家存在,物品直接进入玩家物品栏", + "armor_up": "防御提升", + "toughness_up": "韧性提升", + "damage_up": "伤害提升", + "regeneration_up": "回复升级", + "magic_resistant": "魔法抗性", + "magic_resistant.desc": "受到的魔法伤害x%s%%", + "float": "漂浮升级", + "float.desc": "可浮在水面", + "explosion_resistant": "爆炸抗性", + "explosion_resistant.desc": "受到的爆炸伤害减少至%s%%,且波及到自身的爆炸不会破坏方块", + "damage_cap": "伤害限制", + "damage_cap.desc": "单次受到的伤害不会超过生命值上限的%s%%", + "immunity": "不灭", + "immunity.desc": "免疫虚空伤害以外的所有伤害。所有目标不会攻击自身", + "projectile_reject": "弹射物反射", + "projectile_reject.desc": "反射弹射物。免疫弹射物伤害", + "swim": "游泳", + "swim.desc": "可在液体中游泳", + "player_immune": "友伤免疫", + "player_immune.desc": "免疫所有者及其从属造成的伤害", + "sonic_boom": "音爆", + "sonic_boom.desc": "可使用音爆攻击。若能进行范围攻击,则音爆造成范围伤害", + "bell": "钟声", + "bell.desc": "切换攻击目标时,可敲钟吸引大范围的目标并对其施加发光效果", + "ender_sight": "透视", + "ender_sight.desc": "可看穿墙壁和天花板", + "speed_up": "移动速度提升", + "emerald": "袭击者杀手", + "emerald.desc": "对袭击者造成的伤害提升%s%%", + "dynamic_reduction": "动态减伤", + "dynamic_reduction.desc": "在一定时间内受到的伤害不会超过生命值上限的20%", + "slow": "药水升级:缓慢", + "weak": "药水升级:虚弱", + "wither": "药水升级:凋零", + "pickup": "拾取升级", + "pickup.desc": "允许捡起附近的物品/经验并交给你。详细机制请查阅帕秋莉说明书。如果找不到位置存放物品/经验,则会将其销毁", + "pickup_mending": "拾取附属:经验修补", + "pickup_mending.desc": "在拾取经验时,会试图使用经验修补自身", + "pickup_no_destroy": "拾取附属:取消销毁", + "pickup_no_destroy.desc": "找不到位置存放物品时,不会销毁物品也不会拾取物品。注意:在大量掉落物的区域使用这个升级可能会造成卡顿", + "talented": "多才多艺", + "talented.desc": "前4种蓝色升级在首次安装时不消耗升级槽", + "cauldron": "炼药锅", + "cauldron.desc": "重复的药水升级不消耗升级槽", + "ridding_speed_up": "坐骑升级", + "ridding_speed_up.desc": "不会攻击也不会成为攻击对象。免疫不以自身为攻击对象的目标造成的伤害", + "size_up": "体型升级", + "armor_penetration": "护甲穿透", + "armor_penetration.desc": "造成的伤害有%s%%概率穿透护甲和盾牌", + "add_slot": "额外升级", + "add_slot.desc": "提供%s个额外的升级槽", + "add_slot_diamond": "升级扩充: 钻石", + "add_slot_diamond.desc": "升级槽+1。仅允许使用一次", + "add_slot_netherite": "升级扩充: 下界合金", + "add_slot_netherite.desc": "升级槽+1。仅允许使用一次" } - }, - "modifier.modulargolems": { - "fire_immune": "火焰免疫", - "fire_immune.desc": "免疫火焰伤害,漂浮于岩浆上。", - "thunder_immune": "闪电免疫", - "thunder_immune.desc": "免疫闪电伤害,吸引闪电。被雷劈时获得10秒防火,并回复%s血量。", - "magic_immune": "魔法免疫", - "magic_immune.desc": "免疫魔法伤害", - "recycle": "傀儡回收", - "recycle.desc": "傀儡死亡时掉落0血量的可修复物品形态。如果玩家存在,物品直接加入玩家背包", - "armor_up": "防御提升", - "toughness_up": "韧性提升", - "damage_up": "伤害提升", - "regeneration_up": "回复升级", - "magic_resistant": "魔法抗性", - "magic_resistant.desc": "受到的魔法伤害x%s%%", - "float": "漂浮升级", - "float.desc": "让傀儡浮在水面", - "explosion_resistant": "爆炸抗性", - "explosion_resistant.desc": "受到的爆炸伤害x%s%%,波及到傀儡的爆炸不破坏方块", - "damage_cap": "伤害限制", - "damage_cap.desc": "一次受到的伤害不会超过最高血量的%s%%", - "immunity": "不灭", - "immunity.desc": "免疫虚空伤害以外的所有伤害。怪物不会攻击这个傀儡。", - "projectile_reject": "弹射物反射", - "projectile_reject.desc": "反射弹射物,不受弹射物伤害", - "swim": "游泳", - "swim.desc": "让傀儡能游泳", - "player_immune": "友伤免疫", - "player_immune.desc": "免疫玩家及其从属造成的伤害", - "sonic_boom": "音爆", - "sonic_boom.desc": "傀儡能使用音爆攻击。若傀儡能范围攻击,则音爆造成范围伤害。", - "bell": "钟声", - "bell.desc": "傀儡切换攻击目标时,敲钟并吸引范围内的敌人,同时施加发光效果。", - "ender_sight": "透视", - "ender_sight.desc": "傀儡能看穿墙壁和天花板", - "speed_up": "移动速度提升", - "emerald": "掠夺者杀手", - "emerald.desc": "对掠夺者造成+%s%%伤害", - "slow": "药水升级:缓慢", - "weak": "药水升级:虚弱", - "wither": "药水升级:凋零", - "pickup": "拾取升级", - "pickup.desc": "傀儡会捡起附近的物品和经验并交给你。详细机制请查阅帕秋莉说明书。如果傀儡找不到地方放物品/经验,傀儡会把物品/经验销毁", - "pickup_mending": "拾取附属:经验修补", - "pickup_mending.desc": "傀儡拾取经验时,会试图使用经验修补自身。", - "pickup_no_destroy": "拾取附属:取消销毁", - "pickup_no_destroy.desc": "傀儡找不到地方放物品时不会销毁物品,也不会拾取物品。注意:在大量掉落物的区域使用这个升级可能会造成卡顿", - "talented": "多才多艺", - "talented.desc": "前4种蓝色升级的第一个升级不消耗升级槽", - "cauldron": "炼药锅", - "cauldron.desc": "重复的药水升级不消耗升级槽", - "ridding_speed_up": "坐骑升级", - "ridding_speed_up.desc": "傀儡不会攻击也不会成为攻击对象", - "size_up": "体型升级" - } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/hostility.json b/src/test/resources/modulargolems/lang/zh_cn/hostility.json index 134c44cfa..6e466c41c 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/hostility.json +++ b/src/test/resources/modulargolems/lang/zh_cn/hostility.json @@ -1,13 +1,17 @@ { - "modifier.modulargolems": { - "hostility_core": "恶意核心", - "hostility_core.desc": "其他恶意升级不消耗升级槽", - "hostility_potion": "恶意升级:药水", - "hostility_potion.desc": "每个第一级的药水升级不消耗升级槽", - "hostility_protection": "恶意升级:保护", - "hostility_reflect": "恶意升级:反射", - "hostility_regen": "恶意升级:再生", - "hostility_speed": "恶意升级:神速", - "hostility_tank": "恶意升级:重装" - } + "golem_material.l2hostility.chaotic": "混沌", + "golem_material.l2hostility.miraculous": "奇迹", + "modifier.modulargolems": { + "hostility_adaptive": "恶意词条:适应", + "hostility_dispell": "恶意词条:破魔", + "hostility_core": "恶意核心", + "hostility_core.desc": "其他恶意升级不消耗升级槽", + "hostility_potion": "恶意升级:药水", + "hostility_potion.desc": "每种药水升级在首次安装时不消耗升级槽", + "hostility_protection": "恶意升级:保护", + "hostility_reflect": "恶意升级:反射", + "hostility_regen": "恶意升级:再生", + "hostility_speed": "恶意升级:神速", + "hostility_tank": "恶意升级:重装" + } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/iceandfire.json b/src/test/resources/modulargolems/lang/zh_cn/iceandfire.json new file mode 100644 index 000000000..71202079e --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/iceandfire.json @@ -0,0 +1,13 @@ +{ + "golem_material.iceandfire.fire_dragonsteel": "龙炎钢", + "golem_material.iceandfire.ice_dragonsteel": "龙霜钢", + "golem_material.iceandfire.lightning_dragonsteel": "龙霆钢", + "modifier.modulargolems.fire_dragonsteel_attack": "龙炎斩", + "modifier.modulargolems.fire_dragonsteel_attack.desc": "攻击时点燃并击退目标", + "modifier.modulargolems.ice_dragonsteel_armor": "龙霜棘", + "modifier.modulargolems.ice_dragonsteel_armor.desc": "受到伤害时冻结并击退攻击者", + "modifier.modulargolems.ice_dragonsteel_attack": "龙霜斩", + "modifier.modulargolems.ice_dragonsteel_attack.desc": "攻击时冻结并击退目标", + "modifier.modulargolems.lightning_dragonsteel_attack": "龙霆斩", + "modifier.modulargolems.lightning_dragonsteel_attack.desc": "攻击时同时召唤闪电攻击目标" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/item.json b/src/test/resources/modulargolems/lang/zh_cn/item.json index af0e44c53..df96a6d8a 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/item.json +++ b/src/test/resources/modulargolems/lang/zh_cn/item.json @@ -1,144 +1,167 @@ { - "item.modulargolems": { - "metal_golem_template": "傀儡胚料", - "metal_golem_holder": "大型金属傀儡", - "humanoid_golem_holder": "人形金属傀儡", - "dog_golem_holder": "犬形金属傀儡", - "diamond": "钻石升级", - "fire_immune": "防火升级", - "thunder_immune": "导电升级", - "netherite": "下界合金升级", - "quartz": "石英升级", - "recycle": "回收升级", - "enchanted_gold": "附魔金苹果升级", - "gold": "金苹果升级", - "empty_upgrade": "空白升级模版", - "float": "漂浮升级", - "retrieval_wand": "回收手杖", - "command_wand": "命令手杖", - "summon_wand": "召唤手杖", - "rider_wand": "骑乘手杖", - "sponge": "海绵升级", - "swim": "游泳升级", - "player": "友伤免疫升级", - "bell": "钟升级", - "ender_sight": "透视升级", - "attack_high": "伤害升级V", - "speed": "速度升级", - "speed_high": "速度升级V", - "cleanse": "药水升级:净化", - "curse": "药水升级:诅咒", - "emerald": "绿宝石升级", - "incarcerate": "药水升级:禁锢", - "slow": "药水升级:缓慢", - "weak": "药水升级:虚弱", - "wither": "药水升级:凋零", - "pickup": "拾取升级", - "pickup_mending": "拾取附属:经验修补", - "pickup_no_destroy": "拾取附属:取消销毁", - "talented": "辅助升级:多才多艺", - "cauldron": "辅助升级:炼药锅", - "mount_upgrade": "坐骑升级", - "size_upgrade": "体形升级", - "omnipotent_wand_command": "万能手杖:命令", - "omnipotent_wand_retrieval": "万能手杖:回收", - "omnipotent_wand_rider": "万能手杖:骑乘", - "omnipotent_wand_summon": "万能手杖:召唤", - "omnipotent_wand_squad": "万能手杖:编队", - "squad_wand": "编队手杖", - "hostility_core": "恶意核心", - "hostility_potion": "恶意升级:药水", - "hostility_protection": "恶意升级:保护", - "hostility_reflect": "恶意升级:反射", - "hostility_regen": "恶意升级:再生", - "hostility_speed": "恶意升级:神速", - "hostility_tank": "恶意升级:重装", - "target_filter_name": "生物过滤器: 数据包格式", - "target_filter_type": "生物过滤器: 实体类型", - "target_filter_uuid": "生物过滤器: 实体ID", - "target_filter_default": "生物过滤器: 默认攻击目标", - "patrol_path_recorder": "巡逻手册" - }, - "-cartesian": { - "golem": { - "path": "item.modulargolems", - "reverse": true, - "list": [ - { - "": "", - "incomplete": "(半成品)" - }, - { - "metal_golem_arm": "大型金属傀儡-手臂", - "metal_golem_body": "大型金属傀儡-身体", - "metal_golem_legs": "大型金属傀儡-双腿", - "humanoid_golem_arms": "人形金属傀儡-双臂", - "humanoid_golem_body": "人形金属傀儡-躯干", - "humanoid_golem_legs": "人形金属傀儡-双腿", - "dog_golem_body": "犬形金属傀儡-躯干", - "dog_golem_legs": "犬形金属傀儡-四肢" - } - ] + "block.modulargolems.golem_workbench": "傀儡装配台", + "item.modulargolems": { + "metal_golem_template": "傀儡胚料", + "metal_golem_holder": "大型金属傀儡", + "humanoid_golem_holder": "人形金属傀儡", + "dog_golem_holder": "犬形金属傀儡", + "diamond": "钻石升级", + "fire_immune": "防火升级", + "thunder_immune": "导电升级", + "netherite": "下界合金升级", + "quartz": "石英升级", + "recycle": "回收升级", + "enchanted_gold": "附魔金苹果升级", + "gold": "金苹果升级", + "empty_upgrade": "空白升级模版", + "float": "漂浮升级", + "retrieval_wand": "回收手杖", + "command_wand": "命令手杖", + "summon_wand": "召唤手杖", + "rider_wand": "骑乘手杖", + "sponge": "海绵升级", + "swim": "游泳升级", + "player": "友伤免疫升级", + "bell": "钟升级", + "ender_sight": "透视升级", + "attack_high": "伤害升级V", + "speed": "速度升级", + "speed_high": "速度升级V", + "cleanse": "净化升级", + "curse": "药水升级:诅咒", + "emerald": "绿宝石升级", + "incarcerate": "药水升级:禁锢", + "slow": "药水升级:缓慢", + "weak": "药水升级:虚弱", + "wither": "药水升级:凋零", + "pickup": "拾取升级", + "pickup_mending": "拾取附属:经验修补", + "pickup_no_destroy": "拾取附属:取消销毁", + "talented": "辅助升级:多才多艺", + "cauldron": "辅助升级:炼药锅", + "mount_upgrade": "坐骑升级", + "size_upgrade": "体型升级", + "omnipotent_wand_command": "万能手杖:命令", + "omnipotent_wand_retrieval": "万能手杖:回收", + "omnipotent_wand_rider": "万能手杖:骑乘", + "omnipotent_wand_summon": "万能手杖:召唤", + "omnipotent_wand_squad": "万能手杖:编队", + "squad_wand": "编队手杖", + "hostility_core": "恶意核心", + "hostility_potion": "恶意升级:药水", + "hostility_protection": "恶意升级:保护", + "hostility_reflect": "恶意升级:反射", + "hostility_regen": "恶意升级:再生", + "hostility_speed": "恶意升级:神速", + "hostility_tank": "恶意升级:重装", + "target_filter_name": "生物过滤器: 数据包格式", + "target_filter_type": "生物过滤器: 实体类型", + "target_filter_uuid": "生物过滤器: 实体ID", + "target_filter_default": "生物过滤器: 默认攻击目标", + "patrol_path_recorder": "巡逻手册", + "golem_facade": "傀儡皮肤", + "golem_slicing_axe": "斩铁巨斧", + "diamond_expansion_template": "扩充模版 - 钻石", + "netherite_expansion_template": "扩充模版 - 下界合金", + "hostile_wand": "敌对傀儡调试器", + "barbaric_vanguard_boots": "蛮荒傀儡镣铐", + "wind_spirit_boots": "风行傀儡靴子", + "beacon_boots": "信标傀儡靴子", + "diamond_dog_golem_armor": "钻石制傀儡狼铠", + "gold_dog_golem_armor": "金制傀儡狼铠", + "iron_dog_golem_armor": "铁制傀儡狼铠", + "netherite_dog_golem_armor": "下界合金制傀儡狼铠", + "iron_mecha_bow": "铁质机械弓", + "netherite_mecha_bow": "下界合金机械弓", + "beacon_cannon": "信标炮", + "sonic_cannon": "回响炮", + "mechanical_arm": "维修机械手", + "flame_thrower": "炼狱火枪" }, - "config": { - "path": "item.modulargolems", - "reverse": true, - "list": [ - { - "black": "黑色", - "blue": "蓝色", - "brown": "棕色", - "cyan": "青色", - "gray": "灰色", - "green": "绿色", - "light_blue": "淡蓝色", - "light_gray": "淡灰色", - "lime": "黄绿色", - "magenta": "品红色", - "orange": "橙色", - "pink": "粉红色", - "purple": "紫色", - "red": "红色", - "white": "白色", - "yellow": "黄色" + "-cartesian": { + "golem": { + "path": "item.modulargolems", + "reverse": true, + "list": [ + { + "": "", + "incomplete": "(半成品)" + }, + { + "metal_golem_arm": "大型金属傀儡-手臂", + "metal_golem_body": "大型金属傀儡-身体", + "metal_golem_legs": "大型金属傀儡-双腿", + "humanoid_golem_arms": "人形金属傀儡-双臂", + "humanoid_golem_body": "人形金属傀儡-躯干", + "humanoid_golem_legs": "人形金属傀儡-双腿", + "dog_golem_body": "犬形金属傀儡-躯干", + "dog_golem_legs": "犬形金属傀儡-四肢" + } + ] }, - { - "config_card": "配置卡片" - } - ] - }, - "armor": { - "path": "item.modulargolems", - "list": [ - { - "barbaric_vanguard": "蛮荒", - "roman_guard": "罗马", - "wind_spirit": "风行" - }, - { - "chestplate": "护甲", - "helmet": "头盔", - "shinguard": "护腿" - } - ] - }, - "weapon": { - "path": "item.modulargolems", - "list": [ - { - "iron": "铁", - "diamond": "钻石", - "netherite": "下界合金" + "config": { + "path": "item.modulargolems", + "reverse": true, + "list": [ + { + "black": "黑色", + "blue": "蓝色", + "brown": "棕色", + "cyan": "青色", + "gray": "灰色", + "green": "绿色", + "light_blue": "淡蓝色", + "light_gray": "淡灰色", + "lime": "黄绿色", + "magenta": "品红色", + "orange": "橙色", + "pink": "粉红色", + "purple": "紫色", + "red": "红色", + "white": "白色", + "yellow": "黄色" + }, + { + "config_card": "配置卡片" + } + ] }, - { - "golem": "傀儡" + "armor": { + "path": "item.modulargolems", + "list": [ + { + "barbaric_vanguard": "蛮荒", + "roman_guard": "罗马", + "wind_spirit": "风行" + }, + { + "chestplate": "傀儡胸甲", + "helmet": "傀儡头盔", + "shinguard": "傀儡护腿" + } + ] }, - { - "spear": "长枪", - "axe": "战斧", - "sword": "大剑" + "weapon": { + "path": "item.modulargolems", + "list": [ + { + "iron": "铁", + "diamond": "钻石", + "netherite": "下界合金", + "ironwood": "铁木", + "knightmetal": "骑士", + "fiery": "炽铁", + "steeleaf": "钢叶" + }, + { + "golem": "傀儡" + }, + { + "spear": "长枪", + "axe": "战斧", + "sword": "大剑" + } + ] } - ] } - } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/l2complements.json b/src/test/resources/modulargolems/lang/zh_cn/l2complements.json index d49e36d7f..9dd565650 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/l2complements.json +++ b/src/test/resources/modulargolems/lang/zh_cn/l2complements.json @@ -6,26 +6,26 @@ "totemic_gold": "生命" }, "item.modulargolems": { - "force_field": "凋零护甲升级", - "freezing": "寒流升级", - "soul_flame": "魂火升级", + "force_field": "凋灵护甲升级", + "freezing": "药水升级:寒流", + "soul_flame": "药水升级:魂火", "teleport": "瞬移升级" }, "modifier.modulargolems": { "conduit": "潮涌之力", - "conduit.desc": "当傀儡在水中时:受到的伤害减少至%s%%、每%s秒远程对水中/雨中目标造成%s点信标伤害、提升下列数值:", + "conduit.desc": "当自身在水中/雨中时:受到的伤害减少至%s%%,每%s秒对附近水中/雨中的单个目标造成%s点潮涌伤害,提升以下属性:", "freezing": "药水升级:寒流", - "freezing.desc": "攻击和被攻击时对目标施加寒流效果。傀儡免疫冰冻伤害。", + "freezing.desc": "攻击/被攻击时,对目标/攻击者施加寒流效果。免疫冰冻伤害", "soul_flame": "药水升级:魂火", - "soul_flame.desc": "攻击和被攻击时对目标施加魂火效果。傀儡免疫魂火伤害。", + "soul_flame.desc": "攻击/被攻击时,对目标/攻击者施加魂火效果。免疫魂火伤害", "teleport": "瞬移", - "teleport.desc": "被攻击时随机传送以躲避非魔法伤害。攻击目标时通过传送来更快接近目标。传送存在%s秒冷却", - "cleanse": "药水升级:净化", + "teleport.desc": "被攻击时可随机传送躲避非魔法伤害,攻击时可使用传送快速接近目标。传送存在%s秒冷却", + "cleanse": "净化升级", "curse": "药水升级:诅咒", "incarcerate": "药水升级:禁锢", "poseidite": "海神", - "poseidite.desc": "对怕水生物和水生生物造成+%s%%伤害", + "poseidite.desc": "对怕水生物和水生生物造成的伤害提升%s%%", "totemic_gold": "生命", - "totemic_gold.desc": "对亡灵生物造成+%s%%伤害" + "totemic_gold.desc": "对亡灵生物造成的伤害提升%s%%" } } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/legendary_monsters.json b/src/test/resources/modulargolems/lang/zh_cn/legendary_monsters.json new file mode 100644 index 000000000..4013dccfd --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/legendary_monsters.json @@ -0,0 +1,13 @@ +{ + + "golem_material.legendary_monsters.molten_metal": "熔融金属", + "modifier.modulargolems.ancient_anchor": "荒古锚", + "modifier.modulargolems.ancient_anchor.desc": "可起跳进行下落攻击,落地时释放冲击波眩晕目标并造成范围伤害", + "golem_material.legendary_monsters.cloud": "浮云", + "item.modulargolems.cloud_cube": "浮云立方", + "item.modulargolems.thunderstorm": "雷暴升级", + "modifier.modulargolems.thunderstorm": "雷暴", + "modifier.modulargolems.thunderstorm.desc": "可召唤雷暴攻击多个目标。受到伤害时向周围释放电磁脉冲", + "modifier.modulargolems.cloud_forming": "聚云", + "modifier.modulargolems.cloud_forming.desc": "造成的伤害根据目标的生命值上限提升" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/main.json b/src/test/resources/modulargolems/lang/zh_cn/main.json index aa2bac4ff..33d917533 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/main.json +++ b/src/test/resources/modulargolems/lang/zh_cn/main.json @@ -1,115 +1,181 @@ { - "attribute.name": { - "golem_regen": "生命回复", - "golem_sweep": "范围攻击", - "golem_size": "傀儡体型", - "golem_jump": "傀儡跳跃" - }, - "itemGroup.l2library.golems": "模块化傀儡", - "modulargolems": { - "tooltip": { - "health": "血量: %s/%s", - "slot": "剩余升级槽: %s", - "shift": "按 SHIFT 显示技能细节", - "following": "傀儡会跟随玩家", - "guarding": "傀儡会在(%s, %s, %s)附近行动", - "standing": "傀儡会停在(%s, %s, %s)", - "potion_attack": "对攻击傀儡和被傀儡攻击的敌人施加:%s", - "potion_defense": "傀儡获得:%s", - "follow": "跟随", - "golem_equipment": "只对%s生效", - "guard": "巡逻", - "stand": "停留", - "patrol": "固定路线", - "patrolling": "傀儡会根据既定路线移动", - "squad": "编队", - "team_up": "傀儡会跟随队长", - "wander": "自由行动", - "wandering": "傀儡会自由随机移动", - "modifier": "总计%s个技能,%s个升级", - "target": { - "name": "重命名物品,然后拿在手中右键,把物品名字作为实体类型ID/实体类型标签ID加入过滤器", - "remove": "蹲下右键移除最后一行", - "shift": "按SHIFT显示用法", - "type_add": "右键实体把实体类型加入过滤器", - "type_remove": "蹲下右键实体把实体类型从过滤器中移除", - "uuid_add": "右键实体把实体ID加入过滤器", - "uuid_remove": "蹲下右键实体把实体ID从过滤器中移除", - "default": "包含默认铁傀儡攻击目标:除了爬行者以外的所有敌人" - } + "attribute.name": { + "golem_regen": "生命回复", + "golem_sweep": "范围攻击", + "golem_size": "傀儡体型", + "golem_jump": "傀儡跳跃", + "dynamic_reduction": "动态减伤时间" }, - "wand": { - "mode": "目前模式: %s", - "switch": "使用滚轮或者上下键切换模式", - "right_click": "右键时:", - "shift_click": "蹲下右键时:", - "command_right": "指向傀儡改变行动模式,指向其他生物使周围所有你的傀儡优先攻击该目标", - "command_shift": "打开傀儡详情界面,配置傀儡装备,查看数值等", - "retrieve_right": "回收周围所有你的傀儡", - "retrieve_shift": "指向远处的一个傀儡,将其回收", - "summon_right": "把一个傀儡召唤至指向的远处的方块", - "summon_shift": "召唤背包中所有傀儡", - "rider": "右键一个犬型傀儡以骑在它身上。如果不是你的傀儡,那个傀儡的主人骑乘时你才能骑上去。在傀儡上右键任意地方取消骑乘。", - "config": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对持有相同配置卡的傀儡生效", - "config_init": "右键初始化配置卡", - "config_other": "这不是你的卡片,你不能编辑", - "squad": "设置傀儡为当前配置卡的队长。点队长取消其队长状态", - "path_record": "右键方块添加路径点,再次右键同方块移除。路径点首尾相连成环", - "add_node": "已添加路径点", - "node_count": "包含%s个路径点", - "remove_node": "已移除路径点" + "itemGroup.l2library.golems": "傀儡装配 - 傀儡", + "itemGroup.l2library.golem_items": "傀儡装配 - 物品", + "itemGroup.l2library.golem_upgrades": "傀儡装配 - 升级", + "modulargolems": { + "tooltip": { + "health": "生命值: %s/%s", + "slot": "剩余升级槽: %s", + "meltdown": "熔锻: %s", + "shift": "按SHIFT显示技能细节", + "following": "傀儡会跟随玩家", + "guarding": "傀儡会在(%s, %s, %s)附近行动", + "standing": "傀儡会停在(%s, %s, %s)", + "potion_attack": "攻击/被攻击时,对目标/攻击者施加:%s", + "potion_defense": "获得常驻效果:%s", + "follow": "跟随", + "golem_equipment": "只对%s生效", + "guard": "巡逻", + "stand": "停留", + "patrol": "固定路线", + "patrolling": "傀儡会根据既定路线移动", + "squad": "编队", + "team_up": "傀儡会跟随队长", + "wander": "自由行动", + "wandering": "傀儡会自由随机移动", + "modifier": "总计%s个技能,%s个升级", + "craft_material": "傀儡制作材料", + "repair_material": "傀儡修补材料", + "slicing_enemy": "大型傀儡持此斧击杀特定目标时随机掉落一个对应材料的大型傀儡部件", + "slicing_golem": "大型傀儡持此斧击杀非所有者的傀儡时掉落所有部件,且每个升级有%s概率掉落", + "beacon_boots": "对周围的友方施加%s, %s并治疗", + "no_slot": "移除这个升级会导致傀儡升级槽为负", + "remove_template": "扩充模版不可移除", + "disintegrate": "分解傀儡", + "return_items": "分解傀儡并返还下列物品:", + "return_many": "分解傀儡并返还%s个物品", + "fix_first": "分解前请先修复傀儡!", + "sub_ingot": "替换身体时,傀儡的每个扩充模版都需要额外消耗一个身体材料。当前需要:", + "sub_slot": "替换后升级槽为负", + "diff_stat": "属性/技能差异", + "bow_stiffness": "弓强度: %s", + "multi_shot": "可同时射出至多%s支箭", + "bow_pierce": "射出的箭可穿透%s个实体", + "shoulder_weapon": "傀儡肩部装备", + "beacon_cannon": "可发射信标激光造成魔法伤害", + "mechanical_arm": "可使用材料自动修复傀儡。且可被[蒸汽动力]技能加速", + "sonic_cannon": "可发射三道音爆,造成深渊回响伤害", + "sonic_cannon_resonance": "安装幽匿部件的傀儡使用效果更强", + "flamethrower": "根据弹药在如下3种攻击方式中切换:", + "flamethrower_firecharge": " · [火焰弹]可发射火球,命中时产生爆炸", + "flamethrower_flame": " · [烈焰粉]可发射小火球,每个弹药装填16发。支持无限魔咒", + "flamethrower_tnt": " · [TNT]可发射点燃的TNT,命中时产生爆炸", + "shield_break": "破盾武器", + "player_skin_button": "更改皮肤:玩家/贴图(右键点击重置)", + "target": { + "name": "重命名物品,然后拿在手中右键,把物品名字作为实体类型ID/实体类型标签ID加入过滤器", + "remove": "蹲下右键移除最后一行", + "shift": "按SHIFT显示用法", + "type_add": "右键实体把实体类型加入过滤器", + "type_remove": "蹲下右键实体把实体类型从过滤器中移除", + "uuid_add": "右键实体把实体ID加入过滤器", + "uuid_remove": "蹲下右键实体把实体ID从过滤器中移除", + "default": "包含默认铁傀儡攻击目标:除了爬行者以外的所有敌对目标" + } + }, + "wand": { + "mode": "目前模式: %s", + "switch": "使用滚轮或者上下键切换模式", + "right_click": "右键时:", + "shift_click": "蹲下右键时:", + "command_right": "指向傀儡改变行动模式,指向其他目标时,使附近所有的傀儡优先攻击该目标", + "command_shift": "打开傀儡详情界面,配置傀儡装备,查看数值等", + "retrieve_right": "指向远处的一个傀儡,将其回收", + "retrieve_shift": "回收附近所有的傀儡", + "summon_right": "把一个傀儡召唤至指向的远处的方块", + "summon_shift": "召唤背包中所有傀儡", + "rider": "右键一个犬型傀儡以骑在它身上。如果不是你的傀儡,需要傀儡的所有者骑乘时你才能骑乘。在傀儡上右键任意位置取消骑乘", + "config": "右键傀儡设置配置卡,再次右键移除。副手持有时,手杖只对相同配置卡的傀儡生效", + "config_init": "右键初始化配置卡", + "config_other": "这不是你的配置卡,你不能编辑", + "squad": "设置傀儡为当前配置卡的队长。选择队长则取消其队长状态", + "path_record": "右键方块添加路径点,再次右键同方块移除。潜行右键清空。路径点需首尾相连成环", + "add_node": "已添加路径点", + "node_count": "包含%s个路径点", + "remove_node": "已移除路径点", + "clear_node": "已移除所有路径点", + "err_dim": "你不能跨维度添加路径点", + "err_dist": "路径点之间的距离不能超过16格" + }, + "msg": { + "destroy_exp": "%s销毁了%s经验", + "destroy_item": "%s找不到位置存放物品,销毁了%s个物品", + "call_attack": "%s个傀儡将会攻击%s", + "summon_failed": "召唤%s失败,因为目标地点太远", + "summon_far": "将%s召唤于(%s,%s,%s)", + "add_target": "已将%s加入过滤器", + "remove_target": "已将%s移除过滤器" + }, + "config": { + "loading": "加载中...", + "mode": "默认傀儡模式", + "mode_tooltip": "傀儡的被召唤时的默认模式。不影响已经在世界中的傀儡。傀儡被召唤时采用这个模式,而非被回收时的模式", + "no": "无配置卡片", + "pos": "召唤至", + "pos_original": "回收地点", + "pos_original_tooltip": "如果傀儡是被收回的,把傀儡召唤至上次收回的地点。如果傀儡是新做的则不生效。如果上次收回地点太远,则召唤失败", + "pos_target": "指向位置", + "pos_target_tooltip": "把傀儡召唤至玩家指向的地点", + "set": "<-将傀儡放进这里设置配置卡", + "blacklist": "使用黑名单。点击切换至白名单", + "lock": "锁定交互", + "match_item": "匹配物品。点击启用匹配NBT", + "match_tag": "匹配物品和NBT。点击切换至只匹配物品", + "whitelist": "使用白名单。点击切换至黑名单", + "friendly": "友好列表", + "hostile": "主动攻击目标", + "reset": "重置" + }, + "tab": { + "attribute": "傀儡数值", + "equipment": "傀儡装备", + "pickup": "拾取升级过滤器", + "toggle": "通用配置", + "target": "攻击目标过滤器", + "path": "巡逻配置", + "tracker_alive": "世界中的傀儡", + "tracker_dead": "傀儡死亡记录", + "tracker_retrieve": "返回玩家记录", + "upgrades": "傀儡升级", + "disintegrate": "置换/分解" + }, + "slot": { + "main": "主手槽", + "off": "副手槽", + "backup": "副武器槽", + "arrow": "箭矢槽", + "arrow_desc": "可以把箭放在这里供远程武器使用", + "backup_desc": "可以把副武器放在这里", + "backup_info": "如果主手槽和副武器槽分别放置近战和远程武器,傀儡会根据目标的距离灵活切换武器战斗", + "main_desc": "可以放置任意物品", + "main_desc_metal": "可以放置傀儡武器", + "shoulder": "肩部装备槽" + }, + "tracker": { + "alive": "存活", + "dead": "死亡", + "dim": "维度: %s", + "killed": "被%s杀死", + "pos": "位置: (%s,%s,%s)", + "present": "存在于加载区块", + "recycle_dead": "死亡(有回收升级)", + "recycle_killed": "被%s杀死(有回收升级)", + "retrieved": "被回收", + "retrieved_other": "被%s回收", + "time": "在被卸载的区块", + "dimensional": "回到空间背包", + "ender": "回到末影背包", + "inventory": "回到物品栏" + }, + "gui": { + "player_skin": "玩家/贴图皮肤", + "player_skin.confirm": "确认", + "player_skin.cancel": "取消", + "player_skin.hint": "输入玩家名或资源包贴图文件路径" + } }, - "msg": { - "destroy_exp": "%s销毁了%s经验", - "destroy_item": "%s找不到地方放,销毁了%s个物品", - "call_attack": "%s个傀儡将会攻击%s", - "summon_failed": "召唤%s失败,因为目标地点太远", - "summon_far": "将%s召唤于(%s,%s,%s)", - "add_target": "已将%s加入过滤器", - "remove_target": "已将%s移除过滤器" - }, - "config": { - "loading": "加载中...", - "mode": "默认傀儡模式", - "mode_tooltip": "傀儡的被召唤时的默认模式。不影响已经在世界中的傀儡。傀儡被召唤时采用这个模式,而非被回收时的模式", - "no": "无配置卡片", - "pos": "召唤至", - "pos_original": "回收地点", - "pos_original_tooltip": "如果傀儡是被收回的,把傀儡召唤至上次收回的地点。如果傀儡是新做的则不生效。如果上次收回地点太远,则召唤失败", - "pos_target": "指向位置", - "pos_target_tooltip": "把傀儡召唤至玩家指向的地点", - "set": "把傀儡放在这设置卡片", - "blacklist": "使用黑名单。点击切换至白名单", - "lock": "锁定交互", - "match_item": "匹配物品。点击启用匹配NBT", - "match_tag": "匹配物品和NBT。点击切换至只匹配物品", - "whitelist": "使用白名单。点击切换至黑名单", - "friendly": "友好列表", - "hostile": "主动攻击目标", - "reset": "重置" - }, - "tab": { - "attribute": "傀儡数值", - "equipment": "傀儡装备", - "pickup": "拾取升级过滤器", - "toggle": "通用配置", - "target": "攻击目标过滤器", - "path": "巡逻配置" - }, - "slot": { - "main": "主手槽", - "off": "副手槽", - "backup": "第二武器槽", - "arrow": "箭矢槽", - "arrow_desc": "把箭放在这可以腾出副手持盾", - "backup_desc": "把第二把武器放在这", - "backup_info": "如果主手槽和第二武器槽分别持有近战武器和弓,傀儡会根据敌人的距离灵活切换武器战斗", - "main_desc": "在这放武器。当然什么都可以放" - } - }, - "patchouli.modulargolems.landing": "金属傀儡的组装和升级手册", - "patchouli.modulargolems.title": "模块化傀儡", - "curios.identifier.golem_skin": "人形傀儡皮肤" - - + "patchouli.modulargolems.landing": "金属傀儡的组装和升级手册", + "patchouli.modulargolems.title": "傀儡装配", + "curios.identifier.golem_skin": "人形傀儡皮肤", + "curios.identifier.golem_route": "巡逻手册", + "config.jade.plugin_modulargolems.player_skin": "玩家/贴图皮肤", + "top.modulargolems.player_skin": "玩家皮肤: %s", + "top.modulargolems.file_skin": "贴图皮肤: %s" } \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/mowzie.json b/src/test/resources/modulargolems/lang/zh_cn/mowzie.json new file mode 100644 index 000000000..9bd40f9d0 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/mowzie.json @@ -0,0 +1,7 @@ +{ + "golem_material.mowziesmobs.wroughtnaut": "千锻钢", + "item.modulargolems.wroughtnaut": "千锻震升级", + "item.modulargolems.wroughtnaut_ingot": "千锻钢锭", + "modifier.modulargolems.wroughtnaut": "千锻震", + "modifier.modulargolems.wroughtnaut.desc": "可起跳进行下落攻击,落地时向前方扇形区域释放冲击波并造成范围伤害" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/tinker.json b/src/test/resources/modulargolems/lang/zh_cn/tinker.json new file mode 100644 index 000000000..9bd905bbb --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/tinker.json @@ -0,0 +1,17 @@ +{ + "golem_material.tconstruct.amethyst_bronze": "紫水晶青铜", + "golem_material.tconstruct.cobalt": "钴", + "golem_material.tconstruct.hepatizon": "黑色科林斯青铜", + "golem_material.tconstruct.manyullyn": "玛玉灵", + "golem_material.tconstruct.rose_gold": "玫瑰金", + "effect.modulargolems.hepatizon_effect": "重复保护", + "effect.modulargolems.hepatizon_effect.description": "提升傀儡的伤害减免", + "effect.modulargolems.manyullyn_effect": "贪婪", + "effect.modulargolems.manyullyn_effect.description": "提升傀儡的攻击伤害", + "modifier.modulargolems.hepatizon_defense": "重复保护", + "modifier.modulargolems.hepatizon_defense.desc": "受到伤害后,暂时获得伤害减免", + "modifier.modulargolems.manyullyn_attack": "贪婪", + "modifier.modulargolems.manyullyn_attack.desc": "造成伤害后,暂时提升攻击伤害", + "modifier.modulargolems.manyullyn_defense": "动力", + "modifier.modulargolems.manyullyn_defense.desc": "受到伤害后,暂时提升攻击伤害" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/tlm.json b/src/test/resources/modulargolems/lang/zh_cn/tlm.json new file mode 100644 index 000000000..b8a31f0d9 --- /dev/null +++ b/src/test/resources/modulargolems/lang/zh_cn/tlm.json @@ -0,0 +1,8 @@ +{ + "task.modulargolems.summon_golems.condition.has_golem_wand": "主手持有万能手杖", + "task.modulargolems.summon_golems.desc": "女仆会主动召唤傀儡攻击附近的敌对目标", + "task.modulargolems.summon_golems": "傀儡师", + "modulargolems.tooltip.maid_skin_button": "更改皮肤:女仆(右键点击重置)", + "config.jade.plugin_modulargolems.maid_model": "女仆皮肤", + "top.modulargolems.maid_model": "女仆皮肤: %s" +} \ No newline at end of file diff --git a/src/test/resources/modulargolems/lang/zh_cn/twilightforest.json b/src/test/resources/modulargolems/lang/zh_cn/twilightforest.json index fec017999..746171516 100644 --- a/src/test/resources/modulargolems/lang/zh_cn/twilightforest.json +++ b/src/test/resources/modulargolems/lang/zh_cn/twilightforest.json @@ -1,29 +1,48 @@ { - "golem_material.twilightforest": { - "fiery": "炽铁", - "ironwood": "铁木", - "knightmetal": "骑士", - "steeleaf": "钢叶" - }, - "modifier.modulargolems": { - "fiery": "炽热", - "fiery.desc": "对不免疫火焰伤害的生物造成 %s%% 火焰伤害", - "thorn": "荆棘", - "thorn.desc": "反射 %s%% 伤害", - "tf_damage": "暮色伤害加成", - "tf_damage.desc": "在暮色森林里造成%s%%伤害", - "tf_healing": "暮色再生加成", - "tf_healing.desc": "在暮色森林里回复%s%%原本回复量", - "carminite": "砷铅铁升级", - "carminite.desc": "受伤后%s秒内隐身并免疫伤害", - "naga": "娜迦升级" - }, - "item.modulargolems": { - "carminite": "砷铅铁升级", - "fiery": "炽铁升级", - "ironwood": "铁木升级", - "knightmetal": "骑士升级", - "naga": "娜迦升级", - "steeleaf": "钢叶升级" - } + "golem_material.twilightforest": { + "fiery": "炽铁", + "ironwood": "铁木", + "knightmetal": "骑士", + "steeleaf": "钢叶" + }, + "modifier.modulargolems": { + "fiery": "炽热", + "fiery.desc": "对不免疫火焰伤害的目标造成的伤害提升%s%%", + "thorn": "荆棘", + "thorn.desc": "受到直接物理伤害时,对攻击者反弹%s%%的荆棘伤害", + "tf_damage": "暮色伤害加成", + "tf_damage.desc": "在暮色森林中,造成的伤害提升%s%%", + "tf_healing": "暮色再生加成", + "tf_healing.desc": "在暮色森林中,生命值回复提升%s%%", + "carminite": "砷铅铁升级", + "carminite.desc": "受到伤害后,%s秒内隐身并免疫伤害", + "naga": "娜迦升级" + }, + "item.modulargolems": { + "carminite": "砷铅铁升级", + "fiery": "炽铁升级", + "ironwood": "铁木升级", + "knightmetal": "骑士升级", + "naga": "娜迦升级", + "steeleaf": "钢叶升级" + }, + "-cartesian": { + "equipments": { + "path": "item.modulargolems", + "list": [ + { + "ironwood": "铁木", + "knightmetal": "骑士", + "fiery": "炽铁", + "naga": "娜迦" + }, + { + "chestplate": "傀儡胸甲", + "helmet": "傀儡头盔", + "shinguard": "傀儡护腿", + "boots": "傀儡靴子" + } + ] + } + } } \ No newline at end of file