diff --git a/.gitignore b/.gitignore index 504c6801c..6fa41902f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ build # other eclipse +.claude # run # Files from Forge MDK @@ -35,13 +36,20 @@ run/resources/ run/saves/ run/schematics/uploaded run/screenshots/ +run/servers.* +run/mods/ run/fabricloader.log run/options.txt run/usercache.json run/usernamecache.json +run/hs_err_pid*.log +run/imgui.init run/emi.json run/.mixin.out run/gametest run/logs -run/schematics run/server +run/client2 + +# LLM +.claude/* diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..88d9978c4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.compile.nullAnalysis.mode": "disabled" + +} \ No newline at end of file diff --git a/AUDIT_ACTUEL.md b/AUDIT_ACTUEL.md new file mode 100644 index 000000000..051726919 --- /dev/null +++ b/AUDIT_ACTUEL.md @@ -0,0 +1,279 @@ +# Audit consolidé — CreateNuclearForge (branche V2-CorrectifAudit) + +**Réorganisation du 2026-07-12 (HEAD `cc532f83`).** Ce document a été restructuré pour ne conserver dans ses sections principales (§1 à §7) **que les problèmes encore ouverts**. Tout ce qui est corrigé, réfuté ou décidé (produit) a été déplacé en **§8 Mémoire**, avec le hash du commit correspondant quand il a pu être déterminé avec certitude par archéologie Git (`git log -S`, `git show`, `git blame`) — sinon c'est indiqué explicitement, sans hash inventé. + +**Méthodologie de cette réorganisation** : nouvelle relecture complète du code actuel (`src/main/java`, **292 fichiers**, hors `src/generated`/`src/main/resources`), croisée avec `AUDIT_V1.md`, les versions précédentes de ce fichier, et l'historique Git (`git log`, 1437 commits au total sur le dépôt) — aucun des deux audits n'a été pris comme vérité absolue : plusieurs points ont été revérifiés directement dans le code et un point s'est avéré **périmé** (voir §0). + +**Limite de couverture honnête** *(mise à jour 2026-07-18 après spot-check de `B7`/`B10`/`B17`/`B18`)* : sur les quatre bugs mineurs/robustesse d'`AUDIT_V1.md` autrefois marqués « ni confirmés ni infirmés », trois ont maintenant un statut tranché par lecture directe du code — **ne pas répéter cette relecture, le résultat est acté** : +- **B7** (`CNNoiseData.bootstrapRegistries`) — n'est plus un bug : `EROSION` est bien enregistré, la méthode n'est pas commentée. Voir §8.2. +- **B17** (`RodsTooltipHandler`) — n'est pas un bug : la condition de namespace est intentionnelle (commentaire explicite dans le fichier), pas une inversion par erreur. Voir §8.2. +- **B18** (`CNCClient`, clé TOML `screenShaking`) — corrigé, confirmé dans le code (§8.4) ; seul le hash du commit reste indéterminé. +- **B10** (`IrradiatedOverlayRendererVision`) — **reste un vrai bug ouvert**, seul survivant du lot : `mc.gameMode.getPlayerMode()` (l.23) est encore appelé sans garde sur `mc.gameMode`, qui peut être `null` pendant le chargement d'un monde ; le null-check ajouté depuis ne protège que `mc.player`, plus loin dans la méthode. Voir §1 pour le détail et le fix (une ligne). + +**Ce qui manque réellement encore** : la liste « mineurs » **non numérotée** d'`AUDIT_V1.md` §2 (mineurs/robustesse — `ReactorOutputEntity.tick()`, `ReactorInput.mobInteract` retournant `PASS`, `RenderHelper` champs cache jamais lus, etc.) n'a **jamais** été relue dans cette réorganisation et reste entièrement non vérifiée. Par ailleurs, une bonne partie des corrections d'`AUDIT_V1.md` (B1, B2, B4, B5, B9, B13, et l'essentiel des listes de dead code) sont antérieures à la fenêtre de commits explorée en détail (avant le 2026-06-24) : le code actuel confirme qu'elles sont bien appliquées, mais l'archéologie Git n'a pas retrouvé de hash certain pour la majorité d'entre elles — voir §8.4. + +--- + +## 0. Constat global + +Depuis la dernière consolidation (2026-06-28), le projet a continué d'évoluer : retrait de `IrradiatedBiomes.monsters()` (`8b0428e3`), blocage explicite (message "WIP") de l'apprivoisement des mobs irradiés (`261b26d8`), retrait complet de la mécanique de collier teignable jamais câblée (`17b29aa3`), correction de la tautologie `IHeat.isNotDanger` et ajout d'une hystérésis sur le heat appliqué aux sorties (`fb0897d3`, `a18038db`), guard NBT sur `ReactorFrameDisplayManager.write` (`381c7a5f`), déduplication complète de `drawGauge` via `ReactorGaugeRenderer`/`AbstractReactorStatDisplaySource` (`35e474e3`, `d0da13d1`, `a8b6b23f`), traduction en anglais des scènes Ponder (`3be6252a`), et — le jour même de cette réorganisation — remplacement de la sentinelle de taille/accès positionnels fragiles de `ReactorSummaryDisplaySource` par un `record ReactorSummary` typé (`cc532f83`), qui clôt du même coup le dernier commentaire français de ce fichier. Détail de chaque correction en §8.1. + +**Point périmé trouvé lors de cette réorganisation** : l'item « Flicker vitesse de sortie en fin de ressources » était encore documenté en §1 comme un bug entièrement ouvert, proposant comme correction l'ajout d'un champ `lastAppliedOutputHeat` avec hystérésis sur `RPM_DIVIDER/2. **Cette correction a en réalité déjà été appliquée** par le commit `a18038db` (2026-07-05) — vérifié par lecture directe : `ReactorControllerBlockEntity.java:62` (champ `lastAppliedOutputHeat`), `:430-433` (comparaison au seuil et appel à `rotateOutputs` avec la valeur bufferisée). Le commit lui-même documente que le point reste partiellement ouvert : l'oscillateur `overHeat` sous-jacent (+1/-2 par tick) n'est pas supprimé, seul son symptôme visible (flicker RPM) est amorti, et le seuil de l'hystérésis n'a pas été validé en jeu. L'item est donc reclassé en §1 comme **partiellement résolu, validation en jeu restante** plutôt que comme bug non traité — voir §1. + +**Nouveau point d'audit ajouté** : qualité et langue de la documentation du code (Javadoc, commentaires, noms de symboles) — voir §6. Un premier signal existait déjà dans `AUDIT_V1.md` §5 (« commentaires FR/EN mêlés ») mais n'avait jamais été centralisé ni suivi comme item d'audit à part entière. + +**Mise à jour post-réorganisation (2026-07-13)** : première entame concrète de la dette de tests recommandée en priorité 1 du §7. Deux suites `GameTest` (sous `src/main/java/.../gametest/`, pas `src/test`) ont été ajoutées : `ReactorInputFluidManagerGameTest` (`200df62f`, antérieur à cette réorganisation mais jamais documenté ici — omission corrigée maintenant) et `DefaultHeatCalculatorGameTest` (`498f9dc6`). Cette dernière a été écrite après un aller-retour méthodologique instructif : une première tentative en JUnit pur + Mockito (mocker `Item`/`ItemStack`/`Level`) a été rejetée — Mockito doit exécuter le vrai bloc d'initialisation statique de ces classes Minecraft pour construire le proxy, et celui-ci échoue hors d'un jeu réellement démarré (`MockitoException: Cannot instrument class net.minecraft.world.item.Item ... could not be initialized`), ce qui **confirme empiriquement** pourquoi ce projet doit s'appuyer sur `GameTest` plutôt que sur du JUnit isolé pour tout ce qui touche aux types Minecraft/Forge. Détail en §8.1. + +La dette la plus structurelle reste **l'absence de tests sur la majorité du code** (`src/test` toujours vide — la mécanique JUnit classique n'est pas utilisable ici, voir ci-dessus — et seuls deux composants ont une suite `GameTest`) — précisément là où des bugs/incohérences silencieux (sur-extraction fluide, ex-tautologie `IHeat`, scan non court-circuité, doc devenue obsolète sans que personne ne le remarque) survivent à plusieurs passes d'audit. Le pattern matcher (`ReactorPattern`/`CNMultiblock`) et `PersistentFluidLocks` restent entièrement sans couverture. Voir §3 et §7. + +**Mise à jour (`ae1e394d`, 2026-07-13)** : nettoyage de trois points du §4/§7 en une seule fois — retrait complet des références commentées à la propriété `SPEED` de `ReactorOutput` (§4/§7 item 7, désormais clos), retrait de `BLUE_ICE` et de `addDefaultSoftDisks()`/`VOID_START_PLATFORM` d'`IrradiatedBiomes` (§4 « worldgen irradié », alors partiellement clos), et suppression de `OriginalBiomeLookup.java`, une classe de résolution de biome jamais appelée qui n'avait encore jamais été repérée par cet audit. Détail en §8.1. + +**Mise à jour (`6bc20956`, 2026-07-13)** : suite immédiate de la précédente — retrait de `NETHER_CAVE` (dernier contenu vanilla sans rapport identifié dans `IrradiatedBiomes`, via la suppression de `addDefaultIrradiatedOres()` et de son unique site d'appel), régénération de `irradiated_land.json` (bloc `carvers` désormais vide). **L'item « worldgen irradié » du §4/§7 est donc maintenant entièrement clos** ; seul reste `CNNoiseGeneratorSettings.java:25` (bloc de remplissage `STEEL_BLOCK`) côté §4. Détail en §8.1. + +**Mise à jour (`e7900959`, 2026-07-13)** : deux items de plus tranchés. (1) `CreateNuclearJEI` : le champ statique mutable `Categories` (§2 mineurs item 5) devient un champ d'instance `allCategories`, enfilé explicitement dans `CategoryBuilder` — le risque de contamination entre instances lors d'un reload JEI est éliminé ; au passage, `IJeiRuntime` est désormais exposé via `onRuntimeAvailable`. (2) Le `FIXME` de `CNStandardRecipeGen.java:226` (§4/§6/§7) est tranché : retiré, décision actée que les catégories de recette restent des marqueurs plutôt que des sections. Détail en §8.1. + +**Mise à jour (`9e8abe92`, 2026-07-14)** : traduction en anglais des 9 des 10 fichiers restants du §6 (items 6, 7, 8, 10, 11, 12, 13, 14, plus l'essentiel de 5 — `CNFluids.java` traduit en intégralité). Seul l'item 9 (`NuclearExplosionEntity.java:45,50`, compat Alex's Caves) reste ouvert, non touché par ce commit. Au passage, un fichier jusque-là non repéré par cet audit a été trouvé avec un commentaire français résiduel : `CNEntityType.java:76`. Détail en §6 et §8.1. + +**Mise à jour (2026-07-14, pas de commit — décision documentaire seule)** : le point §2.4/§7 priorité 5 (« harmoniser le mode d'affichage du heat de `ReactorSummaryDisplaySource` avec `HeatDisplaySource` ») est **réfuté et clos** après analyse approfondie — ce n'est pas une incohérence mais un choix de design volontaire du widget de synthèse (`fluid` et `heat` en jauge par défaut car plus lisibles en vue d'ensemble, `fuel`/`cooler` en texte), sans rapport avec le mode par défaut de l'affichage individuel `HeatDisplaySource`. Détail complet en §8.2. + +**Mise à jour (2026-07-14, pas de commit — décision documentaire seule)** : le point §3/§7 item 9 (« `RadiationCapability.tickRadiation` pour les `LivingEntity` non-joueurs : pas de dirty-check d'inventaire ») est **analysé en détail et le statu quo est confirmé** — le scan mob (6 slots, lookups `HashMap` O(1) via `RadiationRegistry`) est trop petit pour qu'un hash façon joueur (41 slots) soit rentable ; le reste de `tickRadiation` (biome, attribut, `MobEffectInstance`) domine probablement le coût par mob de toute façon. Détail complet en §8.2. + +**Mise à jour (`eeffe4fe`, 2026-07-14)** : les 2 derniers fichiers du §6 sont traduits — `NuclearExplosionEntity.java` (commentaires de compat Alex's Caves : typage `Object` du handler, instanciation conditionnelle, immunité Raycat/Tremorzilla, et clarification du commentaire déjà anglais mais devenu incohérent sur `destroyBlock`) et `CNEntityType.java` (commentaire sur le renderer no-op de l'entité d'explosion, reformulé pour expliquer que c'est la particule qui fait le rendu visuel). **Confirmé par grep sur tout `src/main/java` (292 fichiers) : plus aucun caractère accentué français, §6 est intégralement clos.** Détail en §6 et §8.1. + +**Mise à jour (`691dfb13`, 2026-07-26 — suite à une comparaison ligne à ligne avec le calculateur communautaire du wiki et le cahier des charges de balance)** : trois points de `DefaultHeatCalculator`/`DefaultOverheatController` touchés en un seul commit : +1. **Lecture du pattern simplifiée** : `computeHeat` lit désormais le pattern via `ReactorBluePrintItem.getItemStorage(...)` (un `ItemStackHandler`) au lieu de reparser manuellement les tags NBT bruts `"pattern"`/`"Items"` — supprime une désérialisation dupliquée, aligne sur l'accesseur déjà utilisé par `PatternReader` et les fixtures `GameTest`. +2. **Plancher à 0 ajouté** : `return Math.max(0, heat + overHeat);` — la chaleur ne peut plus devenir négative (elle le pouvait avant, contrairement au calculateur de référence qui applique `Math.max(0, totalHeat)`). +3. **`ReactorFluidType.maxHeat()` n'est plus un champ mort** : un paramètre `previousHeat`/`currentHeat` a été enfilé dans toute la chaîne (`IHeatService`, `DefaultHeatService`, `HeatManager`, `IOverheatController`, `DefaultOverheatController`, `IReactorHeatUpdateCoordinator`, `ReactorHeatUpdateCoordinator`, `ReactorControllerBlockEntity`) pour que `DefaultOverheatController` déclenche la dérive de `overHeat` dès que la chaleur dépasse le `maxHeat` du fluide actif, en plus des conditions préexistantes (pénurie de fluide, ratio de chaleur positif). + +**Asymétrie fuel/cooler corrigée (2026-07-26, pas encore commitée séparément au moment de cette réorganisation) :** la branche cooler de `DefaultHeatCalculator.computeHeat` scanne désormais ses propres voisins fuel — `TypeRodPredicate.isCooled(rod) && TypeRodPredicate.isFuel(neighborRod)` → `heat += neighborRod.baseRodHeat() × rod.proximityRodHeat()`, conforme au cahier des charges externe (« Graphite extra: -1/4Q **of the heating rod** ») et au calculateur JS de référence. Vérifié sur un exemple concret (pattern `[G,T,G]/[T,U,T]/[G,T,G]`) : `128` des deux côtés (calculateur JS et jeu). Reste à faire : `DefaultHeatCalculatorGameTest` (§3) n'a pas encore été mis à jour et continue d'asserter l'ancien comportement (division) — le test doit être réécrit pour matcher la formule actuelle avant de pouvoir clore ce point. + +--- + +## 1. 🐛 Bugs confirmés ouverts + +| Réf. | Fichier:ligne | Gravité | Détail (revérifié 2026-07-12) | +|---|---|---|---| +| **ReactorInputFluidManager — sur-extraction** | `controller/manager/ReactorInputFluidManager.java:137-155` | 🟠 | `fluidNeeded` (paramètre de `extractFluids`) n'est **toujours jamais décrémenté** entre handlers (l.146-151) → chaque handler de la boucle tente d'extraire le besoin complet, sur-extraction possible avec plusieurs inputs. `if (toExtract > 1)` (l.147) ignore toujours les extractions de 1 unité. **Détail supplémentaire trouvé cette revue** : la garde `if (fluidNeeded <= 0) break;` (l.151) est **du code mort** — `fluidNeeded` n'étant jamais réassigné dans la boucle, cette condition ne peut être vraie que si le paramètre est déjà ≤ 0 en entrée. Toléré aujourd'hui (tank mono-slot en pratique), reste une violation de contrat latente. | +| **Flicker vitesse de sortie en fin de ressources — partiellement corrigé, validation en jeu restante** *(reclassé le 2026-07-12, code de correction déjà présent depuis `a18038db`, 2026-07-05)* | `content/multiblock/reactorLogic/DefaultOverheatController.java:13-30` + `controller/ReactorControllerBlockEntity.java:430-433` | 🟡 | `overHeat` continue de s'incrémenter de `+1`/`-2` à un rythme régulier, indépendamment du réapprovisionnement — l'oscillateur de base n'a **pas** été supprimé. Mais son symptôme (bascule de vitesse de sortie entre `0` et `X`) est désormais amorti : `ReactorControllerBlockEntity` ne réapplique `rotateOutputs` que si `\|heat - lastAppliedOutputHeat\| >= RPM_DIVIDER/2` (code vérifié présent). **Reste ouvert** : (1) valider en jeu que ce seuil élimine réellement la perception du flicker en fin de ressources (le commit d'origine le signale lui-même comme non validé) ; (2) décider si l'oscillateur `overHeat` doit être revu à la racine ou si l'hystérésis en aval suffit durablement. | +| **`IrradiatedOverlayRendererVision` — NPE potentielle sur `mc.gameMode`** *(ex-`B10` d'`AUDIT_V1.md`, spot-check 2026-07-18)* | `foundation/events/overlay/IrradiatedOverlayRendererVision.java:23` | 🟡 | `GameType playerMode = mc.gameMode.getPlayerMode();` est appelé **sans garde** sur `mc.gameMode`, qui peut être `null` (écran de chargement, entre la déconnexion et la reconnexion). Le null-check sur `mc.player` a bien été ajouté depuis (l.31, `if (localPlayer == null) return;`), mais **après** l'accès à `mc.gameMode` — donc partiellement corrigé seulement. Fix trivial : ajouter `if (mc.gameMode == null) return;` avant la ligne 23. | +--- + +## 2. 🆕 Autres problèmes ouverts (hors radiation, hors documentation) + +### 🟠 Important — performance résiduelle du scan multiblock + +1. **Scan géométrique du contrôleur : court-circuit incomplet (`findController`)** — **seul sous-point encore ouvert de ce chantier** (garde client-side et double scan à la casse : corrigés, voir §8.1). + `ReactorPattern` n'a qu'**une seule** boucle de scan partagée (`scanControllerCandidates`, `ReactorPattern.java:40-56`) sur ~3971 positions (`y∈[-5,+5]`, `x,z∈[-9,+9]`), filtrée par `isInReactorRange`. Le court-circuit (`return true` dans le visiteur dès qu'un contrôleur pertinent est trouvé) n'existe que dans **`findControllerPos`** (`ReactorPattern.java:73-94`, utilisé par `MultiblockHelpers` → `ReactorOutput`/`ReactorRodInput`/`ReactorFluidInput`/`ReactorAlarm`). **`findController`** (`ReactorPattern.java:58-71`, revérifié 2026-07-12 : le visiteur retourne toujours `false` l.69), appelé **directement** par `ReactorCasing.java`, `ReactorCooler.java` et `ReactorFrame.java`, continue de parcourir les ~3971 positions restantes même après avoir traité le contrôleur pertinent. `ReactorCasing` étant le bloc le plus posé/cassé (coque du réacteur), c'est le chemin le plus chaud du projet et il n'est **toujours pas** optimisé. + Fix trivial inchangé : faire retourner `inRange` au lieu de `false` dans le visiteur de `findController`, comme c'est déjà fait dans `findControllerPos`. **Reste la priorité n°1 du projet** (perf uniquement désormais, plus une question de correction — voir §7). + - **Point résiduel mineur, non corrigé, non confirmé comme bug** : `ReactorOutput` (propriété `DIR`) et `ReactorFluidInput` (propriété `FACING`) ont une propriété mutable mais leur `onRemove` n'a pas la garde `!state.is(newState.getBlock())` présente sur `ReactorAlarm`/`ReactorFrame`. Aucun chemin connu ne change `DIR`/`FACING` via `setBlock` sans remplacer le bloc, mais à surveiller si une interaction clé/wrench déclenche un jour un retrait/réenregistrement non désiré. + +### 🟠 Importants + +2. ~~`DefaultHeatCalculator.computeHeat` — asymétrie fuel/cooler~~ — **résolu** (2026-07-26, comparaison avec le cahier des charges/calculateur JS du wiki) : le cooler scanne désormais ses propres voisins fuel (symétrique au fuel), avec `TypeRodPredicate.isCooled(rod) && TypeRodPredicate.isFuel(neighborRod)` → `heat += neighborRod.baseRodHeat() × rod.proximityRodHeat()`, conforme au ratio -1/4 du cahier des charges (« Graphite extra: -1/4Q of the heating rod ») et déjà présent en config (`graphiteProximityMalus=-0.25`). Vérifié sur le pattern `[G,T,G]/[T,U,T]/[G,T,G]` : `128` des deux côtés (JS et Java). ~~**Boucle O(81) de recherche de position**~~ — **résolu** (`37613d8b`, 2026-07-26) : voir §8.1. + - `DefaultHeatCalculatorGameTest` (§3) mis à jour en conséquence : le test 3 (`fuelCoolerMix_coolerScansItsOwnFuelNeighborsSymmetrically`) asserte désormais la formule actuelle, et un nouveau test 4 (`threeByThreeDiamond_matchesWikiCalculatorReferenceValue`) vérifie un pattern 3×3 complet contre la valeur de référence du calculateur JS du wiki (`128` avec la balance par défaut). + +3. ~~`ReactorSummaryDisplaySource` — sentinelle de taille + accès positionnel fragiles~~ — **résolu**, voir §8.1 (`cc532f83`). + +4. ~~`ReactorSummaryDisplaySource.formatValue` — incohérence de mode~~ — **réfuté, clos sans code** (2026-07-14) : voir §8.2. + +### 🟡 Mineurs + +5. ~~**`CreateNuclearJEI`** — champ statique mutable `Categories`~~ — **résolu** (`e7900959`, 2026-07-13) : converti en champ d'instance `allCategories`, enfilé explicitement dans `CategoryBuilder`. Voir §8.1. +6. **`CNPonderReactorScenes.showReactorStructure`** — boucle triple (~11×13×13) avec comparaisons positionnelles ; coût ponctuel (ouverture ponder), remplaçable par une `Map` précalculée. + +### ⏸️ Worldgen minerais — écarts relevés, **mis en attente à la demande de l'utilisateur (2026-07-25), à trancher plus tard** + +7. **Nitrate Ore — mécanisme de drop incohérent avec Thorium/Uranium** ([nitrate_ore.json](src/generated/resources/data/createnuclear/loot_tables/blocks/nitrate_ore.json)) : utilise la formule vanilla `minecraft:ore_drops` (bonus probabiliste façon charbon/diamant, count de base implicite = 1) alors que Thorium et Uranium utilisent `set_count` (min/max explicite) + `uniform_bonus_count` (`bonusMultiplier` fixe). Pas forcément un bug — peut être volontaire — mais rupture de pattern à trancher : soit harmoniser Nitrate sur le même système, soit documenter que c'est intentionnel. + +--- + +## 3. 🏗️ Architecture — points encore ouverts + +| Point | État (revérifié 2026-07-13) | +|---|---| +| **`src/test`** | ❌ **Toujours vide** — confirmé, 0 fichier `.java` sous `src/test`. Sans objet ici : les types Minecraft/Forge (`Item`, `ItemStack`, `Level`, registres du mod) ne s'initialisent pas hors d'un jeu démarré (confirmé empiriquement en tentant de les mocker via Mockito, voir §0/§8.1), donc la couverture de ce projet passe nécessairement par `GameTest`, pas par du JUnit isolé sous `src/test`. | +| **Couverture `GameTest` (`src/main/java/.../gametest/`)** | 🟡 **Partielle, 2 composants sur 4 couverts** — `ReactorInputFluidManager` (`200df62f`) et `DefaultHeatCalculator.computeHeat` (`498f9dc6`, mis à jour le 2026-07-26 : le test 3 a été réécrit en `fuelCoolerMix_coolerScansItsOwnFuelNeighborsSymmetrically` pour matcher la formule actuelle, et un test 4 `threeByThreeDiamond_matchesWikiCalculatorReferenceValue` a été ajouté, vérifiant un pattern 3×3 complet contre la valeur de référence du calculateur JS du wiki) ont une suite dédiée. Le pattern matcher (`ReactorPattern`/`CNMultiblock`, §2.1) et `PersistentFluidLocks` (§8.2) restent **entièrement sans test** — ce sont les deux items restants de la priorité 1 du §7. | +| **`ReactorFluidType.maxHeat()`** | ~~Champ mort côté logique métier~~ — **n'est plus mort** depuis `691dfb13` : consommé par `DefaultOverheatController.updateState` (via le nouveau paramètre `currentHeat`/`previousHeat` enfilé depuis `ReactorControllerBlockEntity`) pour déclencher la dérive de surchauffe dès que la chaleur dépasse le seuil du fluide actif, comportement demandé par le cahier des charges externe (« if HEAT > MAX HEAT of the liquid : as if it has no liquid »). `nitrogen`/`water` gardent leurs valeurs `8196`/`2048` (confirmées conformes au cahier des charges, pas des coquilles). | +| **`RadiationCapability.tickRadiation` pour `LivingEntity` non-joueurs** | ⚠️ **Statu quo recommandé, pas un bug** — recalcule `computeItemRadiation` à chaque tick sans dirty-check (le hash d'inventaire existant, `InventoryHashUtil`, ne couvre que le joueur). Compromis assumé explicitement dans le commit `9ded502c` (« no equivalent inventory to diff against »), et **réévalué en détail le 2026-07-14 sans changement de code** — analyse complète en §8.2. Résumé : le scan mob ne porte que sur 6 stacks (`getArmorSlots()` + main + offhand), résolus par de simples lookups `HashMap` dans `RadiationRegistry`, contre 41 slots hashés côté joueur ; recalculer un hash sur seulement 6 slots coûterait à peu près autant que le calcul direct qu'il est censé éviter, donc reproduire la technique du joueur n'apporterait aucun gain net. Le reste de `tickRadiation` (résolution de biome, lecture d'attribut, gestion de `MobEffectInstance`) s'exécute de toute façon inconditionnellement à chaque tick pour chaque `LivingEntity`, dirty-check ou non — cette boucle de 6 lookups n'est donc probablement pas le poste dominant du coût par mob. À reconsidérer **uniquement** si un profiling réel identifie cette boucle comme point chaud (ex. `IRadiationSource` tiers coûteux, ou densité extrême de mobs équipés) — dans ce cas la piste recommandée n'est pas un hash mais une invalidation événementielle (`LivingEquipmentChangeEvent`), seule approche qui changerait réellement l'ordre de grandeur du coût amorti. | + +*(Les autres affirmations historiques de cette table — inversion `api/`, deux frameworks multiblock concurrents, god class `ReactorControllerBlockEntity`, coordinateur de verrou fluide dédié — ont toutes été réfutées ou closes ; voir §8.2.)* + +--- + +## 4. 🧹 Dead code & features inachevées — reste à faire + +> **⚠️ Faux positifs à NE PAS supprimer** : `CNTabulaModelRenderUtils` (rendu vivant du champignon atomique) ; `ReactorOutputEntity.outputPos` (lu/écrit en NBT) ; `setRotateAngle` (appelé par `NuclearMushroomCloudModel`). + +**Code commencé puis abandonné (hygiène de fin de PR)** +- ~~`content/multiblock/output/ReactorOutput.java` — propriété `SPEED` toujours entièrement commentée~~ — **résolu** (`ae1e394d`, 2026-07-13) : les références commentées (`//builder.add(SPEED);`, `/*.setValue(SPEED, 0)*/`) ont été retirées, voir §8.1. +- ~~`foundation/data/recipe/CNStandardRecipeGen.java:226` — `// FIXME 5.1 refactor - recipe categories as markers...`~~ — **résolu** (`e7900959`, 2026-07-13) : commentaire retiré, décision actée que les catégories de recette restent des marqueurs plutôt que des sections. Voir §8.1. + +**Worldgen « irradié » — template non terminé** +- ~~`IrradiatedBiomes.java` ajoutait du contenu vanilla sans rapport (`BLUE_ICE`, `NETHER_CAVE`, `VOID_START_PLATFORM`)~~ — **résolu** (`ae1e394d` puis `6bc20956`, 2026-07-13) : les trois ont été retirés (dont `addDefaultIrradiatedOres()`/`addDefaultSoftDisks()` et leurs sites d'appel), `irradiated_land.json` régénéré avec un bloc `carvers` vide. Le fichier ne référence plus que ses propres effets de biome (couleurs, sons, particules). Voir §8.1. +- `CNNoiseGeneratorSettings.java:25` utilise toujours `STEEL_BLOCK` comme bloc de remplissage par défaut du biome irradié — seul point restant de cet item. +- **Point trouvé lors de cette mise à jour, non corrigé** : `IrradiatedBiomes.java:5,6,10` — les imports `Carvers`, `MiscOverworldPlacements` et `GenerationStep` sont devenus morts suite au retrait de leurs derniers usages par `6bc20956` (confirmé par grep : plus aucune référence dans le fichier). Trivial, à nettoyer au prochain passage. + +*(Le dead code pur déjà retiré — `SimpleMultiBlockPattern.test()`, `IrradiatedBiomes.monsters()`, le nettoyage de `PlayerInteractReactorFluidInput`, les fichiers de debug `run/`, la mécanique de collier teignable, `OriginalBiomeLookup.java` — est en §8.1/§8.3 avec ses hash.)* + +--- + +## 5. ⚡ Performance — synthèse des points ouverts + +| Point | État | Réf. | +|---|---|---| +| `ReactorPattern.findController` (Casing/Cooler/Frame) : **ne court-circuite jamais**, scanne ~3971 positions à chaque pose/casse même après avoir trouvé le contrôleur | ❌ **non corrigé** — chemin le plus chaud, dernier point ouvert du chantier scan multiblock | §2.1 | +| `DefaultHeatCalculator.computeHeat` : neighbor lookup en O(1) (`NEIGHBORS_BY_SLOT`, `37613d8b`) | ✅ **corrigé, clos** | §2.2/§8.1 | + +*(`findControllerPos`, la garde `isClientSide`, le double scan à la casse, et `clearLockIfAllInputsEmpty` sont déjà sains/corrigés — voir §8.1/§8.2.)* + +--- + +## 6. 📝 Documentation — langue et clarté du code (nouveau point d'audit, 2026-07-12) + +**Périmètre** : `src/main/java` (292 fichiers), recherche des commentaires/Javadoc non rédigés en anglais et des cas ambigus/incomplets indépendamment de la langue. Méthodologie : recherche par caractères accentués + vocabulaire français typique des commentaires, puis lecture manuelle des occurrences trouvées. + +**Décompte global** *(mis à jour 2026-07-14, commit `eeffe4fe`)* : **0 fichier sur 292** ne contient plus de français détectable. **Item entièrement clos** — confirmé par grep sur caractères accentués français, sur tout `src/main/java`, 2026-07-14 : zéro résultat. Aucun symbole de code (nom de classe, méthode, champ) n'avait de toute façon jamais été trouvé en français — le problème était localisé aux commentaires/Javadoc, désormais traités. + +**Historique de la résolution** (du plus ancien au plus récent) : +- Les 4 cas de Javadoc public bilingue, seul sous-item classé 🟢 prioritaire au tour précédent, ont été traduits en intégralité (commit `3be6252a`, *"style: translate French comments and Javadoc to English in VicinityEffect and CNPonderReactorScenes"*) : + - `content/effects/VicinityEffect.java:53-57` — Javadoc de `onContaminate(LivingEntity)` entièrement repassée en anglais. + - `infrastructure/ponder/scenes/CNPonderReactorScenes.java` — fichier intégralement traduit : Javadoc de `Positions` (l.32), de `STATIC_POS` (l.50, reformulée en documentation stable plutôt qu'en note à soi-même) et de `positionsFor` (l.85), plus tous les commentaires inline restants (pedestal, exemples T1/T2/T3, fallback, positions devant/derrière/droite). Ce fichier ne contient plus aucun français. +- Les 3 commentaires français de garde défensive (« Sécurité Triple-Check ») de `content/redstone/displayLink/source/ReactorSummaryDisplaySource.java:51,75,114` (ex-item 9) ont disparu avec le refactor `ReactorSummary` (commit `cc532f83`) : le fichier a été réécrit avec un Javadoc anglais complet sur la classe et chacune de ses méthodes publiques/privées, et ne contient plus aucun français. +- **9 fichiers traduits par `9e8abe92` (2026-07-14)** : `CNFluids.java` (commentaires uranium/azote liquide/thorium, dont la compensation de désync gel/dégel), `ClientEvents.java` (Javadoc tick handling + tremblement de caméra, reformulés plutôt que simplement traduits), `foundation/mixin/RadiationHeartMixin.java`, `foundation/mixin/CameraAccessor.java`, `foundation/mixin/GameRendererMixin.java`, `content/decoration/palettes/PalettesVariantEntry.java` (le commentaire français hébergeait en fait un bloc `if` mort — supprimé plutôt que traduit), `content/equipment/armor/AntiRadiationArmorItem.java`, `content/redstone/displayLink/source/ReactorSizeDisplaySource.java`, `infrastructure/worldgen/biome/IrradiatedBiomes.java` (5 commentaires de couleurs de biome). +- **Les 2 derniers fichiers traduits par `eeffe4fe` (2026-07-14)** : `content/explosion/NuclearExplosionEntity.java` (compat Alex's Caves — typage `Object` du handler pour éviter une dépendance dure au classpath du mod, instanciation conditionnelle, immunité Raycat/Tremorzilla ; au passage, un commentaire déjà en anglais mais devenu incohérent — décrivait un paramètre `false` alors que le code appelait `destroyBlock(pos, true)` — a été réécrit pour décrire fidèlement le comportement actuel) et `CNEntityType.java:76` (commentaire sur le renderer no-op de l'entité d'explosion, reformulé pour expliquer que c'est la particule de champignon atomique qui fait le rendu visuel, pas le renderer). + +Tous ces fichiers sont déplacés dans la table de §8.1. + +**Ambiguïtés/incomplétudes indépendantes de la langue relevées au passage** : +- ~~`CNPonderReactorScenes.java:50,90`~~ — **résolu** (`3be6252a`) : les deux Javadoc ont été reformulées en documentation stable en même temps que leur traduction (voir ci-dessus). +- ~~`ReactorOutput.java` (§4) — propriété `SPEED` commentée sans décision documentée~~ — **résolu** (`ae1e394d`, 2026-07-13) : les références commentées ont été retirées (revérifié par grep, plus aucune trace de `SPEED` dans le fichier), voir §4/§8.1. +- ~~`CNStandardRecipeGen.java:226` (§4) — `FIXME` en anglais mais sans contexte suffisant pour un tiers~~ — **résolu** (`e7900959`, 2026-07-13), voir §4/§8.1. + +**Pattern récurrent** : le point « commentaires FR/EN mêlés » déjà signalé dans `AUDIT_V1.md` §5 (sans jamais être suivi comme item séparé) **est désormais entièrement clos** — plus aucun fichier de `src/main/java` ne contient de français. Le sous-ensemble concerné est passé de 14 fichiers (premier décompte de ce document) à 0, en plusieurs vagues (`3be6252a`, `cc532f83`, `9e8abe92`, `eeffe4fe`). + +**Priorité recommandée** : ✅ **clos.** Aucun symbole d'API n'a jamais été en français, donc aucun impact sur la lisibilité des signatures n'a jamais existé pour un contributeur externe. **Suivi** : à re-scanner ponctuellement (grep accents sur `src/main/java`) si un doute apparaît sur un futur commit, mais aucune action de fond restante. + +--- + +## 7. 🗺️ Feuille de route — priorités justifiées + +Classement par catégorie et impact, du plus important au plus cosmétique. Chaque item renvoie à sa section de détail. + +**1. Dette technique structurelle (racine des bugs silencieux récurrents)** +- ~~`DefaultHeatCalculator`~~ — **fait**, `GameTest` ajoutée (`498f9dc6`, voir §3/§8.1). `ReactorInputFluidManager` avait déjà sa suite (`200df62f`, jusqu'ici non documentée dans cet audit). **Reste** : le pattern matcher (`ReactorPattern`/`CNMultiblock`) et `PersistentFluidLocks` (§3). **Justification** : c'est la cause profonde identifiée à travers *tous* les tours d'audit successifs — sur-extraction fluide, tautologie `IHeat`, scan non court-circuité, et une section d'audit devenue obsolète sans que personne ne s'en aperçoive (§0) sont tous des symptômes du même problème : rien ne vérifie automatiquement le comportement. C'est l'investissement qui a le plus gros effet de levier sur la fiabilité future, mais c'est aussi le plus long — d'où la priorité 1 malgré l'absence d'urgence immédiate. Deux composants sur quatre sont maintenant couverts. + +**2. Optimisation — chemin le plus chaud du projet** +- `ReactorPattern.findController` : faire retourner `inRange` au lieu de `false` dans le visiteur, pour court-circuiter comme `findControllerPos` le fait déjà (§2.1, §5). **Justification** : fix d'une ligne, risque quasi nul, et c'est le chemin appelé par le bloc le plus posé/cassé du jeu (`ReactorCasing`). Rapport gain/effort le plus élevé du projet — reste la priorité n°1 « quick win » malgré son classement en position 2 ici (juste après la dette de tests, qui est stratégiquement plus importante mais bien plus longue à traiter). + +**3. Bug fonctionnel latent — robustesse d'un contrat interne** +- `ReactorInputFluidManager` : décrémenter `fluidNeeded` entre handlers, gérer `toExtract == 1`, retirer la garde morte `fluidNeeded <= 0` (§1). **Justification** : viole silencieusement le contrat d'extraction ; toléré aujourd'hui uniquement parce que la configuration actuelle (tank mono-slot) masque le symptôme — un futur ajout de multi-input fluide le ferait resurgir sans avertissement. + +**4. Validation en jeu — correction déjà codée** +- Flicker de vitesse de sortie : valider en jeu que le seuil d'hystérésis (`RPM_DIVIDER/2`, déjà implémenté par `a18038db`) supprime bien la perception du flicker en fin de ressources (§1). **Justification** : le code est déjà en place, il ne reste qu'une validation de gameplay — priorité basse en effort mais à ne pas oublier, sinon le point restera indéfiniment « à moitié fait » dans la mémoire du projet. + +**5. Amélioration de conception / cohérence UX** +- ~~`ReactorSummaryDisplaySource.formatValue` : harmoniser le mode d'affichage du heat avec `HeatDisplaySource`~~ — **réfuté, clos sans code** (2026-07-14) : voir §8.2. +- ~~`ReactorSummaryDisplaySource` : remplacer l'accès positionnel fragile~~ — **fait**, voir §8.1 (`cc532f83`). + +**6. Optimisation mineure (gain faible, risque nul)** +- ~~`DefaultHeatCalculator` : précalculer une map slot→position pour éliminer la boucle O(81) restante~~ — **fait**, commit `37613d8b` (§2.2/§8.1) : `NEIGHBORS_BY_SLOT` (`Map>`) précalculée une fois via `buildNeighborsBySlot()`, `computeHeat` fait désormais un lookup direct au lieu de rescanner les 81 cellules de la grille par rod. +- `CNPonderReactorScenes.showReactorStructure` : remplacer la boucle triple par une map précalculée (§2.6). Coût ponctuel (ouverture d'un ponder), gain marginal. + +**7. Nettoyage / décisions produit à trancher** +- ~~`ReactorOutput.SPEED` : retirer les commentaires ou décider de réactiver la propriété~~ — **fait**, commit `ae1e394d` (§4/§8.1). +- ~~`CNStandardRecipeGen.java:226` : trancher le `FIXME` sur les catégories de recette~~ — **fait**, commit `e7900959` (§4/§8.1). +- ~~Worldgen « irradié » : retirer le contenu vanilla sans rapport (`BLUE_ICE`, `NETHER_CAVE`, `VOID_START_PLATFORM`)~~ — **fait**, commits `ae1e394d` puis `6bc20956` (§4/§8.1). Reste : choisir un bloc de remplissage cohérent à la place de `STEEL_BLOCK` dans `CNNoiseGeneratorSettings.java:25` (§4). **Justification** : n'affecte que la cohérence thématique du biome, pas de risque technique. + +**8. Documentation (nouveau, §6)** +- ~~Traduire en anglais les 4 cas de Javadoc public bilingue (`VicinityEffect.java`, `CNPonderReactorScenes.java` ×3)~~ — **fait**, commit `3be6252a`. +- ~~Traduire/documenter en anglais les 3 commentaires de garde défensive de `ReactorSummaryDisplaySource`~~ — **fait**, commit `cc532f83` (Javadoc anglais complet ajouté sur la classe et ses méthodes en même temps que le refactor `ReactorSummary`). +- ~~Traduire les 9 fichiers de commentaires métier non triviaux listés en §6 (items 5-8, 10-14)~~ — **fait**, commit `9e8abe92`, 2026-07-14 (`CNFluids`, `ClientEvents`, mixins, `PalettesVariantEntry`, `AntiRadiationArmorItem`, `ReactorSizeDisplaySource`, `IrradiatedBiomes`). +- ~~Traduire les 2 derniers fichiers restants (`NuclearExplosionEntity.java`, `CNEntityType.java`)~~ — **fait**, commit `eeffe4fe`, 2026-07-14. **§6 est désormais entièrement clos, 0/292 fichier concerné.** + +**9. À surveiller sans action immédiate** +- `RadiationCapability.tickRadiation` pour les `LivingEntity` non-joueurs : pas de dirty-check d'inventaire (§3, analyse détaillée en §8.2). Statu quo recommandé — le scan mob (6 slots, lookups `HashMap` O(1)) est trop petit pour qu'un hash façon joueur (41 slots) soit rentable ; à reconsidérer seulement si un profiling mesure cette boucle comme point chaud, auquel cas privilégier une invalidation événementielle (`LivingEquipmentChangeEvent`) plutôt qu'un hash. +- `ReactorOutput`/`ReactorFluidInput` : garde `!state.is(newState.getBlock())` absente dans `onRemove` malgré des propriétés mutables (§2.1). Pas un bug confirmé, à surveiller. +- ~~`CreateNuclearJEI` : champ statique mutable `Categories`~~ — **fait**, commit `e7900959` (§2.5/§8.1). + +**Explicitement retiré du plan (ne plus y revenir sans nouvel élément)** — détail et justification en §8.2/§8.3 : +- Découpage supplémentaire de `ReactorControllerBlockEntity` (chantier clos, croissance maîtrisée). +- « Correction » de l'inversion de dépendance `api/` (n'a jamais existé dans le code observé). +- Fusion/suppression du pipeline multiblock (sain, un seul framework vivant). +- Coordinateur dédié au verrouillage fluide (non justifié, `PersistentFluidLocks` suffit). +- Tags `CNItemTags.FUEL`/`COOLER` désynchronisés de `RodType.type()` (terminé). + +--- + +## 8. ✅ Mémoire — corrections, réfutations et décisions déjà actées + +### 8.1 Corrections appliquées, avec commit identifié + +| Correction | Hash(es) | Date | Détail | +|---|---|---|---| +| `DefaultHeatCalculator.computeHeat` : lecture du pattern simplifiée via `ReactorBluePrintItem.getItemStorage(...)` (`ItemStackHandler`) au lieu du parsing NBT manuel `"pattern"`/`"Items"`; plancher `Math.max(0, heat+overHeat)` ajouté ; `ReactorFluidType.maxHeat()` sort du statut de champ mort en alimentant `DefaultOverheatController` via un nouveau paramètre `currentHeat` enfilé dans toute la chaîne de calcul de chaleur; asymétrie fuel/cooler corrigée (§2.2) | `691dfb13` | 2026-07-26 | Comparaison ligne à ligne avec le calculateur communautaire du wiki et un cahier des charges externe. La branche cooler de `DefaultHeatCalculator` scanne désormais ses propres voisins fuel (`isCooled(rod) && isFuel(neighborRod)`), conforme au cahier des charges (« Graphite extra: -1/4Q of the heating rod ») et au calculateur de référence. Vérifié sur le pattern `[G,T,G]/[T,U,T]/[G,T,G]` : `128` des deux côtés (JS et Java). `DefaultHeatCalculatorGameTest` (§3, `498f9dc6`) mis à jour en conséquence : test 3 réécrit (`fuelCoolerMix_coolerScansItsOwnFuelNeighborsSymmetrically`), test 4 ajouté (`threeByThreeDiamond_matchesWikiCalculatorReferenceValue`, ce même pattern 3×3, assertion dérivée de la config donc robuste à un changement de balance, valeur `128` documentée en Javadoc pour la balance par défaut). **Suite `GameTest` exécutée en jeu (`./gradlew runGameTestServer`) pour valider l'ensemble** : 30 tests, 3 échecs — 2 attendus et déjà documentés (`extractfluids_twohandlers_shouldnotoverextract_expectedcontract`, `extractfluids_needofone_shouldsucceed_expectedcontract`, marqueurs `*_expectedContract` du bug de sur-extraction du §1, `200df62f`), 1 casse par le plancher `Math.max(0, ...)` : `singleCoolerRod_noNeighbors_addsOnlyItsOwnBaseRodHeat` attendait `-32` (le `baseRodHeat` négatif d'un cooler isolé) mais obtenait `0` (avalé par le plancher). Corrigé en ajoutant un `overHeat=50` pour garder le total positif et observer réellement la contribution du cooler, plutôt que d'asserter `-32` qui n'est plus jamais atteignable via `computeHeat`. | +| `DefaultHeatCalculator.computeHeat` : boucle O(81) de recherche de position par rod remplacée par un lookup O(1) — `FORMATTED_PATTERN`/`OFFSETS` deviennent `static final` (constantes de classe au lieu de champs par instance), nouvelle `NEIGHBORS_BY_SLOT` (`Map>`) précalculée une seule fois via `buildNeighborsBySlot()`, `computeHeat` itère directement sur `NEIGHBORS_BY_SLOT.getOrDefault(slot, List.of())` au lieu de rescanner les 81 cellules de la grille par rod (§2.2/§7) | `37613d8b` | 2026-07-26 | Aucun changement de comportement (ordre de résolution des voisins et formules fuel/cooler inchangés, confirmé par le message de commit). Dernier point ouvert de la priorité 6 (§7) sur ce composant. | +| Traduction en anglais des 2 derniers fichiers du §6 : `NuclearExplosionEntity.java` (compat Alex's Caves — typage `Object`, instanciation conditionnelle, immunité Raycat/Tremorzilla ; correction au passage d'un commentaire anglais devenu incohérent sur `destroyBlock`) et `CNEntityType.java:76` (renderer no-op de l'entité d'explosion) | `eeffe4fe` | 2026-07-14 | Aucun changement de comportement dans `CNEntityType.java` (commentaire seul) ; dans `NuclearExplosionEntity.java`, seuls les commentaires ont changé, sauf le petit ajustement de formulation autour de `destroyBlock` qui ne touche pas le code exécuté. **Clôt entièrement §6** : grep sur caractères accentués français, tout `src/main/java` (292 fichiers), zéro résultat. | +| Traduction en anglais de 9 fichiers de commentaires métier non triviaux (§6 items 5-8, 10-14) : `CNFluids.java` (uranium/azote liquide/thorium, compensation désync gel/dégel), `ClientEvents.java` (Javadoc tick + tremblement caméra), `RadiationHeartMixin.java`, `CameraAccessor.java`, `GameRendererMixin.java`, `PalettesVariantEntry.java` (+ suppression d'un bloc `if` mort qui n'hébergeait que le commentaire), `AntiRadiationArmorItem.java`, `ReactorSizeDisplaySource.java`, `IrradiatedBiomes.java` (5 commentaires de couleurs) | `9e8abe92` | 2026-07-14 | Aucun changement de comportement (commentaires/Javadoc uniquement, sauf le bloc `if` mort de `PalettesVariantEntry` qui ne changeait rien à l'exécution). Ramène §6 de 11 à 2 fichiers concernés. Reste ouvert : `NuclearExplosionEntity.java` (non touché par ce commit) et `CNEntityType.java` (nouvellement trouvé, non repéré par les tours précédents). | +| `CreateNuclearJEI` : champ statique mutable `Categories` converti en champ d'instance `allCategories`, enfilé explicitement dans `CategoryBuilder` (nouveau paramètre `targetCategories`) ; exposition d'`IJeiRuntime` via `onRuntimeAvailable` ; retrait du `FIXME` de `CNStandardRecipeGen.java:226` (décision actée : catégories de recette = marqueurs, pas des sections) | `e7900959` | 2026-07-13 | Clôt §2 mineurs item 5, §4/§6/§7 (`CNStandardRecipeGen` FIXME) et §7 item 9 (surveillance `CreateNuclearJEI`). Aucun changement de comportement observable pour le FIXME (retrait de commentaire + décision documentée dans le message de commit) ; pour `CreateNuclearJEI`, chaque instance du plugin a désormais sa propre liste, éliminant le risque de contamination inter-instances en cas de reload JEI. | +| Retrait de `addDefaultIrradiatedOres()` (dernier contenu : le carver `NETHER_CAVE`) et de son unique site d'appel dans `IrradiatedBiomes.irradiated()` ; régénération de `irradiated_land.json`/`.cache` (bloc `carvers` désormais vide) | `6bc20956` | 2026-07-13 | **Clôt entièrement** l'item « worldgen irradié » du §4/§7 (`BLUE_ICE`/`VOID_START_PLATFORM` déjà retirés par `ae1e394d` juste avant). Seul point restant sur ce sujet : `CNNoiseGeneratorSettings.java:25` (`STEEL_BLOCK`), sans rapport avec ce commit. | +| Retrait des références commentées à `SPEED` dans `ReactorOutput` (`createBlockStateDefinition`, `getStateForPlacement`) ; retrait de `BLUE_ICE` et de `addDefaultSoftDisks()`/`VOID_START_PLATFORM` (+ son unique site d'appel) dans `IrradiatedBiomes` ; suppression de `OriginalBiomeLookup.java` (classe de résolution de biome jamais appelée, non repérée jusqu'ici par cet audit) ; ajout de `@ParametersAreNonnullByDefault` sur `ReactorOutput` et retrait du `@NotNull` désormais redondant sur `getShape()` | `ae1e394d` | 2026-07-13 | Clôt le premier bullet de §4/§7 item 7 (`SPEED`). Entame le second (« worldgen irradié »), achevé juste après par `6bc20956` (ci-dessus). `OriginalBiomeLookup` est un bonus hors-périmètre de l'audit courant (jamais listé en §4). | +| Ajout de `DefaultHeatCalculatorGameTest` (3 cas : fuel isolé, cooler isolé, asymétrie de voisinage fuel/cooler) — première couverture de test pour `DefaultHeatCalculator.computeHeat` (§3/§7 priorité 1) | `498f9dc6` | 2026-07-13 | Écrit en `GameTest` (real `ServerLevel`/`ReactorControllerBlockEntity`/items enregistrés) après rejet d'une première tentative JUnit+Mockito : mocker `Item`/`ItemStack`/`Level` échoue hors jeu démarré (static init Minecraft), ce qui confirme empiriquement le choix `GameTest` déjà fait pour `ReactorInputFluidManagerGameTest`. Valeurs attendues dérivées de `CNConfigs.server().rods.*` en direct (pas de valeurs codées en dur), donc robuste à un changement de balance. | +| Ajout de `ReactorInputFluidManagerGameTest` (couvre `read`/`write`/`clearInvalid`/`getBlocksPosition`/`getFuildHandlers`/`getInventory`/`extractFluids`, dont des marqueurs de régression `*_expectedContract` pour le bug de sur-extraction du §1) — **jamais documenté dans cet audit jusqu'ici**, omission corrigée à l'occasion de la mise à jour ci-dessus | `200df62f` | 2026-07-12 (avant la réorganisation issue de ce même jour, retrouvé par `git log`) | Deux tests `*_expectedContract` échouent intentionnellement aujourd'hui (documentent le comportement souhaité, pas encore implémenté) ; le reste passe et caractérise le comportement actuel. | +| `ReactorSummaryDisplaySource` — remplacement de la sentinelle de taille (liste 1/6 éléments) et des accès positionnels fragiles (`components.get(2).get(1)`) par un `record ReactorSummary` typé (`ReactorSummaryRow` + `Builder` validant les 6 champs requis) ; `getComponents()` → `getReactorSummary()` retournant `Optional` ; remplacement de `joptsimple.internal.Strings.repeat` (dépendance transitive non déclarée) par `String.repeat` natif ; Javadoc anglais ajouté sur la classe et ses méthodes, retirant au passage les 3 commentaires français "Sécurité Triple-Check" (§6) | `cc532f83` | 2026-07-12 | Nouveau fichier `ReactorSummary.java` (§2.3 et §6, item ex-9, tous deux clos). `toRows()` reste le seul point de conversion vers le format positionnel `List>` exigé par l'API `DisplaySource` de Create. | +| Traduction en anglais des 4 cas de Javadoc public bilingue relevés en §6 (`VicinityEffect.onContaminate`, `CNPonderReactorScenes.Positions`/`STATIC_POS`/`positionsFor`), plus l'intégralité des commentaires inline restants de `CNPonderReactorScenes.java` | `3be6252a` | 2026-07-12 | `VicinityEffect.java` et `CNPonderReactorScenes.java` ne contiennent plus aucun français ; sortis de la liste §6 (14→12 fichiers concernés, ~40→~25 lignes). | +| Retrait de `IrradiatedBiomes.monsters()` (corps vide, arguments ignorés) | `8b0428e3` | 2026-07-12 | Méthode et son unique site d'appel supprimés ; les réglages de spawn passent désormais uniquement par `MobSpawnSettings.Builder`. | +| Blocage explicite (message "WIP") de l'apprivoisement des mobs irradiés (`AnimalUtil.blockTamingWip`) | `261b26d8` | 2026-07-11 | Remplace un apprivoisement cassé/incohérent (chat : collier non fonctionnel ; loup : aucun chemin d'apprivoisement) par un message explicite "pas encore implémenté". Ce même commit a aussi retiré la mécanique de collier (§8.3). | +| Retrait de la mécanique de collier teignable jamais câblée (`IrradiatedCatCollarLayer`, `IrradiatedWoldCollarLayer`, `DATA_COLLAR_COLOR`) | `17b29aa3` | 2026-07-11 | Décision produit exécutée — voir §8.3 pour le contexte de la décision. | +| Guard NBT : `ReactorFrameDisplayManager.write()` n'écrit les sentinelles `MIN_Y`/`MAX_Y` que si `hasFrameColumn()` est vrai | `381c7a5f` | 2026-07-11 | Élimine une pollution NBT mineure ; `read()` protégeait déjà chaque champ par `compound.contains(...)`, donc sans risque de régression. | +| Déduplication `drawGauge` : nouvelle classe `ReactorGaugeRenderer` + template `AbstractReactorStatDisplaySource`, constantes centralisées dans `ReactorDisplayConstants` | `35e474e3` → `d0da13d1` → `a8b6b23f` → `e34adcc5` | 2026-07-11 (20:38 → 21:08, ordre chronologique confirmé) | 5 copies identiques de `drawGauge` (Fuel/Cooler/Heat/LiquidLevel/Summary) ramenées à une seule implémentation ; `ReactorSizeDisplaySource` volontairement exclue (jauge à segments discrets, sémantique différente). | +| `IHeat.HeatLevel.isNotDanger` : tautologie `!= DANGER \|\| != NONE` (toujours vraie) remplacée par `!= DANGER` | `fb0897d3` | 2026-07-05 | ⚠️ **Changement de comportement de balance réel** : avant, les sorties tournaient toujours ; désormais elles s'arrêtent en `DANGER`. À valider en jeu (un joueur peut se retrouver sans écoulement de sortie tant que le réacteur reste en surchauffe). | +| Hystérésis sur le heat appliqué à `rotateOutputs` (champ `lastAppliedOutputHeat`, seuil `RPM_DIVIDER/2`) | `a18038db` | 2026-07-05 | Corrige le flicker RPM en fin de ressources — voir §1 pour le statut résiduel (validation en jeu du seuil encore ouverte). | +| `PlayerInteractReactorFluidInput` : renommage (`PlayerInteracteReactorFluidInput` → sans le 'e' parasite) + retrait de 4 blocs de dead code (variable morte, bloc commenté référençant `ReactorLiquidInput` inexistant, bloc vide `TANK_TO_ITEM`, `instanceof` toujours vrai) | `f2490469` | 2026-07-03 | **Note de fiabilité documentaire** : ce commit avait, par erreur, laissé l'ancienne description du problème dans `AUDIT_ACTUEL.md` (et même l'avait détaillée davantage) au lieu de la marquer résolue — staleness corrigée le 2026-07-12. Exemple concret de pourquoi §3 recommande des tests plutôt qu'une documentation manuelle comme seul filet de sécurité. | +| Tags `CNItemTags.FUEL`/`COOLER` désynchronisés de `RodType.type()` : classification unifiée sur `RodType.resolveRodType(Level)` | `562ce99d` (5 des 6 sites) + `30de52a7` (2 sites manqués : `ReactorBluePrintMenu`, lookup voisin `DefaultHeatCalculator`) | 2026-06-28 | `Level` enfilé jusqu'à `IHeatCalculator.computeHeat`. Vérifié par grep : plus aucun site de classification ne lit `CNItemTags.FUEL`/`COOLER`. `CNItemTags.FUEL` reste sur `THORIUM_ROD` comme tag de craft, explicitement découplé de la classification. | +| Retrait de `SimpleMultiBlockPattern.test()` | `2aaddb4d` | 2026-06-28 | Aucun appelant, retrait sûr. | +| `InventoryHashUtil.stackHash` n'inclut plus `getDamageValue()` | `575a8ab8` | 2026-06-28 | Aucune implémentation `IRadiationSource`/`RadiationRegistry` ne lit la durabilité ; l'inclure ne faisait que déclencher un recalcul serveur (`RadiationCapability.computeItemRadiation`) à chaque variation de durabilité (minage, combat) sur le hot path que le cache devait protéger. | +| Garde `level.isClientSide` centralisée dans `ReactorAssembler.assemble`/`disassemble` + suppression des overrides `playerDestroy` redondants (généralisation du modèle `ReactorRodInput`) sur `ReactorCasing`, `ReactorCooler`, `ReactorFrame`, `ReactorAlarm`, `ReactorOutput`, `ReactorFluidInput` | `34d5706f` | 2026-06-28 | Point de convergence unique de toute la chaîne `onPlace/onRemove/playerDestroy → findController/findControllerPos → ReactorAssembler` ; `onRemove` se déclenche déjà systématiquement lors d'une casse joueur, donc retirer l'appel redondant dans `playerDestroy` élimine le double scan sans changer de comportement observable. | +| Retrait des 6 fichiers de debug/env trackés dans `run/` (`hs_err_pid*.log`, `imgui.ini`, `servers.dat*`, `Jade*.jar.disabled`) + `.gitignore` élargi | `9ddb5a2a` | 2026-06-28 | Les 10 `run/schematics/*.nbt` conservés (assets de gameplay légitimes). | +| Extension de la radiation à toutes les `LivingEntity` (pas seulement le joueur) | `9ded502c` | 2026-06-28 | Point de vérité unique `canBeIrradiated(LivingEntity)` respecté, hook via `LivingTickEvent` (pas de boucle manuelle sur les entités du monde). Compromis assumé : pas de dirty-check pour les non-joueurs — voir §3 (point à surveiller). | +| Centralisation de l'attribution des advancements de pose sur le contrôleur (au lieu de la pièce posée) | `19617118` | 2026-06-26 | `MultiblockHelpers.handleAdvancedPlacedBy` redirige vers le contrôleur ; `CNAdvancementBehaviour` vérifie l'état Minecraft natif (`isAlreadyAwardedTo`) au lieu d'une liste interne. Élimine un risque de double-attribution. | +| Retrait du `LOGGER.warn` redondant dans `ReactorAssembler.assemble` (spam de log) | `b309f231` | 2026-06-26 | Plus aucun `LOGGER.warn`/`info` dans le chemin de succès. | +| `NuclearExplosionEntity` : anti-pattern `try { onBlockExploded } catch(Exception) { destroyBlock(...) }` remplacé par une vérification explicite (`getBlockState(immutablePos).is(state.getBlock())`) | `11b1108a` | 2026-06-22 | Introduit par `5acde3db` (2026-03-04, compat Alex's Caves), corrigé par `11b1108a`. Antérieur à la fenêtre de commits habituellement explorée en détail par ce document, mais retrouvé avec certitude par `git log -S "immutablePos"`. | + +**Commit à mention neutre (ni bug ni fix, clarification)** : `20c1df0b` (*"IO blocks are now natively Casings in NBT"*) — message trompeur, ne change **rien** à l'architecture : nettoyage cosmétique de 22 lignes d'une scène Ponder. Les blocs I/O (`ReactorOutput`, `ReactorRodInput`, `ReactorFluidInput`, `ReactorAlarm`) restent des classes `Block` séparées de `ReactorCasing`. + +### 8.2 Réfutations / non-problèmes confirmés (architecture) + +Ces affirmations historiques ont été vérifiées comme **fausses ou déjà closes** dans le code actuel — elles ne correspondent à aucun commit de correction isolé (soit rien n'a jamais été cassé, soit la résolution est le résultat cumulatif de nombreux commits non attribuables individuellement) : + +- **Inversion de dépendance `api/`** — ❌ toujours réfuté : `MultiBlockManagerBeta`, `api/multiblock/rods/RodType`, `api/multiblock/fluid/ReactorFluidType` n'importent aucun `content.*` (revérifié par grep sur tout `api/`, 2026-07-12 : zéro résultat). *Pas de hash applicable — l'inversion alléguée par `AUDIT_V1.md` n'existe pas dans l'historique observé.* +- **Deux/trois frameworks multiblock concurrents** — ❌ toujours réfuté : `lib/multiblock/manager/*` et `IBetterPattern` n'existent pas (8 fichiers restants dans `lib/multiblock/`, tous utilisés). *Pas de hash applicable.* +- **God class `ReactorControllerBlockEntity`** — ✅ chantier clos, croissance maîtrisée : **533 lignes** (886 dans `AUDIT_V1.md`, 492 puis 529 aux tours intermédiaires), délégation à 34 fichiers de support (`service/` 14, `manager/` 12, `consumable/` 6, `display/` 2). *Pas de hash unique — résultat cumulatif de dizaines de commits d'extraction progressive vers `manager/service/consumable`, non attribuable avec certitude à un commit isolé.* +- **Coordinateur de verrou fluide dédié** — ✅ toujours non justifié : `PersistentFluidLocks` reste le seul système ; pas de `FluidLockManager` concurrent retrouvé (celui décrit en `AUDIT_V1.md` B14 a disparu, hash non déterminé — voir §8.4). `clearLockIfAllInputsEmpty` utilise `getFuildHandlers(level)` (pas de scan 3D), double itération mineure sans gravité. +- **`clearLockIfAllInputsEmpty` : pas de scan cubique O(n³)** — ✅ acceptable, confirmé sain. +- **`ReactorSummaryDisplaySource.formatValue` — "incohérence" de mode d'affichage du heat vs `HeatDisplaySource`** — ❌ réfuté, ce n'est pas un bug : c'est un choix de design volontaire du widget de synthèse, mal formulé par l'audit initial. Analyse détaillée : `formatValue` force une jauge en mode "normal" pour `heat` (`gaugeOnNormal=true`), mais `formatFluid` (`ReactorSummaryDisplaySource.java:203-207`) fait exactement la même chose pour `fluid` (`mode == 0 || mode == 3` → jauge) — ce n'est donc pas une exception isolée sur `heat`, mais un pattern cohérent et répété : les deux stats les plus critiques à lire d'un coup d'œil dans une vue de synthèse (`fluid`, `heat`) sont en jauge par défaut, `fuel`/`cooler` restent en texte. `HeatDisplaySource`, à l'inverse, est un affichage individuel une-ligne où la jauge occuperait toute la largeur disponible pour une seule information — un défaut texte y est tout aussi légitime. Les deux widgets ont des contraintes d'espace et des objectifs différents ; il n'y a jamais eu de règle implicite selon laquelle un mode par défaut devait être identique entre les deux. **Pas de hash applicable** — aucun changement de code, décision de clôture actée après clarification du comportement voulu. Écarté aussi : la création d'une classe utilitaire `ReactorDisplayFormatting` pour mutualiser les 3 mappings mode→rendu existants (`AbstractReactorStatDisplaySource.provideLine`, `ReactorSummaryDisplaySource.formatValue`, `ReactorSummaryDisplaySource.formatFluid`) — ces 3 mappings ont des sémantiques différentes (3 modes vs 4 modes, flag `gaugeOnNormal` par stat, suffixe d'unité optionnel), donc les unifier demanderait un enum de mode partagé mal aligné entre appelants (le type même de fragilité par index déjà corrigée en `cc532f83`) ou une fonction à autant de paramètres que de sources de divergence — coût supérieur au gain pour un point cosmétique sans risque fonctionnel. +- **`RadiationCapability.tickRadiation` pour `LivingEntity` non-joueurs — absence de dirty-check d'inventaire** — ❌ réfuté comme piste d'amélioration, le statu quo (§3, §7 item 9) est maintenu après analyse approfondie du 2026-07-14. Détail : + - **Asymétrie constatée** : côté joueur, `InventoryHashUtil.compute(player)` hashe 41 slots (`items` 36 + `offhand` 1 + `getArmorSlots()` 4) et `computeItemRadiation(Player)` n'est recalculé que si ce hash change ([RadiationCapability.java:112-121](src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java#L112-L121)). Côté mob, `computeItemRadiation(LivingEntity)` recalcule inconditionnellement à chaque tick, mais sur seulement 6 slots (`getArmorSlots()` 4 + main + offhand). + - **Pourquoi un hash ne serait pas rentable pour les mobs** : chaque stack est résolu par `RadiationRegistry.get(ItemStack)`, un simple `HashMap.get` en O(1) (ou une petite itération de tags en cas d'absence) — voir [RadiationRegistry.java:25-38](src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java#L25-L38). Hasher ces mêmes 6 slots pour détecter un changement coûterait sensiblement la même chose que le calcul direct qu'il est censé éviter (même nombre d'accès aux stacks). Le hash côté joueur est rentable uniquement parce qu'il amortit un scan bien plus large (41 slots, potentiellement des `IRadiationSource` tiers coûteux) sur des ticks où rien n'a changé — ce rapport gain/effort ne tient pas à l'échelle 6 slots. + - **Le reste de `tickRadiation` domine probablement le coût par mob** : résolution de biome (`level.getBiome`), lecture d'attribut (`getRadiationResistance`), et gestion de `MobEffectInstance` (`getEffect`/`removeEffect`/`addEffect`) s'exécutent de toute façon à chaque tick pour chaque `LivingEntity`, dirty-check ou non ([RadiationCapability.java:123-141](src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java#L123-L141)). Un dirty-check sur l'inventaire ne changerait donc pas la classe de complexité globale (toujours O(N) sur le nombre de mobs), seulement une petite constante déjà faible. + - **Seule piste qui changerait réellement l'ordre de grandeur, si un jour nécessaire** : invalidation événementielle via `LivingEquipmentChangeEvent` (Forge) plutôt qu'un hash — un flag booléen positionné uniquement quand un slot d'équipement change réellement, lu en O(1) au lieu d'un scan/hash systématique de 6 slots. Non implémenté car non justifié tant qu'aucun profiling ne montre cette boucle comme point chaud (critère déjà posé par le commit d'origine `9ded502c`). + - **Point annexe repéré au passage, clarifié comme intentionnel** : `computeItemRadiation(Player)` n'inclut pas l'armure du joueur ([RadiationCapability.java:145-158](src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java#L145-L158)) alors que `InventoryHashUtil.compute(player)` la hashe bien (le hash reste correct pour déclencher un recalcul si l'inventaire principal/offhand change, l'armure n'y contribuant simplement jamais de radiation). **Confirmé volontaire, pas un oubli** : dans ce mod, les items d'armure existants sont des équipements de *résistance* à la radiation (ex. armure anti-radiation), jamais des *sources* de radiation — le rôle d'une armure ici est structurellement de protéger, pas d'irradier. Aucun item d'armure n'implémente `IRadiationSource` ni n'est enregistré dans `RadiationRegistry`, donc l'omission est cohérente avec le design actuel plutôt qu'une lacune. À revisiter uniquement si une future armure est conçue comme source de radiation (auquel cas il faudrait l'ajouter explicitement à `computeItemRadiation(Player)`, symétriquement à ce qui existe déjà pour `computeItemRadiation(LivingEntity)`). + - **Pas de hash applicable** — aucun changement de code, décision de statu quo actée après analyse. +- **`CNNoiseData.bootstrapRegistries` — `B7` d'`AUDIT_V1.md`, prétendument entièrement commenté (noise `EROSION` jamais enregistré)** — ❌ réfuté par lecture directe (2026-07-18) : la méthode enregistre bien `EROSION` (`context.register(key, new NoiseParameters(...))`, non commenté). *Pas de hash applicable — la correction (ou le fait que le bug n'a jamais existé sous cette forme dans le code observé) est antérieure à la fenêtre de commits explorée en détail, cf. §8.4.* +- **`RodsTooltipHandler` — `B17` d'`AUDIT_V1.md`, prétendument condition de namespace inversée par erreur** — ❌ réfuté comme bug, clarifié comme intentionnel (2026-07-18) : le fichier retourne bien tôt pour les items du mod (`if (id != null && CreateNuclear.MOD_ID.equals(id.getNamespace())) return;`), mais un commentaire explicite documente désormais que c'est voulu — les items du mod ont déjà leur tooltip via `setTooltipModifierFactory` de Registrate, ce handler ne sert que les items externes/datapack que cette factory ne peut pas couvrir ; inverser la condition doublerait le tooltip sur les rods du mod. *Pas de hash applicable — soit le commentaire de clarification est antérieur à la fenêtre explorée en détail (§8.4), soit le bug initial d'`AUDIT_V1.md` décrivait un état de code jamais confirmé dans l'historique récent.* + +### 8.3 Décisions produit exécutées + +- **Collier teignable chat/loup** — décision prise : retrait complet de la mécanique plutôt que finir le câblage. `IrradiatedCatCollarLayer.java`/`IrradiatedWoldCollarLayer.java` supprimés (aucun appelant, confirmé par grep) ; `DATA_COLLAR_COLOR`, `getCollarColor()`/`setCollarColor()`, et le NBT associé retirés d'`IrradiatedCat.java` ; interaction `DyeItem` retirée de `mobInteract` (complète une suppression partielle laissée par une édition en cours qui rendait le code non compilable en état intermédiaire). `IrradiatedWolf` n'avait de toute façon jamais câblé cette mécanique. Note : `getBreedOffspring` (`IrradiatedCat.java:248-260`) appelle toujours `setCollarColor`/`getCollarColor`, mais sur des `Cat` **vanilla** (API Minecraft native), sans rapport avec la mécanique retirée — laissé tel quel à raison. Hash : `17b29aa3` (2026-07-11). +- **Apprivoisement des mobs irradiés bloqué avec message "WIP"** plutôt que laissé cassé/incohérent — décision produit exécutée en même temps que le retrait du collier. Hash : `261b26d8` (2026-07-11). + +### 8.4 Corrections historiques d'`AUDIT_V1.md` — hash non déterminé avec certitude pour la majorité + +L'audit courant indique depuis plusieurs tours que les bugs suivants d'`AUDIT_V1.md` sont **vérifiés résolus dans le code actuel** : **B2, B3, B4, B5, B6, B8, B9, B11, B13, B16, B19, B12, B14**, l'off-by-one `getFluidInTank`, l'icône d'item de l'armure anti-radiation teintée, et l'ensemble des problèmes radiation historiques (point de vérité unique `canBeIrradiated`). Cette réorganisation a tenté de retrouver un hash de commit pour chacun via `git log -S` sur des chaînes distinctives ; résultat : + +- **B15 (anti-pattern try/catch `NuclearExplosionEntity`)** — ✅ hash déterminé avec certitude : `11b1108a` (voir §8.1). +- **B9 (palier radiation `amplifierLevel0` dupliqué)** — candidat trouvé mais **non confirmé avec certitude** : `3b84bac4` ("refactor: update IrradiatedSurfaceRules and RadiationCapability for improved biome handling and radiation amplification logic") est thématiquement plausible mais le diff n'a pas été vérifié en détail. À valider manuellement avant de le citer comme preuve. +- **B13 (bras invisibles de l'armure anti-radiation)** — candidat trouvé mais **non confirmé avec certitude** : `d9ba3956` (2026-06-26, "fix: adjust arm dimensions and positions in AntiRadiationArmor model for better alignment") correspond thématiquement mais ne mentionne pas explicitement le bug des bras invisibles dans son message. À valider manuellement. +- **B1, B2, B4, B5, B18** — **non déterminé**. Recherches `git log -S` ciblées effectuées sur les chaînes distinctives de chaque bug (`&& false`, `RadiationSyncPacket`, valeur de drop `THORIUM_BLOCK`, `BiomeTagRule`/`return null`, clé config `screenShaking`) sans résultat concluant. Ces corrections sont probablement antérieures à la fenêtre de commits explorée en détail par ce document (avant le 2026-06-24) ; les retrouver demanderait une revue manuelle complète de l'historique pré-fenêtre, disproportionnée par rapport au gain (le code actuel confirme déjà que le bug n'est plus présent, seule la traçabilité du commit manque). +- **Reste de la liste** (B3, B6, B8, B11, B12, B16, B19, off-by-one `getFluidInTank`, icône armure, historique radiation complet) — recherche non retentée par souci de proportionnalité : chaque item nécessiterait sa propre requête `git log -S` sur une chaîne distinctive extraite manuellement du code originel décrit par `AUDIT_V1.md`, pour un ensemble de plus de 10 items mineurs déjà revérifiés comme absents du code actuel à plusieurs tours d'audit successifs. **Si la traçabilité individuelle de ces corrections devient nécessaire (audit externe, obligation de conformité), prévoir une session dédiée à l'archéologie Git plutôt que de l'inclure au fil de l'eau d'un audit de code.** + +**Dead code massif d'`AUDIT_V1.md`** (§3 de ce document historique : `lib.multiblock.manager.*`, framework d'animation keyframe, `CreateNuclearDamageSources`, `CommentEventClients`, fichier `possible code`, `CNShapelessRecipeGen`, `RadiationOverlay`/`EasingHudOverlay`, `IrradiatedSurfaceRules` v1, `VerifyPattern7x7`/`9x9`, `saveData2`, et la longue liste de membres/méthodes/imports morts §3) — non revérifié individuellement dans cette réorganisation (hors périmètre de la demande, qui portait sur la réorganisation d'`AUDIT_ACTUEL.md` et non sur un nouveau balayage complet du dead code d'`AUDIT_V1.md`). Signal indirect : `lib/multiblock/` ne contient plus que 8 fichiers, tous utilisés (revérifié §8.2), ce qui suggère que le plus gros bloc (`lib.multiblock.manager.*` + `IBetterPattern`) a bien été supprimé à un moment de l'historique — mais aucun hash précis n'a été recherché pour cette réorganisation. diff --git a/AUDIT_V1.md b/AUDIT_V1.md new file mode 100644 index 000000000..c5613f34c --- /dev/null +++ b/AUDIT_V1.md @@ -0,0 +1,187 @@ +# 🔬 Audit Create Nuclear — Rapport détaillé + +> Audit du code Java (`src/main/java`, 282 fichiers / ~21 000 lignes) réalisé par revue multi-agents : 11 agents (un par package) ont lu l'intégralité du code ; chaque finding *bug* / *dead code* a été repris par un agent sceptique chargé de le **réfuter** (grep global incluant `src/generated`, mixins, reflection) afin d'éliminer les faux positifs ; un agent final a synthétisé l'architecture. +> +> **Hors périmètre** : `src/generated/resources` (datagen), `src/main/resources` (textures/lang/sons/nbt). +> +> **Résultat brut** : 144 findings → **80 confirmés**, 11 réfutés (écartés), 6 incertains, 47 cleanup/design/perf non soumis à vérification adversariale. + +| Catégorie | Total | Confirmés (≈) | +|---|---|---| +| 🐛 Bugs | 41 | 28 | +| 🧹 Dead code | 33 | 30 | +| ♻️ Cleanup | 33 | — | +| 🏗️ Design | 16 | 10 | +| ⚡ Perf | 7 | 4 | +| ✅ Points forts | 14 | — | + +**Constat transversal** : le code est visiblement en **plein refactor V2**. La majorité des problèmes ne sont pas de la mauvaise écriture mais des **reliques d'une migration inachevée** — deux frameworks multiblock en parallèle, du code commenté un peu partout, des `&& false` de debug oubliés, des features câblées à moitié. C'est l'angle principal du nettoyage. + +--- + +## 1. Vision architecturale + +L'organisation **package-by-feature** est saine et idiomatique (spécifique à create) pour un addon Create : couche d'enregistrement racine (`CN*`), `content/` par domaine, `foundation/` + `infrastructure/` transverses, `api/` + `impl/`, `compat/` isolé. Cinq problèmes structurels ressortent : + +1. **🔴 Inversion de dépendance dans `api/`** — `api.multiblock.MultiBlockManagerBeta` importe `content.multiblock.controller.ReactorControllerBlockEntity` ; `api.multiblock.rods.RodType` importe `content...CNRodTypes` ; idem `ReactorFluidType`. Le package censé être la fondation stable dépend du contenu concret → cycle d'intention, `api/` ne peut pas servir de point d'extension propre. + +2. **🔴 God class** — `ReactorControllerBlockEntity` fait **886 lignes**, touche items / fluides / chaleur / explosion / advancement / biome / NBT / tooltips. Les sous-packages `manager/`, `service/`, `consumable/` ont été créés *pour le découper*, mais l'extraction est à moitié faite : la BlockEntity orchestre encore tout → l'abstraction ajoute de l'indirection **sans** retirer de responsabilité. + +3. **🔴 Deux frameworks multiblock concurrents** — le vivant `api.multiblock.MultiBlockManagerBeta` (utilisé par `CNMultiblock`), et tout `lib.multiblock.manager.*` + `impl.IBetterPattern` qui sont **morts** (ne se référencent qu'entre eux). Piège à temps pour tout nouveau contributeur. + +4. **🟠 Feature radiation éparpillée sur 4 couches** — `api.radiation` + `foundation/item/radiation` + `content/effects/capability` + `foundation/networking/radiation` implémentent **une seule** feature, sans package propriétaire. Le contrat `IRadiationSource` vs `RadiationRegistry` est dupliqué sans règle de priorité. + +5. **🟠 Couplage hub + accès infra direct** — la BlockEntity contrôleur est un hub de couplage (atteint explosion, advancement, biome, config, logistics, inputs, registres) ; et les classes `content/` importent directement `infrastructure.config.CNConfigs` / `CNBiomes`. Un seam `ConfigValueResolver` existe déjà dans `foundation/utility` mais n'est pas utilisé. + +**Autres points structurels** : package racine fourre-tout (~25 classes `CN*` à plat, mélangées avec `@Mod`, le proxy client et `ClientEvents`) ; `foundation/util` vs `foundation/utility` redondants ; framework de modèle décompilé logé dans `content/explosion` (mêle rendu client réutilisable et logique serveur) ; **aucun test** (`src/test` vide) ; dossier **`run/` versionné** (mixin.out, saves, configs — à mettre en `.gitignore`). + +--- + +## 2. 🐛 Bugs confirmés — par priorité + +### 🔴 Critiques (cassent une fonctionnalité, fix simple) + +| # | Fichier:ligne | Problème | +|---|---|---| +| B1 | `foundation/events/overlay/EventTextOverlay.java:40` | `isActive()` fait **`return timer > 0 && false;`** → l'overlay ne s'affiche **jamais**. Kill-switch de debug oublié. Retirer `&& false`. Un `LOGGER.warn` de debug traîne aussi (à retirer). | +| B2 | `foundation/networking/radiation/RadiationSyncPacket.java:26` | Le handler fait `new ClientRadiationData(radiation)` puis **jette l'instance** (record sans stockage statique ni effet de bord). Le serveur envoie la radiation, **rien ne la mémorise côté client** → packet no-op, sync radiation cassée. Fix : stocker dans un holder statique client lu par l'overlay. | +| B3 | `content/effects/VicinityEffect.java:40` | `int cooldownTicks = 0;` déclaré **à l'intérieur** de la boucle `for` → `if (cooldownTicks==0)` toujours vrai, tout le throttling à 500 ticks est mort (map `cooldowns` + get/setCooldown jamais utilisés). `RadiationEffect` override `isDurationEffectTick → true` donc l'effet est ré-appliqué **à chaque tick** sur toutes les entités proches. | +| B4 | `CNBlocks.java:593-610` | **`THORIUM_BLOCK`** (bloc de stockage) drope **`RAW_URANIUM`** au lieu de lui-même, et est taggé comme un **minerai** (`ores`, `ores/thorium`, `NEEDS_DIAMOND_TOOL`…). Copier-coller d'un minerai d'uranium. Confirmé dans le datagen (`thorium_block.json:41`). Fix : calquer sur `LEAD_BLOCK`/`STEEL_BLOCK` (loot par défaut, seul tag `storage_blocks/thorium`). | +| B5 | `infrastructure/worldgen/biome/surfacerule/BiomeTagRule.java:21` | `apply()` retourne **`null`** au lieu d'une `Condition` ; la classe interne `Predicate` qui contient la vraie logique n'est jamais instanciée → **NPE** à l'évaluation de toute surface rule basée dessus. Fix : `return new Predicate(context)`. | +| B6 | `content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java:70` | `new ReactorBluePrintItemPacket(..., countGraphiteRod, countGraphiteRod)` : le 6ᵉ argument répète le 5ᵉ → la valeur **uranium est perdue**, le calcul de progression est faussé. (Ligne 53 : `coef=0.1F` envoyé en place de `heat` → chaleur jamais transmise ; le packet tourne aussi à chaque tick sans condition de changement.) | + +### 🟠 Importants + +| # | Fichier:ligne | Problème | +|---|---|---| +| B7 | `infrastructure/worldgen/biome/CNNoiseData.java:18` | `bootstrapRegistries()` **entièrement commenté** → noise `EROSION` jamais enregistré, mais les surface rules font `noiseCondition(EROSION)` 3× (`IrradiatedSurfaceRules2:54/58/62`) → `getOrThrow` lèvera. **Dormant** tant qu'aucune dimension ne câble `irradiated_noise`, mais défaut d'intégrité de données réel. | +| B8 | `content/multiblock/controller/ReactorControllerBlockEntity.java:1020` | `clearLockIfAllInputsEmpty` enchaîne `findStructure(...).data().getSize()` sans null-check ; `findStructure` retourne `null` quand la structure n'est plus formée → **NPE serveur**. Les 2 autres appelants (`ReactorAssembler:37,62`) gardent bien le null — prouve l'oubli. Fix : stocker le résultat, null-check, fallback `reactorSize`. | +| B9 | `content/effects/capability/RadiationCapability.java:165` | `if (rad` **statique** : (1) pas de dimension dans la clé → collision inter-dimension, (2) **jamais purgée** (unload chunk/monde) → fuite mémoire, (3) doublonne `PersistentFluidLocks` (deux sources de vérité, aiguillage `level instanceof ServerLevel`). La suppression d'un contrôleur ne nettoie que `PersistentFluidLocks`. | +| B15 | `content/explosion/NuclearExplosionEntity.java:224` | `try { onBlockExploded } catch(Exception){ destroyBlock(...,true) }` : utilise une exception comme branchement (anti-pattern), **avale les vrais bugs**, et les deux branches ont des sémantiques de drop **différentes** (catch = drop forcé). Au minimum logger. | +| B16 | `foundation/data/recipe/CNStandardRecipeGen.java:391` | `ModdedCookingRecipeResult.serializeRecipeData` fait `conditions.forEach` alors que le record est construit avec `conditions=null` (l.351) → **NPE datagen** dès qu'une recette `isOtherMod` serait sérialisée. Latent (chemin non câblé) mais cassé. Fix : liste vide au lieu de null, ou garde. | +| B17 | `foundation/events/RodsTooltipHandler.java:26` | Condition de namespace **inversée** : n'applique `RodsStats` qu'aux items **non**-createnuclear (donc no-op, car les rods sont du mod) ; et `RodsStats` est déjà branché via Registrate → si corrigé, **double tooltip**. Code mort fonctionnel à risque de régression — probablement à supprimer entièrement. | +| B18 | `infrastructure/config/CNCClient.java:9` | `screenShaking` réutilise la **même clé TOML** `nuclearBombFlash` que la ligne 8 → les deux options pointent sur la même valeur config (lu dans `ClientEvents:60`). Fix : clé `screenShaking`. | +| B19 | `infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules2.java:23` | `IS_HIGHLANDS = biome()` (varargs vide → `Set.copyOf([])::contains` toujours faux) ne matche jamais → branches `MOON_DIRT` (l.35) / `LEAD_TURF` (l.39) **mortes**. | + +### 🟡 Mineurs / robustesse + +- `content/multiblock/output/ReactorOutputEntity.java:117` — `tick()` : pas de null-check `level`, 2-3 lookups world redondants/tick (client+serveur) pour une position fixe `above(3)`. +- `content/multiblock/input/fluid/ReactorInputFluidManager.java:129/148` — off-by-one `getFluidInTank(getTanks())` : toléré par le `SmartFluidTank` single-tank actuel (qui ignore l'index) mais **viole le contrat `IFluidHandler`** ; et `extractFluids` ne **décrémente jamais `fluidNeeded`** + ignore l'extraction quand `toExtract>1`. +- `content/multiblock/core/ReactorCoreEntity.java` — `tick()` vide. +- `content/multiblock/input/item/ReactorInput.java:65` — retourne `PASS` après ouverture de menu côté serveur → désync client(`SUCCESS`)/serveur. Fix : `CONSUME`/`SUCCESS`. +- `foundation/utility/RenderHelper.java:36` — champs `lastAlpha/lastCoverage/lastFirstPerson` écrits jamais lus (cache inexistant) ; branche `coverage!=1f` inerte (scale commenté + translate qui s'annulent). Connexe : `RadiationOverlay:49` binarise l'alpha via `Math.round`. +- `foundation/utility/InventoryHashUtil.java:91` — le hash inclut `getDamageValue()` → tout changement de durabilité déclenche un resync (rafales de `RadiationSyncPacket` au minage/combat). +- `content/multiblock/output/ReactorOutput.java:63` — `requireNonNull` + `assert entity!=null` (assert désactivé en prod) au lieu d'une garde gracieuse ; `DIR` 0..2 avec valeur 2 jamais utilisée. +- `content/redstone/displayLink/source/ReactorSizeDisplaySource.java:31` — `%` trompeur `tier*100/3` (33/66/100 % pour tier 1..3). + +--- + +## 3. 🧹 Dead code à supprimer + +### Gros blocs (forte valeur, risque faible) + +- **Tout `lib.multiblock.manager.*`** (`MultiBlockManager`, `MultiBlockCache`, `RegisteredMultiBlockPattern`) + **`lib.multiblock.impl.IBetterPattern`** + `SimpleMultiBlockPatternBuilder` (variante non-aisle) → reliques V2 mortes (ne se référencent qu'entre elles). *(`MultiBlockCache.isCached` a même une sémantique inversée.)* +- **Framework d'animation keyframe** : `CNModelAnimator` + `CNAnimation` + `CNIAnimatedEntity` + surcharges `CNAdvancedEntityModel.rotate/rotateMinus` → jamais utilisé (le modèle réel anime directement via `animateParticle`). ⚠️ **Garder** `CNAdvancedEntityModel`/`CNBasicEntityModel`/`CNAdvancedModelBox` : `NuclearMushroomCloudModel` en hérite réellement. +- **`CreateNuclearDamageSources`** = doublon (quasi octet-près) de `CNDamageSources` → garder `CNDamageSources`, migrer les 2 références (`RadiationEffect:94`, `CNFanProcessingTypes:122`) ; les surcharges privées `source(Entity…)` sont aussi mortes dans les deux classes. +- **`foundation/events/CommentEventClients.java`** — coquille `@EventBusSubscriber` vide (aucun `@SubscribeEvent`) → supprimer. +- **`foundation/events/possible code`** — fichier sans extension `.java`, brouillon `com.tonpackage` (3 fragments : services META-INF, `HudOverlayRegistry`, 2ᵉ `CNClientEvent`) → sortir du dépôt. +- **`foundation/data/recipe/CNShapelessRecipeGen.java`** — provider qui n'émet aucune recette, enregistrement commenté (`CreateNuclearDatagen:42`). +- **`IrradiatedSurfaceRules` v1** — remplacé par v2 (`CNNoiseGeneratorSettings:29`), ne survit que via un import. +- **`RadiationOverlay` + `EasingHudOverlay`** — `RadiationOverlay` commenté dans `HudRenderer.overlays` → jamais instancié/rendu (et `IrradiatedOverlayRendererVision` fait déjà ce rendu). +- **`VerifyPattern7x7` / `VerifyPattern9x9`** (`ReactorPattern`) + `getBlockPosForReactor` (@Deprecated) — jamais appelés. +- **`saveData2`** (`ReactorBluePrintMenu:160`) — doublon mort de `saveData` (et logique de comptage subtilement fausse : pas de reset). + +### Membres / méthodes morts + +`ReactorOutputValue` + `outputPos` + `getStressConfigKey` trivial + addBehaviours commenté (`ReactorOutputEntity`) ; `inputPos`/`inputLevelKey` + override `getLevel` trivial (`ReactorInputEntity`) ; `ReactorCasingEntity.getController` + champ `controller` (offset magique `+4/+4`) ; `VicinityEffect.cooldowns`/`getCooldown`/`setCooldown` + param `timer` ; `getArmorResistance` (`RadiationCapability`) ; helpers `TextUtils` (`renderMultilineDebugText`, `renderDebugText`, `translateWithFormatting`, `formatInt`×2, `leftPad`) ; `Mods` (`getBlock`/`getItem`/`contains`/`rl`/`id`/`runIfInstalled`/`executeIfInstalled`) ; `SoundEntryBuilder` (`playItemPickup`, `playExisting`×4, `addVariant`×2, `noSubtitle`, setter `attenuationDistance`) ; `BigFluidStack` (`send`/`receive`/`read`/`isInfinite`/`duplicateWrappers`/`comparator`/`write`) ; `CNParticleRegistry.createBlockParticleType`/`createItemParticleType` ; `parseLegacy`/`ofLegacyName`/`LEGACY_NAME_MAP` (`CNFanProcessingTypes`) ; `registerAndWrap` + vars locales inutilisées (`CNDensityFunctions`) ; `CExplode` (config `size`/`type`/`time` jamais lue) ; `IrradiatedBiomes.monsters()` (corps commenté, no-op) ; `VANILLA_RANGE`/`cubeBottomTop` (`PaletteBlockPattern`) ; `getVariant()` (`CNPaletteStoneTypes`) ; `START=null` (`CNAdvancement`) ; surcharge `RadiationRegistry.getRadiation(biome,player)` ; `VirtualReactorInputFluid.removeFluid`/`getAmount` ; `matchesWithResult`/`construct`/`MultiblockMatchResult`/`getDistanceControllerTest` (lib) ; `ensureProperlyBuilt` (`SimpleMultiBlockPatternBuilder`). + +### Imports morts / doublons + +`CNBlocks.java` (`ResourceLocation`, `BlockTags`, `Enriching*Block` importés 2×) ; `AntiRadiationArmorItem.java` (`Util`/`Component`/`Attribute`/`world.item.*` en double, `TagKey`) ; `ReactorFluidTypesValue.java` (`reflect.Array`/`Field`, `Map`, `ForgeRegistries`) ; `CreateNuclearDatagen.java:18` (`CNShapelessRecipeGen`) ; `CNMixingRecipeGen.java:7` (`Fluids`) ; import dupliqué `IMultiBlockPatternBuilder` (`SimpleMultiBlockPatternBuilder:6-7`). + +--- + +## 4. ⚡ Performance + +| Fichier:ligne | Problème | Fix | +|---|---|---| +| `content/multiblock/pattern/ReactorPattern.java:96` | `findController` / `findControllerPos` scannent **~3971 blocs** (`getBlockState` + `getBlockEntity`) à **chaque pose/casse** de casing/frame/cooler/output — et **aussi côté client** (pas de garde `isClientSide`). Boucles avec `!=` comme condition d'arrêt et `new BlockPos` par itération. | Réduire la zone, `MutableBlockPos`, court-circuit dès trouvé, garde `isClientSide`, `<` au lieu de `!=`. | +| `content/effects/RadiationEffect.java:40` | Le predicate reconstruit un `HashSet` + reparse toutes les `ResourceLocation` de la blacklist **à chaque entité candidate** de la bounding box, **à chaque tick** (override `isDurationEffectTick → true`). | Cacher le `Set` (invalidé au reload config). | +| `content/multiblock/alarm/ReactorAlarmEntity.java:95` | `tickServer()` appelé inconditionnellement (y compris **client**, pas de garde `!isClientSide`), `awardPlayer` à chaque tick quand `POWERED`. | Garde `!isClientSide`, n'award qu'au front montant. | +| `api/multiblock/fluid/ReactorFluidType.java:55` | `getTypeForFluid` : double boucle sur le registry `FLUID_TYPE` + `ForgeRegistries.FLUIDS.getKey(fluid)` recalculé à chaque itération interne. | Calculer la clé une fois avant le filtre. | +| `foundation/events/overlay/HelmetOverlay.java:73` | `gui.renderHotbar(12f, graphics)` re-rendu depuis un overlay HELMET chaque frame (registerAbove → double rendu possible) + lookups inventaire répétés (`getArmor(HEAD)` 2×/frame). | Vérifier la nécessité, mémoriser le casque par frame. | + +*Mineurs* : `NuclearMushroomCloudParticle:136` (`new PoseStack()` + `endBatch()` par frame), `ReactorSummaryDisplaySource:180` (`labelWidth()` recalcule des traductions par affichage). + +--- + +## 5. ♻️ Cleanup notable (qualité) + +- **Duplication `drawGauge`** copiée à l'identique dans 5 `DisplaySource` (Cooler/Fuel/Heat/LiquidLevel/Summary) + magic numbers `maxFuel=64`, `maxCooler=64`, `maxFluid=16000`, `maxHeat=1000` → extraire `AbstractReactorStatDisplaySource`. +- **`GeneratedRecipeBuilder` dupliqué** entre `CNStandardRecipeGen` et `CNShapelessRecipeGen` (+ typo param `enterFolder(String foldedr)`, `createLocation()` jamais appelé). +- **`moddedCompacting`/`moddedPaths` dupliqués** entre `EnrichedRecipeGen` et `SnowPowderRecipeGen` (et `moddedPaths` retourne toujours `null` avec une signature `GeneratedRecipe` trompeuse). +- **Framework de modèle décompilé** (`CNBasicModelPart`, `CNTabulaModelRenderUtils`, `CNAdvancedModelBox`) : noms de variables FernFlower (`lvt_10_1_`, `p_228305_1_`, `var9`), `ModelBox`/`TexturedQuad`/`PositionTextureVertex` dupliqués, shadowing de champs `cubeList`/`childModels`. +- **Logs de debug en prod** : `LOGGER.info("EXPLOSIOOOOOON…")` à chaque explosion (`NuclearMushroomCloudParticle:76`), `LOGGER.warn` par entité touchée (`NuclearExplosionEntity`). +- **Typos dans des noms publics** : `RadiationEffetcHandler` (→ Effect), `SolidRenderedPlaceableFluidtype` + param `stillTecture`, `caracter` (record `MultiBlockOffsetPos`), `contruct` (`IMultiBlockPattern`), `foldedr`. +- **`fireDamage`** non utilisé dans le constructeur `EnrichingCampfireBlock` (valeur 5 passée pour rien) ; dead store `i = ...get2DDataValue()` jamais relu (`EnrichingCampfireBlockEntity:27`) ; branches `isShiftKeyDown` identiques (`ReactorBluePrintItem:51`) ; `use()` redondant retournant `PASS` (`EnrichingCampfireBlock:61`). +- **Commentaires FR/EN mêlés** un peu partout, code commenté résiduel, double `;;` (`CNMixingRecipeGen`, `CNStandardRecipeGen:78`, `CNCClient`), en-têtes FernFlower (`Maths`, `SimplexNoise`). +- **`unlockedBy("has_storage_blocks_steel_nugget", ingots/thorium)`** — critère copié-collé incohérent pour `THORIUM_NUGGET` (`CNItems:186`). + +--- + +## 6. 🏗️ Design + +- **Inversion de couche `api/`** (cf. §1.1) — `api.multiblock`/`api.radiation` dépendent du `content` concret. +- **`MultiBlockManagerBeta` couplé à `ReactorControllerBlockEntity`** : la détection de pattern écrit `setMultiblockFacing` en **effet de bord** dans une BlockEntity concrète (mélange détection + mutation). Fix : retourner la `Direction`, laisser l'appelant l'appliquer. +- **Deux `DeferredRegister` concurrents** pour `ForgeRegistries.PARTICLE_TYPES` (`CNParticleRegistry` brut vs `CNParticleTypes` enum wrapper) — pas un bug (Forge le supporte) mais deux mécanismes/styles parallèles. +- **`controller` typé `ReactorControllerBlock`** (le Block singleton sans état positionnel) dans `ReactorInputEntity`/`ReactorOutputEntity` au lieu de la BlockEntity/BlockPos → champ qui n'apporte aucune info ; champ jamais lu dans `ReactorInputEntity`. +- **`RadiationRegistry` parallèle à `IRadiationSource`** sans règle de priorité → risque de double comptage latent (`RadiationCapability:116` additionne les deux inconditionnellement ; inoffensif aujourd'hui car aucun item n'est dans les deux). +- **`HudOverlay` sur-spécifiée** : `getPriority`/tri sans effet réel sur l'ordre Forge ; `HudRenderer` instancié comme champ alors qu'il est sans état. +- **`@Mod.EventBusSubscriber` sans modid** + `onServerTick()` no-op enregistré pour rien + nommage trompeur `CommentEvents`/`CommentEventClients`. +- **`api/` nommé `Beta`** : surface d'API provisoire promue dans le package censé être stable. +- **`ClothTagHelper`** : copie `base` puis l'écrase toujours (copie inutile dans le flux réel) ; `foundation/util` vs `foundation/utility` sans règle. + +--- + +## 7. ✅ Le bon (à conserver) + +- **Bootstrap idiomatique** : un `CreateRegistrate` + classes `CN*` par domaine appelées depuis `CreateNuclear.onInitialize()` → point unique prévisible ; wiring `DeferredRegister` bien séparé du forge-bus. +- **`api/` + `impl/` datapack registries** : `RodType`/`ReactorFluidType` data-driven avec Codecs + **Builder à validation explicite** (accumule les champs manquants, `IllegalStateException` précise, résolution config paresseuse au runtime) → réacteur extensible par datapack. Très bon design. +- **`RadiationCapability`** : recalcul de la radiation d'inventaire **gardé par un hash** (`InventoryHashUtil`), sync uniquement si `needsSync` → évite le travail par tick sur le hot path joueur. +- **`NuclearExplosionEntity`** : libération **symétrique** des chunks force-loadés (start tick / `remove()`), état `loadingChunks` persisté en NBT pour relâcher après reload. +- **Isolation compat** : `Mods.isLoaded` + pont `AlexscaveCompat` via cast `Object` → pas de `NoClassDefFoundError` quand Alex's Caves est absent. Record `SimpleMultiBlockPattern` immutable (`List.copyOf`/`Map.copyOf`). +- **`CNPackets`** (enum + `PacketType` à index auto) et **`CNTags`** (enum NameSpace factorisé, `matches()` typés) : peu de boilerplate, cohérent. +- **`CNAdvancementBehaviour`** : self-cleanup propre (retire les advancements obtenus, libère `playerId`), server-only, FakePlayer ignoré, persistance NBT. +- **`CNFanProcessingTypes`** : wrappers de recette statiques réutilisés (pas d'allocation par item sur le hot path). +- **`CNProcessingRecipeGen`** : agrégation des sous-générateurs derrière un `DataProvider` unique (`allOf` de `CompletableFuture`). +- **`NotifyUtil`** : gardes side serveur cohérentes, bons overloads `LangBuilder`/`MutableComponent`. +- Direction `controller/{manager,service,consumable}` (interfaces `I*` + impl `Default*`) : la bonne trajectoire stratégie/DI — **à terminer**. + +--- + +## 8. 📋 Plan d'action priorisé + +**Quick wins (≈1 ligne, fort impact)** — corriger d'abord : **B1** (`&& false`), **B2** (sync radiation), **B3** (cooldown), **B5** (`return null`), **B9** (palier radiation), **B18** (clé config) ; puis **B4** (loot thorium). + +**🔴 Priorité 1 — nettoyage à risque faible** +1. Supprimer les reliques V2 mortes : `lib.multiblock.manager.*`, `IBetterPattern`, builders non-aisle, framework keyframe, `CommentEventClients`, `possible code`, `CreateNuclearDamageSources`, `CNShapelessRecipeGen`, `RadiationOverlay`/`EasingHudOverlay`, `IrradiatedSurfaceRules` v1. → **gain le plus élevé pour le moindre risque.** +2. Mettre `run/` dans `.gitignore` (et le dé-tracker du repo). + +**🔴 Priorité 2 — bugs fonctionnels** +3. Traiter les bugs critiques + importants du §2. + +**🟠 Priorité 3 — dette structurelle** +4. Corriger l'**inversion de couche `api/`** : `api.multiblock`/`api.radiation` ne définissent que des interfaces/types ; le `content` dépend de l'api (retourner un `IReactorController` au lieu de `ReactorControllerBlockEntity` ; sortir le wiring `RodType`/`ReactorFluidType` de `api`). +5. **Terminer la décomposition** de `ReactorControllerBlockEntity` (BlockEntity = coordinateur mince, cible < 300 lignes, délégation complète à `manager`/`service`/`consumable`) ; résoudre les **2 systèmes de verrou de fluide** et les **2 `saveData`** en un seul. + +**🟡 Priorité 4 — cohésion** +6. Consolider la radiation en **un** module (api = `IRadiationSource` seul) ; extraire le framework de modèle hors de `content/explosion` ; créer un sous-package `registration/` ; fusionner `foundation/util` → `utility` ; router l'accès config via `ConfigValueResolver` ; renommer les symboles `Beta` ; **ajouter des tests** (`src/test` est vide). + +--- + +*Note : les findings de type bug/dead-code ont été vérifiés de façon adversariale ; 11 ont été réfutés et écartés du rapport. Les sévérités intègrent les corrections des vérificateurs (ex. plusieurs bugs « high » initiaux sont dormants/latents tant qu'un chemin précis n'est pas câblé — signalé au cas par cas ci-dessus).* diff --git a/build.gradle b/build.gradle index ab8ef6417..5343aceb8 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ println "Java: ${System.getProperty 'java.version'}, " + mixin { + add sourceSets.main, "createnuclear.refmap.json" // add sourceSets.main, 'createnuclear.forge.refmap.json' config 'createnuclear.forge.mixins.json' @@ -39,6 +40,7 @@ idea { } minecraft { + accessTransformer = file("src/main/resources/META-INF/accesstransformer.cfg") // The mappings can be changed at any time and must be in the following format. // Channel: Version: // official MCVersion Official field/method names from Mojang mapping files @@ -111,10 +113,14 @@ minecraft { client { workingDirectory project.file('run') // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - //property 'mixin.env.remapRefMap', 'true' - //property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - property("mixin.env.remapRefMap", "true") - property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + } + + client2 { + parent runs.client + workingDirectory project.file('run/client2') + args '--username', 'Dev2' } server { @@ -128,7 +134,7 @@ minecraft { // The gametest system is also enabled by default for other run configs under the /test command. gameTestServer { workingDirectory project.file('run/gametest') - //property 'forge.enabledGameTestNamespaces', mod_id + property 'forge.enabledGameTestNamespaces', mod_id } data { @@ -184,6 +190,10 @@ dependencies { compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}") // at runtime, use the full JEI jar for Forge + //Alex's cave + compileOnly fg.deobf("curse.maven:alexs-caves-924854:5848216") + compileOnly fg.deobf("curse.maven:citadel-331936:6002521") + implementation(fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") { transitive = false }) implementation(fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}")) compileOnly(fg.deobf("dev.engine-room.flywheel:flywheel-forge-api-${minecraft_version}:${flywheel_version}")) @@ -208,6 +218,14 @@ dependencies { annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' }*/ annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" + + /** Tests **/ + testImplementation platform('org.junit:junit-bom:5.10.2') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() } // This block of code expands all declared replace properties in the specified resource targets. diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..7e0ebba85 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: src/generated/resources/assets/createnuclear/lang/en_us.json + translation: /src/main/resources/assets/createnuclear/lang/%locale_with_underscore%.json diff --git a/gradle.properties b/gradle.properties index f05c9784a..97d97f9e6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -62,15 +62,15 @@ mod_id=createnuclear # The human-readable display name for the mod. mod_name=Create Nuclear # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. -mod_license=All Rights Reserved +mod_license=MIT # The mod version. See https://semver.org/ -mod_version=1.3.1 +mod_version=2.0.17-beta-sound3 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html mod_group_id=net.nuclearteam.createnuclear -# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors=Create Nuclear -# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Create nuclear is a mod that adds a whole nuclear system to the create mod. An optimized reactor produces over two millions SU. -mixin_config = 'createnuclear.forge.mixins.json' \ No newline at end of file +# The authors of the mod. This is a simple text string used for display purposes in the mod list. +mod_authors=Create Nuclear Team +# The description of the mod. This is a simple multiline text string used for display purposes in the mod list. +mod_description=Create nuclear is a mod that adds a whole nuclear system to the Create mod. An optimized reactor produces over eight million SU. +mixin_config = 'createnuclear.forge.mixins.json' diff --git a/run/mods/Jade-1.20.1-Forge-11.12.2.jar.disabled b/run/mods/Jade-1.20.1-Forge-11.12.2.jar.disabled deleted file mode 100644 index 5cecec75c..000000000 Binary files a/run/mods/Jade-1.20.1-Forge-11.12.2.jar.disabled and /dev/null differ diff --git a/run/schematics/reactor.nbt b/run/schematics/reactor.nbt new file mode 100644 index 000000000..901228130 Binary files /dev/null and b/run/schematics/reactor.nbt differ diff --git a/run/schematics/reactor9x9.nbt b/run/schematics/reactor9x9.nbt new file mode 100644 index 000000000..5951f274f Binary files /dev/null and b/run/schematics/reactor9x9.nbt differ diff --git a/run/schematics/reactor_t1.nbt b/run/schematics/reactor_t1.nbt new file mode 100644 index 000000000..aea122f24 Binary files /dev/null and b/run/schematics/reactor_t1.nbt differ diff --git a/run/schematics/reactor_t1_ponder.nbt b/run/schematics/reactor_t1_ponder.nbt new file mode 100644 index 000000000..44cd6ae65 Binary files /dev/null and b/run/schematics/reactor_t1_ponder.nbt differ diff --git a/run/schematics/reactor_t2.nbt b/run/schematics/reactor_t2.nbt new file mode 100644 index 000000000..b619d29e6 Binary files /dev/null and b/run/schematics/reactor_t2.nbt differ diff --git a/run/schematics/reactor_t2_ponder.nbt b/run/schematics/reactor_t2_ponder.nbt new file mode 100644 index 000000000..d3b8229d2 Binary files /dev/null and b/run/schematics/reactor_t2_ponder.nbt differ diff --git a/run/schematics/reactor_t3.nbt b/run/schematics/reactor_t3.nbt new file mode 100644 index 000000000..d94dc85fe Binary files /dev/null and b/run/schematics/reactor_t3.nbt differ diff --git a/run/schematics/reactor_t3_ponder.nbt b/run/schematics/reactor_t3_ponder.nbt new file mode 100644 index 000000000..9676d99e7 Binary files /dev/null and b/run/schematics/reactor_t3_ponder.nbt differ diff --git a/run/schematics/reactorhdsbquifu.nbt b/run/schematics/reactorhdsbquifu.nbt new file mode 100644 index 000000000..1fb170fcd Binary files /dev/null and b/run/schematics/reactorhdsbquifu.nbt differ diff --git a/run/schematics/setup.nbt b/run/schematics/setup.nbt new file mode 100644 index 000000000..e753f36bf Binary files /dev/null and b/run/schematics/setup.nbt differ diff --git a/run/schematics/testalarm.nbt b/run/schematics/testalarm.nbt new file mode 100644 index 000000000..292fa369e Binary files /dev/null and b/run/schematics/testalarm.nbt differ diff --git a/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 b/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 new file mode 100644 index 000000000..0a599e347 --- /dev/null +++ b/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 @@ -0,0 +1,2 @@ +// 1.20.1 2026-08-03T17:25:05.6674408 CreateNuclear's Custom Sounds +469b4ea17371681fcb9a666c8cf8b51176a8df3b assets/createnuclear/sounds.json diff --git a/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 index 7c8ad67ce..e98ca84ae 100644 --- a/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 +++ b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 @@ -1,17 +1,24 @@ -// 1.20.1 2025-11-11T13:56:47.9570936 CreateNuclear's Processing Recipes +// 1.20.1 2026-06-25T13:51:56.534886 CreateNuclear's Processing Recipes +bccfe326d6c91bd2df207a38225fbca413e1013f data/createnuclear/recipes/compacting/thorium_fluid_to_thorium_ingot.json c711d032a04e1a9350ad9bc4d9c4d74f54689862 data/createnuclear/recipes/compacting/uranium_fluid_to_yellowcake.json 33becbc558bd2fbe277be096b292c0093f84e44c data/createnuclear/recipes/crushing/coal.json 2a8b609dba5bad88511d9c9a80cf6fb582b18c36 data/createnuclear/recipes/crushing/fix/crushed_raw_uranium.json 57154e35ebb09170bb39f5b3a72ecd49182697f2 data/createnuclear/recipes/crushing/granite.json +682ceb2386fe56cd47e46d7ebb3d8185ac78515b data/createnuclear/recipes/crushing/nitrate.json 4feb59d85e86e34ed565c18b6a4df120fe050bc7 data/createnuclear/recipes/crushing/raw_copper.json -cf17713133d3e05e99164e2ea6649de3aef017fd data/createnuclear/recipes/crushing/raw_uranium_block.json +c0e1f33d8e91a3133e5acf6e4d3eb5ea5cd23471 data/createnuclear/recipes/crushing/raw_thorium.json +169c09c5947ddf8bdc8727af3c71368880b0c128 data/createnuclear/recipes/crushing/raw_thorium_block.json 26d2787e831b9986ed6f90f8ea803d5fdc544bf5 data/createnuclear/recipes/crushing/raw_zinc.json +87d2e1022c9eeb986bdc23b068fe7cf473ee42f1 data/createnuclear/recipes/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json +04c671106607c2c93c0706f690cd876fb072dd56 data/createnuclear/recipes/deploying/reactor_output_from_shaft_and_reactor_casing.json +58a34e84d942cb4250969388f78282270215c227 data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json e42be7d17c5e057e62c4b1176cbf43319a157f51 data/createnuclear/recipes/enriched/enriched_yellowcake.json 74555eb2cce0827f99dc5c4ff91362bdaecad725 data/createnuclear/recipes/enriched/enriching_campfire.json d0a30a8942f3e81d11afa21a93037916601c38cb data/createnuclear/recipes/item_application/reactor_casing_from_steel_and_brass_casing.json -f2d3a2dbcb9135e31261cc8408f11cd07038a826 data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json -91c07d7804d0960aaa17a6258f00f1731ca458f5 data/createnuclear/recipes/item_application/reactor_output_from_shaft_and_reactor_casing.json +a9d114da800657c53caabcb1369137ede6746362 data/createnuclear/recipes/mixing/liquid_nitrogen.json 7fc7695cd03577131096e9695170193044f8bc1a data/createnuclear/recipes/mixing/steel.json +4bc858c73385e4309ef250b163cc696244a64767 data/createnuclear/recipes/mixing/thorium_fluid.json 23e57de458330d04dfebff8070b44b3b1b2718eb data/createnuclear/recipes/mixing/uranium_fluid.json -ee4d2bf63449ba88826be263cf98e4bba2927ced data/createnuclear/recipes/pressing/graphene.json +8e4e330293a702522ed424488055fe4d8d68c22d data/createnuclear/recipes/pressing/graphene.json +f6f427d92e7680c47bc8d25f3d023ae6ce465615 data/createnuclear/recipes/snow_powder/cooled_nitrogen_concentrate.json 0756d627739cbbc2653aa3fbde9945ec11f2eace data/createnuclear/recipes/splashing/crushed_raw_lead.json diff --git a/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f b/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f index 480cb52b7..9d5c18983 100644 --- a/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f +++ b/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f @@ -1,4 +1,4 @@ -// 1.20.1 2025-11-11T13:56:47.9632247 Registrate Provider for createnuclear [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2026-08-03T17:25:05.6689605 Registrate Provider for createnuclear [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 0b2c76c9cff305eacfdfb57c4b703f94ca6dc903 assets/createnuclear/blockstates/autunite.json 5d06bc544bcbeb7443178d66955bb5101cf696da assets/createnuclear/blockstates/autunite_pillar.json 5b375444ac5057e63776f4991589c57824574b4a assets/createnuclear/blockstates/cut_autunite.json @@ -10,6 +10,8 @@ b88d65e7a3393caeaed8d504bf6c4615767371aa assets/createnuclear/blockstates/cut_au 56c308e675a047a3d28757377e61e5f79c6384e3 assets/createnuclear/blockstates/cut_autunite_stairs.json 98d386985f7c185f1acab25b9d606828f788769f assets/createnuclear/blockstates/cut_autunite_wall.json 5cf183e5277aea7ac5eb2bfa88737db909c6244d assets/createnuclear/blockstates/deepslate_lead_ore.json +ba89776428914de9e6a4d068ae695ddc5d7a4881 assets/createnuclear/blockstates/deepslate_nitrate_ore.json +e4edd1e8b7aecc00e45f4c154b302d3581e18ce9 assets/createnuclear/blockstates/deepslate_thorium_ore.json a6f90dfcfc0659663335d4c80129ce41d0c8e47a assets/createnuclear/blockstates/deepslate_uranium_ore.json e11c7fa5830b0877af69bb18e650d2b1e6f90027 assets/createnuclear/blockstates/enriched_soul_soil.json f6b762b1e80656d932e990210b43e4bfb209e4d8 assets/createnuclear/blockstates/enriching_campfire.json @@ -17,29 +19,37 @@ f6b762b1e80656d932e990210b43e4bfb209e4d8 assets/createnuclear/blockstates/enrich 98dd6f667ccef1f8f1d332b42b146a6c0bbfb0db assets/createnuclear/blockstates/layered_autunite.json f10bbdbab6112c58bebf2d98dc0ed3eb9370c09c assets/createnuclear/blockstates/lead_block.json 300b8a29d6a440a60320133481041671dde65448 assets/createnuclear/blockstates/lead_ore.json +c8479fd99df3917545c86ee3ea9bfe981bf762e7 assets/createnuclear/blockstates/nitrate_ore.json +539751a5a2a28445f570cb61b89b16c31e7d5ad0 assets/createnuclear/blockstates/nitrogen.json 1eed8de7f7b90d46d3e4fb6a0e7e9abf10a8a78f assets/createnuclear/blockstates/polished_cut_autunite.json 462d22ea4a021cc368721fdb841c8a9b9176c06d assets/createnuclear/blockstates/polished_cut_autunite_slab.json 76a9a39503654b94cbe01e249292ed280446bbb6 assets/createnuclear/blockstates/polished_cut_autunite_stairs.json f628f8c7aa1e150ad2b5a3ce87dbe7f00b462e74 assets/createnuclear/blockstates/polished_cut_autunite_wall.json 8195d52278bf58414faaaec6067905635aaa29d5 assets/createnuclear/blockstates/raw_lead_block.json +5db59637c8fdd94d90bc9748c10769eb54f97224 assets/createnuclear/blockstates/raw_thorium_block.json 63aaf78c3e0c16c2f37b069c5392e3d1a93ac058 assets/createnuclear/blockstates/raw_uranium_block.json +1c9953bedf6cec725a6db7a199d826dcdfe9dfa7 assets/createnuclear/blockstates/reactor_alarm.json 0fbc9288622efc18fe39b6c8ba89e7e2281dee26 assets/createnuclear/blockstates/reactor_casing.json -60ca260d5b5bcd975c0a3918b461748786cde95e assets/createnuclear/blockstates/reactor_controller.json +0b5bd864f1e3b0c6b0ce868245da96fd8070fb21 assets/createnuclear/blockstates/reactor_controller.json 3c259041f317bb8868fb4f177c457fc12b8d28f5 assets/createnuclear/blockstates/reactor_cooler.json 3cced3f7d35371f1881b0485ee324788adcd2c74 assets/createnuclear/blockstates/reactor_core.json +0d8ab9ccc729b8e78539a2fab7b52b6be0afb24b assets/createnuclear/blockstates/reactor_fluid_input.json ff68065029f7d47434aaf3f60e5ec3319302d2d8 assets/createnuclear/blockstates/reactor_frame.json -797bb3045272b742be75c5dc1a511a1c2acaa877 assets/createnuclear/blockstates/reactor_input.json 36ee5c127b0548502d15bc16a638a5bac40df1b6 assets/createnuclear/blockstates/reactor_output.json +daa6730e5e83972faea54e62eb1cf0fe36aaef0a assets/createnuclear/blockstates/reactor_rod_input.json f7504d5f748fe938bf07d2eb5d0ba46bbfa0499d assets/createnuclear/blockstates/reinforced_glass.json f9dd0a30be6d92e85fd7c3dde4f1b732f63d35ce assets/createnuclear/blockstates/small_autunite_brick.json 533317e2fc9ab18b71dea2fecaec599533a864c4 assets/createnuclear/blockstates/small_autunite_brick_slab.json b9c915389ea6cf8338d20c48e908591f8baa2108 assets/createnuclear/blockstates/small_autunite_brick_stairs.json a2fc21fa320e677fe7690b260ee3f57ebdbd50b6 assets/createnuclear/blockstates/small_autunite_brick_wall.json 57c846a957e9250bc45f2f1091bf3f78b2a77344 assets/createnuclear/blockstates/steel_block.json +3134eef054a6f9f461bf774630241414614a9109 assets/createnuclear/blockstates/thorium.json +3c5ff75a6dc4ba05ac94e0f2435e88821cd848ee assets/createnuclear/blockstates/thorium_block.json +643a4d44b491a84d0d26e1a8944dffc40e83ce14 assets/createnuclear/blockstates/thorium_ore.json de2884054a21315d8b167f64b206be331d388420 assets/createnuclear/blockstates/uranium.json 4557f548df100ae1d05e3b5711797225f6a39673 assets/createnuclear/blockstates/uranium_ore.json -27f15cf0f283a9dbd23b2af0069bffb349080a57 assets/createnuclear/lang/en_ud.json -2e3ff05dfc61519481e228d1b85e1c3e5e4ad55c assets/createnuclear/lang/en_us.json +3f4d8689a07544843dba2a41e2e127da377d727e assets/createnuclear/lang/en_ud.json +f706554fe75cd5537f0e75fd8174eb99da7cb5a3 assets/createnuclear/lang/en_us.json a8495d2cd5e38213683becaf1c84b2852f8b06f5 assets/createnuclear/models/block/autunite_natural_0.json 29394a22ee8655dc22ea51563411505fbcfd2dab assets/createnuclear/models/block/autunite_natural_1.json 9e4f83de1ca7a9ab5363f43fc7c3f7f4ec6164d5 assets/createnuclear/models/block/autunite_natural_2.json @@ -65,11 +75,15 @@ e1e1e4bff55028860d776d8ecb992547fa12b1b5 assets/createnuclear/models/block/cut_a baced15580735dd63848a96763f8c7ffe61f3376 assets/createnuclear/models/block/cut_autunite_wall_side.json cd15b5be0dca5f621266b157b424ac37dac859dd assets/createnuclear/models/block/cut_autunite_wall_side_tall.json 9a589577d80aa23ac97312bda605b5512eff5167 assets/createnuclear/models/block/deepslate_lead_ore.json +1a125ab1e392f50375ea2f4421adc8106c5ac7be assets/createnuclear/models/block/deepslate_nitrate_ore.json +6fa74ed345ab06422eca4c254f9108b4dfabfd78 assets/createnuclear/models/block/deepslate_thorium_ore.json 6793dd91b730f4c9abea29215de16cd0751d8cbd assets/createnuclear/models/block/deepslate_uranium_ore.json e1b8fdc0555a1fdabda54f66cca868e444d1110b assets/createnuclear/models/block/enriched_soul_soil.json 8408a3894e9ca6e45e738b81f0a1932a0b2f86a5 assets/createnuclear/models/block/layered_autunite.json fd642aefed8f59f5575c96ad1a0251e7773f3909 assets/createnuclear/models/block/lead_block.json c9757e3fd9841ee17366b1d88563df6ea8106513 assets/createnuclear/models/block/lead_ore.json +ed7fef54fcaf191778ffdb588ed62fa72ec892b4 assets/createnuclear/models/block/nitrate_ore.json +20a57f470b6d6ce6822c61da93e09e95bad6deee assets/createnuclear/models/block/nitrogen.json 460e9ac2c0a90607b74afc5823b737a2867a35e3 assets/createnuclear/models/block/polished_cut_autunite.json 8d0e97cda9e4098e0aa8dca93445d3b52150dcfa assets/createnuclear/models/block/polished_cut_autunite_slab.json 4fa87093074c0a325ea50ab2d3c9725a90a11e1c assets/createnuclear/models/block/polished_cut_autunite_slab_double.json @@ -81,7 +95,12 @@ a251d75552efea796382a4124659f9d39606461b assets/createnuclear/models/block/polis ad989d89e7b80a30e0860fb0f1418013fe3355d2 assets/createnuclear/models/block/polished_cut_autunite_wall_side.json b950ac6ca2df77ffe3abd02e13c38567602e5536 assets/createnuclear/models/block/polished_cut_autunite_wall_side_tall.json cf8b4d604330762358b21b6e079aaab1eb2987f4 assets/createnuclear/models/block/raw_lead_block.json +de9b4dee9580161263fa8020d326ac5fe4e38ed4 assets/createnuclear/models/block/raw_thorium_block.json 561c9f9a4e153fc648a3c7224812c71c8ac2da5c assets/createnuclear/models/block/raw_uranium_block.json +dedbaa09b31d53c446144816edf216d4c20253df assets/createnuclear/models/block/reactor/controller/off.json +988faa4b7af770a8256ea25247e333cbc9d14eca assets/createnuclear/models/block/reactor/controller/on.json +d58fcfe99b438b77b4a2dd8d0dd9e1f35d037bae assets/createnuclear/models/block/reactor/controller/standby.json +d5acc57be1c8ccc3e61c40cf11856933d35803b3 assets/createnuclear/models/block/reactor_alarm.json 7cdeee7f4740b6a86802354534be24dbb251e211 assets/createnuclear/models/block/reinforced_glass.json e94d3eb865d17234b18241d89acdec2b10a1d21a assets/createnuclear/models/block/small_autunite_brick.json 2d0c4071223fd38069cfdac403b33bd2925d6750 assets/createnuclear/models/block/small_autunite_brick_slab.json @@ -93,26 +112,89 @@ f99b30bd0cb3a8b78ed88a3a17b35b512c69ee06 assets/createnuclear/models/block/small 093bb2418968291015e9d3122755af3fd0b948d4 assets/createnuclear/models/block/small_autunite_brick_wall_side.json 5a9a262da20c1b7053276c444bff017e73c923c9 assets/createnuclear/models/block/small_autunite_brick_wall_side_tall.json 47f627eaccbd07bf81d1c45f95ebcc88994ad757 assets/createnuclear/models/block/steel_block.json +9333acc5ef34d03e00e0eaf24a3b48f2704a15c1 assets/createnuclear/models/block/thorium.json +9d2613725484de94788ba5075854eb225eaa4936 assets/createnuclear/models/block/thorium_block.json +e27878149b45eefa8673f2b86b6f491e2ed7a80f assets/createnuclear/models/block/thorium_ore.json d234edb3b6bc81b7300ee65722973b66db0b82d9 assets/createnuclear/models/block/uranium.json a4d5ee44c830e329034a46792280edea53343034 assets/createnuclear/models/block/uranium_ore.json -fba1c32ae3c38d735ebb0b4c3912afc8f9e9cde4 assets/createnuclear/models/item/anti_radiation_boots.json 29394a22ee8655dc22ea51563411505fbcfd2dab assets/createnuclear/models/item/autunite.json 30b11d8da5d02a3e9cebb739b3b9efbee087573c assets/createnuclear/models/item/autunite_pillar.json -f8e44e53a7bc368d4c159769bb071eef6d28d856 assets/createnuclear/models/item/black_anti_radiation_chestplate.json -82a63e5c93daac9c5430ae77aa8d10b1bddbc2c7 assets/createnuclear/models/item/black_anti_radiation_helmet.json -2d0a3f0d2dd0fab5b73c7b8291a5eb3a7921157a assets/createnuclear/models/item/black_anti_radiation_leggings.json +dd462819c7477f9d416f6783b27651385d3ac16f assets/createnuclear/models/item/biome_irradiation_extractor.json +55f1cb77f9e4decaa0ed9a08e71aa861c6e05366 assets/createnuclear/models/item/biome_irradiation_extractor/full.json +c9ea333225e88893332265930dc3a52dce185cf9 assets/createnuclear/models/item/biome_irradiation_extractor/half.json +0cbeee214db51866795c62777e45ca5ed980d7e7 assets/createnuclear/models/item/biome_irradiation_extractor/quarter.json +c8a996760a2e68b408df64fe3702fd8933908e35 assets/createnuclear/models/item/biome_irradiation_extractor/three_quarters.json 3036f3b383b40ca2021856366cd0f01cb279285b assets/createnuclear/models/item/black_cloth.json -288c9245496eb0020ace0481a4d4ac26df876063 assets/createnuclear/models/item/blue_anti_radiation_chestplate.json -b8574d7ee3d3e733dab79700062554cf4b58bd6f assets/createnuclear/models/item/blue_anti_radiation_helmet.json -ed88d15d2f1a4af012371d523fb3b95bcedfad28 assets/createnuclear/models/item/blue_anti_radiation_leggings.json 3a5955f81eeed80e907bf8e2ee4df14fe42843f0 assets/createnuclear/models/item/blue_cloth.json -2e364d92951412b2dd7d9fbb0209fc8f3194bcd5 assets/createnuclear/models/item/brown_anti_radiation_chestplate.json -d61337a67071319320d75383a62ecac11c3222d1 assets/createnuclear/models/item/brown_anti_radiation_helmet.json -ce17b82389ca226bc9e55072ae0dab1ef049e96f assets/createnuclear/models/item/brown_anti_radiation_leggings.json 8cdcca32a87171e2c709e762165330b2f0389f90 assets/createnuclear/models/item/brown_cloth.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/createnuclear/models/item/cat_irradiated_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/createnuclear/models/item/chicken_irradiated_spawn_egg.json 047d097f30f9586494547715d07271c6994acd18 assets/createnuclear/models/item/coal_dust.json +bf6071ba9dac8aa186d7eff1687fd0c49c9e83d4 assets/createnuclear/models/item/colored/black_anti_radiation_boots.json +5e5029f1eced6b6588c6bf0a8a24412769be2032 assets/createnuclear/models/item/colored/black_anti_radiation_chestplate.json +c9a0fd5c17d33650f929ea28e753f1524b28df8e assets/createnuclear/models/item/colored/black_anti_radiation_helmet.json +8d35357fdf69ae42b16a529c58f13e3286a36e96 assets/createnuclear/models/item/colored/black_anti_radiation_leggings.json +2e4e4388510043760a1686cf2a535b95e4e11746 assets/createnuclear/models/item/colored/blue_anti_radiation_boots.json +e630329b2f6072a5e03e657f3c7c04f1e19ec6f0 assets/createnuclear/models/item/colored/blue_anti_radiation_chestplate.json +11858d3d90ff03ffb533d33c6a2dc6736f954c1a assets/createnuclear/models/item/colored/blue_anti_radiation_helmet.json +a19e265184d7df73f6c465d24f23a6566d9b08cc assets/createnuclear/models/item/colored/blue_anti_radiation_leggings.json +af2f19bf91ad723971afbe71c93a3fb1ef9e9b80 assets/createnuclear/models/item/colored/brown_anti_radiation_boots.json +9f2490080037e0cc9580e1939957243d7d80f494 assets/createnuclear/models/item/colored/brown_anti_radiation_chestplate.json +5dc65bb458012228b982eebb3b292aaea048f129 assets/createnuclear/models/item/colored/brown_anti_radiation_helmet.json +e6f5233fec76488fed7f01a8fc6dd13e369bb99c assets/createnuclear/models/item/colored/brown_anti_radiation_leggings.json +ccbfebe4c6428606495ec9d95d03cba12f0614c3 assets/createnuclear/models/item/colored/cyan_anti_radiation_boots.json +2922f5f250e65244329fa2e8a9fc063252f1c384 assets/createnuclear/models/item/colored/cyan_anti_radiation_chestplate.json +92b43a2cde30b9485d7abbdadfda5de7df745f27 assets/createnuclear/models/item/colored/cyan_anti_radiation_helmet.json +1899b326e3ae6b628d793a988839e940da7d4184 assets/createnuclear/models/item/colored/cyan_anti_radiation_leggings.json +135d0ef2e307cacde2fc7834ff599f175f708321 assets/createnuclear/models/item/colored/gray_anti_radiation_boots.json +c7a2bcf4933ee6530668468e2d750a766685b6d8 assets/createnuclear/models/item/colored/gray_anti_radiation_chestplate.json +eb475bbcb4fcc6ef33247a8d828a5f7cebc9bd17 assets/createnuclear/models/item/colored/gray_anti_radiation_helmet.json +8dc41293aea1b2b10d3f5ed7cceb1e750211de82 assets/createnuclear/models/item/colored/gray_anti_radiation_leggings.json +32e4183b43020d4adafc0492e3380f582bc1bc96 assets/createnuclear/models/item/colored/green_anti_radiation_boots.json +2ee9cb67f264276d1e43ae867261194d48cf3e2f assets/createnuclear/models/item/colored/green_anti_radiation_chestplate.json +777b11e9079ed656d81d46618abcf0e3180fa211 assets/createnuclear/models/item/colored/green_anti_radiation_helmet.json +4a764228deb8dd3fa9919b96de866a67147dab47 assets/createnuclear/models/item/colored/green_anti_radiation_leggings.json +0b284171834018501d8a8fa033c2f23253410435 assets/createnuclear/models/item/colored/light_blue_anti_radiation_boots.json +aa8b456049ff706bb4f24ad6e9c159f5be97595e assets/createnuclear/models/item/colored/light_blue_anti_radiation_chestplate.json +f920b0e1e5ccd09cf718aed7c4ce877d8b71535c assets/createnuclear/models/item/colored/light_blue_anti_radiation_helmet.json +28a24d909791afb368fef3c9ea62bd8f411294c0 assets/createnuclear/models/item/colored/light_blue_anti_radiation_leggings.json +3f95305d86580f5bcd4565bf212529c0a31df89f assets/createnuclear/models/item/colored/light_gray_anti_radiation_boots.json +fc40ae0592b29adc56b474a1dcfdda3b308338b6 assets/createnuclear/models/item/colored/light_gray_anti_radiation_chestplate.json +ff2b2cd99e3a5f1d73d5a5b85188e166860e840b assets/createnuclear/models/item/colored/light_gray_anti_radiation_helmet.json +504461e53fd0666769900bb4a9203f549516c32a assets/createnuclear/models/item/colored/light_gray_anti_radiation_leggings.json +56db9dc9744caa6cc0d7f447ee779eea7611bcec assets/createnuclear/models/item/colored/lime_anti_radiation_boots.json +c12d3c89f7964fc9891ae1757457f52f5fd42fb4 assets/createnuclear/models/item/colored/lime_anti_radiation_chestplate.json +0e3076492440bd60e320b960e783b87f941b4bca assets/createnuclear/models/item/colored/lime_anti_radiation_helmet.json +0319754a78d26eb0a102410b172847f59b4e3abd assets/createnuclear/models/item/colored/lime_anti_radiation_leggings.json +a67c6bcc52241530e0a6a1b6462815125730f47c assets/createnuclear/models/item/colored/magenta_anti_radiation_boots.json +d1a3620810d13a8d2887b740aa31147d667a76fe assets/createnuclear/models/item/colored/magenta_anti_radiation_chestplate.json +bd51ce1850aeb47e442d9a225f8e1b9c64703668 assets/createnuclear/models/item/colored/magenta_anti_radiation_helmet.json +2237ced4a4e9ce11096fca7832475859f6a63d12 assets/createnuclear/models/item/colored/magenta_anti_radiation_leggings.json +0e8458fba6ef3f70d485e9ef94ad3348b9c9ccc3 assets/createnuclear/models/item/colored/orange_anti_radiation_boots.json +5596d1c4c495809c2642c5e59e697661411f29a6 assets/createnuclear/models/item/colored/orange_anti_radiation_chestplate.json +3f7f545fe4aecd253b1e34c146ee7eb45dc5a4b6 assets/createnuclear/models/item/colored/orange_anti_radiation_helmet.json +854edc540ee421a3da166ebedb95706349e3612b assets/createnuclear/models/item/colored/orange_anti_radiation_leggings.json +db195113d80a009ccdd6db125020dbfc010e81b3 assets/createnuclear/models/item/colored/pink_anti_radiation_boots.json +c435c2b95d5e27fff9fd300218710ce8b4444df5 assets/createnuclear/models/item/colored/pink_anti_radiation_chestplate.json +823b1614c94b8e385449c05225bc8d3dfa214168 assets/createnuclear/models/item/colored/pink_anti_radiation_helmet.json +3ee985f85be75905a3ec5c31750a6093e29332c2 assets/createnuclear/models/item/colored/pink_anti_radiation_leggings.json +c8ae14ec7e445f9f2158ff0ce05addcfe412f8f1 assets/createnuclear/models/item/colored/purple_anti_radiation_boots.json +f62d520b0e16a5800aee9937e50f543d7ae9505f assets/createnuclear/models/item/colored/purple_anti_radiation_chestplate.json +8a4fa7289406f02f82bf52871bdabd7918600ce8 assets/createnuclear/models/item/colored/purple_anti_radiation_helmet.json +a550ea9c2b1f3aaa4b942552993f84f2ac856bff assets/createnuclear/models/item/colored/purple_anti_radiation_leggings.json +804f3448f3b880ce8e43fbb3fcb963c8ace1841c assets/createnuclear/models/item/colored/red_anti_radiation_boots.json +c35ac2019c04d1da881af7e0c48ee5074fa85bfb assets/createnuclear/models/item/colored/red_anti_radiation_chestplate.json +caa15a3ca087a40b33eb78e2156c9697b08f5c5f assets/createnuclear/models/item/colored/red_anti_radiation_helmet.json +b28e064c434b9859f1465c698f97fecd738707d6 assets/createnuclear/models/item/colored/red_anti_radiation_leggings.json +bd8afdb187eaaaf8611c80e43783a3d428d7477d assets/createnuclear/models/item/colored/white_anti_radiation_boots.json +64ddb5bd41f762fae95366dc33e9bb80aee440be assets/createnuclear/models/item/colored/white_anti_radiation_chestplate.json +59333dc66e3d12c84ea8a83dbce5e96048ef179f assets/createnuclear/models/item/colored/white_anti_radiation_helmet.json +7bb3c999d445c237d220267c390e4ef1d6cb605b assets/createnuclear/models/item/colored/white_anti_radiation_leggings.json +fbf21711d9d9196b95f53d10a3d0160e1423e3ef assets/createnuclear/models/item/colored/yellow_anti_radiation_boots.json +96f46592ee8bd686c14d53eabc03ac0223784fd5 assets/createnuclear/models/item/colored/yellow_anti_radiation_chestplate.json +ceefea70488adb5db8c8e2355eb9b59b8262b0fc assets/createnuclear/models/item/colored/yellow_anti_radiation_helmet.json +893789e72874b7b3bb5634df81b374c38177f2f7 assets/createnuclear/models/item/colored/yellow_anti_radiation_leggings.json +4c5ade8688c0dfd0c3007c6bde5d52fb0a0f44cc assets/createnuclear/models/item/cooled_nitrogen_concentrate.json 0c682ff48601bf7f42c8561819ecede780664fbf assets/createnuclear/models/item/cut_autunite.json 11220bd60ab51e05a978a8322511c224d15bf886 assets/createnuclear/models/item/cut_autunite_bricks.json d43ffb4c5491fcd8c98451649c3f4ceb271e8875 assets/createnuclear/models/item/cut_autunite_brick_slab.json @@ -121,79 +203,61 @@ dfea56e99288e64e5061c621e860fa314fc31e9d assets/createnuclear/models/item/cut_au 5027aa166900571aa2e4f50ad53869b595ff3426 assets/createnuclear/models/item/cut_autunite_slab.json bd832947d219746d3264422bc4c82f6acdc5cc3e assets/createnuclear/models/item/cut_autunite_stairs.json 4c0b115eb2a2f8d6e74c612fa6e1aa5b357e9185 assets/createnuclear/models/item/cut_autunite_wall.json -3aa34b484b1eb135c9e2fcd3db675aa8d7927951 assets/createnuclear/models/item/cyan_anti_radiation_chestplate.json -4925fd5469c909ae1e212cb0279f534656ee93a4 assets/createnuclear/models/item/cyan_anti_radiation_helmet.json -84b9d23fadc9fd0a2e45fc3609f6bf16ecb1545d assets/createnuclear/models/item/cyan_anti_radiation_leggings.json de649e8356e85e802df3e64df8fd663ce62ba16d assets/createnuclear/models/item/cyan_cloth.json 34c28d31d8b93699cc6ffab724d9c51670c0f3e2 assets/createnuclear/models/item/deepslate_lead_ore.json +e7121a329daab2859a4fbe971cea9ce1d3ab0b56 assets/createnuclear/models/item/deepslate_nitrate_ore.json +60b37c01bc3e885a25ce9b1aff4f8cb44e98f759 assets/createnuclear/models/item/deepslate_thorium_ore.json 1f160865067749c0bed163a84a61581631294141 assets/createnuclear/models/item/deepslate_uranium_ore.json +da342367b9997ac11b7165287f236ac483cc6671 assets/createnuclear/models/item/default_anti_radiation_boots.json +a1ee5609ce7559169b986d4eb17e6a5cd500d485 assets/createnuclear/models/item/default_anti_radiation_chestplate.json +42c1d356ab28f9046073d582da2cf96457366a2d assets/createnuclear/models/item/default_anti_radiation_helmet.json +809f0c1d796358d37d0e4f1df699fd13b1b9e5ed assets/createnuclear/models/item/default_anti_radiation_leggings.json 5a2694d92c4708ca23ddfa67666ea26be66b9a45 assets/createnuclear/models/item/enriched_soul_soil.json 306f5731ab788fa3cf3d75a7edfcc68b9c20613a assets/createnuclear/models/item/enriched_yellowcake.json a3b71025626527be742999a0256e9c2290c9d42e assets/createnuclear/models/item/enriching_campfire.json 78240d0c081d144592e76af622d0c9929569db17 assets/createnuclear/models/item/graphene.json 3c0e762c21fa4fa5724f5570c190e89d247ee71b assets/createnuclear/models/item/graphite_rod.json -eae1421ac37a98d0fc795bab8f349906aed521dd assets/createnuclear/models/item/gray_anti_radiation_chestplate.json -c88d66c0a041c51ee8089e5596169dc6c353fb13 assets/createnuclear/models/item/gray_anti_radiation_helmet.json -e66dc779ab853aecc35e6ccfba5d9dba78cd0574 assets/createnuclear/models/item/gray_anti_radiation_leggings.json 75bd474d73be3c041ceb82627cc438b2775e9b1b assets/createnuclear/models/item/gray_cloth.json -b4ddee28d16f837d70e311c84748b18fe3cdc21a assets/createnuclear/models/item/green_anti_radiation_chestplate.json -d0f9a216114a583e097ef8369c4ed74f50270672 assets/createnuclear/models/item/green_anti_radiation_helmet.json -00308a5c640b2ec21ad96b313789a2ec28cff516 assets/createnuclear/models/item/green_anti_radiation_leggings.json 104ab85c7f23d9239608603e6cb2227bc60b585f assets/createnuclear/models/item/green_cloth.json ad33dca8ecf90a8bc1ebb61c2007af72c427e9ed assets/createnuclear/models/item/layered_autunite.json 17ec52f71bd19239771c599ee80d9ffa073738af assets/createnuclear/models/item/lead_block.json 649fce08e620f39f776ab8ae8dcb17e0fd77c82f assets/createnuclear/models/item/lead_ingot.json 4d18b6f86e9ebcff28c08b9876f1819a067cd290 assets/createnuclear/models/item/lead_nugget.json 3fc1094857b79873a966d6de2dc9ec3b711caadf assets/createnuclear/models/item/lead_ore.json -af0ce4256f68076af5c6a6da9faa98919eeb0a1c assets/createnuclear/models/item/light_blue_anti_radiation_chestplate.json -71bbf3a4c34d499581bc7d0bb8fee63d2441c903 assets/createnuclear/models/item/light_blue_anti_radiation_helmet.json -e3acc02d9c87edea70fb57e88e172209b2b17a3f assets/createnuclear/models/item/light_blue_anti_radiation_leggings.json f3b5417e33bf6c166d8cffbf16ab0f9893e29c6d assets/createnuclear/models/item/light_blue_cloth.json -4904ab86720357735b330a1a70d303d2218c31f6 assets/createnuclear/models/item/light_gray_anti_radiation_chestplate.json -8ed063e9486b9d6d830bba43a35a3b5dd07ea0a0 assets/createnuclear/models/item/light_gray_anti_radiation_helmet.json -114178d84e51715bc7e81cec53fca931499f72e4 assets/createnuclear/models/item/light_gray_anti_radiation_leggings.json 33bd84e37cc034cdd6d6516af77f944b7399f3fa assets/createnuclear/models/item/light_gray_cloth.json -c982468ef610a204620f31cf7bc9b19b4163489c assets/createnuclear/models/item/lime_anti_radiation_chestplate.json -50c312969d1f3f0c5fad27639ba3f95d0853cb14 assets/createnuclear/models/item/lime_anti_radiation_helmet.json -cb27df2e5ed459128cc7d83786c9f32d91242e56 assets/createnuclear/models/item/lime_anti_radiation_leggings.json b20e1b4dd0745ead1aa2248a91df5dde465e0938 assets/createnuclear/models/item/lime_cloth.json -5ad910a7a4ee066d98d1727988557725038f957e assets/createnuclear/models/item/magenta_anti_radiation_chestplate.json -e02c005625f9ab199ba04201152973e016b16831 assets/createnuclear/models/item/magenta_anti_radiation_helmet.json -5e91eecf2e5def0f863b5d7d9b3625a62e4de7af assets/createnuclear/models/item/magenta_anti_radiation_leggings.json 4799138766c26496b41807407a4b1ce2106cf7b7 assets/createnuclear/models/item/magenta_cloth.json -626c65938b0109839ff3f48fecabe659fe38a657 assets/createnuclear/models/item/orange_anti_radiation_chestplate.json -72af25b71ba1417c58137fce1070c09cc65a61b5 assets/createnuclear/models/item/orange_anti_radiation_helmet.json -af14c1a038ff14285b1d78dfbcab0a8e44df14e5 assets/createnuclear/models/item/orange_anti_radiation_leggings.json +94fbc4170e0aebba53f00f5828089a25bf683c4c assets/createnuclear/models/item/nitrate.json +1e42471def4f88f8bb4b40755c72f5f713a19f30 assets/createnuclear/models/item/nitrate_ore.json +55e956c815f423e5a94d1f113ba7301199f272f5 assets/createnuclear/models/item/nitrogen_bucket.json +126657f82888c7b7b9e2338dfec05a7f80b1080d assets/createnuclear/models/item/nitrogen_concentrate.json cfc8b9126dc3fe3b993c5e6201533aecc07989c3 assets/createnuclear/models/item/orange_cloth.json -45223d8e65c235302e923cda583fff09cb4ab156 assets/createnuclear/models/item/pink_anti_radiation_chestplate.json -0703dcb90ab1cbe58167c0872bd9e9950de99531 assets/createnuclear/models/item/pink_anti_radiation_helmet.json -af0dd245292fd2952c37e2d81bfff0a34f8aa5f6 assets/createnuclear/models/item/pink_anti_radiation_leggings.json 9f81dccbba864441a1d76a5312216faa44e6e44b assets/createnuclear/models/item/pink_cloth.json 6d3410aa77b41ada9809f246f1d1a1a982449736 assets/createnuclear/models/item/polished_cut_autunite.json 6919e7571fa3bd76fa08b0a707f1f9367e203a49 assets/createnuclear/models/item/polished_cut_autunite_slab.json d3459552745c002eb95585853ddec7b638b4c11f assets/createnuclear/models/item/polished_cut_autunite_stairs.json b6c3a22d368bd0796b004ac27b8e453a16e7d14c assets/createnuclear/models/item/polished_cut_autunite_wall.json -86d99549567048667239096badcb4249d6dddf2b assets/createnuclear/models/item/purple_anti_radiation_chestplate.json -9e3c06e53c3bb29bd4fca943a6700e97e81a6705 assets/createnuclear/models/item/purple_anti_radiation_helmet.json -047c75651f6c6d8888fcfb1416e67dcb91f3dd99 assets/createnuclear/models/item/purple_anti_radiation_leggings.json 3171211192a2b92005177fd1ee2ce7fbe2592b52 assets/createnuclear/models/item/purple_cloth.json 7da7ddaac39353657166badddc16fe9eb79f1a27 assets/createnuclear/models/item/raw_lead.json ba58a4c086d8937d6703795a9d80435c2d450e35 assets/createnuclear/models/item/raw_lead_block.json +58c3279f0d6dfe7b88f5a85bfce6c1d683bbe2b4 assets/createnuclear/models/item/raw_thorium.json +528149130134a5b1d90552f22e1c856a2644a9dd assets/createnuclear/models/item/raw_thorium_block.json 2e30d8c1f56b02bd000509c2a6b32f4ff6c33290 assets/createnuclear/models/item/raw_uranium.json 5bad8990f31085232b63b11d295b90b581af9a82 assets/createnuclear/models/item/raw_uranium_block.json +11d78b3caf55cd1bcdeed1ad53fcfdcb7133d2f6 assets/createnuclear/models/item/reactor_alarm.json ef76b3a3a97b5d1901d7e8ac17009381de418ab8 assets/createnuclear/models/item/reactor_blueprint_item.json ee9b06de6d4e5f722543a83e5d9f7564ac6d7f70 assets/createnuclear/models/item/reactor_casing.json 7d0b9c3d7301e1f419441b69f152955fc69c5633 assets/createnuclear/models/item/reactor_controller.json 118e595a42c557d4eb97750ba31699a0e3f29ed8 assets/createnuclear/models/item/reactor_cooler.json 7e444d9dc776530d017fc28fe18dad0fabeedcdc assets/createnuclear/models/item/reactor_core.json +3e46c3ff9c6fc0b276549f7f63be2b4690cd3d62 assets/createnuclear/models/item/reactor_fluid_input.json 6726831326d47e5e416216e0ec1d3fd214110e89 assets/createnuclear/models/item/reactor_frame.json -18dc2031fd8aeba588d92e43093fb76e78b2bbe4 assets/createnuclear/models/item/reactor_input.json 69e464d730b826a0c28ed3cfeab28c4c561ec1b0 assets/createnuclear/models/item/reactor_output.json -a108ac857c776255abc1631429c5ffabb3e2a8de assets/createnuclear/models/item/red_anti_radiation_chestplate.json -b7a56e4ac63519df8fcefb9b18a2583991bd9f34 assets/createnuclear/models/item/red_anti_radiation_helmet.json -54aa0a32f1eeedc5b78eb223ea01c3ff30ae365d assets/createnuclear/models/item/red_anti_radiation_leggings.json +08b156175821e1ce7820783f2f1ba92924e54a7d assets/createnuclear/models/item/reactor_rod_input.json 4db93da70d6a7549155201b7d9d68355449652ac assets/createnuclear/models/item/red_cloth.json 78a9e80073512a111cb936a516d290a824846ff2 assets/createnuclear/models/item/reinforced_glass.json +736521abdac62d6fa4292aafb8c86bb3d7c9623f assets/createnuclear/models/item/reinforced_glass_bottle.json 60dc6eb917ee1567461f02aca765e061d3d9f55a assets/createnuclear/models/item/small_autunite_brick.json 9b83b53d90891eaf7aa4693eafe2876a831e0be2 assets/createnuclear/models/item/small_autunite_brick_slab.json 3e80ef1d80473c73a723d3c4b5c1409c7998d70f assets/createnuclear/models/item/small_autunite_brick_stairs.json @@ -201,20 +265,22 @@ b7a56e4ac63519df8fcefb9b18a2583991bd9f34 assets/createnuclear/models/item/red_an 7f33b090f2821bdeb07b2938b1618ad3f309248f assets/createnuclear/models/item/steel_block.json bcb30dce2419ce1ec2e043eaff83df82ac8a4bec assets/createnuclear/models/item/steel_ingot.json 4b0492cf73c071f13538ce485419e46a164c99c7 assets/createnuclear/models/item/steel_nugget.json +d4ec5a600b482636195c7ba0c915ed5d78e8c880 assets/createnuclear/models/item/thorium_block.json +9712377d41a7153cb07638e33dd02e880609d249 assets/createnuclear/models/item/thorium_bucket.json +b636be722a513137e6ca68bdc6510c4a56a2296d assets/createnuclear/models/item/thorium_dust.json +6c63ff92f764da7ce92a99149bf2bf43c23e3727 assets/createnuclear/models/item/thorium_ingot.json +fe44d1ed2b4100ec32dda43274a085166706485d assets/createnuclear/models/item/thorium_nugget.json +954086bd19e91b833a263d3da33bb59903ce153f assets/createnuclear/models/item/thorium_ore.json +420836e3d9085a4ace8a147c25c7bd5fb28b58a1 assets/createnuclear/models/item/thorium_rod.json 2b6958059c3a4c8aee7fb4c003feba12dd0ab252 assets/createnuclear/models/item/uranium_bucket.json 7b15a9300d0f6d106e589db3dcd3294781d0bdca assets/createnuclear/models/item/uranium_ore.json 3b03793c0f5786f258c593e0b140cd6bd10c3b7b assets/createnuclear/models/item/uranium_powder.json ea04609e8b5c12a7805b1c564bca07fefd6d38ba assets/createnuclear/models/item/uranium_rod.json -798287f6d78ee3d736022963d35a700f42cbdca9 assets/createnuclear/models/item/white_anti_radiation_chestplate.json -7960569836d3b7f0c50ff9a000253098f776a8f0 assets/createnuclear/models/item/white_anti_radiation_helmet.json -31283971103bb25159e8b049b63dfbc408e87d23 assets/createnuclear/models/item/white_anti_radiation_leggings.json 4d85657105612ca5525a14791c3e07cf6bd239b8 assets/createnuclear/models/item/white_cloth.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/createnuclear/models/item/wolf_irradiated_spawn_egg.json 8bdc2fabbfc9fcc7c2ad4a3273897659d90b95ab assets/createnuclear/models/item/yellowcake.json -609c04d42448ccc99291c723c8b6741e870b46d4 assets/createnuclear/models/item/yellow_anti_radiation_chestplate.json -953491d658ba39add0f080137ebfafc9ac07ee1d assets/createnuclear/models/item/yellow_anti_radiation_helmet.json -b20aeafcdcd235c7d89067d5331b823535b82522 assets/createnuclear/models/item/yellow_anti_radiation_leggings.json a1970879fd57836f5ae5d23352cdca277095bc7d assets/createnuclear/models/item/yellow_cloth.json +dabba9d38be6825bc8c7684f10de5e23f5d2870f data/createnuclear/advancements/recipes/brewing/crafting/reinforced_glass_bottle.json 72b0cec0c98e9ead9562ff0cc1231a5028e2a22f data/createnuclear/advancements/recipes/building_blocks/autunite_from_stone_types_autunite_stonecutting.json e7967751f132676cb1d523743adaac3aea1f0814 data/createnuclear/advancements/recipes/building_blocks/autunite_pillar_from_stone_types_autunite_stonecutting.json 8e9cfc8ab1ddd7b818cb52cbd0fb60c0c4713bad data/createnuclear/advancements/recipes/building_blocks/crafting/enriched_soul_soil.json @@ -267,66 +333,90 @@ b8f6ee21b426748e16cff1d76f098d5a032c15f7 data/createnuclear/advancements/recipes 73819b2283f45f3fdf7509ef458f3288f6329ca8 data/createnuclear/advancements/recipes/building_blocks/small_autunite_brick_stairs_from_stone_types_autunite_stonecutting.json c1df1a2553a55dd47f37285912e5e3020c67da2a data/createnuclear/advancements/recipes/building_blocks/small_autunite_brick_wall.json 26b718d481625238a5ff718ee027dcddd29a2e98 data/createnuclear/advancements/recipes/building_blocks/small_autunite_brick_wall_from_stone_types_autunite_stonecutting.json -979c398bbb9b73d8924ee9a1248fead541cbfd0e data/createnuclear/advancements/recipes/combat/crafting/items/armors/anti_radiation_boots.json -b4e68786ee0454d0310f5513a9047f53287b527c data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_chestplate.json -b2846412cad33434c85eed1b85d8a93dc5e16558 data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_helmet.json -2937c8fcae25aa80770e37991761be38f82119d8 data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_leggings.json -97b7ce5609fd7571778db785984cb5901cbf9723 data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_chestplate.json -f35cf42e5cb446d15b8e8203a591a51fd6e60f08 data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_helmet.json -aefc767f0155f9d00ab6204c5225876a3b763b99 data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_leggings.json -f8ac7de1b529688ed0b3954a24139cbe980cc84b data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_chestplate.json -4a3cecd35fd9dc73c786fe14d02460b16a7dadce data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_helmet.json -3bbce0af30d3ac94664aa68f18d1c9409970c8eb data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_leggings.json -493e7753ada91ba6886d0ce8ddfe7ad8f18f2c4c data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_chestplate.json -9e57ccc2e4ddb3881f45b9ef462b14cacb94d627 data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_helmet.json -eea54f4d24acc18dcc884df4d824db6e4dfb8a35 data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_leggings.json -9eb34323953599d42bef55204212cad010b017e8 data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_chestplate.json -96365989b361f8597953b95c88590b28933b4b2c data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_helmet.json -1dec5607eb281f3d91b94a6ee4441467dbbf11bf data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_leggings.json -03af591683635c5132ca4da0a79087b98616074b data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_chestplate.json -7dd4666d18364fa8f6056ef31e9f8bfc5ab3fea3 data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_helmet.json -35ad8bd492986a14d7d65247834d0519484f9ae0 data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_leggings.json -9e27f06026cde03c34993eb8b92a864536634fd7 data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_chestplate.json -912e93938b1a4d40dac38b1ee928a53d33357059 data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_helmet.json -0ae8592bd11f77e9df3240c1eb4c1424b06bcac8 data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_leggings.json -6ab73cdf0099e5c241daf50d3c715350f4158dd1 data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_chestplate.json -2a5f39827ddb6bcdfddf38543635dd8f734a867c data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_helmet.json -355f2cc4b2615bc721afedd320cb8d95f077d4c5 data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_leggings.json -3c662699144a166787165c54e59c69d222c1d399 data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_chestplate.json -366b1dbcd64ce41bf58d376386f7d370c900dd7f data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_helmet.json -e305c22a584440dfb7d031aadcc3c7f9aae9ed36 data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_leggings.json -de8086a8e456a350a89ef40764b320488953e18b data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_chestplate.json -a4d7b131d6bded1bdf42b43a0dcce5d509b75055 data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_helmet.json -97346563c1c5b4ad94c3458bea61d4ca8c58e79b data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_leggings.json -406b815c2bc63c406ca1881df08f3dee49aa6ff6 data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_chestplate.json -ca99e24a7f687d907700115423965e890a862f0a data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_helmet.json -c95b8f6ff00aa08c5f491d51c8ebfd82c9f07d5f data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_leggings.json -f80fd14bc2e410bc54c7a8aa2f91fabfb1cde57a data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_chestplate.json -1ab62422e830f2ccd3a1d22597dbf2237d7b5631 data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_helmet.json -00c4ff8f0e0e44f3593c3e30b96a1ac92419b6e5 data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_leggings.json -75181c4cdc5f9c64e3fe52a76eab64ab3b96d264 data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_chestplate.json -f1a36845c18af71d0b7ca2357c9bb47116e90fe2 data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_helmet.json -658420ef1bd9924a614e53089c43bd9632e4f213 data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_leggings.json -0088dca4b49ce5239ffb4fd63d50eee13652ad41 data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_chestplate.json -3cdfe8144924ab168d5f898e3c36aa89b42314d3 data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_helmet.json -682b9abb1212143c87cddd857555c7c14057ff74 data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_leggings.json -54dce406692683c630633c836916a657e2bfc6b6 data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_chestplate.json -33e5921a5eec633e93a2fefcb8ab7986d7d0014a data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_helmet.json -e423dda41c61e3885bd9189db7f485f4a580b64d data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_leggings.json -dd349fb2cfe2c8a92fd5091fdf55ae954ea77237 data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_chestplate.json -009c689264f2b974c72a2387223b2a7eb9f52aba data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_helmet.json -b8c6c649aec3cd595be961fe43d9ebc3a6013d8c data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_leggings.json +6a03d6b4e9119aa8b866489b9fc3034b7b075690 data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_boots.json +1b9533e643ba4e622744049351a73840be7d3d91 data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_chestplate.json +89923c201544800f1c3a545826f27a3945056215 data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_helmet.json +3986bf37b8b7fb8bed679a7bba4b208c202f4b8f data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_leggings.json +85bdf89b4f26e680ce725497bf4a40d8e8175618 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_black.json +05d25905b416fdeef6a5d01fdef38c54ed892d27 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_blue.json +30b3d1c1720668f7929270f6f0856fea2a261f98 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_brown.json +075faf78404c0a1f158f08b2e4393ef6eb38c64e data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_cyan.json +d2d4858f558926d2797d435b2223383f14a7796b data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_gray.json +3288f5fd9180b5ae2cc168b638aa1e504d94301c data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_green.json +5641cdd59b9c6b3ac009162e031ab0a7fd8b6675 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_blue.json +de55063eac462f0da6b7a6b139737219a17c7abb data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_gray.json +7073c2024318b15133a1a3dd196476f006f9fb44 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_lime.json +42d2016db6fdf3b869089a8cdb1cd8245416f3a8 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_magenta.json +4824c97086a4cc8e2fee6dfa9d91ea146f634894 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_orange.json +f8b0de005226101168cf52d015186014151fec91 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_pink.json +2b673c43efd329e562429121ab90e5116de49440 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_purple.json +6fbe22371092ec071100d3ea2895d34d68e9987a data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_red.json +7bb893015b7a523495a3cfa4cbac411d4702a121 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_white.json +5b831354f6882ffc01cf5d4de99c80ae39eb6985 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_yellow.json +f550721e88b796216fd7945c5a1e5ebe1a8e9ebf data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_black.json +991c8077332847f5cec0d30dfcf849356fadd384 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_blue.json +e1c256431f9cac59595de6ac64eed75c24e5e669 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_brown.json +9b094bb692299f38493d1f461f16ebc405dcf5df data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_cyan.json +1c2f8904e3b5cfbb58036dbe0a9e21c7fe000cc2 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_gray.json +a1db9d61813e073d23e899b0b70a9babf01ac73f data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_green.json +062e952b638235313ee3f83fbecafaffb99e68c9 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_blue.json +f20f6004fa8610b844bc18c2a2f965221d844d72 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_gray.json +1c4c9b54dd2d5fc9dfbe98fac98f8029eb9f2122 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_lime.json +42470e8057b0c52c0fe560fee0a187cefdf9ad2a data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_magenta.json +1092af45e194c8dbb5eccbacf3e75596568b1c3e data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_orange.json +f069a2608b2e0f9abaa4f9d40086688b2a6c1d2c data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_pink.json +be2c6daadca8e5cf0ad31e87ff3eadb2a46d3783 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_purple.json +b751b05a36dafbf2ecdfda256540f61b7dc9ae54 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_red.json +afeb17b15cf197717fee9a3441a97a7e6a8e67ef data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_white.json +1c11e058e64a98723719d4d84855223ac16a6dcf data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_yellow.json +ac0b324373f50348a605d990025587c0ce67b743 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_black.json +a86cea3c07e433e60dae933feaa47d52ac266bc2 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_blue.json +eaae2a639de0c131da4b3bf5f463c4856446464f data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_brown.json +a5d0e86d0062750bbf7c6ba2a5f567a510722717 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_cyan.json +32c1c9c0357504e2d1cf0ff00d56fcf9c3b0d4ed data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_gray.json +2b052785e459634471ec996f2235b5a8aef9678d data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_green.json +67447839d7f63397876c2931cc5927e6b1943500 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_blue.json +e9a2775434aa15c03b20f54a6e594739d8efcf41 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_gray.json +0d6fe76e7c6c2e6836d0b9eb58a2aac1bde34e41 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_lime.json +0fce9d96d0349e870563fd9e083b5d29691702f8 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_magenta.json +a4e502ad607a0b7d87a877aa94caa9ea61c3c426 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_orange.json +b192c67968b4bd48b53768bc4e5143cd4fd03dd6 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_pink.json +90940d59965a9be36b332a77267da47ee5c7e2a4 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_purple.json +93538ce24ab2e560200c0221f21b27e9933e2197 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_red.json +93b6c69d6ac5d63d002257acca531f42a92f6b77 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_white.json +a4ace0514e1eec98d82c69ee978dc7dd3e4f2010 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_yellow.json +359867df30709d1c30e12fee724f0da327eb165c data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_black.json +18ce97fe67745ad9cc9b82ea277066a3e5b538ef data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_blue.json +0da5037d78deeaded4cd7641433da7a7c6e1a5ee data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_brown.json +c31aa299dbd2c917e4cbdf0201e2360eb14ac8e4 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_cyan.json +be5bfabee101369283012ab286e9a325bfeac826 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_gray.json +3bbd719c37aeaec56c2e05c756bf3e5aff9a0935 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_green.json +aca51ee59b2742be3b5f76796f88e87dfd662569 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_blue.json +b5681eeea9b91ac4966c015e857c6524778073b2 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_gray.json +18dbeafcde9cfca46fae1801503473b3c72e2c38 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_lime.json +2cff4f5903db38589b94c589ded794a817943611 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_magenta.json +6a21a2ed6e38f01244fbd35ec250c380a2fc40cd data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_orange.json +209a37ba8e6bbfc61ede95a908d7f5fd7aad26ef data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_pink.json +24a4fd0309359021fb67636038ce121f3e00fe1c data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_purple.json +48a844e0dd62eb684247d238592518b687137d9d data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_red.json +dfd6b4a2aadbd3c301bb02e980f7790caa4a3746 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_white.json +9511519d4e79d31e671081ba25e7074e908195e1 data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_yellow.json +7a12ea1e92fe1eb20998c28399f041e3684d66aa data/createnuclear/advancements/recipes/decorations/crafting/raw/raw_thorium_block.json 0d806e128a0eab473c822824e1914cd39d684efa data/createnuclear/advancements/recipes/decorations/crafting/raw_lead_block.json 570d06b2ab9f3b2d9d8265baac395e896e8b171e data/createnuclear/advancements/recipes/decorations/crafting/raw_uranium_block.json eafffaaada04af83623ebf8e940df2b507d933eb data/createnuclear/advancements/recipes/decorations/crafting/reactor/reinforced_glass.json +f9cc69b93befb0fda996ebe1c9d5e48c1753ed3b data/createnuclear/advancements/recipes/misc/crafting/biome_irradiation_extractor.json 0221cf60748260f92b94be675249afc98de1d707 data/createnuclear/advancements/recipes/misc/crafting/enriching_campfire.json cc3ec047cc113f80a1163aeb2277dad33af8e424 data/createnuclear/advancements/recipes/misc/crafting/lead_ingot_from_decompacting.json 58477747b204491c22a9aecb751d99054f71310b data/createnuclear/advancements/recipes/misc/crafting/lead_nugget_from_decompacting.json 2f3e459eff3d7404e49d23b9544b199caba741c9 data/createnuclear/advancements/recipes/misc/crafting/raw_lead_from_decompacting.json +ebab14dadd0650c76722c7e324ec4330539ee208 data/createnuclear/advancements/recipes/misc/crafting/raw_thorium_from_decompacting.json a9d692d44743f8fcabfc45046ad17a039c594747 data/createnuclear/advancements/recipes/misc/crafting/raw_uranium_from_decompacting.json 16c681121078827282f2ce2e16d335d2d7e5e1f2 data/createnuclear/advancements/recipes/misc/crafting/reactor_blueprint_item.json e28d26c880c31bb2ca64c9f380e001a13e3a01aa data/createnuclear/advancements/recipes/misc/crafting/steel_ingot_from_decompacting.json 76e79e1f9fb40d89a0364939158b1aaba8598ab6 data/createnuclear/advancements/recipes/misc/crafting/steel_nugget_from_decompacting.json +4d798680125ac67e3469e906b43f6d294cbf8fd6 data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_decompacting.json +fa9fc1d028bc6a7e9c59aab335fa666e05bdef65 data/createnuclear/advancements/recipes/misc/crafting/thorium_nugget_from_decompacting.json f38e19487233203d7135f35a7afe65d6b19a5aa7 data/createnuclear/advancements/recipes/misc/shapeless/reactor_blueprint_item_clear.json a021646becb7b6411eddd86644e5b17c8365582c data/createnuclear/loot_tables/blocks/autunite.json 62b7087350b0a9af9007b848c7f619a730e90693 data/createnuclear/loot_tables/blocks/autunite_pillar.json @@ -338,100 +428,70 @@ db666ffaca36edc9e246e225f225c1e87604dd88 data/createnuclear/loot_tables/blocks/c 10aff7424eefd85e50269c66e60ae343043193cd data/createnuclear/loot_tables/blocks/cut_autunite_slab.json e6e624e978fdacfa3cdd123d23d021f504308149 data/createnuclear/loot_tables/blocks/cut_autunite_stairs.json f28efa9fb383b86c770b8c7344fc30f6ab9200d3 data/createnuclear/loot_tables/blocks/cut_autunite_wall.json -113d87359e902ec9112e063f87adf5646cd01dbc data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json -ac0d262ec298e481314387399c378ecd454e20cc data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json +463869981259ac3b7087139c283e38178b629b6a data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json +ab2a2b6038a5f6d841ec21a28db2e5e693d7ee82 data/createnuclear/loot_tables/blocks/deepslate_nitrate_ore.json +06f3370110396372b9bef4d6c0805affbe70cec4 data/createnuclear/loot_tables/blocks/deepslate_thorium_ore.json +063436e2539f1d04b6a96427801ea0fa70c03be5 data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json 76ca23065681dfd7f18dbbc5a65b8ab8bc40c20c data/createnuclear/loot_tables/blocks/enriched_soul_soil.json 62f405d930be8b534e863c8aac205687b943f3ef data/createnuclear/loot_tables/blocks/enriching_campfire.json aa8efeb48b11261953f7d90e6d7db38411550694 data/createnuclear/loot_tables/blocks/enriching_fire.json 297b7824fc2eea67ef47760da549f73e93424b60 data/createnuclear/loot_tables/blocks/layered_autunite.json efe2ad634ad8b801a8fa69f45516b30157b46771 data/createnuclear/loot_tables/blocks/lead_block.json -9db8f06cd9b1d7a9c2d94e652f00a7588398571c data/createnuclear/loot_tables/blocks/lead_ore.json +3fedfbd217847c7102f049501a00929cb03d25de data/createnuclear/loot_tables/blocks/lead_ore.json +1e942f7a1aaf752424e39a61d094b4736834ec30 data/createnuclear/loot_tables/blocks/nitrate_ore.json 7ad41810138d7b55a5d9d0db0956cd255e879632 data/createnuclear/loot_tables/blocks/polished_cut_autunite.json d5fb5ebfe991980abfd6f1932575363d026d8859 data/createnuclear/loot_tables/blocks/polished_cut_autunite_slab.json 8205832fc48bd24351b4b433f92a70a533336f48 data/createnuclear/loot_tables/blocks/polished_cut_autunite_stairs.json 2c3ca9fb7683d1edfdc2e4fcd4b25ab7f40c3ab6 data/createnuclear/loot_tables/blocks/polished_cut_autunite_wall.json 66ab1033aebea1383fe3f09c7468f4cd60d8aa25 data/createnuclear/loot_tables/blocks/raw_lead_block.json +7cc60fa9a9bb958907f56b583e27c7f37af2a63e data/createnuclear/loot_tables/blocks/raw_thorium_block.json 0998d5a55f2dc10e85e83dd74bd91d4a3913f61f data/createnuclear/loot_tables/blocks/raw_uranium_block.json +b0cfc64250ce727ba39807bc1560b36497f294be data/createnuclear/loot_tables/blocks/reactor_alarm.json af059cd55441441329347fbd569245b539b095db data/createnuclear/loot_tables/blocks/reactor_casing.json e76c0b96c978e266f39eca8e46cd5ba2388e1749 data/createnuclear/loot_tables/blocks/reactor_controller.json 95a90d9d9a553448c878dfdf4b153ceada923030 data/createnuclear/loot_tables/blocks/reactor_cooler.json daa4fad27f07fd72cb25a524464edea9efe771b7 data/createnuclear/loot_tables/blocks/reactor_core.json +1f0c66a193aaddb26626967d16cd8112e18b7383 data/createnuclear/loot_tables/blocks/reactor_fluid_input.json 576b0bf970ddbdd11ec06963e1d65e08e63d69e1 data/createnuclear/loot_tables/blocks/reactor_frame.json -be48e04b069441c8593aab5e9bf78f4edc2dd249 data/createnuclear/loot_tables/blocks/reactor_input.json 37af2b0b5eacf53995703344a45fb3f4d0efe1f9 data/createnuclear/loot_tables/blocks/reactor_output.json +4d10dc9daa7551a1c4879edbc22f63a8f1d84c73 data/createnuclear/loot_tables/blocks/reactor_rod_input.json 88c7cfbf28fdbe53241453e073722791c780de75 data/createnuclear/loot_tables/blocks/reinforced_glass.json feedbac4c2a466fb93f82756562edc63cb1b4b5b data/createnuclear/loot_tables/blocks/small_autunite_brick.json d51f9b307f2986ac086d32f48bd41e6dc4024348 data/createnuclear/loot_tables/blocks/small_autunite_brick_slab.json 4014ab450bb5de0522690577486f2fbbc334de9c data/createnuclear/loot_tables/blocks/small_autunite_brick_stairs.json 8718c7e7cce27e299611ee34792cdb59f3434e39 data/createnuclear/loot_tables/blocks/small_autunite_brick_wall.json 94dc8e72195da5aa505c6d5a3785ccfea30f7c05 data/createnuclear/loot_tables/blocks/steel_block.json -401811bf59cdb43ffb0c0bb5ba40eb954d7fa216 data/createnuclear/loot_tables/blocks/uranium_ore.json +10453354af3c17390f7b6eb2eaa7109eae3988c3 data/createnuclear/loot_tables/blocks/thorium_block.json +c1c889e441f52d3c7fcf50dd2a4dab7311c9b262 data/createnuclear/loot_tables/blocks/thorium_ore.json +28feab8379c2951034bed4016eb91981d07dd24b data/createnuclear/loot_tables/blocks/uranium_ore.json fba1a7bdb0835c034aa5ef52ebf589123d41b33e data/createnuclear/loot_tables/entities/irradiated_cat.json 2d8f5d7d7babd2b02ae836846e62daabf84de427 data/createnuclear/loot_tables/entities/irradiated_chicken.json +900719d49cec9385da31bb392649c65f4297288c data/createnuclear/loot_tables/entities/irradiated_cow.json f91f43a39c80f583f878ea1a0d944798c05f2388 data/createnuclear/loot_tables/entities/irradiated_wolf.json 4c985d77908c367245c3b4d56e1302a843522eff data/createnuclear/recipes/autunite_from_stone_types_autunite_stonecutting.json 9819e80259d08c1518b30ee9d4cf5c18689d3efc data/createnuclear/recipes/autunite_pillar_from_stone_types_autunite_stonecutting.json +163d7fc43633fd6ebdc124a487e55e427f47d147 data/createnuclear/recipes/crafting/biome_irradiation_extractor.json af0091392c2d5784455a57783bfa62d0d60d13ae data/createnuclear/recipes/crafting/enriched_soul_soil.json 3ce1aa65e8260fbe5fe84c9064b8de3745762605 data/createnuclear/recipes/crafting/enriching_campfire.json -3e12f7186fee08c35956e4a7bd26770830e4d462 data/createnuclear/recipes/crafting/items/armors/anti_radiation_boots.json -ea505dc482e9c4f17087235e4d26fcae4079ebe0 data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_chestplate.json -9f437a5a52abf8f353c0b376aa6444773b7cbe77 data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_helmet.json -314a4ac10a0be2cdf83615774897988ff7371f30 data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_leggings.json -f44a7c66a9dfc9147fc9d55677b26076f4afd484 data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_chestplate.json -a3bb50e8dd41d9764cd9c9bf273785422275a8bc data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_helmet.json -3fe95bda860847685656cf3f277a8afea6ab6b85 data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_leggings.json -fc0aee948e98bdf4b0f78b97943a1aebaa8d1796 data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_chestplate.json -16394f944b94aea1cd19ba2677de56c00bebcdba data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_helmet.json -66bdaffe18edc322b6de69d2d6b1523c774087a2 data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_leggings.json -e6c352908b8f660db226132bbf957774c5cf12d7 data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_chestplate.json -9c7d16a6a8e021d914fbb5f3fa5389085833be3d data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_helmet.json -77b9d0bc061bf5a34d6398d00ce5e4c5c9e2ca1a data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_leggings.json -3b041d0515279352e7a167d53c1605997d27451c data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_chestplate.json -31e9cd688f7bf3cc238310dae87dcf55df62d577 data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_helmet.json -2ed6e23f248230a2ca4bb2aa05432116df9c7bb6 data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_leggings.json -05febbed635c8dbb250a38aabe815bfffa7c77c4 data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_chestplate.json -09145d0e4ddb0fd1c4d02710488c32527508cb74 data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_helmet.json -28ef8d35b4a30748d686cfd6f0ae1b56ee9e28f0 data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_leggings.json -b1a37c88635b1d855e340bf000f16d6affa70bc2 data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_chestplate.json -cff50e5fef80b39173ba94dce7fa9c484666117d data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_helmet.json -d69885154f870a949409ea4fe4d18b820d8aa228 data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_leggings.json -2eba7fd8a55d87de9b4fb4b8336df3420cd6dc18 data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_chestplate.json -178e220968870a1a3ba576ddbed0c378d8f4e394 data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_helmet.json -1e4f64eba61816f9fcc029c45252c43f083060f3 data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_leggings.json -bb094494b3c7f6f7bcdba620aa5812d8c3de691c data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_chestplate.json -3d91fcefa05ae913c2edd5574f44b2400f9864e5 data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_helmet.json -5aa5fb2b8b00842d62aba0fe6f041199335716ba data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_leggings.json -cfd49e391be051ec35444e10c4738309a1d2d1fc data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_chestplate.json -63e8a0d55cc4d6bcba6ed31ccd202f833f8c2fce data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_helmet.json -11aa98f3b7e9dbf17411f7f1eceaa5a375ee9be8 data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_leggings.json -8160905f2e316c934758180df7a866e73d7d5696 data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_chestplate.json -4f47f524a86375ddbb59ab1474577148c0a9e551 data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_helmet.json -b7df84fcd2fce86d73c3d37e8dfe5142ee898b32 data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_leggings.json -adf187f72a26a894ef9870d9b76c6aa9a2f61628 data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_chestplate.json -b3fde9445facafb387ea8ba7f0d478f20b4ad8eb data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_helmet.json -0c4bfdc67fedce323b7cd0463b2668ee5c8dfc09 data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_leggings.json -c4a6454d1f702ee3977a53a9e11a1eac7ae7640a data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_chestplate.json -d9578f67192594cf2481d45caf05de24969cb693 data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_helmet.json -4b80187e8db023b1bdc115b19f5b1d719e594fd5 data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_leggings.json -3fe339111ac211ff078cfe5376d1afeb3825e7fe data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_chestplate.json -7739a0c3452793819b049c5eaa1b91f9d2d9ddd1 data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_helmet.json -3ffba6c86818b5c6fab8eef8f2ab93214585221e data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_leggings.json -299f8fe18bd72af28f6dfd46000bed94fb0ce484 data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_chestplate.json -e6396835f0c68c87409e25edda2779227b84f5ec data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_helmet.json -8910f75d2b1ede94f5d09dcda192d25286b06ef2 data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_leggings.json -8816c1ad382a26cfabdae73d17c3376eb4ea8b8b data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_chestplate.json -96b0fde88bd9f53edd341658750311715ae52ceb data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_helmet.json -1d22695a4dd7ce4429529011c6cccee1969abb9e data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_leggings.json +3c2942b0a34c94bf074e19169a7f35834d5cb1cb data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_boots.json +c02e0f491c8db972860d217e88013858a090b39d data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_chestplate.json +6a3f2e0a58b380803fa33025e84919b039143aa9 data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_helmet.json +7fb19c3769092282a6bf6034260c55c3cc390501 data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_leggings.json ad29e797fed10865a6c15d95c3de1278c0427df8 data/createnuclear/recipes/crafting/lead_ingot_from_decompacting.json 42fa720bf96a1d46e206db30cbd38e1b04ea7f63 data/createnuclear/recipes/crafting/lead_nugget_from_decompacting.json +befcdaaf4abf86e29d7f7008d489638c5f3cd6bd data/createnuclear/recipes/crafting/raw/raw_thorium_block.json 6d70c403bab3160fc13fbb3efee85d9f77f2e96c data/createnuclear/recipes/crafting/raw_lead_block.json 7bf77189b1a9bc533e5ac0bb72ec87e8d5221691 data/createnuclear/recipes/crafting/raw_lead_from_decompacting.json +06b7a11d4472cf36542c67d113acff6c3dccfd5f data/createnuclear/recipes/crafting/raw_thorium_from_decompacting.json 62e238496e81bbf9a86fcfc9396a6416e057007c data/createnuclear/recipes/crafting/raw_uranium_block.json 997f2bf339dd63253d9a98d16a9efeffac4eea81 data/createnuclear/recipes/crafting/raw_uranium_from_decompacting.json a7ff79f9d11a46e52fb25819a7c9e9604e8a317a data/createnuclear/recipes/crafting/reactor/reinforced_glass.json 77f77148406d34c065b55efa9d6e7a2b107831c5 data/createnuclear/recipes/crafting/reactor_blueprint_item.json +236a031ceec7fa78e963941df8eec874a2d589fe data/createnuclear/recipes/crafting/reinforced_glass_bottle.json ae6d07dc30751bfa39edbcdb8758a2faababa5da data/createnuclear/recipes/crafting/steel_ingot_from_decompacting.json 5fb04284d66de4bf54471a3db0d9a3bfa6b7a18c data/createnuclear/recipes/crafting/steel_nugget_from_decompacting.json +047c50559746a9ffb5835ff960ba500400e7e299 data/createnuclear/recipes/crafting/thorium_ingot_from_decompacting.json +428e74b7762c3b5b74e80850a5c75d27960c73c9 data/createnuclear/recipes/crafting/thorium_nugget_from_decompacting.json ebfe438f4284101e07538accdf15789d06140c94 data/createnuclear/recipes/cut_autunite_bricks_from_stone_types_autunite_stonecutting.json 4b86d48cdf03dcfaa383552881a7f52b7bebe9c5 data/createnuclear/recipes/cut_autunite_brick_slab.json b9d828959c4614caa4a0f3ac82f322dd538c6219 data/createnuclear/recipes/cut_autunite_brick_slab_from_stone_types_autunite_stonecutting.json @@ -457,22 +517,22 @@ af81c9ed277e6f3d0d9e48d413247debcc7b64be data/createnuclear/recipes/polished_cut 9cd62ff9cbce5c4a5293c7bfcb9c8c35d68ea91e data/createnuclear/recipes/polished_cut_autunite_stairs_from_stone_types_autunite_stonecutting.json e74d31ed68a39baca7d719338fdfeb71a9cea9a4 data/createnuclear/recipes/polished_cut_autunite_wall.json bd7dd55600eb9ddebb17ac6932cf77f0538bfe02 data/createnuclear/recipes/polished_cut_autunite_wall_from_stone_types_autunite_stonecutting.json -1713ce33da8ce2fd0145e9921cab615d31fa5e66 data/createnuclear/recipes/shapeless/cloth/black_cloth.json -0d0c71a2b494a34439cb2d7873b31083b07877b0 data/createnuclear/recipes/shapeless/cloth/blue_cloth.json -e6ec8d394df502aa1dcebd16d1ed0275f92e9d2a data/createnuclear/recipes/shapeless/cloth/brown_cloth.json -8d0f363323584bcdefe7803e9057f252b63fd12d data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json -fff014f30a041fad100ceefcf70ed9e8a00c318c data/createnuclear/recipes/shapeless/cloth/gray_cloth.json -cdd6de83eccb34f7bc4f38c6a92a32a74b7b3ff7 data/createnuclear/recipes/shapeless/cloth/green_cloth.json -fe147f38895f8b99412c53a6f7530a1e9575003c data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json -ab94d1c13af2e4bef0c92b8486108940180d3f9d data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json -2cd96d4f78b81393bff120448e9a14235cf2376b data/createnuclear/recipes/shapeless/cloth/lime_cloth.json -a22692736ff403a44bca8ef34b5f97a855eb0a7a data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json -bbc2714fa8586db7d42db2c1e4375accd7c264d2 data/createnuclear/recipes/shapeless/cloth/orange_cloth.json -d6be8ab92dd0caa9df946afb83868ce278c2c437 data/createnuclear/recipes/shapeless/cloth/pink_cloth.json -fa041c5a7e252bed6dc4636a45e5857d7e14dcb1 data/createnuclear/recipes/shapeless/cloth/purple_cloth.json -c863e58a1e11f9b8a925b08b321d45f76cb96de4 data/createnuclear/recipes/shapeless/cloth/red_cloth.json -2d315d82efde22d511e339baec628babdce5767f data/createnuclear/recipes/shapeless/cloth/white_cloth.json -fac232af7ba0edf6cf8e0f018cf53678457e652e data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json +7d07afbab06c52adaf8463f256c238eb59e2969a data/createnuclear/recipes/shapeless/cloth/black_cloth.json +4f14ccebaae840b99856155c779da52cc820c0fd data/createnuclear/recipes/shapeless/cloth/blue_cloth.json +14d9c62de0aa59106b31785092acd2d1f4f5fa78 data/createnuclear/recipes/shapeless/cloth/brown_cloth.json +481f0fcad9e386443f4abb193572be6dea20c50a data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json +8cb32e458634f2217f7b8fc0cb785cbbddb3e98d data/createnuclear/recipes/shapeless/cloth/gray_cloth.json +b67355b2e6d9b792cc18ed12a95487277c27469c data/createnuclear/recipes/shapeless/cloth/green_cloth.json +66de7a4a6f768e68b6a81a1510c3b4f1ae62b2fe data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json +b04f0b6f3875abf2207f19951f6a078e7445bb83 data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json +9f43e08955d8c269ec514e4bb66d186f1b60f34f data/createnuclear/recipes/shapeless/cloth/lime_cloth.json +5a3bd7aeee574101cff4ab42aadfcc697ac05a16 data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json +b282815b9b858c78ba00870d4e795bc50d1c0380 data/createnuclear/recipes/shapeless/cloth/orange_cloth.json +7e40f80880139ffd26def352e1f0c17b2b05872c data/createnuclear/recipes/shapeless/cloth/pink_cloth.json +1cb11c3bbe8393116da50ac4e181ac1b68fbc7ee data/createnuclear/recipes/shapeless/cloth/purple_cloth.json +389c841c99a2ef68a4eba3dca414952d3c3d9099 data/createnuclear/recipes/shapeless/cloth/red_cloth.json +3a63377f0de2473803fe4b81b2fce121443faa42 data/createnuclear/recipes/shapeless/cloth/white_cloth.json +0e075da2b474cc1ffb430fb612feaca8c5426932 data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json 8e194709b50fd2ca2ef2138b5d2528e092b45e4f data/createnuclear/recipes/shapeless/reactor_blueprint_item_clear.json bf49ba3e1332f0742e933d81ddd0dd9462f175db data/createnuclear/recipes/small_autunite_brick_from_stone_types_autunite_stonecutting.json 01e0af5e7139dc9d887ee026e4d319d5063415e5 data/createnuclear/recipes/small_autunite_brick_slab.json @@ -482,66 +542,135 @@ d6fbc19ffcbd5f5e3cdb0636813cf3a8c3262ec2 data/createnuclear/recipes/small_autuni bd84328028cb729d48f38ccc449f14be1d7acfb5 data/createnuclear/recipes/small_autunite_brick_stairs_from_stone_types_autunite_stonecutting.json 44f3dde18c582cc5dd95c705c7ad76691996b57c data/createnuclear/recipes/small_autunite_brick_wall.json 6bdbdc93b69c388425345d6d1aeb862eed894e5a data/createnuclear/recipes/small_autunite_brick_wall_from_stone_types_autunite_stonecutting.json +038fc3343f4c1df42af40a83539dfc5b4cd1809c data/createnuclear/recipes/smithing/default_anti_radiation_boots_black.json +8c545f7b81a2a959ec7311cc431acb9152100978 data/createnuclear/recipes/smithing/default_anti_radiation_boots_blue.json +022b1c9e64c6016d9fcf09505b2299a74b92f211 data/createnuclear/recipes/smithing/default_anti_radiation_boots_brown.json +367a0304d542804ae27db09f314c72aa2ac80bd0 data/createnuclear/recipes/smithing/default_anti_radiation_boots_cyan.json +58a6a497fe90086fc857b2739166fca14b3184b6 data/createnuclear/recipes/smithing/default_anti_radiation_boots_gray.json +1e59dcd5e24348b76c0d03a02ba08ce511e0c74e data/createnuclear/recipes/smithing/default_anti_radiation_boots_green.json +5fa9cc328406202b6dc8e918c0da1261f250c062 data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_blue.json +2bd8125af83708312c6e58a67945dbf608191963 data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_gray.json +3dea685cd4b310c14b331702f3e588c9829b5548 data/createnuclear/recipes/smithing/default_anti_radiation_boots_lime.json +2238b9ea259343214e28250707f09f5fea9501d6 data/createnuclear/recipes/smithing/default_anti_radiation_boots_magenta.json +834f64762f5dfc67f3df4a74b43ca2005967daef data/createnuclear/recipes/smithing/default_anti_radiation_boots_orange.json +983d805d5f3036f718e7a4e7885eee14769fa7b4 data/createnuclear/recipes/smithing/default_anti_radiation_boots_pink.json +4b5f83e830492a3280d78475217a949e63ebb72e data/createnuclear/recipes/smithing/default_anti_radiation_boots_purple.json +93d6c425f5f3f0d180a83b0349f5a6683dad5046 data/createnuclear/recipes/smithing/default_anti_radiation_boots_red.json +cd459e98f51f3a05c48970c4ef88fdfb3ce7ffc2 data/createnuclear/recipes/smithing/default_anti_radiation_boots_white.json +7c18b313411e4db4286b9b20845a3ab53889eda7 data/createnuclear/recipes/smithing/default_anti_radiation_boots_yellow.json +ea3eb2ca1258fe8336136f14be2cbab301ccbeec data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_black.json +e0db8911281e87614b5d7c36b7f7cc664db35e48 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_blue.json +f0b28a48d6f45857f915e56b0b30bdb97b6de681 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_brown.json +3220b0788cc0230b0c031e6983f4a15e11d07604 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_cyan.json +50a47115b8b84964824d2982f0582144d63e9c40 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_gray.json +53438a0dd3f84de14a064f8a66da83028da484b5 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_green.json +9c8e3ccecc11814102f255e40235d20bd42b3de3 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_blue.json +4f9a24f040fcb22add324826bd30660fd91efc43 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_gray.json +31f62ce94482c1b33a9407104e4b438cd0b4fe33 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_lime.json +d6ae9103fb1bce4684463a58a685232135cbf24a data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_magenta.json +465e82f5103bb96939ecdf048d9ae1416bcbdbf1 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_orange.json +0cec840222214c2d5335a174bce2bad2c3ca9b54 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_pink.json +7d852b6fa5872198205e30558593fe01faf59ec8 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_purple.json +6bcafe28789bb091f9f5d687ed2c6aad0f6c1db2 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_red.json +3a8ba11c021da81883149de9f7fd9020d1ebeff0 data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_white.json +80cb608e8e689701e8bce4a3986a87829c234d9a data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_yellow.json +7b346a25b801f93168be563a2aa365e4e48f827b data/createnuclear/recipes/smithing/default_anti_radiation_helmet_black.json +c69780adec8c2427c237cea5ddcd92a40e718d28 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_blue.json +25119854b65bc1bcfd7f069c1bbf49f94d522e23 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_brown.json +7e4780779055040d3484380914c09a0d025f9afa data/createnuclear/recipes/smithing/default_anti_radiation_helmet_cyan.json +92a249d8e1a28748e9d22626baf96326f6f6e221 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_gray.json +005d67d80eefe39b56f7b9393240068d18fafb01 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_green.json +88e16f23c073e994d4a6df46d90534d7f70df29c data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_blue.json +7b2fff312dc5b0bcc183e25faa14298b4633ff61 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_gray.json +1446a034a24c4e9f7070c9c1fbab0c88b0f308c3 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_lime.json +b29303743557b04966a1ee6cfb043f02df969d3e data/createnuclear/recipes/smithing/default_anti_radiation_helmet_magenta.json +e696a89e37fd63d7d287a2b3f8566d42da939b63 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_orange.json +a65d8515483a60d05c40a94d836c76112c7b8658 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_pink.json +a279b08aa7ac8f3e1b9e954d0d163faa3275c51b data/createnuclear/recipes/smithing/default_anti_radiation_helmet_purple.json +6e8392bb8d3e96e6cc440d03dab331f3963dad18 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_red.json +37551f2d20b034f07b11f7858ec110474f757694 data/createnuclear/recipes/smithing/default_anti_radiation_helmet_white.json +bfce9d7de2a052f3fa792b9c1f187e72092e007b data/createnuclear/recipes/smithing/default_anti_radiation_helmet_yellow.json +4164b283ba6bd2c9a97dcbae969cdfc27b2e9d22 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_black.json +72bb2356d213f4bca7ec238271b8ccad39f61576 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_blue.json +5d6997ae238d853a7c358a54af7fd2f70c1c431c data/createnuclear/recipes/smithing/default_anti_radiation_leggings_brown.json +959823e193ed0f7cc17137116a3a81b4e0c0249d data/createnuclear/recipes/smithing/default_anti_radiation_leggings_cyan.json +23298fa9b239964faa6a952dbe0ec6c4a56f7a1f data/createnuclear/recipes/smithing/default_anti_radiation_leggings_gray.json +e354f42965d41abae16e6f31c23981d23326359d data/createnuclear/recipes/smithing/default_anti_radiation_leggings_green.json +4a26d58d0946323336db531059b59ab6639b8ae8 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_blue.json +5071edb01d1cb7ab3b1514bbe2ecd5452c14f395 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_gray.json +2aee5d790b14c5b2dcf9417cd8577313000509c9 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_lime.json +0c3cd83adf7c0efa1511e2b9c557ff0eb6dad648 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_magenta.json +88f2da1df98b6547f8c6c53c071cfb5d3eeb04f6 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_orange.json +baef31d622842d32d7c820304de49c913b9a820c data/createnuclear/recipes/smithing/default_anti_radiation_leggings_pink.json +887a317461008f2fc5d8719e123ac6a057a353a3 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_purple.json +203dcb45f480bb9a9fbfc4c0b41a99fc104e394b data/createnuclear/recipes/smithing/default_anti_radiation_leggings_red.json +ded8acf28ec98ddbd5257b9e7a7a4d8f3686d6df data/createnuclear/recipes/smithing/default_anti_radiation_leggings_white.json +18118142ae5ada0eee60321cfa8a64fba4d8c8a2 data/createnuclear/recipes/smithing/default_anti_radiation_leggings_yellow.json a7d4278d8a39649c8b658ad2f3f1d092cb012bdf data/createnuclear/tags/blocks/enriching_fire_base_blocks.json 509b5baa813ae0dc3345fd97754e4088132359ec data/createnuclear/tags/blocks/fan_processing_catalysts/enriched.json -925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/createnuclear/tags/blocks/lead_ores.json -bad88bea18fec41c7ad6fa4d396feacc0346a137 data/createnuclear/tags/blocks/uranium_ores.json -e8b97836e0a934f9023ba18e6ad44e60dca4532d data/createnuclear/tags/entity_types/irradiated_immune.json +bc8701774f57ab000a8f0f1d390702175a6cdbb8 data/createnuclear/tags/blocks/fan_processing_catalysts/snow_powder.json +ccbc67cba973a8e1e43d0166ddfa5645f6a82aea data/createnuclear/tags/entity_types/irradiated_immune.json +410aa6d101788f25baa176741887c6f314006f29 data/createnuclear/tags/fluids/nitrogen.json +dd07a117bf2a657aba3d776ee718829150a1c0af data/createnuclear/tags/fluids/thorium.json bfd5a561b60a7d59d7f7c248ec75e3571a0f2fed data/createnuclear/tags/fluids/uranium.json -7422c4cd9d6dd716f91311faa1fb7e26aa9ac345 data/createnuclear/tags/items/all_anti_radiation_armors.json -e3fe4325aafb669d287c17b5b30953e4fb709110 data/createnuclear/tags/items/anti_radiation_armor.json -fadb3957b979d82146790ef3550e38606760421e data/createnuclear/tags/items/anti_radiation_boots_dye.json -e7d6ce5456dd6ed6f018a8fb2f3a14b5b4f78e52 data/createnuclear/tags/items/anti_radiation_chestplate_dye.json -0845acff015f78c494df2cd6754c5cff10d77c05 data/createnuclear/tags/items/anti_radiation_chestplate_full_dye.json -3f127db66e68fd3aac662a14e4cbacc4204efa8e data/createnuclear/tags/items/anti_radiation_helmet_dye.json -b5d23f0bc26a4e3a72cde40f3c6d59c03c818b4d data/createnuclear/tags/items/anti_radiation_helmet_full_dye.json -0e3c30cdbfaa4b73bac1276fb973db733b934619 data/createnuclear/tags/items/anti_radiation_leggings_dye.json -bebad856ee0f047735060f28544eb6149d8c2b20 data/createnuclear/tags/items/anti_radiation_leggings_full_dye.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/createnuclear/tags/items/all_anti_radiation_armors.json +bce34f53cb2d00f7dee84683e8fdd429dabbcc1d data/createnuclear/tags/items/anti_radiation_armor.json 2e4d08932c4a84863f0198eb2845f80d8fda1221 data/createnuclear/tags/items/cloth.json 8e6598f14a72a61cbe1e5ed2aaea229fb2dd74e6 data/createnuclear/tags/items/cooler.json -c5587bb72c54f59e9f9a4cd2c3e6bedb78ee198d data/createnuclear/tags/items/fuel.json -925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/createnuclear/tags/items/lead_ores.json +d534438c9314e8b014bf1796060dd801f4ef4d4e data/createnuclear/tags/items/fuel.json 1a438d724641b4899f18b4abeef0b0708c76ea70 data/createnuclear/tags/items/stone_types/autunite.json -bad88bea18fec41c7ad6fa4d396feacc0346a137 data/createnuclear/tags/items/uranium_ores.json d8d6ad7a4fc31fd68a98b368207c359fb610f417 data/create/tags/blocks/safe_nbt.json 75f0600da4891d0f4a3329fb44cac6c4945a0b49 data/forge/tags/blocks/glass.json -38aa0fddd24ec7dde10f1e2804328660a2019ac8 data/forge/tags/blocks/ores.json +1fd17be1d553e7ddf20494ee1e98084f02137cc8 data/forge/tags/blocks/ores.json 925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/forge/tags/blocks/ores/lead.json +1ad062f84e124267bb3aae3add3a4e5265a4f8d7 data/forge/tags/blocks/ores/nitrate.json +3f665c928bcdfaa68700d1da7a28fddcbb7bf802 data/forge/tags/blocks/ores/thorium.json bad88bea18fec41c7ad6fa4d396feacc0346a137 data/forge/tags/blocks/ores/uranium.json -dec8291df390fe12bd034da156c39432cccef0d4 data/forge/tags/blocks/ores_in_ground/deepslate.json -f36fa9b8ea20e21fd4a452ea0ec7ce557acd3ac2 data/forge/tags/blocks/ores_in_ground/stone.json +4f1ebc0bb505bc510c52671c5935494270ec7008 data/forge/tags/blocks/ores_in_ground/deepslate.json +a04457046c7b0dc46d430af61f83518a84a508d2 data/forge/tags/blocks/ores_in_ground/stone.json a7258ae3454252e874b324fbd81b880ce52759c4 data/forge/tags/blocks/storage_blocks/lead.json 2b32fe875f887d4a406700d35e0fe5a93548ebb7 data/forge/tags/blocks/storage_blocks/raw_lead.json +725644962932169e20d6f2726e69af199ce3800c data/forge/tags/blocks/storage_blocks/raw_thorium.json 0aafd338eaffcc3f48fb8dc9d18fc969318b06e0 data/forge/tags/blocks/storage_blocks/raw_uranium.json f8074cdbc6e2b560acb4e9da953b23f9825486a6 data/forge/tags/blocks/storage_blocks/steel.json +baae2dfd7e19770072d6261ec68ce157a32be80c data/forge/tags/blocks/storage_blocks/thorium.json a63487094743744be756ad497f483fcd4d11e9bc data/forge/tags/fluids/uranium.json -fadb3957b979d82146790ef3550e38606760421e data/forge/tags/items/armors/boots.json -0845acff015f78c494df2cd6754c5cff10d77c05 data/forge/tags/items/armors/chestplates.json -b5d23f0bc26a4e3a72cde40f3c6d59c03c818b4d data/forge/tags/items/armors/helmets.json -bebad856ee0f047735060f28544eb6149d8c2b20 data/forge/tags/items/armors/leggings.json +e15fb3153f19574ecf55a117c026f6bf028f3a87 data/forge/tags/items/armors/boots.json +fb238dbddaf54871f03731ee7cce881af0932459 data/forge/tags/items/armors/chestplates.json +b3f8c7d4cc47db1954a7470d37e5e4e6549c9480 data/forge/tags/items/armors/helmets.json +9f9c6b5fe521e31527d238cd230e6f3ef689857f data/forge/tags/items/armors/leggings.json +419d05292cb4947015b5320c991500e5a51f5466 data/forge/tags/items/buckets/nitrogen.json +c53aa7c19dc2c02afdab4bc7e3188ca2b2224af6 data/forge/tags/items/buckets/thorium.json 9ac9f967f480bbbe186815331a7e1771c8feea57 data/forge/tags/items/buckets/uranium.json -25c93720c5221fac9aeb0ae47182ef59e0a0c2bb data/forge/tags/items/coal_dusts.json -4c65712ad229579aed33c75220c37f9a70134cb2 data/forge/tags/items/dusts.json +6c2e44175fc9799f1cf69287a6b21ef3f8c659e1 data/forge/tags/items/dusts.json 25c93720c5221fac9aeb0ae47182ef59e0a0c2bb data/forge/tags/items/dusts/coal.json +d6176bfd8cf296e3d5b5601ff2da8fc59620a092 data/forge/tags/items/dusts/thorium.json 69b53861489d10b3a836be9812af97c999833470 data/forge/tags/items/dusts/uranium.json 75f0600da4891d0f4a3329fb44cac6c4945a0b49 data/forge/tags/items/glass.json -81d5270bd69ab7d6ffef70dc7867a498202eb4b4 data/forge/tags/items/ingots.json +69b0ac78e6b1f46e527de8e63aba797c335290f9 data/forge/tags/items/ingots.json 30fa647448df4131c1d6460756f18583a493ee31 data/forge/tags/items/ingots/lead.json 24bc6e0cdae825d9e5d1500567ae81d83c15a88d data/forge/tags/items/ingots/steel.json -3245aa72f5bb5f83632ab05f449e8a2d576ac386 data/forge/tags/items/nuggets.json +a50840c5dc4023ab62b7faa86a5fd9f032a50caf data/forge/tags/items/ingots/thorium.json +a77ba3f79cd096f38bd53b5f1b6a5696b864e9df data/forge/tags/items/nuggets.json 41ff866ec94383906342a0d1594554e3063b9d0f data/forge/tags/items/nuggets/lead.json 1ec402fda0c91947be220066973f79f3e522663f data/forge/tags/items/nuggets/steel.json +31d6f68b8cbb51e44700987c1b242a855e120b33 data/forge/tags/items/nuggets/thorium.json 925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/forge/tags/items/ores/lead.json +1ad062f84e124267bb3aae3add3a4e5265a4f8d7 data/forge/tags/items/ores/nitrate.json +3f665c928bcdfaa68700d1da7a28fddcbb7bf802 data/forge/tags/items/ores/thorium.json bad88bea18fec41c7ad6fa4d396feacc0346a137 data/forge/tags/items/ores/uranium.json -cdebf2b4eabcf71ee4566b7fbf22f18990a4e06b data/forge/tags/items/raw_materials.json +fd86e3b3265d7069f3cfff0cfb5d086eea5a813a data/forge/tags/items/raw_materials.json 610ed700de0886bcb4b1c90100c35f3034c53940 data/forge/tags/items/raw_materials/lead.json +61f6f1f4b16790c36a45f769141900772ce4529a data/forge/tags/items/raw_materials/thorium.json 03a88f0d9f44d3c338b82bf92b22a14dec490bef data/forge/tags/items/raw_materials/uranium.json -cdebf2b4eabcf71ee4566b7fbf22f18990a4e06b data/forge/tags/items/raw_ores.json -c1ad472460350e6abd024de7785cd870dad05cd9 data/forge/tags/items/rods.json +fd86e3b3265d7069f3cfff0cfb5d086eea5a813a data/forge/tags/items/raw_ores.json +4a76a7534e658f2f41e33e3eb5fc2cc55f5e58a8 data/forge/tags/items/rods.json a7258ae3454252e874b324fbd81b880ce52759c4 data/forge/tags/items/storage_blocks/lead.json 2b32fe875f887d4a406700d35e0fe5a93548ebb7 data/forge/tags/items/storage_blocks/raw_lead.json +725644962932169e20d6f2726e69af199ce3800c data/forge/tags/items/storage_blocks/raw_thorium.json 0aafd338eaffcc3f48fb8dc9d18fc969318b06e0 data/forge/tags/items/storage_blocks/raw_uranium.json f8074cdbc6e2b560acb4e9da953b23f9825486a6 data/forge/tags/items/storage_blocks/steel.json +baae2dfd7e19770072d6261ec68ce157a32be80c data/forge/tags/items/storage_blocks/thorium.json e84d8e1fa924bec3e226b8917b4973b9629a5f52 data/minecraft/tags/blocks/all/campfires.json 8875ba7215b30d75573e3dcfe46e0b690b1d7f2f data/minecraft/tags/blocks/azalea_root_replaceable.json e84d8e1fa924bec3e226b8917b4973b9629a5f52 data/minecraft/tags/blocks/campfires.json @@ -551,16 +680,17 @@ e84d8e1fa924bec3e226b8917b4973b9629a5f52 data/minecraft/tags/blocks/campfires.js 75f0600da4891d0f4a3329fb44cac6c4945a0b49 data/minecraft/tags/blocks/impermeable.json 8875ba7215b30d75573e3dcfe46e0b690b1d7f2f data/minecraft/tags/blocks/lush_ground_replaceable.json e84d8e1fa924bec3e226b8917b4973b9629a5f52 data/minecraft/tags/blocks/mineable/axe.json -f3aae3bed8f4a0faad6d92489d9f8e9c0c10e30f data/minecraft/tags/blocks/mineable/pickaxe.json +299ef1307fe3379e6919e195533d45e342939765 data/minecraft/tags/blocks/mineable/pickaxe.json a7d4278d8a39649c8b658ad2f3f1d092cb012bdf data/minecraft/tags/blocks/mineable/shovel.json 8875ba7215b30d75573e3dcfe46e0b690b1d7f2f data/minecraft/tags/blocks/moss_replaceable.json -41d3382a5f829a516326fa59334529abffdc8fb2 data/minecraft/tags/blocks/needs_diamond_tool.json -38aa0fddd24ec7dde10f1e2804328660a2019ac8 data/minecraft/tags/blocks/needs_iron_tool.json +af6dc9f8e98b963b468d2ec348343783ec30be1d data/minecraft/tags/blocks/needs_diamond_tool.json +1fd17be1d553e7ddf20494ee1e98084f02137cc8 data/minecraft/tags/blocks/needs_iron_tool.json 9b9e13222cf9d971353888483c5f041cbb664dc3 data/minecraft/tags/blocks/slabs.json 7e5c701218bfbd3b186b102ff52dc79454a39e8f data/minecraft/tags/blocks/stairs.json 92fe109294976e85a9b9763124896e012a17c98a data/minecraft/tags/blocks/walls.json 2535c56fd6376328fbca0528562ecc2046a3b655 data/minecraft/tags/entity_types/fall_damage_immune.json a63487094743744be756ad497f483fcd4d11e9bc data/minecraft/tags/fluids/lava.json +9b1c04e4516407eb6df9f1262fd73a71605f3bb1 data/minecraft/tags/fluids/water.json 9b9e13222cf9d971353888483c5f041cbb664dc3 data/minecraft/tags/items/slabs.json 7e5c701218bfbd3b186b102ff52dc79454a39e8f data/minecraft/tags/items/stairs.json 92fe109294976e85a9b9763124896e012a17c98a data/minecraft/tags/items/walls.json diff --git a/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e b/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e index b0e0ba0c7..de59cc550 100644 --- a/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e +++ b/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e @@ -1,7 +1,9 @@ -// 1.20.1 2025-11-11T12:39:11.5625077 createnuclear's mechanical crafting recipes +// 1.20.1 2026-06-24T11:17:44.2189222 createnuclear's mechanical crafting recipes 0a56332199941d1db61ee7512130d2664fd73e46 data/createnuclear/recipes/mechanical_crafting/graphite_rod.json +13bbcaa279d141281856ee7dbed5d3ea105e2389 data/createnuclear/recipes/mechanical_crafting/reactor_alarm.json 85f68439da9d4bb70d1308b7b64db0e30fec9e51 data/createnuclear/recipes/mechanical_crafting/reactor_controller.json 11b4c4d65d4f6981c34e7f97e0e8dc3468376b05 data/createnuclear/recipes/mechanical_crafting/reactor_cooler.json 8228bb2d850dfd474e2ce142ac9a0ff6ab707f07 data/createnuclear/recipes/mechanical_crafting/reactor_core.json -48db9006423a3762a24c7cae7a3534f124aa0e4c data/createnuclear/recipes/mechanical_crafting/reactor_frame.json +9b2a4dee0019fa8506cc26fdd20802e0f5baba1b data/createnuclear/recipes/mechanical_crafting/reactor_frame.json +f6eda56d293f771067b1d5b661284ed1ce9e8f93 data/createnuclear/recipes/mechanical_crafting/thorium_rod.json 0a1d26105f14cb2a01b18b9f050c900412f917fb data/createnuclear/recipes/mechanical_crafting/uranium_rod.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 1ab24c53b..36147ff72 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,29 +1,37 @@ -// 1.20.1 2025-11-11T12:39:11.5491243 Recipes +// 1.20.1 2026-06-15T19:58:10.7478909 Recipes 229dafab82da54169697898f94d3be266a77d5ff data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead.json -14b3abbc5d9b1950f65ef1cc03f79a36c8820efc data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json +53d8b344f1d5b0a0ce7d6082f5e214a6ae9c0bef data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json 028d2b4f2f5ec4764791ca5c28c19b6848b00bea data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_raw_lead.json -605ccb2acc7e944ddbce2e962af3278e47a04627 data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json +203072b1b00fca38c88c3c7d9141ce044e1cded3 data/createnuclear/advancements/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json +3aa4a3f3fdccc2b33ae50babf6db874f98835563 data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json a72a296cd6cad499e78fa33f74194d74e9d2eef0 data/createnuclear/advancements/recipes/misc/crafting/lead_block_from_compacting.json c6acb8cd38541f9baf6e9045bf2547666a48dd66 data/createnuclear/advancements/recipes/misc/crafting/lead_ingot_from_compacting.json 7be9394a2c56bc4683288e45a44bfc5dda6a4b6e data/createnuclear/advancements/recipes/misc/crafting/steel_block_from_compacting.json 4ad292cd97e78f82b3ed9d4123f5e95c5ddea55c data/createnuclear/advancements/recipes/misc/crafting/steel_ingot_from_compacting.json +c14100e996c2146f0c0c062ef489380e11b36b46 data/createnuclear/advancements/recipes/misc/crafting/thorium_block_from_compacting.json +6e8a83dd9ce1ed273bedceb577670f07bc18b750 data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_compacting.json a98dc6de94e6658d78ec28b77959ae9cb17b1d58 data/createnuclear/advancements/recipes/misc/crafting/white_cloth.json 067475701d6f059793c064718b7bba4b939ce380 data/createnuclear/advancements/recipes/misc/crafting/white_cloth_wool.json d4162de75c52e6106a386dcf4c5c3bc5b74261d6 data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead.json -0c347228b63702ba70d4257c4b5642133fb8e5b8 data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json +26308967967782cb80e52e0cda39b27580923d53 data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json 1bb03dfa15ff7f76bc2accdd7d26b520605ae4bf data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_raw_lead.json -d7cfc6f1ff4d39df0df526ec3723e8d18d198945 data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json +4e49562ac3d71b9c1648649ac94858df73b1b2f6 data/createnuclear/advancements/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json +e2928f9172550d20f060a7fc5fcd690ab9f2bf16 data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json 932672d0475e9c82d033d395ee12010e9f3d6828 data/createnuclear/recipes/blasting/lead_ingot_for_lead.json -b2ec2f955ece9110bf315a2773b70999e268f81d data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json +065cd18605273ab59b5f68d2e21a40d4c144f51c data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json c46810e5000a34edfceed6a8457595afe9d0377d data/createnuclear/recipes/blasting/lead_ingot_for_raw_lead.json -978cc9d92268673050da5697482f4013a63a65f1 data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json +ecfe4877ed719c02863e50a2de99a54bca0a6672 data/createnuclear/recipes/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json +247249727f830f450bb81d6da4f418d87c8f9d0a data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json 319718ee24e2c5bdeba2b16cd99c55fc7f97f9e4 data/createnuclear/recipes/crafting/lead_block_from_compacting.json 17e9a54a54b1ed1f6af0a3fbb0771262af585a95 data/createnuclear/recipes/crafting/lead_ingot_from_compacting.json 8e2e9b598fe86d2238915fb59486bccfac737e16 data/createnuclear/recipes/crafting/steel_block_from_compacting.json af5d168185e516ea79c335ac7eb6652b99723143 data/createnuclear/recipes/crafting/steel_ingot_from_compacting.json +5bfd142e7275ee50951d6848745bf4a8cc3fc62d data/createnuclear/recipes/crafting/thorium_block_from_compacting.json +53ace49121c54906024163655b786cefdd84e801 data/createnuclear/recipes/crafting/thorium_ingot_from_compacting.json f2841ff83321c5bf5d43649fb204fa3a97fd596e data/createnuclear/recipes/crafting/white_cloth.json 93e75639c60d69067daddecfb2fa480a8e2040c4 data/createnuclear/recipes/crafting/white_cloth_wool.json 165a3c45b53d0a94149f26300f609c2fd7c688f1 data/createnuclear/recipes/smelting/lead_ingot_for_lead.json -4121c89708b0b069ece6dd9356dd3865af602779 data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json +8d587bca58cdcc2320a115d0b653dbba7e7785ab data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json 7acfaccfb12d280e8d858fdaf7f9048a5ac29e26 data/createnuclear/recipes/smelting/lead_ingot_for_raw_lead.json -93fe12ad36a99451009518d71ac105969a1ef2aa data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json +ad4541bf1f0994177d3f6ae830abb279c4d222f3 data/createnuclear/recipes/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json +279e5b03513f47f91867e356f9ccc77ee1f39629 data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json diff --git a/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 b/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 index 8e1d4e818..f993613d8 100644 --- a/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 +++ b/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 @@ -1,26 +1,44 @@ -// 1.20.1 2025-11-11T12:39:11.5247801 Create Nuclear Advancements -384b002f95b70c595cedc692ed219d45931f1f5b data/createnuclear/advancements/anti_radiation_armor.json -41069c530d33ea7d59cccddada0ceececd69f5af data/createnuclear/advancements/automatic_uranium.json +// 1.20.1 2026-06-25T18:37:37.4848866 Create Nuclear Advancements +605607e2254e01df3e30839921ddd33635250d04 data/createnuclear/advancements/absolute_zero.json +b6aa52d55ebb681fa0784c5419667c88a4b0e6db data/createnuclear/advancements/anti_radiation_armor.json +fe81bbd052ebe4a70c48912b47e12ed4e4523d1d data/createnuclear/advancements/automatic_uranium.json +46adc59d053ab49e13dd89106edf1ba23b4840f8 data/createnuclear/advancements/avoiding_cancer.json +3456f765a017423c5ebab69766250523f9895ec3 data/createnuclear/advancements/chemistry_101.json +5077f1f3f28142404fea023fa47a4bfe9c388780 data/createnuclear/advancements/chill_out.json 2e8127a4546d680ab502c6e3c71f49d8df2b1b18 data/createnuclear/advancements/coal_dust.json -2c2cfb8724f39fc5e101a34dce08de6e33f6d1f8 data/createnuclear/advancements/dye_anti_radiation_armor.json +a0d591c0cfa26fbd3ea83da54cdd9f900d58926c data/createnuclear/advancements/craft_enriching_campfire.json +826cf04c3b3768dd1a5834ce24dc4301435fed75 data/createnuclear/advancements/crunchy_uranium.json +f85ce01405f65f942bbc2960442677ef5a3863d9 data/createnuclear/advancements/cryogenic_baptism.json +efcd55929d60b9925ac4833ad1171ddb81dd47a0 data/createnuclear/advancements/dye_anti_radiation_armor.json eda669191bc6149e3feee4a2b9b25b64e1d7da60 data/createnuclear/advancements/enriched_yellowcake.json -fb039aef2e300f0f4eb946b8367e154a1772cc90 data/createnuclear/advancements/full_anti_radiation_armor.json +a4c2c7a01789564aa45097c6ce38c55b75264db7 data/createnuclear/advancements/feeding_the_reactor.json +6d6de5eb0a2736287ba0149dd54746319df6f271 data/createnuclear/advancements/fueling_the_reactor.json +68d2b2361f527a1d9fbe48da95f3f313654c6761 data/createnuclear/advancements/getting_concentrated.json bffbc5007ddb20829768a122cc514f84c2dee1e0 data/createnuclear/advancements/graphene.json 8e89393b2e396243d12cf5b29e283ab97c814519 data/createnuclear/advancements/graphite_rod.json 07e0edb7519c4e755446e95086487f5c8bbbbb17 data/createnuclear/advancements/lead_ingot.json +2d4e1850876ff75bf3020c3e772799c0fe7ac825 data/createnuclear/advancements/no_time_to_die.json e9f9668d36ebd431502b20296f774c83a1d050f0 data/createnuclear/advancements/raw_lead.json +4f6fe1f20d539a316966f8557988c3ba5f5e986e data/createnuclear/advancements/raw_thorium.json 0ac2cb2226f212b6c56c2f05dfa882b46f066f6f data/createnuclear/advancements/raw_uranium.json e9d8bd7f04cac0f3ea72a02a5cdc4cc98f728d98 data/createnuclear/advancements/reactor_blueprint.json 46f6044ed5c777f9fe08f7957c3d26e39d69f3c5 data/createnuclear/advancements/reactor_casing.json bf6947708102180f9cd08e31305253774187d763 data/createnuclear/advancements/reactor_controller.json -842add59177cc7aec1b55102ec0495a522ced05c data/createnuclear/advancements/reactor_cooler.json +74363604b80b4a402fb582711f5967b9f68051e1 data/createnuclear/advancements/reactor_cooler.json f88401b0664256c3b2cb35c018f8f738b60bc3e9 data/createnuclear/advancements/reactor_core.json -07047ca35a1e75dfe3f7885ad8b5a63ce53e1b34 data/createnuclear/advancements/reactor_frame.json -4f963ff2f6c09a0272c25ebdb46423700e5256eb data/createnuclear/advancements/reactor_input.json -b19a554150aa4d9dee594574e310c436d7bfc66d data/createnuclear/advancements/reactor_output.json +eb2975b0ff5956717aa1737794258d4ed7d7528f data/createnuclear/advancements/reactor_frame.json 91aab6f0a18aee167c63a3aece5fa9778cf52b0b data/createnuclear/advancements/reinforced_glass.json -a7b50865e9c0a441d749bf386f38e0a9dd69e5c8 data/createnuclear/advancements/root.json +734a40badf33a911d1e0adb9a2b18688d5cb5401 data/createnuclear/advancements/root.json +79e11acd6d9c16e92bf10d417251a9d6859399c3 data/createnuclear/advancements/silence_the_core.json a44ae76ec00fae36f7df13e43f20ebe389b416d5 data/createnuclear/advancements/steel_ingot.json +6db13694145ff3bbff4abfb58e857f404f0add73 data/createnuclear/advancements/t1.json +663bc37c0587b13e9578d75309825f76c0abe4b9 data/createnuclear/advancements/t2.json +8f8e494675b2a506e1801c92a4ab34410e286871 data/createnuclear/advancements/t3.json +22df89169fa9f9f53156f3044e4ebc9a542fb244 data/createnuclear/advancements/thorium_dust.json +f7d455c664ca65948f6230eda0621365da68bbcd data/createnuclear/advancements/thorium_ingot.json +2f5be65619e05a1213ef6e71475b7b0c361a6be5 data/createnuclear/advancements/thorium_liquid.json +c845dedfc3fe75d51227237a2fb1f5f14f28354b data/createnuclear/advancements/thorium_rod.json +d332d15cb59c5f942c728748121c4249e932df17 data/createnuclear/advancements/unlimited_power.json 5a41894d2428fb7297b98a6b78925a17af2a3095 data/createnuclear/advancements/uranium_liquid.json 01ac168072fa666f64148113ae806ec0b5ea5158 data/createnuclear/advancements/uranium_powder.json 06d1bfea924a4ea35ce78937adcab967cce02b67 data/createnuclear/advancements/uranium_rod.json diff --git a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea index 3fb0164c0..5def8b186 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,10 +1,27 @@ -// 1.20.1 2025-11-11T12:39:11.546555 CreateNuclear Generated Registry Entries +// 1.20.1 2026-08-03T17:25:05.6674408 CreateNuclear Generated Registry Entries +46e263393c1672a180bc12b99f9e39adf22e66b5 data/createnuclear/createnuclear/fluids/type/fallback.json +2837d5ecbd5735f39c1fac545469486e09c502e0 data/createnuclear/createnuclear/fluids/type/nitrogen.json +152a58adb9f86e1c9fac62fd2095ba8413142568 data/createnuclear/createnuclear/fluids/type/water.json +15403b1cee46d300af2247a08485c04ccd80cfc0 data/createnuclear/createnuclear/rods/type/fallback.json +9b26dc9810e426fa58e03de22a96f45403e5f1b3 data/createnuclear/damage_type/fan_radiation.json +8c374052eefd34e87959a1f643e60b674f0345f8 data/createnuclear/damage_type/radiation.json 5edbd74546f4088818e02bb7a5c5eb2ecfe25623 data/createnuclear/forge/biome_modifier/lead_ore.json +5c8a0b9f47166236a030ecbcbec7f42cfaca8378 data/createnuclear/forge/biome_modifier/nitrate_ore.json 72173023e6a31748692e750db0f5fa8c555d1009 data/createnuclear/forge/biome_modifier/striated_ores_overworld.json +1d15657126bab7c0b4355d0dcb9addc2d417ed01 data/createnuclear/forge/biome_modifier/thorium_ore.json fa32145101dc12ec914684fec8c5cbb995d2c051 data/createnuclear/forge/biome_modifier/uranium_ore.json -b68555f371c9700aa4ecfa9370b010de8fe25b60 data/createnuclear/worldgen/configured_feature/lead_ore.json +a3399faccac4549c2c7d41a5863883ecea074e99 data/createnuclear/worldgen/biome/irradiated_land.json +d9a89f0f1804d33867b4e0c28cbe0cf69ce131f5 data/createnuclear/worldgen/configured_feature/lead_ore.json +c3bb421f6bf5a02b09a178d4d1f003679b86c919 data/createnuclear/worldgen/configured_feature/nitrate_ore.json 4f11c0a518c0de7857919983fc638ba551c6630a data/createnuclear/worldgen/configured_feature/striated_ores_overworld.json +aaa284a4e57635bf05f4539125b33a2f9176ed5b data/createnuclear/worldgen/configured_feature/thorium_ore.json b0e1ee7314412507fd7346cb48b29d105f6186ad data/createnuclear/worldgen/configured_feature/uranium_ore.json -d45ed5f7008864ba4f60c409038ad428a280fd7f data/createnuclear/worldgen/placed_feature/lead_ore.json -f26be417cb34461ecb180e77a9a749eaaf4c9880 data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json -bed936158c61471513252910d9e3b0e2de610f1a data/createnuclear/worldgen/placed_feature/uranium_ore.json +59d61c02881d710b0426a0955f6945b7a12d219f data/createnuclear/worldgen/density_function/irradiated/erosion.json +59d61c02881d710b0426a0955f6945b7a12d219f data/createnuclear/worldgen/density_function/irradiated/final_density.json +7f5f110a211b82bc22627b2f901c5f3c6a1265dd data/createnuclear/worldgen/noise/irradiated/erosion.json +ea836bafce53bcb743cb2de5ba38271291483865 data/createnuclear/worldgen/noise_settings/irradiated_noise.json +f11d981e79cf92130a47ad564925d7be26ffbc0b data/createnuclear/worldgen/placed_feature/lead_ore.json +e69f61cbb4bf2c50a6123ddc87c024c801bb78d1 data/createnuclear/worldgen/placed_feature/nitrate_ore.json +d0e47433fc86ee2acd9dde56f0465aae54fe5fe0 data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json +5e64cf339847e8c89e4bbb94a2382262a0ce66ac data/createnuclear/worldgen/placed_feature/thorium_ore.json +148db47005efc228a743e41fd60011b8bff8e78a data/createnuclear/worldgen/placed_feature/uranium_ore.json diff --git a/src/generated/resources/assets/createnuclear/blockstates/deepslate_nitrate_ore.json b/src/generated/resources/assets/createnuclear/blockstates/deepslate_nitrate_ore.json new file mode 100644 index 000000000..0b75136ad --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/deepslate_nitrate_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/deepslate_nitrate_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/deepslate_thorium_ore.json b/src/generated/resources/assets/createnuclear/blockstates/deepslate_thorium_ore.json new file mode 100644 index 000000000..9effc25d3 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/deepslate_thorium_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/deepslate_thorium_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/nitrate_ore.json b/src/generated/resources/assets/createnuclear/blockstates/nitrate_ore.json new file mode 100644 index 000000000..2f14544eb --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/nitrate_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/nitrate_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/nitrogen.json b/src/generated/resources/assets/createnuclear/blockstates/nitrogen.json new file mode 100644 index 000000000..113fb23f2 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/nitrogen.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/nitrogen" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/raw_thorium_block.json b/src/generated/resources/assets/createnuclear/blockstates/raw_thorium_block.json new file mode 100644 index 000000000..626939bb5 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/raw_thorium_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/raw_thorium_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_alarm.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_alarm.json new file mode 100644 index 000000000..1a4f20323 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/reactor_alarm.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/reactor_alarm" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json index 28a903c51..cbd0a7cfc 100644 --- a/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json +++ b/src/generated/resources/assets/createnuclear/blockstates/reactor_controller.json @@ -1,33 +1,63 @@ { "variants": { - "assembled=false,facing=east": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=east": { + "model": "createnuclear:block/reactor/controller/off", "y": 270 }, - "assembled=false,facing=north": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=north": { + "model": "createnuclear:block/reactor/controller/off", "y": 180 }, - "assembled=false,facing=south": { - "model": "createnuclear:block/reactor/controller/block" + "active=false,assembled=false,facing=south": { + "model": "createnuclear:block/reactor/controller/off" }, - "assembled=false,facing=west": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=false,facing=west": { + "model": "createnuclear:block/reactor/controller/off", "y": 90 }, - "assembled=true,facing=east": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=east": { + "model": "createnuclear:block/reactor/controller/standby", "y": 270 }, - "assembled=true,facing=north": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=north": { + "model": "createnuclear:block/reactor/controller/standby", "y": 180 }, - "assembled=true,facing=south": { - "model": "createnuclear:block/reactor/controller/block" + "active=false,assembled=true,facing=south": { + "model": "createnuclear:block/reactor/controller/standby" }, - "assembled=true,facing=west": { - "model": "createnuclear:block/reactor/controller/block", + "active=false,assembled=true,facing=west": { + "model": "createnuclear:block/reactor/controller/standby", + "y": 90 + }, + "active=true,assembled=false,facing=east": { + "model": "createnuclear:block/reactor/controller/off", + "y": 270 + }, + "active=true,assembled=false,facing=north": { + "model": "createnuclear:block/reactor/controller/off", + "y": 180 + }, + "active=true,assembled=false,facing=south": { + "model": "createnuclear:block/reactor/controller/off" + }, + "active=true,assembled=false,facing=west": { + "model": "createnuclear:block/reactor/controller/off", + "y": 90 + }, + "active=true,assembled=true,facing=east": { + "model": "createnuclear:block/reactor/controller/on", + "y": 270 + }, + "active=true,assembled=true,facing=north": { + "model": "createnuclear:block/reactor/controller/on", + "y": 180 + }, + "active=true,assembled=true,facing=south": { + "model": "createnuclear:block/reactor/controller/on" + }, + "active=true,assembled=true,facing=west": { + "model": "createnuclear:block/reactor/controller/on", "y": 90 } } diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_fluid_input.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_fluid_input.json new file mode 100644 index 000000000..2ada65ac1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/reactor_fluid_input.json @@ -0,0 +1,26 @@ +{ + "variants": { + "facing=down": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input_vertical", + "x": 180 + }, + "facing=east": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input", + "y": 270 + }, + "facing=north": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input", + "y": 180 + }, + "facing=south": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input" + }, + "facing=up": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input_vertical" + }, + "facing=west": { + "model": "createnuclear:block/reactor/fluid_input/fluid_input", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_input.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_input.json deleted file mode 100644 index d6e05583e..000000000 --- a/src/generated/resources/assets/createnuclear/blockstates/reactor_input.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "createnuclear:block/reactor/input/block", - "y": 270 - }, - "facing=north": { - "model": "createnuclear:block/reactor/input/block", - "y": 180 - }, - "facing=south": { - "model": "createnuclear:block/reactor/input/block" - }, - "facing=west": { - "model": "createnuclear:block/reactor/input/block", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_rod_input.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_rod_input.json new file mode 100644 index 000000000..37ee320b8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/reactor_rod_input.json @@ -0,0 +1,26 @@ +{ + "variants": { + "facing=down": { + "model": "createnuclear:block/reactor/rod_input/rod_input_vertical", + "x": 180 + }, + "facing=east": { + "model": "createnuclear:block/reactor/rod_input/rod_input", + "y": 270 + }, + "facing=north": { + "model": "createnuclear:block/reactor/rod_input/rod_input", + "y": 180 + }, + "facing=south": { + "model": "createnuclear:block/reactor/rod_input/rod_input" + }, + "facing=up": { + "model": "createnuclear:block/reactor/rod_input/rod_input_vertical" + }, + "facing=west": { + "model": "createnuclear:block/reactor/rod_input/rod_input", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/thorium.json b/src/generated/resources/assets/createnuclear/blockstates/thorium.json new file mode 100644 index 000000000..007ce08d8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/thorium.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/thorium" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/thorium_block.json b/src/generated/resources/assets/createnuclear/blockstates/thorium_block.json new file mode 100644 index 000000000..cb8fa6377 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/thorium_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/thorium_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/thorium_ore.json b/src/generated/resources/assets/createnuclear/blockstates/thorium_ore.json new file mode 100644 index 000000000..c976ca170 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/blockstates/thorium_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "createnuclear:block/thorium_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/lang/en_ud.json b/src/generated/resources/assets/createnuclear/lang/en_ud.json index 498881bd0..fa22fda48 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_ud.json +++ b/src/generated/resources/assets/createnuclear/lang/en_ud.json @@ -1,24 +1,46 @@ { - "advancement.createnuclear.anti_radiation_armor": "ɹoɯɹⱯ uoıʇɐıpɐɹ ıʇuⱯ", + "advancement.createnuclear.absolute_zero": "oɹǝZ ǝʇnןosqⱯ", + "advancement.createnuclear.absolute_zero.desc": "uǝboɹʇıu pınbıן uıɐʇqo oʇ ǝʇɐɹʇuǝɔuoɔ uǝboɹʇıu pǝןooɔ xıW", + "advancement.createnuclear.anti_radiation_armor": "ɹoɯɹⱯ uoıʇɐıpɐᴚ ıʇuⱯ", "advancement.createnuclear.anti_radiation_armor.desc": "uoıʇɐıpɐɹ ɯoɹɟ ɟןǝsɹnoʎ ʇɔǝʇoɹd oʇ ǝɔǝıd ɹoɯɹɐ uoıʇɐıpɐɹ-ıʇuɐ ʇsɹıɟ ɹnoʎ ʇɟɐɹƆ", "advancement.createnuclear.automatic_uranium": "ɯnıuɐɹ∩ buıʇɐɯoʇnⱯ", "advancement.createnuclear.automatic_uranium.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nbuıssǝɔoɹd ɯnıuɐɹn ɔıʇɐɯoʇnɐ ǝɥʇ buısn ɹǝpʍod ɯnıuɐɹn ǝɯos uıɐʇqO", + "advancement.createnuclear.avoiding_cancer": "pǝɹǝʌoƆ ɟןǝsɹnoʎ dǝǝʞ ʇsǝᗺ", + "advancement.createnuclear.avoiding_cancer.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ ɹoɯɹɐ uoıʇɐıpɐɹ-ıʇuɐ dınbƎ", + "advancement.createnuclear.chemistry_101": "ʇI buıɥsnɹƆ", + "advancement.createnuclear.chemistry_101.desc": "ǝʇɐɹʇıu uıɐʇqo oʇ ǝuoʇsǝɯıן ɥsnɹɔ ɹo ǝɹo ǝʇɐɹʇıu ǝuıW", + "advancement.createnuclear.chill_out": "ʇnO ןןıɥƆ", + "advancement.createnuclear.chill_out.desc": "uoıʇɔɐɟǝnbıן ɹoɟ ʇı ǝɹɐdǝɹd oʇ ǝʇɐɹʇuǝɔuoɔ uǝboɹʇıu uʍop ןooƆ", "advancement.createnuclear.coal_dust": "ʇsnᗡ ןɐoƆ", "advancement.createnuclear.coal_dust.desc": "ןɐıɹǝʇɐɯ buıʇɟɐɹɔ ʎǝʞ ɐ 'ʇsnp ןɐoɔ uıɐʇqo oʇ ןɐoɔɹɐɥɔ ɹo ןɐoɔ ɥsnɹƆ", + "advancement.createnuclear.craft_enriching_campfire": "¿ǝʞoɯS ǝʞɐW ʇɐɥ⟘ sǝoᗡ", + "advancement.createnuclear.craft_enriching_campfire.desc": "ǝɹıɟdɯɐƆ buıɥɔıɹuƎ uɐ ʇɟɐɹƆ", + "advancement.createnuclear.crunchy_uranium": "ʇɔǝdxƎ noʎ pıᗡ ʇɐɥM", + "advancement.createnuclear.crunchy_uranium.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\n¿¿ ʇɐɥʍ pıp noʎ ˙˙˙˙˙oɹᗺ", + "advancement.createnuclear.cryogenic_baptism": "ǝɹoɯʎuⱯ ʇǝǝℲ ʎW ןǝǝℲ ʇ,uɐɔ I", + "advancement.createnuclear.cryogenic_baptism.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ uǝboɹʇıu pınbıן ǝɥʇ uı ɯıʍS", "advancement.createnuclear.dye_anti_radiation_armor": "ɹoɯɹⱯ ʎW dɯıԀ", "advancement.createnuclear.dye_anti_radiation_armor.desc": "ɹoןoɔ ʎuɐ oʇ ɹoɯɹɐ uoıʇɐıpɐɹ ıʇuɐ ɹnoʎ ǝʎᗡ", "advancement.createnuclear.enriched_yellowcake": "ǝʞɐɔʍoןןǝʎ buıɔuɐɥuƎ", "advancement.createnuclear.enriched_yellowcake.desc": "ןnɟɹǝʍod ǝɹoɯ ʇı ǝʞɐɯ puɐ ǝʞɐɔʍoןןǝʎ ɥɔıɹuǝ oʇ uɐɟ ɐ ǝs∩", - "advancement.createnuclear.full_anti_radiation_armor": "pǝʇɔǝʇoɹԀ ʎןןnℲ", - "advancement.createnuclear.full_anti_radiation_armor.desc": "uoıʇɐıpɐɹ ɯoɹɟ ɟןǝsɹnoʎ ʇɔǝʇoɹd ʎןןnɟ oʇ ɹoɯɹɐ uoıʇɐıpɐɹ-ıʇuɐ ɟo ʇǝs ןןnɟ ɐ ɹɐǝM", + "advancement.createnuclear.feeding_the_reactor": "ɹoʇɔɐǝᴚ ǝɥ⟘ buıpǝǝℲ", + "advancement.createnuclear.feeding_the_reactor.desc": "ɹoʇɔɐǝɹ ɹnoʎ oʇuı spoɹ buıןooɔ puɐ buıʇɐǝɥ pǝǝɟ oʇ ʇnduI poᴚ ɹoʇɔɐǝᴚ ɐ ʇɟɐɹƆ", + "advancement.createnuclear.fueling_the_reactor": "ɹoʇɔɐǝᴚ ǝɥ⟘ buıןǝnℲ", + "advancement.createnuclear.fueling_the_reactor.desc": "ɹoʇɔɐǝɹ ɹnoʎ oʇuı ʇuɐןooɔ pınbıן pǝǝɟ oʇ ʇnduI pınןℲ ɹoʇɔɐǝᴚ ɐ ʇɟɐɹƆ", + "advancement.createnuclear.getting_concentrated": "pǝʇɐɹʇuǝɔuoƆ buıʇʇǝ⅁", + "advancement.createnuclear.getting_concentrated.desc": "ǝʇɐɹʇuǝɔuoɔ uǝboɹʇıu uıɐʇqo oʇ ǝɔɐuɹnɟ ʇsɐןq ɐ uı ǝʇɐɹʇıu ʇןǝɯS", "advancement.createnuclear.graphene": "ǝuǝɥdɐɹ⅁", "advancement.createnuclear.graphene.desc": "ǝuǝɥdɐɹb ǝʇɐǝɹɔ oʇ ʇsnp ןɐoɔ ssǝɹԀ", "advancement.createnuclear.graphite_rod": "sǝuO ǝsoɥ⟘ ʇǝbɹoℲ ʇ,uoᗡ", "advancement.createnuclear.graphite_rod.desc": "spoɹ ǝʇıɥdɐɹb ǝʞɐɯ oʇ ɹǝʇɟɐɹɔ ןɐɔıuɐɥɔǝɯ ɐ uı sʇobuı ןǝǝʇs puɐ ǝuǝɥdɐɹb ǝuıqɯoƆ", - "advancement.createnuclear.lead_ingot": "ʇobuı pɐǝꞀ", + "advancement.createnuclear.lead_ingot": "ʇobuI pɐǝꞀ", "advancement.createnuclear.lead_ingot.desc": "ʇobuı pɐǝן ɐ uıɐʇqo oʇ pɐǝן ʍɐɹ ɐ ʇןǝɯS", + "advancement.createnuclear.no_time_to_die": "ǝıᗡ o⟘ ǝɯı⟘ oN", + "advancement.createnuclear.no_time_to_die.desc": "¡ WOOOᗺⱯʞ ǝɥʇ ǝɹoɟǝq ɹoʇɔɐǝɹ ǝɥʇ doʇS", "advancement.createnuclear.raw_lead": "pɐǝꞀ ʍɐᴚ", "advancement.createnuclear.raw_lead.desc": "ǝɹo pɐǝן buıuıɯ ʎq pɐǝן ʍɐɹ ǝɯos uıɐʇqO", + "advancement.createnuclear.raw_thorium": "ʍoן⅁ s,ɯnıɹoɥ⟘", + "advancement.createnuclear.raw_thorium.desc": "buıssǝɔoɹd ɹǝɥʇɹnɟ ɹoɟ ɯnıɹoɥʇ ʍɐɹ uıɐʇqo oʇ ǝɹo ɯnıɹoɥʇ ǝuıW", "advancement.createnuclear.raw_uranium": "ɹǝʍoԀ ʍɐᴚ ǝɥ⟘", "advancement.createnuclear.raw_uranium.desc": "buıssǝɔoɹd ɹǝɥʇɹnɟ ɹoɟ ɯnıuɐɹn ʍɐɹ uıɐʇqo oʇ ǝɹo ɯnıuɐɹn ǝuıW", "advancement.createnuclear.reactor_blueprint": "ɹǝʍoԀ ɹoℲ ʇuıɹdǝnןᗺ", @@ -29,20 +51,34 @@ "advancement.createnuclear.reactor_controller.desc": "ɹoʇɔɐǝɹ ɹnoʎ ǝʇɐןnbǝɹ puɐ ǝbɐuɐɯ oʇ ɹǝןןoɹʇuoɔ ɹoʇɔɐǝɹ ɐ ʇɟɐɹƆ", "advancement.createnuclear.reactor_cooler": "ɹoʇɔɐǝᴚ ǝɥ⟘ buıןooƆ", "advancement.createnuclear.reactor_cooler.desc": "ɹoʇɔɐǝɹ ɹnoʎ ןooɔ oʇ ɹǝןooɔ ɹoʇɔɐǝɹ ɐ ʇɟɐɹƆ", - "advancement.createnuclear.reactor_core": "ɹǝʍoԀ ɟo ǝɹoƆ", + "advancement.createnuclear.reactor_core": "ɹǝʍoԀ ɟO ǝɹoƆ", "advancement.createnuclear.reactor_core.desc": "ɹoʇɔɐǝɹ ɹɐǝןɔnu ɹnoʎ ɟo ʎbɹǝuǝ ןןnɟ ǝɥʇ ssǝuɹɐɥ oʇ ǝɹoɔ ɹoʇɔɐǝɹ ǝɥʇ ʇɟɐɹƆ", "advancement.createnuclear.reactor_frame": "ǝɯɐɹℲ ɹoʇɔɐǝᴚ", "advancement.createnuclear.reactor_frame.desc": "ɹoʇɔɐǝɹ ɹɐǝןɔnu ɹnoʎ pןınq oʇ ǝɯɐɹɟ ɹoʇɔɐǝɹ ɐ ʇɟɐɹƆ", - "advancement.createnuclear.reactor_input": "ɹoʇɔɐǝᴚ ǝɥ⟘ buıןǝnℲ", - "advancement.createnuclear.reactor_input.desc": "ɹoʇɔɐǝɹ ɹnoʎ oʇuı spoɹ ǝʇıɥdɐɹb puɐ ɯnıuɐɹn pǝǝɟ oʇ ʇnduı ɹoʇɔɐǝɹ ɐ ʇɟɐɹƆ", - "advancement.createnuclear.reactor_output": "ʇndʇnO ɹǝʍoԀ", - "advancement.createnuclear.reactor_output.desc": "ɹoʇɔɐǝɹ ɹnoʎ ʎq pǝɔnpoɹd ʎbɹǝuǝ ǝɥʇ ɹǝɟsuɐɹʇ oʇ ʇndʇno ɹoʇɔɐǝɹ ɐ ʇɟɐɹƆ", "advancement.createnuclear.reinforced_glass": "ssɐן⅁ pǝɔɹoɟuıǝᴚ", "advancement.createnuclear.reinforced_glass.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ ssɐןb pǝɔɹoɟuıǝɹ ǝɯos ʇɟɐɹƆ", "advancement.createnuclear.root": "ʎǝuɹnoſ ɹɐǝןɔnN ǝɥ⟘ buıʇɹɐʇS", "advancement.createnuclear.root.desc": "ɹǝpʍod ɯnıuɐɹn ʇsɹıɟ ɹnoʎ ʇǝb puɐ ʎbɹǝuǝ ɹɐǝןɔnu ɟo sɔısɐq ǝɥʇ ʞɔoןu∩", + "advancement.createnuclear.silence_the_core": "¡ ǝsıoN ɥɔnW oS sǝʞɐW ʇI", + "advancement.createnuclear.silence_the_core.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ ɯɹɐןɐ ǝɥʇ punos", "advancement.createnuclear.steel_ingot": "ʇobuI ןǝǝʇS", "advancement.createnuclear.steel_ingot.desc": "sʇobuı ןǝǝʇs ǝʇɐǝɹɔ oʇ sʇobuı uoɹı puɐ ʇsnp ןɐoɔ ǝuıqɯoƆ", + "advancement.createnuclear.t1": "Ɩ⟘ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", + "advancement.createnuclear.t1.desc": "ɹoʇɔɐǝᴚ ɹɐǝןɔnN Ɩ ɹǝıʇ ɐ pןınᗺ", + "advancement.createnuclear.t2": "ᄅ⟘ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", + "advancement.createnuclear.t2.desc": "ɹoʇɔɐǝᴚ ɹɐǝןɔnN ᄅ ɹǝıʇ ɐ pןınᗺ", + "advancement.createnuclear.t3": "Ɛ⟘ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", + "advancement.createnuclear.t3.desc": "ɹoʇɔɐǝᴚ ɹɐǝןɔnN Ɛ ɹǝıʇ ɐ pןınᗺ", + "advancement.createnuclear.thorium_dust": "ɯnıɹoɥ⟘ pǝɹǝpʍoԀ", + "advancement.createnuclear.thorium_dust.desc": "buıuıɟǝɹ ɹǝɥʇɹnɟ ɹoɟ ǝɹɐdǝɹd oʇ ʇsnp oʇuı ɯnıɹoɥʇ ʍɐɹ ɥsnɹƆ", + "advancement.createnuclear.thorium_ingot": "ɯnıɹoɥ⟘ pǝʇɔɐdɯoƆ", + "advancement.createnuclear.thorium_ingot.desc": "ʇobuı ɯnıɹoɥʇ ɐ ǝʇɐǝɹɔ oʇ pınbıן ɯnıɹoɥʇ ʇɔɐdɯoƆ", + "advancement.createnuclear.thorium_liquid": "ɯnıɹoɥ⟘ uǝʇןoW", + "advancement.createnuclear.thorium_liquid.desc": "ʇsnp ɯnıɹoɥʇ buıxıɯ ʎq pınbıן ɯnıɹoɥʇ ǝɯos uıɐʇqO", + "advancement.createnuclear.thorium_rod": "ʞɔıʇS ǝnןᗺ Ɐ ʇɐɥM", + "advancement.createnuclear.thorium_rod.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ poɹ ɯnıɹoɥʇ ɐ ʇɟɐɹƆ", + "advancement.createnuclear.unlimited_power": "ɹǝʍoԀ pǝʇıɯıןu∩", + "advancement.createnuclear.unlimited_power.desc": "ɹoʇɔɐǝɹ ɹnoʎ ʎq pǝɔnpoɹd ʎbɹǝuǝ ǝɥʇ ʇɔɐɹʇxǝ oʇ ʇndʇnO ɹoʇɔɐǝᴚ ɐ ʇɟɐɹƆ", "advancement.createnuclear.uranium_liquid": "pınbıꞀ o⟘ pıןoS buıuɹn⟘", "advancement.createnuclear.uranium_liquid.desc": "ɹǝpʍod ɯnıuɐɹn buıxıɯ ʎq pınbıן ɯnıuɐɹn ǝɯos uıɐʇqO", "advancement.createnuclear.uranium_powder": "ɯnıuɐɹ∩ pǝɹǝpʍoԀ", @@ -51,6 +87,8 @@ "advancement.createnuclear.uranium_rod.desc": "ɹǝʇɟɐɹɔ ןɐɔıuɐɥɔǝɯ ɐ uı ǝʞɐɔʍoןןǝʎ pǝɥɔıɹuǝ buısn poɹ ɯnıuɐɹn ʇsɹıɟ ɹnoʎ ǝʇɐǝɹƆ", "advancement.createnuclear.yellowcake": "ssǝɔoɹԀ ǝʞɐɔʍoןןǝʎ ǝɥ⟘", "advancement.createnuclear.yellowcake.desc": "ǝʞɐɔʍoןןǝʎ ǝʇɐǝɹɔ oʇ pınbıן ɯnıuɐɹn ʇɔɐdɯoƆ", + "attribute.name.createnuclear.generic.irradiated_resistance": "ǝɔuɐʇsısǝᴚ uoıʇɐıpɐᴚ", + "biome.createnuclear.irradiated_land": "puɐꞀ pǝʇɐıpɐɹɹI", "block.createnuclear.autunite": "ǝʇıunʇnⱯ", "block.createnuclear.autunite_pillar": "ɹɐןןıԀ ǝʇıunʇnⱯ", "block.createnuclear.cut_autunite": "ǝʇıunʇnⱯ ʇnƆ", @@ -62,20 +100,26 @@ "block.createnuclear.cut_autunite_stairs": "sɹıɐʇS ǝʇıunʇnⱯ ʇnƆ", "block.createnuclear.cut_autunite_wall": "ןןɐM ǝʇıunʇnⱯ ʇnƆ", "block.createnuclear.deepslate_lead_ore": "ǝɹO pɐǝꞀ ǝʇɐןsdǝǝᗡ", + "block.createnuclear.deepslate_nitrate_ore": "ǝɹO ǝʇɐɹʇıN ǝʇɐןsdǝǝᗡ", + "block.createnuclear.deepslate_thorium_ore": "ǝɹO ɯnıɹoɥ⟘ ǝʇɐןsdǝǝᗡ", "block.createnuclear.deepslate_uranium_ore": "ǝɹO ɯnıuɐɹ∩ ǝʇɐןsdǝǝᗡ", "block.createnuclear.enriched_soul_soil": "ןıoS ןnoS pǝɥɔıɹuƎ", - "block.createnuclear.enriched_soul_soil.tooltip.summary": "˙‾ǝɹıɟ uǝǝɹb‾ ɐ ǝʞɐɯ oʇ ʇsnظ ɹo ǝɹıɟdɯɐɔ pǝɥɔıɹuǝ ‾ʇɟɐɹɔ‾ oʇ pǝsn ǝq uɐƆ˙‾ǝɹıɟ pǝɥɔıɹuǝ‾ ǝʇɐǝɹɔ oɥʍ ʞɔoןq ‾ʎןuo‾ ǝɥ⟘", + "block.createnuclear.enriched_soul_soil.tooltip.summary": "˙‾ǝɹıɟ uǝǝɹb‾ ɐ ǝʞɐɯ oʇ ʇsnظ ɹo ǝɹıɟdɯɐɔ pǝɥɔıɹuǝ ‾ʇɟɐɹɔ‾ oʇ pǝsn ǝq uɐƆ ˙‾ǝɹıɟ pǝɥɔıɹuǝ‾ ǝʇɐǝɹɔ oɥʍ ʞɔoןq ‾ʎןuo‾ ǝɥ⟘", "block.createnuclear.enriching_campfire": "ǝɹıɟdɯɐƆ buıɥɔıɹuƎ", "block.createnuclear.enriching_fire": "ǝɹıℲ buıɥɔıɹuƎ", "block.createnuclear.layered_autunite": "ǝʇıunʇnⱯ pǝɹǝʎɐꞀ", "block.createnuclear.lead_block": "ʞɔoןᗺ pɐǝꞀ", "block.createnuclear.lead_ore": "ǝɹO pɐǝꞀ", + "block.createnuclear.nitrate_ore": "ǝɹO ǝʇɐɹʇıN", + "block.createnuclear.nitrogen": "uǝboɹʇıN", "block.createnuclear.polished_cut_autunite": "ǝʇıunʇnⱯ ʇnƆ pǝɥsıןoԀ", "block.createnuclear.polished_cut_autunite_slab": "qɐןS ǝʇıunʇnⱯ ʇnƆ pǝɥsıןoԀ", "block.createnuclear.polished_cut_autunite_stairs": "sɹıɐʇS ǝʇıunʇnⱯ ʇnƆ pǝɥsıןoԀ", "block.createnuclear.polished_cut_autunite_wall": "ןןɐM ǝʇıunʇnⱯ ʇnƆ pǝɥsıןoԀ", "block.createnuclear.raw_lead_block": "ʞɔoןᗺ pɐǝꞀ ʍɐᴚ", + "block.createnuclear.raw_thorium_block": "ʞɔoןᗺ ɯnıɹoɥ⟘ ʍɐᴚ", "block.createnuclear.raw_uranium_block": "ʞɔoןᗺ ɯnıuɐɹ∩ ʍɐᴚ", + "block.createnuclear.reactor_alarm": "ɯɹɐןⱯ ɹoʇɔɐǝᴚ", "block.createnuclear.reactor_casing": "buısɐƆ ɹoʇɔɐǝᴚ", "block.createnuclear.reactor_casing.tooltip.summary": "‾ɹoʇɔɐǝɹ‾ ǝɥʇ pןınq oʇ pǝsn ‾ʞɔoןᗺ‾", "block.createnuclear.reactor_controller": "ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", @@ -86,167 +130,289 @@ "block.createnuclear.reactor_cooler.tooltip.summary": "‾ɹoʇɔɐǝɹ‾ ǝɥʇ pןınq oʇ pǝsn ‾ʞɔoןᗺ‾", "block.createnuclear.reactor_core": "ǝɹoƆ ɹoʇɔɐǝᴚ", "block.createnuclear.reactor_core.tooltip.summary": "‾ɹoʇɔɐǝɹ‾ ǝɥʇ pןınq oʇ pǝsn ‾ʞɔoןᗺ‾", + "block.createnuclear.reactor_fluid_input": "ʇnduI pınןℲ ɹoʇɔɐǝᴚ", + "block.createnuclear.reactor_fluid_input.tooltip.behaviour1": "˙‾buıʇɐǝɥɹǝʌo‾ pıoʌɐ puɐ ‾ɹoʇɔɐǝᴚ ǝɥ⟘‾ ɹǝʍod oʇ sǝıʇıʇuɐnb ǝbɹɐן uı ‾uǝboɹʇıN pınbıꞀ‾ ɹo ‾ɹǝʇɐM‾ ʇɹǝsuI", + "block.createnuclear.reactor_fluid_input.tooltip.condition1": "pǝןqɯǝssɐ sı ɹoʇɔɐǝɹ ǝɥʇ uǝɥM", + "block.createnuclear.reactor_fluid_input.tooltip.summary": "˙ɹoʇɔɐǝᴚ ǝɥʇ oʇuı ‾uǝboɹʇıN pınbıꞀ‾ ɹo ‾ɹǝʇɐM‾ ʇɹǝsuı oʇ pǝsn ǝq uɐɔ ʇɐɥʇ ‾ʞɔoןq‾ ɐ sı ‾ʇnduI pınןℲ ɹoʇɔɐǝᴚ ǝɥ⟘‾", "block.createnuclear.reactor_frame": "ǝɯɐɹℲ ɹoʇɔɐǝᴚ", "block.createnuclear.reactor_frame.tooltip.summary": "‾ɹoʇɔɐǝɹ‾ ǝɥʇ pןınq oʇ pǝsn ‾ʞɔoןᗺ‾", - "block.createnuclear.reactor_input": "ʇnduI ɹoʇɔɐǝᴚ", - "block.createnuclear.reactor_input.tooltip.behaviour1": " ‾ɹoʇɔɐǝɹ ǝɥʇ‾ ɹǝʍod oʇ sǝıʇıʇuɐnb ǝbɹɐן uı spoɹ ‾ǝuǝɥdɐɹb‾ puɐ ‾ɯnıuɐɹn‾ ʇɹǝsuI", - "block.createnuclear.reactor_input.tooltip.condition1": "pǝןqɯǝssɐ sı ɹoʇɔɐǝᴚ ǝɥʇ uǝɥM", - "block.createnuclear.reactor_input.tooltip.summary": "‾ɹoʇɔɐǝᴚ‾ ǝɥʇ oʇuı spoɹ ‾ǝuǝɥdɐɹ⅁‾ puɐ ‾ɯnıuɐɹ∩‾ ʇɹǝsuı oʇ pǝsn ǝq uɐɔ ʇɐɥʇ ‾ʞɔoןq‾ ɐ sı ‾ʇnduI ɹoʇɔɐǝᴚ ǝɥ⟘‾", "block.createnuclear.reactor_output": "ʇndʇnO ɹoʇɔɐǝᴚ", "block.createnuclear.reactor_output.tooltip.behaviour1": "‾ʇndʇno ɹoʇɔɐǝɹ‾ ǝɥʇ oʇ ‾ʇɟɐɥs‾ buıɥɔɐʇʇɐ ʎq ɹoʇɔɐǝɹ ǝɥʇ ʎq ǝɔnpoɹd ‾ʎbɹǝuǝ ǝɥʇ ʇɔɐɹʇxǝ‾ uɐɔ noʎ", "block.createnuclear.reactor_output.tooltip.condition1": "ʎbɹǝuǝ ǝɔnpoɹd ɹoʇɔɐǝɹ ǝɥʇ uǝɥM", "block.createnuclear.reactor_output.tooltip.summary": "‾ɹoʇɔɐǝᴚ‾ ǝɥʇ ʎq pǝʇɐɹǝuǝb ʎbɹǝuǝ ןɐɔıuɐɥɔǝɯ ǝɥʇ ʇɔɐɹʇxǝ oʇ pǝsn ǝq uɐɔ ʇɐɥʇ ‾ʞɔoןq‾ ɐ sı ‾ʇndʇnO ɹoʇɔɐǝᴚ ǝɥ⟘‾", + "block.createnuclear.reactor_rod_input": "ʇnduI poᴚ ɹoʇɔɐǝᴚ", + "block.createnuclear.reactor_rod_input.tooltip.behaviour1": "˙‾ɹoʇɔɐǝᴚ ǝɥ⟘‾ ɹǝʍod oʇ sǝıʇıʇuɐnb ǝbɹɐן uı spoɹ )‾ǝʇıɥdɐɹ⅁‾ ǝʞıן( ‾buıןooƆ‾ puɐ )‾ɯnıɹoɥ⟘‾ ɹo ‾ɯnıuɐɹ∩‾ ǝʞıן( ‾buıʇɐǝH‾ ʇɹǝsuI", + "block.createnuclear.reactor_rod_input.tooltip.condition1": "pǝןqɯǝssɐ sı ɹoʇɔɐǝɹ ǝɥʇ uǝɥM", + "block.createnuclear.reactor_rod_input.tooltip.summary": "˙ɹoʇɔɐǝᴚ ǝɥʇ oʇuı spoɹ ‾buıןooƆ‾ ɹo ‾buıʇɐǝH‾ ʇɹǝsuı oʇ pǝsn ǝq uɐɔ ʇɐɥʇ ‾ʞɔoןq‾ ɐ sı ‾ʇnduI poᴚ ɹoʇɔɐǝᴚ ǝɥ⟘‾", "block.createnuclear.reinforced_glass": "ssɐן⅁ pǝɔɹoɟuıǝᴚ", "block.createnuclear.small_autunite_brick": "ʞɔıɹᗺ ǝʇıunʇnⱯ ןןɐɯS", "block.createnuclear.small_autunite_brick_slab": "qɐןS ʞɔıɹᗺ ǝʇıunʇnⱯ ןןɐɯS", "block.createnuclear.small_autunite_brick_stairs": "sɹıɐʇS ʞɔıɹᗺ ǝʇıunʇnⱯ ןןɐɯS", "block.createnuclear.small_autunite_brick_wall": "ןןɐM ʞɔıɹᗺ ǝʇıunʇnⱯ ןןɐɯS", "block.createnuclear.steel_block": "ʞɔoןᗺ ןǝǝʇS", + "block.createnuclear.thorium": "ɯnıɹoɥ⟘", + "block.createnuclear.thorium_block": "ʞɔoןᗺ ɯnıɹoɥ⟘", + "block.createnuclear.thorium_ore": "ǝɹO ɯnıɹoɥ⟘", "block.createnuclear.uranium": "ɯnıuɐɹ∩", "block.createnuclear.uranium_ore": "ǝɹO ɯnıuɐɹ∩", "create.recipe.fan_enriched.fan": "ǝɹıℲ pǝɥɔıɹuƎ puıɥǝq uɐℲ", + "create.recipe.fan_snow_powder.fan": "ʍouS ɹǝpʍoԀ puıɥǝq uɐℲ", + "createnuclear.display_source.cooler": "ɹǝןooƆ ɹoʇɔɐǝᴚ", + "createnuclear.display_source.fuel": "ןǝnℲ ɹoʇɔɐǝᴚ", + "createnuclear.display_source.heat": "ʇɐǝH ɹoʇɔɐǝᴚ", + "createnuclear.display_source.heat.rotation": "WԀᴚ", + "createnuclear.display_source.heat.type": "ןǝʌǝן ʇɐǝH", + "createnuclear.display_source.heat.value": "Ὁ", + "createnuclear.display_source.liquid": "ןǝʌǝꞀ pınbıꞀ", + "createnuclear.display_source.liquid_level": "ןǝʌǝꞀ pınbıꞀ ɹoʇɔɐǝᴚ", + "createnuclear.display_source.reactor.active": "ƎΛI⟘ƆⱯ", + "createnuclear.display_source.reactor.cooler": " :ɹǝןooƆ", + "createnuclear.display_source.reactor.fluid": " :pınןℲ", + "createnuclear.display_source.reactor.for_reactor_status": "snʇɐʇs ɹoʇɔɐǝɹ ɹoɟ", + "createnuclear.display_source.reactor.fuel": " :ןǝnℲ", + "createnuclear.display_source.reactor.heat": " :ʇɐǝH", + "createnuclear.display_source.reactor.idle": "ƎꞀᗡI", + "createnuclear.display_source.reactor.mode.gauge": "sǝbnɐ⅁", + "createnuclear.display_source.reactor.mode.normal": "ןɐɯɹoN", + "createnuclear.display_source.reactor.mode.percent": "sǝbɐʇuǝɔɹǝԀ", + "createnuclear.display_source.reactor.mode.value": "sǝnןɐΛ", + "createnuclear.display_source.reactor.no_controller": "punoɟ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ oN", + "createnuclear.display_source.reactor.not_enough_space": " ǝɔɐds ɥbnouǝ ʇoN", + "createnuclear.display_source.reactor.size": " :ɹǝı⟘", + "createnuclear.display_source.reactor.size.large": "ǝbɹɐꞀ", + "createnuclear.display_source.reactor.size.medium": "ɯnıpǝW", + "createnuclear.display_source.reactor.size.small": "ןןɐɯS", + "createnuclear.display_source.reactor.status": " :snʇɐʇS", + "createnuclear.display_source.reactor_controller_count_rod.cooled": "pǝןooƆ", + "createnuclear.display_source.reactor_controller_count_rod.fuel": "ןǝnℲ", + "createnuclear.display_source.reactor_count_rod": "uɹǝʇʇɐԀ uı poᴚ ʇunoƆ", + "createnuclear.display_source.reactor_summary": "ʎɹɐɯɯnS ɹoʇɔɐǝᴚ", + "createnuclear.display_source.reactor_summary.active": "ƎΛI⟘ƆⱯ", + "createnuclear.display_source.reactor_summary.coolant": ":ʇuɐןooƆ", + "createnuclear.display_source.reactor_summary.fuel": ":spoᴚ", + "createnuclear.display_source.reactor_summary.idle": "ƎꞀᗡI", + "createnuclear.display_source.reactor_summary.no_controller": "punoɟ ʇou ɹoʇɔɐǝᴚ", + "createnuclear.display_source.reactor_summary.status": ":snʇɐʇS", + "createnuclear.display_source.reactor_summary.temperature": ":dɯǝ⟘", + "createnuclear.display_source.size": "ǝzıS ɹoʇɔɐǝᴚ", "createnuclear.enriched.fan.recipe": "buıɥɔıɹuƎ ʞןnᗺ", + "createnuclear.generic.unit.count.rod": "poᴚ %s sʇunoƆ", + "createnuclear.generic.unit.countCooled.rod": "%d :poᴚ pǝןooƆ ʇunoƆ", + "createnuclear.generic.unit.countFuel.rod": "%d :poᴚ ןǝnℲ ʇunoƆ", + "createnuclear.generic.unit.fluid.value": "ᗺɯ", "createnuclear.generic.unit.heat": "Ὁ", + "createnuclear.generic.unit.heat.rotation": "WԀᴚ", + "createnuclear.generic.unit.heat.type": "%s :ןǝʌǝꞀ ʇɐǝH", + "createnuclear.generic.unit.heat.value": "Ὁ", + "createnuclear.generic.unit.liquid": "ԀIM", + "createnuclear.generic.unit.seconds": "s", "createnuclear.gui.reactor_controller.info_header.title": "ǝnןɐʌ ʇɐǝH", - "createnuclear.ponder.reactor.header": "ɹoʇɔɐǝɹ ǝɥʇ ɟo uoıʇɔnɹʇsuoƆ", - "createnuclear.ponder.reactor.text_1": "Ɩ ɹooןℲ", - "createnuclear.ponder.reactor.text_10": "ㄥ ɹooןℲ", - "createnuclear.ponder.reactor.text_2": "˙ɹoʇɔɐǝɹ ǝɥʇ ʎq pǝʇɐɹǝuǝb )∩S( ʎbɹǝuǝ ǝɥʇ sʇndʇno ʇɐɥʇ ʞɔoןq ǝɥʇ sı sıɥ⟘ :ʇndʇnO ɹoʇɔɐǝᴚ", - "createnuclear.ponder.reactor.text_3": "ᄅ ɹooןℲ", - "createnuclear.ponder.reactor.text_4": "Ɛ ɹooןℲ", - "createnuclear.ponder.reactor.text_5": "ㄣ ɹooןℲ", - "createnuclear.ponder.reactor.text_6": "˙ɹoʇɔɐǝɹ ǝɥʇ ǝʇɐɹǝdo oʇ spoɹ ǝʇıɥdɐɹb puɐ ɯnıuɐɹn sǝɹoʇs ʇɐɥʇ ʞɔoןq Ɐ :ʇnduI ɹoʇɔɐǝᴚ", - "createnuclear.ponder.reactor.text_7": "˙ɹǝʍod ǝʇɐɹǝuǝb oʇ pǝpǝǝu suoıʇɐןnɔןɐɔ ǝɥʇ ןןɐ sǝןpuɐɥ ʇı ؛ɹoʇɔɐǝɹ ǝɥʇ ǝʇɐɹǝdo oʇ ʞɔoןq ʇuɐʇɹodɯı ʇsoɯ ǝɥ⟘ :ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", - "createnuclear.ponder.reactor.text_8": "ϛ ɹooןℲ", - "createnuclear.ponder.reactor.text_9": "9 ɹooןℲ", - "createnuclear.ponder.reactor_blueprint.header": "uoıʇɐʌıʇɔⱯ ɹǝןןoɹʇuoƆ", - "createnuclear.ponder.reactor_blueprint.text_1": "˙sןǝpoɯ ɔıɟıɔǝds oʇ buıpɹoɔɔɐ pǝɹnbıɟuoɔ ǝq oʇ ɹoʇɔɐǝɹ ǝɥʇ sʍoןןɐ ʇı ؛ʇuǝɯǝןǝ ʇuɐʇɹodɯı ʇsoɯ ǝɥʇ :ʇuıɹdǝnןᗺ ɹoʇɔɐǝᴚ", + "createnuclear.notification.reactor.assembled": "pǝןqɯǝssɐ uǝǝq sɐɥ ɹoʇɔɐǝᴚ", + "createnuclear.notification.reactor.critical_failure": "Ǝᴚ∩ꞀIⱯℲ ꞀⱯƆI⟘IᴚƆ", + "createnuclear.notification.reactor.destroyed": "ᗡƎʎOᴚ⟘SƎᗡ ᴚO⟘ƆⱯƎᴚ", + "createnuclear.notification.reactor.disassembled": "pǝןqɯǝssɐsıp uǝǝq sɐɥ ɹoʇɔɐǝᴚ", + "createnuclear.notification.reactor.imminent_explosion": "NOISOꞀԀXƎ ⟘NƎNIWWI", + "createnuclear.notification.reactor.meltdown_finished": "pǝʇǝןdɯoɔ uʍopʇןǝɯ ןɐɔıʇıɹƆ", + "createnuclear.notification.reactor.meltdown_in": " NI NMOᗡ⟘ꞀƎW ƎᴚOƆ", + "createnuclear.notification.reactor.overheating": "⅁NI⟘ⱯƎHᴚƎΛO ƎᴚOƆ :⅁NINᴚⱯM", + "createnuclear.notification.reactor.stabilized": "ᗡƎZIꞀIᗺⱯ⟘S ƎᴚOƆ", + "createnuclear.ponder.reactor_io_placement.header": "ʇuǝɯǝɔɐןԀ & uoıʇɔunℲ :O/I ɹoʇɔɐǝᴚ", + "createnuclear.ponder.reactor_io_placement.text_1": "˙ʎʇıןıqɐʇs ɹoɟ poᴚ buıןooƆ ǝuo puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ʇɐǝɥ oʇ )ןǝnɟ( poᴚ buıʇɐǝH ǝuo pǝǝu ǝM ˙spoᴚ buıןooƆ ɹo buıʇɐǝH sǝɹoʇS :ʇnduI poᴚ", + "createnuclear.ponder.reactor_io_placement.text_2": "˙suoısoןdxǝ ʇuǝʌǝɹd oʇ poᴚ buıןooƆ ǝɥʇ ɹoɟ ǝuo puɐ poᴚ buıʇɐǝH ǝɥʇ ɹoɟ ǝuO ¡sʇnduı oʍʇ ʇsɐǝן ʇɐ pǝǝu ǝʍ ʎɥʍ sı sıɥ⟘ :ʇnduI poᴚ puoɔǝS", + "createnuclear.ponder.reactor_io_placement.text_3": "˙ǝpoןdxǝ ʇou sǝop ʇı ǝɹnsuǝ puɐ ɹoʇɔɐǝɹ ǝɥʇ ןooɔ oʇ pǝɹınbǝɹ osןɐ sı pınןℲ :ʇnduI pınןℲ", + "createnuclear.ponder.reactor_io_placement.text_4": "˙buıpoןdxǝ sʞsıɹ puɐ ǝןqɐʇsun sǝɯoɔǝq ɹoʇɔɐǝɹ ǝɥʇ uǝɥʍ punos ɐ sʇıɯƎ :)ןɐuoıʇdO( ɯɹɐןⱯ", + "createnuclear.ponder.reactor_io_placement.text_5": "˙ɯǝɥʇ uǝǝʍʇǝq ʎbɹǝuǝ ןɐʇoʇ ǝɥʇ ɥɔʇɐdsıp oʇ sʇndʇno ǝןdıʇןnɯ ǝɔɐןd uɐɔ noʎ ˙ʎbɹǝuǝ pǝʇɐɹǝuǝb ʇɔɐɹʇxǝ oʇ ʎɹɐssǝɔǝN :ʇndʇnO", + "createnuclear.ponder.reactor_io_placement.text_6": "˙ǝbpǝ uɐ uo ʇou sı ʇı sɐ buoן sɐ 'buısɐƆ ɹoʇɔɐǝᴚ ʎNⱯ ǝɔɐןdǝɹ uɐɔ sʞɔoןq ǝsǝɥ⟘", + "createnuclear.ponder.reactor_io_placement.text_7": "˙ǝɔɐɟɹns ʇɐןɟ ɹǝɥʇo ʎuɐ ɹo ɟooɹ ǝɥʇ uo ɹǝɥʇǝboʇ pǝdnoɹb ǝq uɐɔ ʎǝɥ⟘", + "createnuclear.ponder.reactor_t1.header": "Ɩ⟘ ɹoʇɔɐǝᴚ", + "createnuclear.ponder.reactor_t1.text_1": "Ɩ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_10": "˙)uoıʇɔunɟ & ʇuǝɯǝɔɐןd( sʞɔoןq ɯɹɐןⱯ puɐ O/I ɹoɟ ㄣ ǝbɐd ʞɔǝɥƆ :ǝʇoN", + "createnuclear.ponder.reactor_t1.text_2": "ᄅ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_3": "Ɛ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_4": "ㄣ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_5": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", + "createnuclear.ponder.reactor_t1.text_6": "ϛ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_7": "9 ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_8": "ㄥ ɹooןℲ", + "createnuclear.ponder.reactor_t1.text_9": "puɐɥ uı ʇuıɹdǝnןq ǝɥʇ ɥʇıʍ ɹǝןןoɹʇuoɔ ǝɥʇ ʞɔıןɔ ʇɥbıɹ uǝɥʇ 'uɹǝʇʇɐd ǝɥʇ oʇ buıpuodsǝɹɹoɔ spoɹ puɐ pınbıן pǝǝu ןןıʍ noʎ ɹoʇɔɐǝɹ ǝɥʇ ʇɹɐʇs o⟘", + "createnuclear.ponder.reactor_t2.header": "ᄅ⟘ ɹoʇɔɐǝᴚ", + "createnuclear.ponder.reactor_t2.text_1": "Ɩ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_10": "6 ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_11": "puɐɥ uı ʇuıɹdǝnןq ǝɥʇ ɥʇıʍ ɹǝןןoɹʇuoɔ ǝɥʇ ʞɔıןɔ ʇɥbıɹ uǝɥʇ 'uɹǝʇʇɐd ǝɥʇ oʇ buıpuodsǝɹɹoɔ spoɹ puɐ pınbıן pǝǝu ןןıʍ noʎ ɹoʇɔɐǝɹ ǝɥʇ ʇɹɐʇs o⟘", + "createnuclear.ponder.reactor_t2.text_12": "˙)uoıʇɔunɟ & ʇuǝɯǝɔɐןd( sʞɔoןq ɯɹɐןⱯ puɐ O/I ɹoɟ ㄣ ǝbɐd ʞɔǝɥƆ :ǝʇoN", + "createnuclear.ponder.reactor_t2.text_2": "ᄅ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_3": "Ɛ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_4": "ㄣ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_5": "ϛ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_6": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", + "createnuclear.ponder.reactor_t2.text_7": "9 ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_8": "ㄥ ɹooןℲ", + "createnuclear.ponder.reactor_t2.text_9": "8 ɹooןℲ", + "createnuclear.ponder.reactor_t3.header": "Ɛ⟘ ɹoʇɔɐǝᴚ", + "createnuclear.ponder.reactor_t3.text_1": "Ɩ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_10": "6 ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_11": "0Ɩ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_12": "ƖƖ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_13": "puɐɥ uı ʇuıɹdǝnןq ǝɥʇ ɥʇıʍ ɹǝןןoɹʇuoɔ ǝɥʇ ʞɔıןɔ ʇɥbıɹ uǝɥʇ 'uɹǝʇʇɐd ǝɥʇ oʇ buıpuodsǝɹɹoɔ spoɹ puɐ pınbıן pǝǝu ןןıʍ noʎ ɹoʇɔɐǝɹ ǝɥʇ ʇɹɐʇs o⟘", + "createnuclear.ponder.reactor_t3.text_14": "˙)uoıʇɔunɟ & ʇuǝɯǝɔɐןd( sʞɔoןq ɯɹɐןⱯ puɐ O/I ɹoɟ ㄣ ǝbɐd ʞɔǝɥƆ :ǝʇoN", + "createnuclear.ponder.reactor_t3.text_2": "ᄅ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_3": "Ɛ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_4": "ㄣ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_5": "ϛ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_6": "9 ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_7": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", + "createnuclear.ponder.reactor_t3.text_8": "ㄥ ɹooןℲ", + "createnuclear.ponder.reactor_t3.text_9": "8 ɹooןℲ", + "createnuclear.reactor.debug.label.alarm": "ɯɹɐןⱯ", + "createnuclear.reactor.debug.label.fluid_input": "ʇnduI pınןℲ", + "createnuclear.reactor.debug.label.input": "ʇnduI", + "createnuclear.reactor.debug.label.output": "ʇndʇnO", + "createnuclear.reactor.debug.registered_position": "%s @ pǝɹǝʇsıbǝɹ ", + "createnuclear.reactor.debug.summary": "pıןɐʌ %s 'pǝɹǝʇsıbǝɹ %s :%s", + "createnuclear.reactor.debug.title": "--- sɔıʇsoubɐıp ɹoʇɔɐǝᴚ ---", + "createnuclear.reactor.debug.valid_position": "%s @ pıןɐʌ ", + "createnuclear.snow_powder.fan.recipe": "uɐɟ ɔıuǝboʎɹƆ", + "createnuclear.subtitle.alarm/alarm": "dooꞀ ɯɹɐןⱯ ɹoʇɔɐǝᴚ", + "createnuclear.subtitle.alarm/reactor_alarm": "ɯɹɐןⱯ ɹoʇɔɐǝᴚ", + "createnuclear.subtitle.biomes/wasteland": "puɐןǝʇsɐM", + "createnuclear.subtitle.explosion/large_nuclear_explosion": "uoısoןdxƎ ɹɐǝןɔnN ǝbɹɐꞀ", + "createnuclear.subtitle.explosion/main": "uıɐW uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.explosion/nuclear_explosion": "uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.explosion/nuclear_explosion_rumble": "ǝןqɯnᴚ uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.explosion/ringing": "buıbuıᴚ uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.explosion/rumble": "ǝןqɯnᴚ uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.explosion/shockwave": "ǝʌɐʍʞɔoɥS uoısoןdxƎ ɹɐǝןɔnN", + "createnuclear.subtitle.geiger/high": "ɥbıH ɹǝbıǝ⅁", + "createnuclear.subtitle.geiger/low": "ʍoꞀ ɹǝbıǝ⅁", + "createnuclear.subtitle.geiger/medium": "ɯnıpǝW ɹǝbıǝ⅁", + "createnuclear.subtitle.reacteur/activation": "uoıʇɐʌıʇɔⱯ ɹoʇɔɐǝᴚ", + "createnuclear.subtitle.reacteur/assemble_deassemble/motor_assemble": "ǝןqɯǝssⱯ ɹoʇoW", + "createnuclear.subtitle.reacteur/assemble_deassemble/motor_disassemble": "ǝןqɯǝssɐsıᗡ ɹoʇoW", + "createnuclear.subtitle.reacteur/running": "buıuunᴚ ɹoʇɔɐǝᴚ", + "createnuclear.subtitle.reacteur/shut_off": "ɟɟO ʇnɥS ɹoʇɔɐǝᴚ", + "createnuclear.tooltip.baseRodHeat": "Ὁ %d :ʇɐǝH poᴚ ǝsɐᗺ", + "createnuclear.tooltip.biome_irradiation_extractor.biome_restore": "%d / %d :suoıʇɐɹoʇsǝᴚ", + "createnuclear.tooltip.fluid": " %s :pınןℲ", + "createnuclear.tooltip.fluid.amount": "qɯ %d", + "createnuclear.tooltip.fluid.none": " ǝuoN :pınןℲ", "createnuclear.tooltip.heatLevel": "ןǝʌǝꞀ ʇɐǝH", "createnuclear.tooltip.heatLevel.caution": "uoıʇnɐƆ", "createnuclear.tooltip.heatLevel.danger": "ɹǝbuɐᗡ", "createnuclear.tooltip.heatLevel.none": "ǝuoN", "createnuclear.tooltip.heatLevel.safety": "ʎʇǝɟɐS", "createnuclear.tooltip.heatLevel.warning": "buıuɹɐM", - "createnuclear.tooltip.item.graphene.rod": " :poᴚ ǝʇıɥdɐɹ⅁", + "createnuclear.tooltip.item.cooled.rod": " :poᴚ ɹǝןooƆ", + "createnuclear.tooltip.item.empty.rod": " :sɯǝʇI ʇnduI", + "createnuclear.tooltip.item.fuel.rod": " :poᴚ ןǝnℲ", "createnuclear.tooltip.item.unknown.rod": " :uʍouʞu∩", - "createnuclear.tooltip.item.uranium.rod": " :poᴚ ɯnıuɐɹ∩", + "createnuclear.tooltip.proximityRodHeat": "Ὁ ɟᄅ˙% :ʇɐǝH poᴚ ʎʇıɯıxoɹԀ", + "createnuclear.tooltip.ratio": "%d :oıʇɐɹ ɹoɟ ǝnןɐΛ poᴚ", + "createnuclear.tooltip.rodTimer": "ʞɔıʇ %d :uoıʇɐɹnᗡ poᴚ", + "createnuclear.tooltip.statRod": ":uɹǝʇʇɐԀ ʇɐʇS poᴚ", + "createnuclear.tooltip.typeRod": "%s :ǝdʎ⟘ poᴚ", + "death.attack.createnuclear.fan_radiation": "ʇsɐןq uoıʇɐıpɐɹ ɯoɹɟ pǝıp %1$s", + "death.attack.createnuclear.radiation": "uoıʇɐıpɐɹ ɯoɹɟ pǝıp %1$s", + "effect.createnuclear.iodine": "ǝuıpoI", "effect.createnuclear.radiation": "uoıʇɐıpɐᴚ", "emi.category.createnuclear.fan_enriched": "buıɥɔıɹuƎ ʞןnᗺ", + "emi.category.createnuclear.snow_powder": "uɐɟ ɔıuǝboʎɹƆ", "entity.createnuclear.irradiated_cat": "ʇɐƆ pǝʇɐıpɐɹɹI", "entity.createnuclear.irradiated_chicken": "uǝʞɔıɥƆ pǝʇɐıpɐɹɹI", + "entity.createnuclear.irradiated_cow": "ʍoƆ pǝʇɐıpɐɹɹI", "entity.createnuclear.irradiated_wolf": "ɟןoM pǝʇɐıpɐɹɹI", + "entity.createnuclear.nuclear_explosion": "uoısoןdxƎ ɹɐǝןɔnN", + "fluid.createnuclear.nitrogen": "uǝboɹʇıN pınbıꞀ", + "fluid.createnuclear.thorium": "ɯnıɹoɥ⟘ pınbıꞀ", "fluid.createnuclear.uranium": "ɯnıuɐɹ∩ pınbıꞀ", "gui.createnuclear.reactor_controller.title": "ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", "gui.createnuclear.reactor_input.title": "ǝbɐɹoʇS ʇnduI ɹoʇɔɐǝᴚ", - "item.createnuclear.anti_radiation_boots": "sʇooᗺ uoıʇɐıpɐᴚ ıʇuⱯ", - "item.createnuclear.black_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ʞɔɐןᗺ", - "item.createnuclear.black_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ʞɔɐןᗺ", - "item.createnuclear.black_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ʞɔɐןᗺ", + "irradiated.taming.wip": "ssǝɹboɹd uı ʞɹoʍ ɐ ןןıʇs ǝɹɐ sqoɯ pǝʇɐıpɐɹɹı - ʇǝʎ pǝɯɐʇ ǝq ʇouuɐɔ ǝɹnʇɐǝɹɔ sıɥ⟘", + "item.createnuclear.biome_irradiation_extractor": "ɹoʇɔɐɹʇxƎ uoıʇɐıpɐɹɹI ǝɯoıᗺ", + "item.createnuclear.biome_irradiation_extractor.tooltip.summary": "˙ǝʇɐpdn ʇxǝu ǝɥʇ uı ǝɹnʇxǝʇ & ɯɹoɟ s,ʇı ǝbuɐɥɔ ןןıʍ puɐ ‾ɐʇǝq‾ uı ʎןʇuǝɹɹnɔ sı ɯǝʇı sıɥ⟘", "item.createnuclear.black_cloth": "ɥʇoןƆ ʞɔɐןᗺ", - "item.createnuclear.blue_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ", - "item.createnuclear.blue_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ", - "item.createnuclear.blue_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ", "item.createnuclear.blue_cloth": "ɥʇoןƆ ǝnןᗺ", - "item.createnuclear.brown_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ uʍoɹᗺ", - "item.createnuclear.brown_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ uʍoɹᗺ", - "item.createnuclear.brown_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ uʍoɹᗺ", "item.createnuclear.brown_cloth": "ɥʇoןƆ uʍoɹᗺ", "item.createnuclear.cat_irradiated_spawn_egg": "bbƎ uʍɐdS ʇɐƆ pǝʇɐıpɐɹɹI", "item.createnuclear.chicken_irradiated_spawn_egg": "bbƎ uʍɐdS uǝʞɔıɥƆ pǝʇɐıpɐɹɹI", "item.createnuclear.coal_dust": "ʇsnᗡ ןɐoƆ", - "item.createnuclear.cyan_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ uɐʎƆ", - "item.createnuclear.cyan_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ uɐʎƆ", - "item.createnuclear.cyan_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ uɐʎƆ", + "item.createnuclear.cooled_nitrogen_concentrate": "ǝʇɐɹʇuǝɔuoƆ uǝboɹʇıN pǝןooƆ", "item.createnuclear.cyan_cloth": "ɥʇoןƆ uɐʎƆ", + "item.createnuclear.default_anti_radiation_boots": "sʇooᗺ uoıʇɐıpɐᴚ ıʇuⱯ", + "item.createnuclear.default_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ", + "item.createnuclear.default_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ", + "item.createnuclear.default_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ", "item.createnuclear.enriched_yellowcake": "ǝʞɐɔʍoןןǝʎ pǝɥɔıɹuƎ", "item.createnuclear.graphene": "ǝuǝɥdɐɹ⅁", "item.createnuclear.graphite_rod": "poᴚ ǝʇıɥdɐɹ⅁", - "item.createnuclear.graphite_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾ʞɔıʇS‾", - "item.createnuclear.gray_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁", - "item.createnuclear.gray_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁", - "item.createnuclear.gray_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁", + "item.createnuclear.graphite_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı poɹ ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾poᴚ‾", "item.createnuclear.gray_cloth": "ɥʇoןƆ ʎɐɹ⅁", - "item.createnuclear.green_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ uǝǝɹ⅁", - "item.createnuclear.green_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ uǝǝɹ⅁", - "item.createnuclear.green_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ uǝǝɹ⅁", "item.createnuclear.green_cloth": "ɥʇoןƆ uǝǝɹ⅁", "item.createnuclear.lead_ingot": "ʇobuI pɐǝꞀ", "item.createnuclear.lead_nugget": "ʇǝbbnN pɐǝꞀ", - "item.createnuclear.light_blue_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ ʇɥbıꞀ", - "item.createnuclear.light_blue_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ ʇɥbıꞀ", - "item.createnuclear.light_blue_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝnןᗺ ʇɥbıꞀ", "item.createnuclear.light_blue_cloth": "ɥʇoןƆ ǝnןᗺ ʇɥbıꞀ", - "item.createnuclear.light_gray_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁ ʇɥbıꞀ", - "item.createnuclear.light_gray_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁ ʇɥbıꞀ", - "item.createnuclear.light_gray_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ʎɐɹ⅁ ʇɥbıꞀ", "item.createnuclear.light_gray_cloth": "ɥʇoןƆ ʎɐɹ⅁ ʇɥbıꞀ", - "item.createnuclear.lime_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝɯıꞀ", - "item.createnuclear.lime_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝɯıꞀ", - "item.createnuclear.lime_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝɯıꞀ", "item.createnuclear.lime_cloth": "ɥʇoןƆ ǝɯıꞀ", - "item.createnuclear.magenta_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ɐʇuǝbɐW", - "item.createnuclear.magenta_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ɐʇuǝbɐW", - "item.createnuclear.magenta_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ɐʇuǝbɐW", "item.createnuclear.magenta_cloth": "ɥʇoןƆ ɐʇuǝbɐW", - "item.createnuclear.orange_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝbuɐɹO", - "item.createnuclear.orange_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝbuɐɹO", - "item.createnuclear.orange_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝbuɐɹO", + "item.createnuclear.nitrate": "ǝʇɐɹʇıN", + "item.createnuclear.nitrogen_bucket": "ʇǝʞɔnᗺ uǝboɹʇıN", + "item.createnuclear.nitrogen_concentrate": "ǝʇɐɹʇuǝɔuoƆ uǝboɹʇıN", "item.createnuclear.orange_cloth": "ɥʇoןƆ ǝbuɐɹO", - "item.createnuclear.pink_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ʞuıԀ", - "item.createnuclear.pink_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ʞuıԀ", - "item.createnuclear.pink_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ʞuıԀ", "item.createnuclear.pink_cloth": "ɥʇoןƆ ʞuıԀ", - "item.createnuclear.purple_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝןdɹnԀ", - "item.createnuclear.purple_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝןdɹnԀ", - "item.createnuclear.purple_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝןdɹnԀ", "item.createnuclear.purple_cloth": "ɥʇoןƆ ǝןdɹnԀ", "item.createnuclear.raw_lead": "pɐǝꞀ ʍɐᴚ", + "item.createnuclear.raw_thorium": "ɯnıɹoɥ⟘ ʍɐᴚ", "item.createnuclear.raw_uranium": "ɯnıuɐɹ∩ ʍɐᴚ", + "item.createnuclear.reactor_blueprint.chat_info": ":uoıʇɐʇuǝɯnɔop ǝɥʇ uǝdo oʇ ʞuıן ǝɥʇ ʍoןןoℲ", + "item.createnuclear.reactor_blueprint.tooltip": "˙ʇnoʎɐן ɹoıɹǝʇuı s,ɹoʇɔɐǝɹ ǝɥʇ ǝzıןɐnsıʌ puɐ ubısǝp oʇ pǝs∩", + "item.createnuclear.reactor_blueprint.tooltip_hint": "˙ʞuıן ıʞıM ǝɥʇ ʇǝb oʇ puɐɥ uı ʇuıɹdǝnןq ǝɥʇ ɥʇıʍ oʇㄥ§ ʞɔıןƆ ʇɥbıᴚ + ʇɟıɥSǝ§ ssǝɹԀㄥ§", + "item.createnuclear.reactor_blueprint.wiki_link": "]ıʞıM ןɐıɔıɟɟO uǝdO[", "item.createnuclear.reactor_blueprint_item": "ʇuıɹdǝnןᗺ ɹoʇɔɐǝᴚ", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour1": "˙ʇı ןןıɟ oʇ ʞɔıןɔ ‾ʇɥbıᴚ‾", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour2": "˙ʇı uǝdo oʇ ɹǝןןoɹʇuoɔ ɹoʇɔɐǝɹ ǝɥʇ uo ʞɔıןɔ ‾ʇɥbıᴚ‾", - "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "spoɹ ɯnıuɐɹn puɐ ǝʇıɥdɐɹb ɥʇıʍ pǝןןıℲ", + "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "spoɹ buıʇɐǝɥ puɐ buıןooɔ ɥʇıʍ pǝןןıℲ", "item.createnuclear.reactor_blueprint_item.tooltip.condition2": "pǝןqɯǝssɐ ǝq ʇsnɯ ɹoʇɔɐǝɹ ǝɥ⟘", "item.createnuclear.reactor_blueprint_item.tooltip.summary": "˙uɹǝʇʇɐd uʍo ɹnoʎ ǝɹnbıɟuoɔ oʇ noʎ sʍoןןɐ ʇI", - "item.createnuclear.red_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ pǝᴚ", - "item.createnuclear.red_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ pǝᴚ", - "item.createnuclear.red_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ pǝᴚ", "item.createnuclear.red_cloth": "ɥʇoןƆ pǝᴚ", + "item.createnuclear.reinforced_glass_bottle": "ǝןʇʇoᗺ ssɐן⅁ pǝɔɹoɟuıǝᴚ", "item.createnuclear.steel_ingot": "ʇobuI ןǝǝʇS", "item.createnuclear.steel_nugget": "ʇǝbbnN ןǝǝʇS", + "item.createnuclear.thorium_bucket": "ʇǝʞɔnᗺ ɯnıɹoɥ⟘", + "item.createnuclear.thorium_dust": "ʇsnᗡ ɯnıɹoɥ⟘", + "item.createnuclear.thorium_ingot": "ʇobuI ɯnıɹoɥ⟘", + "item.createnuclear.thorium_nugget": "ʇǝbbnN ɯnıɹoɥ⟘", + "item.createnuclear.thorium_rod": "poᴚ ɯnıɹoɥ⟘", + "item.createnuclear.thorium_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı poɹ ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾poᴚ‾", "item.createnuclear.uranium_bucket": "ʇǝʞɔnᗺ ɯnıuɐɹ∩", "item.createnuclear.uranium_powder": "ɹǝpʍoԀ ɯnıuɐɹ∩", "item.createnuclear.uranium_rod": "poᴚ ɯnıuɐɹ∩", - "item.createnuclear.uranium_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾ʞɔıʇS‾", - "item.createnuclear.white_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ǝʇıɥM", - "item.createnuclear.white_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ǝʇıɥM", - "item.createnuclear.white_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ǝʇıɥM", + "item.createnuclear.uranium_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı poɹ ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾poᴚ‾", "item.createnuclear.white_cloth": "ɥʇoןƆ ǝʇıɥM", "item.createnuclear.wolf_irradiated_spawn_egg": "bbƎ uʍɐdS ɟןoM pǝʇɐıpɐɹɹI", - "item.createnuclear.yellow_anti_radiation_chestplate": "ǝʇɐןdʇsǝɥƆ uoıʇɐıpɐᴚ ıʇuⱯ ʍoןןǝʎ", - "item.createnuclear.yellow_anti_radiation_helmet": "ʇǝɯןǝH uoıʇɐıpɐᴚ ıʇuⱯ ʍoןןǝʎ", - "item.createnuclear.yellow_anti_radiation_leggings": "sbuıbbǝꞀ uoıʇɐıpɐᴚ ıʇuⱯ ʍoןןǝʎ", "item.createnuclear.yellow_cloth": "ɥʇoןƆ ʍoןןǝʎ", "item.createnuclear.yellowcake": "ǝʞɐɔʍoןןǝʎ", + "item.minecraft.lingering_potion.effect.potion_of_iodine": "ǝuıpoI ɟo uoıʇoԀ buıɹǝbuıꞀ", + "item.minecraft.lingering_potion.effect.potion_of_iodine_augment": "ǝuıpoI ɟo uoıʇoԀ buıɹǝbuıꞀ", "item.minecraft.lingering_potion.effect.potion_of_radiation_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ buıɹǝbuıꞀ", "item.minecraft.lingering_potion.effect.potion_of_radiation_2": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ buıɹǝbuıꞀ", "item.minecraft.lingering_potion.effect.potion_of_radiation_augment_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ buıɹǝbuıꞀ", + "item.minecraft.potion.effect.potion_of_iodine": "ǝuıpoI ɟo uoıʇoԀ", + "item.minecraft.potion.effect.potion_of_iodine_augment": "ǝuıpoI ɟo uoıʇoԀ", "item.minecraft.potion.effect.potion_of_radiation_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ", "item.minecraft.potion.effect.potion_of_radiation_2": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ", "item.minecraft.potion.effect.potion_of_radiation_augment_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ", + "item.minecraft.splash_potion.effect.potion_of_iodine": "ǝuıpoI ɟo uoıʇoԀ ɥsɐןdS", + "item.minecraft.splash_potion.effect.potion_of_iodine_augment": "ǝuıpoI ɟo uoıʇoԀ ɥsɐןdS", "item.minecraft.splash_potion.effect.potion_of_radiation_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ ɥsɐןdS", "item.minecraft.splash_potion.effect.potion_of_radiation_2": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ ɥsɐןdS", "item.minecraft.splash_potion.effect.potion_of_radiation_augment_1": "uoıʇɐıpɐᴚ ɟo uoıʇoԀ ɥsɐןdS", + "item.minecraft.tipped_arrow.effect.potion_of_iodine": "ǝuıpoI ɟo ʍoɹɹⱯ", + "item.minecraft.tipped_arrow.effect.potion_of_iodine_augment": "ǝuıpoI ɟo ʍoɹɹⱯ", "item.minecraft.tipped_arrow.effect.potion_of_radiation_1": "uoıʇɐıpɐᴚ ɟo ʍoɹɹⱯ", "item.minecraft.tipped_arrow.effect.potion_of_radiation_2": "uoıʇɐıpɐᴚ ɟo ʍoɹɹⱯ", "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "uoıʇɐıpɐᴚ ɟo ʍoɹɹⱯ", "itemGroup.createnuclear.main": "ɹɐǝןɔnN ǝʇɐǝɹƆ", "itemgroup.uranium": "dnoɹ⅁ ɯnıuɐɹ∩", - "overlay.event_message": "ɹǝɯıʇ %s ⚠ buıuɹɐM ⚠", "reactor.info.assembled.creator": "pǝןqɯǝssɐ uǝǝq sɐɥ ɹoʇɔɐǝᴚ", - "reactor.info.assembled.destroyer": "pǝןqɯǝssɐsıp uǝǝq sɐɥ ɹoʇɔɐǝᴚ", - "reactor.info.assembled.none": "pǝןqɯǝssɐ ʇou sı ɹoʇɔɐǝᴚ", - "reactor.info.is": "sı ɹǝןןoɹʇuoɔ", "reactor.item.gui.name": "uɹǝʇʇɐԀ bıɟuoƆ", "reactor.update.casing.input": "ʇnduı uı buısɐɔ ǝɥʇ ǝʇɐpd∩", "tag.fluid.c.uranium": "ɯnıuɐɹ∩ pınןℲ", diff --git a/src/generated/resources/assets/createnuclear/lang/en_us.json b/src/generated/resources/assets/createnuclear/lang/en_us.json index ae35b2112..736471b2e 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_us.json +++ b/src/generated/resources/assets/createnuclear/lang/en_us.json @@ -1,24 +1,46 @@ { - "advancement.createnuclear.anti_radiation_armor": "Anti radiation Armor", + "advancement.createnuclear.absolute_zero": "Absolute Zero", + "advancement.createnuclear.absolute_zero.desc": "Mix cooled nitrogen concentrate to obtain liquid nitrogen", + "advancement.createnuclear.anti_radiation_armor": "Anti Radiation Armor", "advancement.createnuclear.anti_radiation_armor.desc": "Craft your first anti-radiation armor piece to protect yourself from radiation", "advancement.createnuclear.automatic_uranium": "Automating Uranium", "advancement.createnuclear.automatic_uranium.desc": "Obtain some uranium powder using the automatic uranium processing\n§7(Hidden Advancement)", + "advancement.createnuclear.avoiding_cancer": "Best Keep Yourself Covered", + "advancement.createnuclear.avoiding_cancer.desc": "Equip anti-radiation armor for the first time", + "advancement.createnuclear.chemistry_101": "Crushing It", + "advancement.createnuclear.chemistry_101.desc": "Mine nitrate ore or crush limestone to obtain nitrate", + "advancement.createnuclear.chill_out": "Chill Out", + "advancement.createnuclear.chill_out.desc": "Cool down nitrogen concentrate to prepare it for liquefaction", "advancement.createnuclear.coal_dust": "Coal Dust", "advancement.createnuclear.coal_dust.desc": "Crush coal or charcoal to obtain coal dust, a key crafting material", + "advancement.createnuclear.craft_enriching_campfire": "Does That Make Smoke?", + "advancement.createnuclear.craft_enriching_campfire.desc": "Craft an Enriching Campfire", + "advancement.createnuclear.crunchy_uranium": "What Did You Expect", + "advancement.createnuclear.crunchy_uranium.desc": "Bro..... you did what ??\n§7(Hidden Advancement)", + "advancement.createnuclear.cryogenic_baptism": "I can't Feel My Feet Anymore", + "advancement.createnuclear.cryogenic_baptism.desc": "Swim in the liquid nitrogen for the first time\n§7(Hidden Advancement)", "advancement.createnuclear.dye_anti_radiation_armor": "Pimp My Armor", "advancement.createnuclear.dye_anti_radiation_armor.desc": "Dye your anti radiation armor to any color", "advancement.createnuclear.enriched_yellowcake": "Enhancing Yellowcake", "advancement.createnuclear.enriched_yellowcake.desc": "Use a fan to enrich yellowcake and make it more powerful", - "advancement.createnuclear.full_anti_radiation_armor": "Fully Protected", - "advancement.createnuclear.full_anti_radiation_armor.desc": "Wear a full set of anti-radiation armor to fully protect yourself from radiation", + "advancement.createnuclear.feeding_the_reactor": "Feeding The Reactor", + "advancement.createnuclear.feeding_the_reactor.desc": "Craft a Reactor Rod Input to feed heating and cooling rods into your reactor", + "advancement.createnuclear.fueling_the_reactor": "Fueling The Reactor", + "advancement.createnuclear.fueling_the_reactor.desc": "Craft a Reactor Fluid Input to feed liquid coolant into your reactor", + "advancement.createnuclear.getting_concentrated": "Getting Concentrated", + "advancement.createnuclear.getting_concentrated.desc": "Smelt nitrate in a blast furnace to obtain nitrogen concentrate", "advancement.createnuclear.graphene": "Graphene", "advancement.createnuclear.graphene.desc": "Press coal dust to create graphene", "advancement.createnuclear.graphite_rod": "Don't Forget Those Ones", "advancement.createnuclear.graphite_rod.desc": "Combine graphene and steel ingots in a mechanical crafter to make graphite rods", - "advancement.createnuclear.lead_ingot": "Lead ingot", + "advancement.createnuclear.lead_ingot": "Lead Ingot", "advancement.createnuclear.lead_ingot.desc": "Smelt a raw lead to obtain a lead ingot", + "advancement.createnuclear.no_time_to_die": "No Time To Die", + "advancement.createnuclear.no_time_to_die.desc": "Stop the reactor before the KABOOOM !", "advancement.createnuclear.raw_lead": "Raw Lead", "advancement.createnuclear.raw_lead.desc": "Obtain some raw lead by mining lead ore", + "advancement.createnuclear.raw_thorium": "Thorium's Glow", + "advancement.createnuclear.raw_thorium.desc": "Mine thorium ore to obtain raw thorium for further processing", "advancement.createnuclear.raw_uranium": "The Raw Power", "advancement.createnuclear.raw_uranium.desc": "Mine uranium ore to obtain raw uranium for further processing", "advancement.createnuclear.reactor_blueprint": "Blueprint For Power", @@ -29,20 +51,34 @@ "advancement.createnuclear.reactor_controller.desc": "Craft a reactor controller to manage and regulate your reactor", "advancement.createnuclear.reactor_cooler": "Cooling The Reactor", "advancement.createnuclear.reactor_cooler.desc": "Craft a reactor cooler to cool your reactor", - "advancement.createnuclear.reactor_core": "Core of Power", + "advancement.createnuclear.reactor_core": "Core Of Power", "advancement.createnuclear.reactor_core.desc": "Craft the reactor core to harness the full energy of your nuclear reactor", "advancement.createnuclear.reactor_frame": "Reactor Frame", "advancement.createnuclear.reactor_frame.desc": "Craft a reactor frame to build your nuclear reactor", - "advancement.createnuclear.reactor_input": "Fueling The Reactor", - "advancement.createnuclear.reactor_input.desc": "Craft a reactor input to feed uranium and graphite rods into your reactor", - "advancement.createnuclear.reactor_output": "Power Output", - "advancement.createnuclear.reactor_output.desc": "Craft a reactor output to transfer the energy produced by your reactor", "advancement.createnuclear.reinforced_glass": "Reinforced Glass", "advancement.createnuclear.reinforced_glass.desc": "Craft some reinforced glass for the first time", "advancement.createnuclear.root": "Starting The Nuclear Journey", "advancement.createnuclear.root.desc": "Unlock the basics of nuclear energy and get your first uranium powder", + "advancement.createnuclear.silence_the_core": "It Makes So Much Noise !", + "advancement.createnuclear.silence_the_core.desc": "sound the alarm for the first time", "advancement.createnuclear.steel_ingot": "Steel Ingot", "advancement.createnuclear.steel_ingot.desc": "Combine coal dust and iron ingots to create steel ingots", + "advancement.createnuclear.t1": "Reactor Controller T1", + "advancement.createnuclear.t1.desc": "Build a tier 1 Nuclear Reactor", + "advancement.createnuclear.t2": "Reactor Controller T2", + "advancement.createnuclear.t2.desc": "Build a tier 2 Nuclear Reactor", + "advancement.createnuclear.t3": "Reactor Controller T3", + "advancement.createnuclear.t3.desc": "Build a tier 3 Nuclear Reactor", + "advancement.createnuclear.thorium_dust": "Powdered Thorium", + "advancement.createnuclear.thorium_dust.desc": "Crush raw thorium into dust to prepare for further refining", + "advancement.createnuclear.thorium_ingot": "Compacted Thorium", + "advancement.createnuclear.thorium_ingot.desc": "Compact thorium liquid to create a thorium ingot", + "advancement.createnuclear.thorium_liquid": "Molten Thorium", + "advancement.createnuclear.thorium_liquid.desc": "Obtain some thorium liquid by mixing thorium dust", + "advancement.createnuclear.thorium_rod": "What A Blue Stick", + "advancement.createnuclear.thorium_rod.desc": "Craft a thorium rod for the first time", + "advancement.createnuclear.unlimited_power": "Unlimited Power", + "advancement.createnuclear.unlimited_power.desc": "Craft a Reactor Output to extract the energy produced by your reactor", "advancement.createnuclear.uranium_liquid": "Turning Solid To Liquid", "advancement.createnuclear.uranium_liquid.desc": "Obtain some uranium liquid by mixing uranium powder", "advancement.createnuclear.uranium_powder": "Powdered Uranium", @@ -51,6 +87,8 @@ "advancement.createnuclear.uranium_rod.desc": "Create your first uranium rod using enriched yellowcake in a mechanical crafter", "advancement.createnuclear.yellowcake": "The Yellowcake Process", "advancement.createnuclear.yellowcake.desc": "Compact uranium liquid to create yellowcake", + "attribute.name.createnuclear.generic.irradiated_resistance": "Radiation Resistance", + "biome.createnuclear.irradiated_land": "Irradiated Land", "block.createnuclear.autunite": "Autunite", "block.createnuclear.autunite_pillar": "Autunite Pillar", "block.createnuclear.cut_autunite": "Cut Autunite", @@ -62,20 +100,26 @@ "block.createnuclear.cut_autunite_stairs": "Cut Autunite Stairs", "block.createnuclear.cut_autunite_wall": "Cut Autunite Wall", "block.createnuclear.deepslate_lead_ore": "Deepslate Lead Ore", + "block.createnuclear.deepslate_nitrate_ore": "Deepslate Nitrate Ore", + "block.createnuclear.deepslate_thorium_ore": "Deepslate Thorium Ore", "block.createnuclear.deepslate_uranium_ore": "Deepslate Uranium Ore", "block.createnuclear.enriched_soul_soil": "Enriched Soul Soil", - "block.createnuclear.enriched_soul_soil.tooltip.summary": "The _only_ block who create _enriched fire_.Can be used to _craft_ enriched campfire or just to make a _green fire_.", + "block.createnuclear.enriched_soul_soil.tooltip.summary": "The _only_ block who create _enriched fire_. Can be used to _craft_ enriched campfire or just to make a _green fire_.", "block.createnuclear.enriching_campfire": "Enriching Campfire", "block.createnuclear.enriching_fire": "Enriching Fire", "block.createnuclear.layered_autunite": "Layered Autunite", "block.createnuclear.lead_block": "Lead Block", "block.createnuclear.lead_ore": "Lead Ore", + "block.createnuclear.nitrate_ore": "Nitrate Ore", + "block.createnuclear.nitrogen": "Nitrogen", "block.createnuclear.polished_cut_autunite": "Polished Cut Autunite", "block.createnuclear.polished_cut_autunite_slab": "Polished Cut Autunite Slab", "block.createnuclear.polished_cut_autunite_stairs": "Polished Cut Autunite Stairs", "block.createnuclear.polished_cut_autunite_wall": "Polished Cut Autunite Wall", "block.createnuclear.raw_lead_block": "Raw Lead Block", + "block.createnuclear.raw_thorium_block": "Raw Thorium Block", "block.createnuclear.raw_uranium_block": "Raw Uranium Block", + "block.createnuclear.reactor_alarm": "Reactor Alarm", "block.createnuclear.reactor_casing": "Reactor Casing", "block.createnuclear.reactor_casing.tooltip.summary": "_Block_ used to build the _reactor_", "block.createnuclear.reactor_controller": "Reactor Controller", @@ -86,167 +130,289 @@ "block.createnuclear.reactor_cooler.tooltip.summary": "_Block_ used to build the _reactor_", "block.createnuclear.reactor_core": "Reactor Core", "block.createnuclear.reactor_core.tooltip.summary": "_Block_ used to build the _reactor_", + "block.createnuclear.reactor_fluid_input": "Reactor Fluid Input", + "block.createnuclear.reactor_fluid_input.tooltip.behaviour1": "Insert _Water_ or _Liquid Nitrogen_ in large quantities to power _The Reactor_ and avoid _overheating_.", + "block.createnuclear.reactor_fluid_input.tooltip.condition1": "When the reactor is assembled", + "block.createnuclear.reactor_fluid_input.tooltip.summary": "_The Reactor Fluid Input_ is a _block_ that can be used to insert _Water_ or _Liquid Nitrogen_ into the Reactor.", "block.createnuclear.reactor_frame": "Reactor Frame", "block.createnuclear.reactor_frame.tooltip.summary": "_Block_ used to build the _reactor_", - "block.createnuclear.reactor_input": "Reactor Input", - "block.createnuclear.reactor_input.tooltip.behaviour1": "Insert _uranium_ and _graphene_ rods in large quantities to power _the reactor_ ", - "block.createnuclear.reactor_input.tooltip.condition1": "When the Reactor is assembled", - "block.createnuclear.reactor_input.tooltip.summary": "_The Reactor Input_ is a _block_ that can be used to insert _Uranium_ and _Graphene_ rods into the _Reactor_", "block.createnuclear.reactor_output": "Reactor Output", "block.createnuclear.reactor_output.tooltip.behaviour1": "You can _extract the energy_ produce by the reactor by attaching _shaft_ to the _reactor output_", "block.createnuclear.reactor_output.tooltip.condition1": "When the reactor produce energy", "block.createnuclear.reactor_output.tooltip.summary": "_The Reactor Output_ is a _block_ that can be used to extract the mechanical energy generated by the _Reactor_", + "block.createnuclear.reactor_rod_input": "Reactor Rod Input", + "block.createnuclear.reactor_rod_input.tooltip.behaviour1": "Insert _Heating_ (like _Uranium_ or _Thorium_) and _Cooling_ (like _Graphite_) rods in large quantities to power _The Reactor_.", + "block.createnuclear.reactor_rod_input.tooltip.condition1": "When the reactor is assembled", + "block.createnuclear.reactor_rod_input.tooltip.summary": "_The Reactor Rod Input_ is a _block_ that can be used to insert _Heating_ or _Cooling_ rods into the Reactor.", "block.createnuclear.reinforced_glass": "Reinforced Glass", "block.createnuclear.small_autunite_brick": "Small Autunite Brick", "block.createnuclear.small_autunite_brick_slab": "Small Autunite Brick Slab", "block.createnuclear.small_autunite_brick_stairs": "Small Autunite Brick Stairs", "block.createnuclear.small_autunite_brick_wall": "Small Autunite Brick Wall", "block.createnuclear.steel_block": "Steel Block", + "block.createnuclear.thorium": "Thorium", + "block.createnuclear.thorium_block": "Thorium Block", + "block.createnuclear.thorium_ore": "Thorium Ore", "block.createnuclear.uranium": "Uranium", "block.createnuclear.uranium_ore": "Uranium Ore", "create.recipe.fan_enriched.fan": "Fan behind Enriched Fire", + "create.recipe.fan_snow_powder.fan": "Fan behind Powder Snow", + "createnuclear.display_source.cooler": "Reactor Cooler", + "createnuclear.display_source.fuel": "Reactor Fuel", + "createnuclear.display_source.heat": "Reactor Heat", + "createnuclear.display_source.heat.rotation": "RPM", + "createnuclear.display_source.heat.type": "Heat level", + "createnuclear.display_source.heat.value": "Q", + "createnuclear.display_source.liquid": "Liquid Level", + "createnuclear.display_source.liquid_level": "Reactor Liquid Level", + "createnuclear.display_source.reactor.active": "ACTIVE", + "createnuclear.display_source.reactor.cooler": "Cooler: ", + "createnuclear.display_source.reactor.fluid": "Fluid: ", + "createnuclear.display_source.reactor.for_reactor_status": "for reactor status", + "createnuclear.display_source.reactor.fuel": "Fuel: ", + "createnuclear.display_source.reactor.heat": "Heat: ", + "createnuclear.display_source.reactor.idle": "IDLE", + "createnuclear.display_source.reactor.mode.gauge": "Gauges", + "createnuclear.display_source.reactor.mode.normal": "Normal", + "createnuclear.display_source.reactor.mode.percent": "Percentages", + "createnuclear.display_source.reactor.mode.value": "Values", + "createnuclear.display_source.reactor.no_controller": "No Reactor Controller found", + "createnuclear.display_source.reactor.not_enough_space": "Not enough space ", + "createnuclear.display_source.reactor.size": "Tier: ", + "createnuclear.display_source.reactor.size.large": "Large", + "createnuclear.display_source.reactor.size.medium": "Medium", + "createnuclear.display_source.reactor.size.small": "Small", + "createnuclear.display_source.reactor.status": "Status: ", + "createnuclear.display_source.reactor_controller_count_rod.cooled": "Cooled", + "createnuclear.display_source.reactor_controller_count_rod.fuel": "Fuel", + "createnuclear.display_source.reactor_count_rod": "Count Rod in Pattern", + "createnuclear.display_source.reactor_summary": "Reactor Summary", + "createnuclear.display_source.reactor_summary.active": "ACTIVE", + "createnuclear.display_source.reactor_summary.coolant": "Coolant:", + "createnuclear.display_source.reactor_summary.fuel": "Rods:", + "createnuclear.display_source.reactor_summary.idle": "IDLE", + "createnuclear.display_source.reactor_summary.no_controller": "Reactor not found", + "createnuclear.display_source.reactor_summary.status": "Status:", + "createnuclear.display_source.reactor_summary.temperature": "Temp:", + "createnuclear.display_source.size": "Reactor Size", "createnuclear.enriched.fan.recipe": "Bulk Enriching", + "createnuclear.generic.unit.count.rod": "Counts %s Rod", + "createnuclear.generic.unit.countCooled.rod": "Count Cooled Rod: %d", + "createnuclear.generic.unit.countFuel.rod": "Count Fuel Rod: %d", + "createnuclear.generic.unit.fluid.value": "mB", "createnuclear.generic.unit.heat": "Q", + "createnuclear.generic.unit.heat.rotation": "RPM", + "createnuclear.generic.unit.heat.type": "Heat Level: %s", + "createnuclear.generic.unit.heat.value": "Q", + "createnuclear.generic.unit.liquid": "WIP", + "createnuclear.generic.unit.seconds": "s", "createnuclear.gui.reactor_controller.info_header.title": "Heat value", - "createnuclear.ponder.reactor.header": "Construction of the reactor", - "createnuclear.ponder.reactor.text_1": "Floor 1", - "createnuclear.ponder.reactor.text_10": "Floor 7", - "createnuclear.ponder.reactor.text_2": "Reactor Output: This is the block that outputs the energy (SU) generated by the reactor.", - "createnuclear.ponder.reactor.text_3": "Floor 2", - "createnuclear.ponder.reactor.text_4": "Floor 3", - "createnuclear.ponder.reactor.text_5": "Floor 4", - "createnuclear.ponder.reactor.text_6": "Reactor Input: A block that stores uranium and graphite rods to operate the reactor.", - "createnuclear.ponder.reactor.text_7": "Reactor Controller: The most important block to operate the reactor; it handles all the calculations needed to generate power.", - "createnuclear.ponder.reactor.text_8": "Floor 5", - "createnuclear.ponder.reactor.text_9": "Floor 6", - "createnuclear.ponder.reactor_blueprint.header": "Controller Activation", - "createnuclear.ponder.reactor_blueprint.text_1": "Reactor Blueprint: the most important element; it allows the reactor to be configured according to specific models.", + "createnuclear.notification.reactor.assembled": "Reactor has been assembled", + "createnuclear.notification.reactor.critical_failure": "CRITICAL FAILURE", + "createnuclear.notification.reactor.destroyed": "REACTOR DESTROYED", + "createnuclear.notification.reactor.disassembled": "Reactor has been disassembled", + "createnuclear.notification.reactor.imminent_explosion": "IMMINENT EXPLOSION", + "createnuclear.notification.reactor.meltdown_finished": "Critical meltdown completed", + "createnuclear.notification.reactor.meltdown_in": "CORE MELTDOWN IN ", + "createnuclear.notification.reactor.overheating": "WARNING: CORE OVERHEATING", + "createnuclear.notification.reactor.stabilized": "CORE STABILIZED", + "createnuclear.ponder.reactor_io_placement.header": "Reactor I/O: Function & Placement", + "createnuclear.ponder.reactor_io_placement.text_1": "Rod Input: Stores Heating or Cooling Rods. We need one Heating Rod (fuel) to heat the reactor, and one Cooling Rod for stability.", + "createnuclear.ponder.reactor_io_placement.text_2": "Second Rod Input: This is why we need at least two inputs! One for the Heating Rod and one for the Cooling Rod to prevent explosions.", + "createnuclear.ponder.reactor_io_placement.text_3": "Fluid Input: Fluid is also required to cool the reactor and ensure it does not explode.", + "createnuclear.ponder.reactor_io_placement.text_4": "Alarm (Optional): Emits a sound when the reactor becomes unstable and risks exploding.", + "createnuclear.ponder.reactor_io_placement.text_5": "Output: Necessary to extract generated energy. You can place multiple outputs to dispatch the total energy between them.", + "createnuclear.ponder.reactor_io_placement.text_6": "These blocks can replace ANY Reactor Casing, as long as it is not on an edge.", + "createnuclear.ponder.reactor_io_placement.text_7": "They can be grouped together on the roof or any other flat surface.", + "createnuclear.ponder.reactor_t1.header": "Reactor T1", + "createnuclear.ponder.reactor_t1.text_1": "Floor 1", + "createnuclear.ponder.reactor_t1.text_10": "Note: Check page 4 for I/O and Alarm blocks (placement & function).", + "createnuclear.ponder.reactor_t1.text_2": "Floor 2", + "createnuclear.ponder.reactor_t1.text_3": "Floor 3", + "createnuclear.ponder.reactor_t1.text_4": "Floor 4", + "createnuclear.ponder.reactor_t1.text_5": "Controller: brain of the reactor, and the place where the blueprint goes to start it", + "createnuclear.ponder.reactor_t1.text_6": "Floor 5", + "createnuclear.ponder.reactor_t1.text_7": "Floor 6", + "createnuclear.ponder.reactor_t1.text_8": "Floor 7", + "createnuclear.ponder.reactor_t1.text_9": "To start the reactor you will need liquid and rods corresponding to the pattern, then right click the controller with the blueprint in hand", + "createnuclear.ponder.reactor_t2.header": "Reactor T2", + "createnuclear.ponder.reactor_t2.text_1": "Floor 1", + "createnuclear.ponder.reactor_t2.text_10": "Floor 9", + "createnuclear.ponder.reactor_t2.text_11": "To start the reactor you will need liquid and rods corresponding to the pattern, then right click the controller with the blueprint in hand", + "createnuclear.ponder.reactor_t2.text_12": "Note: Check page 4 for I/O and Alarm blocks (placement & function).", + "createnuclear.ponder.reactor_t2.text_2": "Floor 2", + "createnuclear.ponder.reactor_t2.text_3": "Floor 3", + "createnuclear.ponder.reactor_t2.text_4": "Floor 4", + "createnuclear.ponder.reactor_t2.text_5": "Floor 5", + "createnuclear.ponder.reactor_t2.text_6": "Controller: brain of the reactor, and the place where the blueprint goes to start it", + "createnuclear.ponder.reactor_t2.text_7": "Floor 6", + "createnuclear.ponder.reactor_t2.text_8": "Floor 7", + "createnuclear.ponder.reactor_t2.text_9": "Floor 8", + "createnuclear.ponder.reactor_t3.header": "Reactor T3", + "createnuclear.ponder.reactor_t3.text_1": "Floor 1", + "createnuclear.ponder.reactor_t3.text_10": "Floor 9", + "createnuclear.ponder.reactor_t3.text_11": "Floor 10", + "createnuclear.ponder.reactor_t3.text_12": "Floor 11", + "createnuclear.ponder.reactor_t3.text_13": "To start the reactor you will need liquid and rods corresponding to the pattern, then right click the controller with the blueprint in hand", + "createnuclear.ponder.reactor_t3.text_14": "Note: Check page 4 for I/O and Alarm blocks (placement & function).", + "createnuclear.ponder.reactor_t3.text_2": "Floor 2", + "createnuclear.ponder.reactor_t3.text_3": "Floor 3", + "createnuclear.ponder.reactor_t3.text_4": "Floor 4", + "createnuclear.ponder.reactor_t3.text_5": "Floor 5", + "createnuclear.ponder.reactor_t3.text_6": "Floor 6", + "createnuclear.ponder.reactor_t3.text_7": "Controller: brain of the reactor, and the place where the blueprint goes to start it", + "createnuclear.ponder.reactor_t3.text_8": "Floor 7", + "createnuclear.ponder.reactor_t3.text_9": "Floor 8", + "createnuclear.reactor.debug.label.alarm": "Alarm", + "createnuclear.reactor.debug.label.fluid_input": "Fluid Input", + "createnuclear.reactor.debug.label.input": "Input", + "createnuclear.reactor.debug.label.output": "Output", + "createnuclear.reactor.debug.registered_position": " registered @ %s", + "createnuclear.reactor.debug.summary": "%s: %s registered, %s valid", + "createnuclear.reactor.debug.title": "--- Reactor diagnostics ---", + "createnuclear.reactor.debug.valid_position": " valid @ %s", + "createnuclear.snow_powder.fan.recipe": "Cryogenic fan", + "createnuclear.subtitle.alarm/alarm": "Reactor Alarm Loop", + "createnuclear.subtitle.alarm/reactor_alarm": "Reactor Alarm", + "createnuclear.subtitle.biomes/wasteland": "Wasteland", + "createnuclear.subtitle.explosion/large_nuclear_explosion": "Large Nuclear Explosion", + "createnuclear.subtitle.explosion/main": "Nuclear Explosion Main", + "createnuclear.subtitle.explosion/nuclear_explosion": "Nuclear Explosion", + "createnuclear.subtitle.explosion/nuclear_explosion_rumble": "Nuclear Explosion Rumble", + "createnuclear.subtitle.explosion/ringing": "Nuclear Explosion Ringing", + "createnuclear.subtitle.explosion/rumble": "Nuclear Explosion Rumble", + "createnuclear.subtitle.explosion/shockwave": "Nuclear Explosion Shockwave", + "createnuclear.subtitle.geiger/high": "Geiger High", + "createnuclear.subtitle.geiger/low": "Geiger Low", + "createnuclear.subtitle.geiger/medium": "Geiger Medium", + "createnuclear.subtitle.reacteur/activation": "Reactor Activation", + "createnuclear.subtitle.reacteur/assemble_deassemble/motor_assemble": "Motor Assemble", + "createnuclear.subtitle.reacteur/assemble_deassemble/motor_disassemble": "Motor Disassemble", + "createnuclear.subtitle.reacteur/running": "Reactor Running", + "createnuclear.subtitle.reacteur/shut_off": "Reactor Shut Off", + "createnuclear.tooltip.baseRodHeat": "Base Rod Heat: %d Q", + "createnuclear.tooltip.biome_irradiation_extractor.biome_restore": "Restorations: %d / %d", + "createnuclear.tooltip.fluid": "Fluid: %s ", + "createnuclear.tooltip.fluid.amount": "%d mb", + "createnuclear.tooltip.fluid.none": "Fluid: None ", "createnuclear.tooltip.heatLevel": "Heat Level", "createnuclear.tooltip.heatLevel.caution": "Caution", "createnuclear.tooltip.heatLevel.danger": "Danger", "createnuclear.tooltip.heatLevel.none": "None", "createnuclear.tooltip.heatLevel.safety": "Safety", "createnuclear.tooltip.heatLevel.warning": "Warning", - "createnuclear.tooltip.item.graphene.rod": "Graphite Rod: ", + "createnuclear.tooltip.item.cooled.rod": "Cooler Rod: ", + "createnuclear.tooltip.item.empty.rod": "Input Items: ", + "createnuclear.tooltip.item.fuel.rod": "Fuel Rod: ", "createnuclear.tooltip.item.unknown.rod": "Unknown: ", - "createnuclear.tooltip.item.uranium.rod": "Uranium Rod: ", + "createnuclear.tooltip.proximityRodHeat": "Proximity Rod Heat: %.2f Q", + "createnuclear.tooltip.ratio": "Rod Value for ratio: %d", + "createnuclear.tooltip.rodTimer": "Rod Duration: %d tick", + "createnuclear.tooltip.statRod": "Rod Stat Pattern:", + "createnuclear.tooltip.typeRod": "Rod Type: %s", + "death.attack.createnuclear.fan_radiation": "%1$s died from radiation blast", + "death.attack.createnuclear.radiation": "%1$s died from radiation", + "effect.createnuclear.iodine": "Iodine", "effect.createnuclear.radiation": "Radiation", "emi.category.createnuclear.fan_enriched": "Bulk Enriching", + "emi.category.createnuclear.snow_powder": "Cryogenic fan", "entity.createnuclear.irradiated_cat": "Irradiated Cat", "entity.createnuclear.irradiated_chicken": "Irradiated Chicken", + "entity.createnuclear.irradiated_cow": "Irradiated Cow", "entity.createnuclear.irradiated_wolf": "Irradiated Wolf", + "entity.createnuclear.nuclear_explosion": "Nuclear Explosion", + "fluid.createnuclear.nitrogen": "Liquid Nitrogen", + "fluid.createnuclear.thorium": "Liquid Thorium", "fluid.createnuclear.uranium": "Liquid Uranium", "gui.createnuclear.reactor_controller.title": "Reactor Controller", "gui.createnuclear.reactor_input.title": "Reactor Input Storage", - "item.createnuclear.anti_radiation_boots": "Anti Radiation Boots", - "item.createnuclear.black_anti_radiation_chestplate": "Black Anti Radiation Chestplate", - "item.createnuclear.black_anti_radiation_helmet": "Black Anti Radiation Helmet", - "item.createnuclear.black_anti_radiation_leggings": "Black Anti Radiation Leggings", + "irradiated.taming.wip": "This creature cannot be tamed yet - irradiated mobs are still a work in progress", + "item.createnuclear.biome_irradiation_extractor": "Biome Irradiation Extractor", + "item.createnuclear.biome_irradiation_extractor.tooltip.summary": "This item is currently in _beta_ and will change it's form & texture in the next update.", "item.createnuclear.black_cloth": "Black Cloth", - "item.createnuclear.blue_anti_radiation_chestplate": "Blue Anti Radiation Chestplate", - "item.createnuclear.blue_anti_radiation_helmet": "Blue Anti Radiation Helmet", - "item.createnuclear.blue_anti_radiation_leggings": "Blue Anti Radiation Leggings", "item.createnuclear.blue_cloth": "Blue Cloth", - "item.createnuclear.brown_anti_radiation_chestplate": "Brown Anti Radiation Chestplate", - "item.createnuclear.brown_anti_radiation_helmet": "Brown Anti Radiation Helmet", - "item.createnuclear.brown_anti_radiation_leggings": "Brown Anti Radiation Leggings", "item.createnuclear.brown_cloth": "Brown Cloth", "item.createnuclear.cat_irradiated_spawn_egg": "Irradiated Cat Spawn Egg", "item.createnuclear.chicken_irradiated_spawn_egg": "Irradiated Chicken Spawn Egg", "item.createnuclear.coal_dust": "Coal Dust", - "item.createnuclear.cyan_anti_radiation_chestplate": "Cyan Anti Radiation Chestplate", - "item.createnuclear.cyan_anti_radiation_helmet": "Cyan Anti Radiation Helmet", - "item.createnuclear.cyan_anti_radiation_leggings": "Cyan Anti Radiation Leggings", + "item.createnuclear.cooled_nitrogen_concentrate": "Cooled Nitrogen Concentrate", "item.createnuclear.cyan_cloth": "Cyan Cloth", + "item.createnuclear.default_anti_radiation_boots": "Anti Radiation Boots", + "item.createnuclear.default_anti_radiation_chestplate": "Anti Radiation Chestplate", + "item.createnuclear.default_anti_radiation_helmet": "Anti Radiation Helmet", + "item.createnuclear.default_anti_radiation_leggings": "Anti Radiation Leggings", "item.createnuclear.enriched_yellowcake": "Enriched Yellowcake", "item.createnuclear.graphene": "Graphene", "item.createnuclear.graphite_rod": "Graphite Rod", - "item.createnuclear.graphite_rod.tooltip.summary": "_Stick_ to be used in the _reactor input_ to operate it.", - "item.createnuclear.gray_anti_radiation_chestplate": "Gray Anti Radiation Chestplate", - "item.createnuclear.gray_anti_radiation_helmet": "Gray Anti Radiation Helmet", - "item.createnuclear.gray_anti_radiation_leggings": "Gray Anti Radiation Leggings", + "item.createnuclear.graphite_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", "item.createnuclear.gray_cloth": "Gray Cloth", - "item.createnuclear.green_anti_radiation_chestplate": "Green Anti Radiation Chestplate", - "item.createnuclear.green_anti_radiation_helmet": "Green Anti Radiation Helmet", - "item.createnuclear.green_anti_radiation_leggings": "Green Anti Radiation Leggings", "item.createnuclear.green_cloth": "Green Cloth", "item.createnuclear.lead_ingot": "Lead Ingot", "item.createnuclear.lead_nugget": "Lead Nugget", - "item.createnuclear.light_blue_anti_radiation_chestplate": "Light Blue Anti Radiation Chestplate", - "item.createnuclear.light_blue_anti_radiation_helmet": "Light Blue Anti Radiation Helmet", - "item.createnuclear.light_blue_anti_radiation_leggings": "Light Blue Anti Radiation Leggings", "item.createnuclear.light_blue_cloth": "Light Blue Cloth", - "item.createnuclear.light_gray_anti_radiation_chestplate": "Light Gray Anti Radiation Chestplate", - "item.createnuclear.light_gray_anti_radiation_helmet": "Light Gray Anti Radiation Helmet", - "item.createnuclear.light_gray_anti_radiation_leggings": "Light Gray Anti Radiation Leggings", "item.createnuclear.light_gray_cloth": "Light Gray Cloth", - "item.createnuclear.lime_anti_radiation_chestplate": "Lime Anti Radiation Chestplate", - "item.createnuclear.lime_anti_radiation_helmet": "Lime Anti Radiation Helmet", - "item.createnuclear.lime_anti_radiation_leggings": "Lime Anti Radiation Leggings", "item.createnuclear.lime_cloth": "Lime Cloth", - "item.createnuclear.magenta_anti_radiation_chestplate": "Magenta Anti Radiation Chestplate", - "item.createnuclear.magenta_anti_radiation_helmet": "Magenta Anti Radiation Helmet", - "item.createnuclear.magenta_anti_radiation_leggings": "Magenta Anti Radiation Leggings", "item.createnuclear.magenta_cloth": "Magenta Cloth", - "item.createnuclear.orange_anti_radiation_chestplate": "Orange Anti Radiation Chestplate", - "item.createnuclear.orange_anti_radiation_helmet": "Orange Anti Radiation Helmet", - "item.createnuclear.orange_anti_radiation_leggings": "Orange Anti Radiation Leggings", + "item.createnuclear.nitrate": "Nitrate", + "item.createnuclear.nitrogen_bucket": "Nitrogen Bucket", + "item.createnuclear.nitrogen_concentrate": "Nitrogen Concentrate", "item.createnuclear.orange_cloth": "Orange Cloth", - "item.createnuclear.pink_anti_radiation_chestplate": "Pink Anti Radiation Chestplate", - "item.createnuclear.pink_anti_radiation_helmet": "Pink Anti Radiation Helmet", - "item.createnuclear.pink_anti_radiation_leggings": "Pink Anti Radiation Leggings", "item.createnuclear.pink_cloth": "Pink Cloth", - "item.createnuclear.purple_anti_radiation_chestplate": "Purple Anti Radiation Chestplate", - "item.createnuclear.purple_anti_radiation_helmet": "Purple Anti Radiation Helmet", - "item.createnuclear.purple_anti_radiation_leggings": "Purple Anti Radiation Leggings", "item.createnuclear.purple_cloth": "Purple Cloth", "item.createnuclear.raw_lead": "Raw Lead", + "item.createnuclear.raw_thorium": "Raw Thorium", "item.createnuclear.raw_uranium": "Raw Uranium", + "item.createnuclear.reactor_blueprint.chat_info": "Follow the link to open the documentation:", + "item.createnuclear.reactor_blueprint.tooltip": "Used to design and visualize the reactor's interior layout.", + "item.createnuclear.reactor_blueprint.tooltip_hint": "§7Press §eShift + Right Click §7to with the blueprint in hand to get the Wiki link.", + "item.createnuclear.reactor_blueprint.wiki_link": "[Open Official Wiki]", "item.createnuclear.reactor_blueprint_item": "Reactor Blueprint", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour1": "_Right_ click to fill it.", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour2": "_Right_ click on the reactor controller to open it.", - "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Filled with graphite and uranium rods", + "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Filled with cooling and heating rods", "item.createnuclear.reactor_blueprint_item.tooltip.condition2": "The reactor must be assembled", "item.createnuclear.reactor_blueprint_item.tooltip.summary": "It allows you to configure your own pattern.", - "item.createnuclear.red_anti_radiation_chestplate": "Red Anti Radiation Chestplate", - "item.createnuclear.red_anti_radiation_helmet": "Red Anti Radiation Helmet", - "item.createnuclear.red_anti_radiation_leggings": "Red Anti Radiation Leggings", "item.createnuclear.red_cloth": "Red Cloth", + "item.createnuclear.reinforced_glass_bottle": "Reinforced Glass Bottle", "item.createnuclear.steel_ingot": "Steel Ingot", "item.createnuclear.steel_nugget": "Steel Nugget", + "item.createnuclear.thorium_bucket": "Thorium Bucket", + "item.createnuclear.thorium_dust": "Thorium Dust", + "item.createnuclear.thorium_ingot": "Thorium Ingot", + "item.createnuclear.thorium_nugget": "Thorium Nugget", + "item.createnuclear.thorium_rod": "Thorium Rod", + "item.createnuclear.thorium_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", "item.createnuclear.uranium_bucket": "Uranium Bucket", "item.createnuclear.uranium_powder": "Uranium Powder", "item.createnuclear.uranium_rod": "Uranium Rod", - "item.createnuclear.uranium_rod.tooltip.summary": "_Stick_ to be used in the _reactor input_ to operate it.", - "item.createnuclear.white_anti_radiation_chestplate": "White Anti Radiation Chestplate", - "item.createnuclear.white_anti_radiation_helmet": "White Anti Radiation Helmet", - "item.createnuclear.white_anti_radiation_leggings": "White Anti Radiation Leggings", + "item.createnuclear.uranium_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", "item.createnuclear.white_cloth": "White Cloth", "item.createnuclear.wolf_irradiated_spawn_egg": "Irradiated Wolf Spawn Egg", - "item.createnuclear.yellow_anti_radiation_chestplate": "Yellow Anti Radiation Chestplate", - "item.createnuclear.yellow_anti_radiation_helmet": "Yellow Anti Radiation Helmet", - "item.createnuclear.yellow_anti_radiation_leggings": "Yellow Anti Radiation Leggings", "item.createnuclear.yellow_cloth": "Yellow Cloth", "item.createnuclear.yellowcake": "Yellowcake", + "item.minecraft.lingering_potion.effect.potion_of_iodine": "Lingering Potion of Iodine", + "item.minecraft.lingering_potion.effect.potion_of_iodine_augment": "Lingering Potion of Iodine", "item.minecraft.lingering_potion.effect.potion_of_radiation_1": "Lingering Potion of Radiation", "item.minecraft.lingering_potion.effect.potion_of_radiation_2": "Lingering Potion of Radiation", "item.minecraft.lingering_potion.effect.potion_of_radiation_augment_1": "Lingering Potion of Radiation", + "item.minecraft.potion.effect.potion_of_iodine": "Potion of Iodine", + "item.minecraft.potion.effect.potion_of_iodine_augment": "Potion of Iodine", "item.minecraft.potion.effect.potion_of_radiation_1": "Potion of Radiation", "item.minecraft.potion.effect.potion_of_radiation_2": "Potion of Radiation", "item.minecraft.potion.effect.potion_of_radiation_augment_1": "Potion of Radiation", + "item.minecraft.splash_potion.effect.potion_of_iodine": "Splash Potion of Iodine", + "item.minecraft.splash_potion.effect.potion_of_iodine_augment": "Splash Potion of Iodine", "item.minecraft.splash_potion.effect.potion_of_radiation_1": "Splash Potion of Radiation", "item.minecraft.splash_potion.effect.potion_of_radiation_2": "Splash Potion of Radiation", "item.minecraft.splash_potion.effect.potion_of_radiation_augment_1": "Splash Potion of Radiation", + "item.minecraft.tipped_arrow.effect.potion_of_iodine": "Arrow of Iodine", + "item.minecraft.tipped_arrow.effect.potion_of_iodine_augment": "Arrow of Iodine", "item.minecraft.tipped_arrow.effect.potion_of_radiation_1": "Arrow of Radiation", "item.minecraft.tipped_arrow.effect.potion_of_radiation_2": "Arrow of Radiation", "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", - "reactor.info.assembled.destroyer": "Reactor has been disassembled", - "reactor.info.assembled.none": "Reactor is not assembled", - "reactor.info.is": "controller is", "reactor.item.gui.name": "Config Pattern", "reactor.update.casing.input": "Update the casing in input", "tag.fluid.c.uranium": "Fluid Uranium", diff --git a/src/generated/resources/assets/createnuclear/models/block/deepslate_nitrate_ore.json b/src/generated/resources/assets/createnuclear/models/block/deepslate_nitrate_ore.json new file mode 100644 index 000000000..7af5e2f28 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/deepslate_nitrate_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/deepslate_nitrate_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/deepslate_thorium_ore.json b/src/generated/resources/assets/createnuclear/models/block/deepslate_thorium_ore.json new file mode 100644 index 000000000..8ba7752a6 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/deepslate_thorium_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/deepslate_thorium_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/nitrate_ore.json b/src/generated/resources/assets/createnuclear/models/block/nitrate_ore.json new file mode 100644 index 000000000..575456042 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/nitrate_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/nitrate_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/nitrogen.json b/src/generated/resources/assets/createnuclear/models/block/nitrogen.json new file mode 100644 index 000000000..a48ca03d1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/nitrogen.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "createnuclear:fluid/nitrogen_still" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/raw_thorium_block.json b/src/generated/resources/assets/createnuclear/models/block/raw_thorium_block.json new file mode 100644 index 000000000..9301beef3 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/raw_thorium_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/raw_thorium_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json new file mode 100644 index 000000000..fb38b94e5 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/off.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_off", + "particle": "createnuclear:block/reactor/controller/controller_panel_off" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json new file mode 100644 index 000000000..423b3f4f9 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/on.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_on", + "particle": "createnuclear:block/reactor/controller/controller_panel_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json new file mode 100644 index 000000000..59dc81de5 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor/controller/standby.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:block/reactor/controller/block", + "textures": { + "1": "createnuclear:block/reactor/controller/controller_panel_standby", + "particle": "createnuclear:block/reactor/controller/controller_panel_standby" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/reactor_alarm.json b/src/generated/resources/assets/createnuclear/models/block/reactor_alarm.json new file mode 100644 index 000000000..e78ea0f3b --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/reactor_alarm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/reactor_alarm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/thorium.json b/src/generated/resources/assets/createnuclear/models/block/thorium.json new file mode 100644 index 000000000..5a6ef097c --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/thorium.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "createnuclear:fluid/thorium_still" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/thorium_block.json b/src/generated/resources/assets/createnuclear/models/block/thorium_block.json new file mode 100644 index 000000000..1295cc9f7 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/thorium_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/thorium_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/block/thorium_ore.json b/src/generated/resources/assets/createnuclear/models/block/thorium_ore.json new file mode 100644 index 000000000..bc948d220 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/block/thorium_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "createnuclear:block/thorium_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/anti_radiation_boots.json deleted file mode 100644 index 703df56e1..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/anti_radiation_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/anti_radiation_boots" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor.json b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor.json new file mode 100644 index 000000000..5afa3b26a --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "createnuclear:item/biome_irradiation_extractor/quarter", + "predicate": { + "createnuclear:biome_restore": 0.25 + } + }, + { + "model": "createnuclear:item/biome_irradiation_extractor/half", + "predicate": { + "createnuclear:biome_restore": 0.5 + } + }, + { + "model": "createnuclear:item/biome_irradiation_extractor/three_quarters", + "predicate": { + "createnuclear:biome_restore": 0.75 + } + }, + { + "model": "createnuclear:item/biome_irradiation_extractor/full", + "predicate": { + "createnuclear:biome_restore": 1.0 + } + } + ], + "textures": { + "layer0": "createnuclear:item/biome_irradiation_extractor/empty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/full.json b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/full.json new file mode 100644 index 000000000..1f07daec8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/full.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/biome_irradiation_extractor/full" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/half.json b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/half.json new file mode 100644 index 000000000..25634c8ac --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/half.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/biome_irradiation_extractor/half" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/quarter.json b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/quarter.json new file mode 100644 index 000000000..35b311abc --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/quarter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/biome_irradiation_extractor/quarter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/three_quarters.json b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/three_quarters.json new file mode 100644 index 000000000..dd251fd81 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/biome_irradiation_extractor/three_quarters.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/biome_irradiation_extractor/three_quarters" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_chestplate.json deleted file mode 100644 index 7d0d44ac3..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/black_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_helmet.json deleted file mode 100644 index 46225ff06..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/black_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_leggings.json deleted file mode 100644 index a88edd4fe..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/black_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/black_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_chestplate.json deleted file mode 100644 index 4ea98be85..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/blue_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_helmet.json deleted file mode 100644 index e7c37591f..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/blue_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_leggings.json deleted file mode 100644 index 5f9b8db04..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/blue_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/blue_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_chestplate.json deleted file mode 100644 index faa30b54e..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/brown_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_helmet.json deleted file mode 100644 index cb65b3957..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/brown_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_leggings.json deleted file mode 100644 index ebbf44e33..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/brown_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/brown_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_boots.json new file mode 100644 index 000000000..69119f5f7 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/black_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_chestplate.json new file mode 100644 index 000000000..6675fc3e0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/black_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_helmet.json new file mode 100644 index 000000000..8aa9ce757 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/black_anti_radiation_suit", + "particle": "createnuclear:item/armors/black_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_leggings.json new file mode 100644 index 000000000..26b2d81c2 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/black_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/black_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_boots.json new file mode 100644 index 000000000..bc00cdafa --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_chestplate.json new file mode 100644 index 000000000..609f89b9e --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_helmet.json new file mode 100644 index 000000000..ef9dff51a --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/blue_anti_radiation_suit", + "particle": "createnuclear:item/armors/blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_leggings.json new file mode 100644 index 000000000..c17392eb2 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/blue_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_boots.json new file mode 100644 index 000000000..25fa3e012 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/brown_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_chestplate.json new file mode 100644 index 000000000..09169bff8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/brown_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_helmet.json new file mode 100644 index 000000000..fa4da8401 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/brown_anti_radiation_suit", + "particle": "createnuclear:item/armors/brown_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_leggings.json new file mode 100644 index 000000000..c690923f0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/brown_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/brown_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_boots.json new file mode 100644 index 000000000..a2faeecbf --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/cyan_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_chestplate.json new file mode 100644 index 000000000..32883f011 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/cyan_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_helmet.json new file mode 100644 index 000000000..2a0f8c9c0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/cyan_anti_radiation_suit", + "particle": "createnuclear:item/armors/cyan_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_leggings.json new file mode 100644 index 000000000..81e4a6024 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/cyan_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/cyan_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_boots.json new file mode 100644 index 000000000..9c16f60a0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_chestplate.json new file mode 100644 index 000000000..c60317b61 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_helmet.json new file mode 100644 index 000000000..eed2cc4ba --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/gray_anti_radiation_suit", + "particle": "createnuclear:item/armors/gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_leggings.json new file mode 100644 index 000000000..249fc9828 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/gray_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_boots.json new file mode 100644 index 000000000..10953b22f --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/green_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_chestplate.json new file mode 100644 index 000000000..581676201 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/green_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_helmet.json new file mode 100644 index 000000000..a8641aae6 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/green_anti_radiation_suit", + "particle": "createnuclear:item/armors/green_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_leggings.json new file mode 100644 index 000000000..5bb03c06c --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/green_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/green_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_boots.json new file mode 100644 index 000000000..d18e5ee8d --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/light_blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_chestplate.json new file mode 100644 index 000000000..02c67b153 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/light_blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_helmet.json new file mode 100644 index 000000000..7c80dea80 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/light_blue_anti_radiation_suit", + "particle": "createnuclear:item/armors/light_blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_leggings.json new file mode 100644 index 000000000..cd611a9e9 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_blue_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/light_blue_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_boots.json new file mode 100644 index 000000000..66e566066 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/light_gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_chestplate.json new file mode 100644 index 000000000..afba5c083 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/light_gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_helmet.json new file mode 100644 index 000000000..597080487 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/light_gray_anti_radiation_suit", + "particle": "createnuclear:item/armors/light_gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_leggings.json new file mode 100644 index 000000000..bc1afc65e --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/light_gray_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/light_gray_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_boots.json new file mode 100644 index 000000000..0ee29f8b0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/lime_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_chestplate.json new file mode 100644 index 000000000..b4fd6a4a0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/lime_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_helmet.json new file mode 100644 index 000000000..5e7924d53 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/lime_anti_radiation_suit", + "particle": "createnuclear:item/armors/lime_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_leggings.json new file mode 100644 index 000000000..028841ee5 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/lime_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/lime_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_boots.json new file mode 100644 index 000000000..f1a1e3d3e --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/magenta_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_chestplate.json new file mode 100644 index 000000000..0b9cefd79 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/magenta_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_helmet.json new file mode 100644 index 000000000..412ed6f67 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/magenta_anti_radiation_suit", + "particle": "createnuclear:item/armors/magenta_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_leggings.json new file mode 100644 index 000000000..052a1c32a --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/magenta_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/magenta_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_boots.json new file mode 100644 index 000000000..c18a4bbd0 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/orange_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_chestplate.json new file mode 100644 index 000000000..1e9533367 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/orange_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_helmet.json new file mode 100644 index 000000000..7d9bb28e6 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/orange_anti_radiation_suit", + "particle": "createnuclear:item/armors/orange_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_leggings.json new file mode 100644 index 000000000..a71064a51 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/orange_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/orange_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_boots.json new file mode 100644 index 000000000..aab0a59bd --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/pink_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_chestplate.json new file mode 100644 index 000000000..8a4f72db7 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/pink_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_helmet.json new file mode 100644 index 000000000..43657ec3d --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/pink_anti_radiation_suit", + "particle": "createnuclear:item/armors/pink_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_leggings.json new file mode 100644 index 000000000..0d1be27ae --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/pink_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/pink_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_boots.json new file mode 100644 index 000000000..8059c6692 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/purple_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_chestplate.json new file mode 100644 index 000000000..5a4416201 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/purple_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_helmet.json new file mode 100644 index 000000000..6efbf23d4 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/purple_anti_radiation_suit", + "particle": "createnuclear:item/armors/purple_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_leggings.json new file mode 100644 index 000000000..5e000c478 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/purple_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/purple_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_boots.json new file mode 100644 index 000000000..516a66fc1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/red_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_chestplate.json new file mode 100644 index 000000000..0dd13c7e1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/red_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_helmet.json new file mode 100644 index 000000000..63e497a10 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/red_anti_radiation_suit", + "particle": "createnuclear:item/armors/red_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_leggings.json new file mode 100644 index 000000000..1b62aaa2e --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/red_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/red_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_boots.json new file mode 100644 index 000000000..7d9de83f8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/white_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_chestplate.json new file mode 100644 index 000000000..995ff506a --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/white_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_helmet.json new file mode 100644 index 000000000..c89f038d7 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/white_anti_radiation_suit", + "particle": "createnuclear:item/armors/white_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_leggings.json new file mode 100644 index 000000000..e99461b63 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/white_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/white_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_boots.json new file mode 100644 index 000000000..d1ecbe8b5 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_boots/item", + "textures": { + "14": "createnuclear:item/armors/yellow_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_chestplate.json new file mode 100644 index 000000000..6f12a2ff7 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_chestplate/item", + "textures": { + "14": "createnuclear:item/armors/yellow_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_helmet.json new file mode 100644 index 000000000..0f97b2b94 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_helmet/item", + "textures": { + "layer0": "createnuclear:item/armors/yellow_anti_radiation_suit", + "particle": "createnuclear:item/armors/yellow_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_leggings.json new file mode 100644 index 000000000..77b23ea75 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/colored/yellow_anti_radiation_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "createnuclear:item/default_anti_radiation_leggings/item", + "textures": { + "14": "createnuclear:item/armors/yellow_anti_radiation_suit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/cooled_nitrogen_concentrate.json b/src/generated/resources/assets/createnuclear/models/item/cooled_nitrogen_concentrate.json new file mode 100644 index 000000000..e122350fb --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/cooled_nitrogen_concentrate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/cooled_nitrogen_concentrate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_chestplate.json deleted file mode 100644 index 04c605bd1..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/cyan_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_helmet.json deleted file mode 100644 index 9c29042ba..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/cyan_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_leggings.json deleted file mode 100644 index a7d6f2510..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/cyan_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/cyan_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/deepslate_nitrate_ore.json b/src/generated/resources/assets/createnuclear/models/item/deepslate_nitrate_ore.json new file mode 100644 index 000000000..d0f8ebb37 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/deepslate_nitrate_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/deepslate_nitrate_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/deepslate_thorium_ore.json b/src/generated/resources/assets/createnuclear/models/item/deepslate_thorium_ore.json new file mode 100644 index 000000000..c7a358aea --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/deepslate_thorium_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/deepslate_thorium_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_boots.json new file mode 100644 index 000000000..7e2cc99b4 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_boots.json @@ -0,0 +1,104 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "createnuclear:item/colored/white_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.0625 + } + }, + { + "model": "createnuclear:item/colored/orange_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.125 + } + }, + { + "model": "createnuclear:item/colored/magenta_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.1875 + } + }, + { + "model": "createnuclear:item/colored/light_blue_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.25 + } + }, + { + "model": "createnuclear:item/colored/yellow_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.3125 + } + }, + { + "model": "createnuclear:item/colored/lime_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.375 + } + }, + { + "model": "createnuclear:item/colored/pink_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.4375 + } + }, + { + "model": "createnuclear:item/colored/gray_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.5 + } + }, + { + "model": "createnuclear:item/colored/light_gray_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.5625 + } + }, + { + "model": "createnuclear:item/colored/cyan_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.625 + } + }, + { + "model": "createnuclear:item/colored/purple_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.6875 + } + }, + { + "model": "createnuclear:item/colored/blue_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.75 + } + }, + { + "model": "createnuclear:item/colored/brown_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.8125 + } + }, + { + "model": "createnuclear:item/colored/green_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.875 + } + }, + { + "model": "createnuclear:item/colored/red_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 0.9375 + } + }, + { + "model": "createnuclear:item/colored/black_anti_radiation_boots", + "predicate": { + "createnuclear:cloth_color": 1.0 + } + } + ], + "textures": { + "layer0": "createnuclear:item/armors/default_anti_radiation_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate.json new file mode 100644 index 000000000..b851ffacd --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate.json @@ -0,0 +1,104 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "createnuclear:item/colored/white_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.0625 + } + }, + { + "model": "createnuclear:item/colored/orange_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.125 + } + }, + { + "model": "createnuclear:item/colored/magenta_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.1875 + } + }, + { + "model": "createnuclear:item/colored/light_blue_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.25 + } + }, + { + "model": "createnuclear:item/colored/yellow_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.3125 + } + }, + { + "model": "createnuclear:item/colored/lime_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.375 + } + }, + { + "model": "createnuclear:item/colored/pink_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.4375 + } + }, + { + "model": "createnuclear:item/colored/gray_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.5 + } + }, + { + "model": "createnuclear:item/colored/light_gray_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.5625 + } + }, + { + "model": "createnuclear:item/colored/cyan_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.625 + } + }, + { + "model": "createnuclear:item/colored/purple_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.6875 + } + }, + { + "model": "createnuclear:item/colored/blue_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.75 + } + }, + { + "model": "createnuclear:item/colored/brown_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.8125 + } + }, + { + "model": "createnuclear:item/colored/green_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.875 + } + }, + { + "model": "createnuclear:item/colored/red_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 0.9375 + } + }, + { + "model": "createnuclear:item/colored/black_anti_radiation_chestplate", + "predicate": { + "createnuclear:cloth_color": 1.0 + } + } + ], + "textures": { + "layer0": "createnuclear:item/armors/default_anti_radiation_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_helmet.json new file mode 100644 index 000000000..53d4be45f --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_helmet.json @@ -0,0 +1,104 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "createnuclear:item/colored/white_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.0625 + } + }, + { + "model": "createnuclear:item/colored/orange_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.125 + } + }, + { + "model": "createnuclear:item/colored/magenta_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.1875 + } + }, + { + "model": "createnuclear:item/colored/light_blue_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.25 + } + }, + { + "model": "createnuclear:item/colored/yellow_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.3125 + } + }, + { + "model": "createnuclear:item/colored/lime_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.375 + } + }, + { + "model": "createnuclear:item/colored/pink_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.4375 + } + }, + { + "model": "createnuclear:item/colored/gray_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.5 + } + }, + { + "model": "createnuclear:item/colored/light_gray_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.5625 + } + }, + { + "model": "createnuclear:item/colored/cyan_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.625 + } + }, + { + "model": "createnuclear:item/colored/purple_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.6875 + } + }, + { + "model": "createnuclear:item/colored/blue_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.75 + } + }, + { + "model": "createnuclear:item/colored/brown_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.8125 + } + }, + { + "model": "createnuclear:item/colored/green_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.875 + } + }, + { + "model": "createnuclear:item/colored/red_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 0.9375 + } + }, + { + "model": "createnuclear:item/colored/black_anti_radiation_helmet", + "predicate": { + "createnuclear:cloth_color": 1.0 + } + } + ], + "textures": { + "layer0": "createnuclear:item/armors/default_anti_radiation_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_leggings.json new file mode 100644 index 000000000..cc553f827 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_leggings.json @@ -0,0 +1,104 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "createnuclear:item/colored/white_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.0625 + } + }, + { + "model": "createnuclear:item/colored/orange_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.125 + } + }, + { + "model": "createnuclear:item/colored/magenta_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.1875 + } + }, + { + "model": "createnuclear:item/colored/light_blue_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.25 + } + }, + { + "model": "createnuclear:item/colored/yellow_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.3125 + } + }, + { + "model": "createnuclear:item/colored/lime_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.375 + } + }, + { + "model": "createnuclear:item/colored/pink_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.4375 + } + }, + { + "model": "createnuclear:item/colored/gray_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.5 + } + }, + { + "model": "createnuclear:item/colored/light_gray_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.5625 + } + }, + { + "model": "createnuclear:item/colored/cyan_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.625 + } + }, + { + "model": "createnuclear:item/colored/purple_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.6875 + } + }, + { + "model": "createnuclear:item/colored/blue_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.75 + } + }, + { + "model": "createnuclear:item/colored/brown_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.8125 + } + }, + { + "model": "createnuclear:item/colored/green_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.875 + } + }, + { + "model": "createnuclear:item/colored/red_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 0.9375 + } + }, + { + "model": "createnuclear:item/colored/black_anti_radiation_leggings", + "predicate": { + "createnuclear:cloth_color": 1.0 + } + } + ], + "textures": { + "layer0": "createnuclear:item/armors/default_anti_radiation_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_chestplate.json deleted file mode 100644 index 157232194..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/gray_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_helmet.json deleted file mode 100644 index ab33a1af7..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/gray_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_leggings.json deleted file mode 100644 index 9708f7a46..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/gray_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/gray_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_chestplate.json deleted file mode 100644 index 624ba0736..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/green_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_helmet.json deleted file mode 100644 index c766bd2ef..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/green_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_leggings.json deleted file mode 100644 index 07af99b17..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/green_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/green_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_chestplate.json deleted file mode 100644 index 03200d24d..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/light_blue_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_helmet.json deleted file mode 100644 index 95498a8cb..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/light_blue_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_leggings.json deleted file mode 100644 index 79eb60004..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_blue_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/light_blue_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_chestplate.json deleted file mode 100644 index e30f93f8d..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/light_gray_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_helmet.json deleted file mode 100644 index 9aeb29d3c..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/light_gray_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_leggings.json deleted file mode 100644 index a1e91cf37..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/light_gray_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/light_gray_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_chestplate.json deleted file mode 100644 index f4f7f966f..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/lime_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_helmet.json deleted file mode 100644 index 1e7eb904b..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/lime_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_leggings.json deleted file mode 100644 index 87466b53a..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/lime_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/lime_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_chestplate.json deleted file mode 100644 index 624729818..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/magenta_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_helmet.json deleted file mode 100644 index 16f6f1816..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/magenta_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_leggings.json deleted file mode 100644 index a7da5fdd0..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/magenta_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/magenta_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/nitrate.json b/src/generated/resources/assets/createnuclear/models/item/nitrate.json new file mode 100644 index 000000000..b5e84b43b --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/nitrate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/nitrate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/nitrate_ore.json b/src/generated/resources/assets/createnuclear/models/item/nitrate_ore.json new file mode 100644 index 000000000..47e5d8735 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/nitrate_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/nitrate_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/nitrogen_bucket.json b/src/generated/resources/assets/createnuclear/models/item/nitrogen_bucket.json new file mode 100644 index 000000000..8b1e966d2 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/nitrogen_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/nitrogen_bucket" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/nitrogen_concentrate.json b/src/generated/resources/assets/createnuclear/models/item/nitrogen_concentrate.json new file mode 100644 index 000000000..80476cb24 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/nitrogen_concentrate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/nitrogen_concentrate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_chestplate.json deleted file mode 100644 index ce18ac3ce..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/orange_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_helmet.json deleted file mode 100644 index c922ae529..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/orange_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_leggings.json deleted file mode 100644 index 202a468ce..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/orange_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/orange_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_chestplate.json deleted file mode 100644 index a24f101d8..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/pink_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_helmet.json deleted file mode 100644 index 6ec17b119..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/pink_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_leggings.json deleted file mode 100644 index 58b1c4ad6..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/pink_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/pink_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_chestplate.json deleted file mode 100644 index 3e9009b60..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/purple_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_helmet.json deleted file mode 100644 index 748b018f0..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/purple_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_leggings.json deleted file mode 100644 index 001024bbc..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/purple_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/purple_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/raw_thorium.json b/src/generated/resources/assets/createnuclear/models/item/raw_thorium.json new file mode 100644 index 000000000..82bb96b89 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/raw_thorium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/raw_thorium" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/raw_thorium_block.json b/src/generated/resources/assets/createnuclear/models/item/raw_thorium_block.json new file mode 100644 index 000000000..b75c1958f --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/raw_thorium_block.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/raw_thorium_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/reactor_alarm.json b/src/generated/resources/assets/createnuclear/models/item/reactor_alarm.json new file mode 100644 index 000000000..889a06efb --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/reactor_alarm.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/reactor_alarm" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/reactor_fluid_input.json b/src/generated/resources/assets/createnuclear/models/item/reactor_fluid_input.json new file mode 100644 index 000000000..9def8ea63 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/reactor_fluid_input.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/reactor/fluid_input/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/reactor_input.json b/src/generated/resources/assets/createnuclear/models/item/reactor_input.json deleted file mode 100644 index b4175b22e..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/reactor_input.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "createnuclear:block/reactor/input/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/reactor_rod_input.json b/src/generated/resources/assets/createnuclear/models/item/reactor_rod_input.json new file mode 100644 index 000000000..5fe1a68b1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/reactor_rod_input.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/reactor/rod_input/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_chestplate.json deleted file mode 100644 index 7e71188f6..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/red_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_helmet.json deleted file mode 100644 index a4736bd14..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/red_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_leggings.json deleted file mode 100644 index 524089846..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/red_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/red_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/reinforced_glass_bottle.json b/src/generated/resources/assets/createnuclear/models/item/reinforced_glass_bottle.json new file mode 100644 index 000000000..c29947f4a --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/reinforced_glass_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/reinforced_glass_bottle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_block.json b/src/generated/resources/assets/createnuclear/models/item/thorium_block.json new file mode 100644 index 000000000..94d3fcb85 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_block.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/thorium_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_bucket.json b/src/generated/resources/assets/createnuclear/models/item/thorium_bucket.json new file mode 100644 index 000000000..2a48a3431 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/thorium_bucket" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_dust.json b/src/generated/resources/assets/createnuclear/models/item/thorium_dust.json new file mode 100644 index 000000000..7c6ab4d85 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/thorium_dust" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_ingot.json b/src/generated/resources/assets/createnuclear/models/item/thorium_ingot.json new file mode 100644 index 000000000..3cfe5d773 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/thorium_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_nugget.json b/src/generated/resources/assets/createnuclear/models/item/thorium_nugget.json new file mode 100644 index 000000000..3389988a9 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/thorium_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_ore.json b/src/generated/resources/assets/createnuclear/models/item/thorium_ore.json new file mode 100644 index 000000000..c0ce70ce8 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "createnuclear:block/thorium_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/thorium_rod.json b/src/generated/resources/assets/createnuclear/models/item/thorium_rod.json new file mode 100644 index 000000000..9f31f8ad1 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/models/item/thorium_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "createnuclear:item/thorium_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_chestplate.json deleted file mode 100644 index a5d91e2bc..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/white_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_helmet.json deleted file mode 100644 index c203cda2f..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/white_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_leggings.json deleted file mode 100644 index f6d419c65..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/white_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/white_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_chestplate.json b/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_chestplate.json deleted file mode 100644 index e66b6d45f..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/chestplates/yellow_anti_radiation_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_helmet.json b/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_helmet.json deleted file mode 100644 index 6b76a4311..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/helmets/yellow_anti_radiation_helmet" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_leggings.json b/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_leggings.json deleted file mode 100644 index 618032623..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/yellow_anti_radiation_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "createnuclear:item/armors/leggings/yellow_anti_radiation_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/sounds.json b/src/generated/resources/assets/createnuclear/sounds.json new file mode 100644 index 000000000..94a577445 --- /dev/null +++ b/src/generated/resources/assets/createnuclear/sounds.json @@ -0,0 +1,164 @@ +{ + "alarm/alarm": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:alarm/alarm" + } + ], + "subtitle": "createnuclear.subtitle.alarm/alarm" + }, + "alarm/reactor_alarm": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:alarm/reactor_alarm" + } + ], + "subtitle": "createnuclear.subtitle.alarm/reactor_alarm" + }, + "biomes/wasteland": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:biomes/wasteland" + } + ], + "subtitle": "createnuclear.subtitle.biomes/wasteland" + }, + "explosion/large_nuclear_explosion": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/large_nuclear_explosion" + } + ], + "subtitle": "createnuclear.subtitle.explosion/large_nuclear_explosion" + }, + "explosion/main": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/main" + } + ], + "subtitle": "createnuclear.subtitle.explosion/main" + }, + "explosion/nuclear_explosion": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/nuclear_explosion" + } + ], + "subtitle": "createnuclear.subtitle.explosion/nuclear_explosion" + }, + "explosion/nuclear_explosion_rumble": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/nuclear_explosion_rumble" + } + ], + "subtitle": "createnuclear.subtitle.explosion/nuclear_explosion_rumble" + }, + "explosion/ringing": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/ringing" + } + ], + "subtitle": "createnuclear.subtitle.explosion/ringing" + }, + "explosion/rumble": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/rumble" + } + ], + "subtitle": "createnuclear.subtitle.explosion/rumble" + }, + "explosion/shockwave": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:explosion/shockwave" + } + ], + "subtitle": "createnuclear.subtitle.explosion/shockwave" + }, + "geiger/high": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:geiger/high" + } + ], + "subtitle": "createnuclear.subtitle.geiger/high" + }, + "geiger/low": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:geiger/low" + } + ], + "subtitle": "createnuclear.subtitle.geiger/low" + }, + "geiger/medium": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:geiger/medium" + } + ], + "subtitle": "createnuclear.subtitle.geiger/medium" + }, + "reacteur/activation": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:reacteur/activation" + } + ], + "subtitle": "createnuclear.subtitle.reacteur/activation" + }, + "reacteur/assemble_deassemble/motor_assemble": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:reacteur/assemble_deassemble/motor_assemble" + } + ], + "subtitle": "createnuclear.subtitle.reacteur/assemble_deassemble/motor_assemble" + }, + "reacteur/assemble_deassemble/motor_disassemble": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:reacteur/assemble_deassemble/motor_disassemble" + } + ], + "subtitle": "createnuclear.subtitle.reacteur/assemble_deassemble/motor_disassemble" + }, + "reacteur/running": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:reacteur/running" + } + ], + "subtitle": "createnuclear.subtitle.reacteur/running" + }, + "reacteur/shut_off": { + "sounds": [ + { + "type": "file", + "name": "createnuclear:reacteur/shut_off" + } + ], + "subtitle": "createnuclear.subtitle.reacteur/shut_off" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/absolute_zero.json b/src/generated/resources/data/createnuclear/advancements/absolute_zero.json new file mode 100644 index 000000000..6bb33b4fb --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/absolute_zero.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:chill_out", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:nitrogen_bucket" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.absolute_zero.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:nitrogen_bucket" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.absolute_zero" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/anti_radiation_armor.json b/src/generated/resources/data/createnuclear/advancements/anti_radiation_armor.json index cd1a68b93..9f27bca39 100644 --- a/src/generated/resources/data/createnuclear/advancements/anti_radiation_armor.json +++ b/src/generated/resources/data/createnuclear/advancements/anti_radiation_armor.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "createnuclear:all_anti_radiation_armors" + "tag": "createnuclear:anti_radiation_armor" } ] }, @@ -21,7 +21,7 @@ "frame": "task", "hidden": false, "icon": { - "item": "createnuclear:white_anti_radiation_helmet", + "item": "createnuclear:default_anti_radiation_helmet", "nbt": "{Damage:0}" }, "show_toast": true, diff --git a/src/generated/resources/data/createnuclear/advancements/automatic_uranium.json b/src/generated/resources/data/createnuclear/advancements/automatic_uranium.json index 2eea816ea..b76f5827f 100644 --- a/src/generated/resources/data/createnuclear/advancements/automatic_uranium.json +++ b/src/generated/resources/data/createnuclear/advancements/automatic_uranium.json @@ -3,7 +3,7 @@ "criteria": { "0": { "conditions": {}, - "trigger": "create:automatic_uranium_builtin" + "trigger": "createnuclear:automatic_uranium_builtin" } }, "display": { diff --git a/src/generated/resources/data/createnuclear/advancements/avoiding_cancer.json b/src/generated/resources/data/createnuclear/advancements/avoiding_cancer.json new file mode 100644 index 000000000..2c7e643de --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/avoiding_cancer.json @@ -0,0 +1,64 @@ +{ + "parent": "createnuclear:anti_radiation_armor", + "criteria": { + "0": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "minecraft:player", + "equipment": { + "chest": { + "items": [ + "createnuclear:default_anti_radiation_chestplate" + ] + }, + "feet": { + "items": [ + "createnuclear:default_anti_radiation_boots" + ] + }, + "head": { + "items": [ + "createnuclear:default_anti_radiation_helmet" + ] + }, + "legs": { + "items": [ + "createnuclear:default_anti_radiation_leggings" + ] + } + } + } + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.avoiding_cancer.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:default_anti_radiation_helmet", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.avoiding_cancer" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/chemistry_101.json b/src/generated/resources/data/createnuclear/advancements/chemistry_101.json new file mode 100644 index 000000000..d1e268fc6 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/chemistry_101.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:nitrate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.chemistry_101.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:nitrate" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.chemistry_101" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/chill_out.json b/src/generated/resources/data/createnuclear/advancements/chill_out.json new file mode 100644 index 000000000..bb15e8486 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/chill_out.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:getting_concentrated", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:cooled_nitrogen_concentrate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.chill_out.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:cooled_nitrogen_concentrate" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.chill_out" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/craft_enriching_campfire.json b/src/generated/resources/data/createnuclear/advancements/craft_enriching_campfire.json new file mode 100644 index 000000000..0fde5b86f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/craft_enriching_campfire.json @@ -0,0 +1,46 @@ +{ + "parent": "createnuclear:root", + "criteria": { + "0": { + "conditions": { + "ingredients": [ + { + "items": [ + "createnuclear:enriched_soul_soil" + ] + }, + { + "tag": "minecraft:logs" + }, + { + "tag": "forge:rods/wooden" + } + ], + "recipe_id": "createnuclear:crafting/enriching_campfire" + }, + "trigger": "minecraft:recipe_crafted" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.craft_enriching_campfire.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:enriching_campfire" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.craft_enriching_campfire" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/crunchy_uranium.json b/src/generated/resources/data/createnuclear/advancements/crunchy_uranium.json new file mode 100644 index 000000000..aa2ae8a50 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/crunchy_uranium.json @@ -0,0 +1,37 @@ +{ + "parent": "createnuclear:yellowcake", + "criteria": { + "0": { + "conditions": { + "item": { + "items": [ + "createnuclear:yellowcake" + ] + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.crunchy_uranium.desc" + }, + "frame": "goal", + "hidden": true, + "icon": { + "item": "createnuclear:yellowcake" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.crunchy_uranium" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json b/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json new file mode 100644 index 000000000..80219e67d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:absolute_zero", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:cryogenic_baptism_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.cryogenic_baptism.desc" + }, + "frame": "goal", + "hidden": true, + "icon": { + "item": "createnuclear:nitrogen_bucket" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.cryogenic_baptism" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/dye_anti_radiation_armor.json b/src/generated/resources/data/createnuclear/advancements/dye_anti_radiation_armor.json index 08762768f..25a2cddb6 100644 --- a/src/generated/resources/data/createnuclear/advancements/dye_anti_radiation_armor.json +++ b/src/generated/resources/data/createnuclear/advancements/dye_anti_radiation_armor.json @@ -2,34 +2,8 @@ "parent": "createnuclear:anti_radiation_armor", "criteria": { "0": { - "conditions": { - "items": [ - { - "tag": "createnuclear:anti_radiation_helmet_dye" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "1": { - "conditions": { - "items": [ - { - "tag": "createnuclear:anti_radiation_chestplate_dye" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "2": { - "conditions": { - "items": [ - { - "tag": "createnuclear:anti_radiation_leggings_dye" - } - ] - }, - "trigger": "minecraft:inventory_changed" + "conditions": {}, + "trigger": "createnuclear:dye_anti_radiation_armor_builtin" } }, "display": { @@ -41,7 +15,7 @@ "frame": "task", "hidden": false, "icon": { - "item": "createnuclear:red_anti_radiation_helmet", + "item": "createnuclear:default_anti_radiation_helmet", "nbt": "{Damage:0}" }, "show_toast": true, @@ -52,12 +26,6 @@ "requirements": [ [ "0" - ], - [ - "1" - ], - [ - "2" ] ], "sends_telemetry_event": true diff --git a/src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json b/src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json new file mode 100644 index 000000000..524586ca2 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:reactor_casing", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:reactor_rod_input" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.feeding_the_reactor.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_rod_input" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.feeding_the_reactor" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json b/src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json new file mode 100644 index 000000000..c93fd2d31 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:feeding_the_reactor", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:reactor_fluid_input" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.fueling_the_reactor.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_fluid_input" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.fueling_the_reactor" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/full_anti_radiation_armor.json b/src/generated/resources/data/createnuclear/advancements/full_anti_radiation_armor.json deleted file mode 100644 index 1cd5b6873..000000000 --- a/src/generated/resources/data/createnuclear/advancements/full_anti_radiation_armor.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "createnuclear:anti_radiation_armor", - "criteria": { - "0": { - "conditions": { - "items": [ - { - "tag": "createnuclear:anti_radiation_helmet_full_dye" - }, - { - "tag": "createnuclear:anti_radiation_chestplate_full_dye" - }, - { - "tag": "createnuclear:anti_radiation_leggings_full_dye" - }, - { - "tag": "createnuclear:anti_radiation_boots_dye" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": false, - "description": { - "color": "#DBA213", - "translate": "advancement.createnuclear.full_anti_radiation_armor.desc" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "createnuclear:white_anti_radiation_chestplate", - "nbt": "{Damage:0}" - }, - "show_toast": true, - "title": { - "translate": "advancement.createnuclear.full_anti_radiation_armor" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/getting_concentrated.json b/src/generated/resources/data/createnuclear/advancements/getting_concentrated.json new file mode 100644 index 000000000..77d665d51 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/getting_concentrated.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:chemistry_101", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:nitrogen_concentrate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.getting_concentrated.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:nitrogen_concentrate" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.getting_concentrated" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/no_time_to_die.json b/src/generated/resources/data/createnuclear/advancements/no_time_to_die.json new file mode 100644 index 000000000..c647b6ec8 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/no_time_to_die.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:reactor_controller", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:no_time_to_die_builtin" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.no_time_to_die.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:autunite" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.no_time_to_die" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/raw_thorium.json b/src/generated/resources/data/createnuclear/advancements/raw_thorium.json new file mode 100644 index 000000000..e9892c627 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/raw_thorium.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:raw_thorium" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.raw_thorium.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:raw_thorium" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.raw_thorium" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_cooler.json b/src/generated/resources/data/createnuclear/advancements/reactor_cooler.json index c5234f2ae..645138991 100644 --- a/src/generated/resources/data/createnuclear/advancements/reactor_cooler.json +++ b/src/generated/resources/data/createnuclear/advancements/reactor_cooler.json @@ -1,5 +1,5 @@ { - "parent": "createnuclear:reactor_casing", + "parent": "createnuclear:reactor_core", "criteria": { "0": { "conditions": { diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_frame.json b/src/generated/resources/data/createnuclear/advancements/reactor_frame.json index 133a61b9c..36c137e85 100644 --- a/src/generated/resources/data/createnuclear/advancements/reactor_frame.json +++ b/src/generated/resources/data/createnuclear/advancements/reactor_frame.json @@ -1,5 +1,5 @@ { - "parent": "createnuclear:reactor_casing", + "parent": "createnuclear:reactor_cooler", "criteria": { "0": { "conditions": { diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_input.json b/src/generated/resources/data/createnuclear/advancements/reactor_input.json deleted file mode 100644 index d75676dac..000000000 --- a/src/generated/resources/data/createnuclear/advancements/reactor_input.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "parent": "createnuclear:reactor_casing", - "criteria": { - "0": { - "conditions": { - "items": [ - { - "items": [ - "createnuclear:reactor_input" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": false, - "description": { - "color": "#DBA213", - "translate": "advancement.createnuclear.reactor_input.desc" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "createnuclear:reactor_input" - }, - "show_toast": true, - "title": { - "translate": "advancement.createnuclear.reactor_input" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_output.json b/src/generated/resources/data/createnuclear/advancements/reactor_output.json deleted file mode 100644 index 54b8e4b8f..000000000 --- a/src/generated/resources/data/createnuclear/advancements/reactor_output.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "parent": "createnuclear:reactor_casing", - "criteria": { - "0": { - "conditions": { - "items": [ - { - "items": [ - "createnuclear:reactor_output" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": false, - "description": { - "color": "#DBA213", - "translate": "advancement.createnuclear.reactor_output.desc" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "createnuclear:reactor_output" - }, - "show_toast": true, - "title": { - "translate": "advancement.createnuclear.reactor_output" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/brewing/crafting/reinforced_glass_bottle.json b/src/generated/resources/data/createnuclear/advancements/recipes/brewing/crafting/reinforced_glass_bottle.json new file mode 100644 index 000000000..d668153c5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/brewing/crafting/reinforced_glass_bottle.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_reinforced_glass": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:reinforced_glass" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/reinforced_glass_bottle" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_reinforced_glass", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/reinforced_glass_bottle" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/anti_radiation_boots.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/anti_radiation_boots.json deleted file mode 100644 index 565424640..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/anti_radiation_boots.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/anti_radiation_boots" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/anti_radiation_boots" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_chestplate.json deleted file mode 100644 index 31e34504e..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/black_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/black_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_helmet.json deleted file mode 100644 index fd9547037..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/black_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/black_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_leggings.json deleted file mode 100644 index aebe26611..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/black_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/black_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/black_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_chestplate.json deleted file mode 100644 index 047f28d7e..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/blue_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/blue_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_helmet.json deleted file mode 100644 index 4a04bedd7..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/blue_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/blue_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_leggings.json deleted file mode 100644 index 12da31701..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/blue_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/blue_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/blue_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_chestplate.json deleted file mode 100644 index 32883990d..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/brown_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/brown_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_helmet.json deleted file mode 100644 index 46e609543..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/brown_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/brown_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_leggings.json deleted file mode 100644 index 0124298f2..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/brown_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/brown_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/brown_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_chestplate.json deleted file mode 100644 index 6c39961a1..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/cyan_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/cyan_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_helmet.json deleted file mode 100644 index aae36f9b1..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/cyan_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/cyan_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_leggings.json deleted file mode 100644 index f72f9edbb..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/cyan_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/cyan_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/cyan_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_boots.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_boots.json new file mode 100644 index 000000000..af5a591da --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_boots.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/items/armors/default_anti_radiation_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/items/armors/default_anti_radiation_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_chestplate.json new file mode 100644 index 000000000..093d00d53 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_chestplate.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/items/armors/default_anti_radiation_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/items/armors/default_anti_radiation_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_helmet.json new file mode 100644 index 000000000..26bc01fb9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_helmet.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/items/armors/default_anti_radiation_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/items/armors/default_anti_radiation_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_leggings.json new file mode 100644 index 000000000..ca8b8b935 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/default_anti_radiation_leggings.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/items/armors/default_anti_radiation_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/items/armors/default_anti_radiation_leggings" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_chestplate.json deleted file mode 100644 index 0b05ed970..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/gray_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/gray_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_helmet.json deleted file mode 100644 index b6e37d80c..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/gray_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/gray_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_leggings.json deleted file mode 100644 index c65d337be..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/gray_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/gray_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/gray_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_chestplate.json deleted file mode 100644 index 6bf46ef69..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/green_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/green_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_helmet.json deleted file mode 100644 index 7a6088d4b..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/green_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/green_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_leggings.json deleted file mode 100644 index 54e1223ca..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/green_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/green_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/green_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_chestplate.json deleted file mode 100644 index 0b79ba850..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_blue_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_blue_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_helmet.json deleted file mode 100644 index d17a30b94..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_blue_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_blue_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_leggings.json deleted file mode 100644 index 064dee9e5..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_blue_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_blue_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_blue_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_chestplate.json deleted file mode 100644 index 083b4a842..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_gray_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_gray_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_helmet.json deleted file mode 100644 index 7715e1b0f..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_gray_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_gray_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_leggings.json deleted file mode 100644 index 09ce1b425..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/light_gray_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/light_gray_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/light_gray_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_chestplate.json deleted file mode 100644 index d3dde0706..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/lime_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/lime_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_helmet.json deleted file mode 100644 index 80e4165a1..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/lime_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/lime_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_leggings.json deleted file mode 100644 index d3ffe2947..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/lime_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/lime_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/lime_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_chestplate.json deleted file mode 100644 index be2d2aaa2..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/magenta_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/magenta_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_helmet.json deleted file mode 100644 index b810dae59..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/magenta_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/magenta_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_leggings.json deleted file mode 100644 index 278489f2b..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/magenta_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/magenta_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/magenta_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_chestplate.json deleted file mode 100644 index 9a30a7c64..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/orange_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/orange_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_helmet.json deleted file mode 100644 index 1aa187dd5..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/orange_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/orange_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_leggings.json deleted file mode 100644 index 457b51189..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/orange_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/orange_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/orange_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_chestplate.json deleted file mode 100644 index 29f2f24cd..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/pink_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/pink_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_helmet.json deleted file mode 100644 index 74945a9ae..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/pink_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/pink_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_leggings.json deleted file mode 100644 index 953375fcc..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/pink_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/pink_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/pink_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_chestplate.json deleted file mode 100644 index 86bf3d154..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/purple_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/purple_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_helmet.json deleted file mode 100644 index a996f502a..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/purple_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/purple_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_leggings.json deleted file mode 100644 index d70567ffa..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/purple_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/purple_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/purple_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_chestplate.json deleted file mode 100644 index d538ed190..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/red_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/red_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_helmet.json deleted file mode 100644 index 2e2d909b1..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/red_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/red_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_leggings.json deleted file mode 100644 index d06aa6fd6..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/red_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/red_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/red_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_chestplate.json deleted file mode 100644 index 57e6a8a1d..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/white_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/white_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_helmet.json deleted file mode 100644 index b095d3c19..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/white_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/white_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_leggings.json deleted file mode 100644 index 3f974fd79..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/white_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/white_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/white_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_chestplate.json deleted file mode 100644 index 7d3b89bad..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_chestplate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/yellow_anti_radiation_chestplate" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/yellow_anti_radiation_chestplate" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_helmet.json deleted file mode 100644 index 0ee9523f7..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_helmet.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/yellow_anti_radiation_helmet" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/yellow_anti_radiation_helmet" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_leggings.json deleted file mode 100644 index ac6f93040..000000000 --- a/src/generated/resources/data/createnuclear/advancements/recipes/combat/crafting/items/armors/yellow_anti_radiation_leggings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_cloth": { - "conditions": { - "items": [ - { - "tag": "createnuclear:cloth" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "createnuclear:crafting/items/armors/yellow_anti_radiation_leggings" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "createnuclear:crafting/items/armors/yellow_anti_radiation_leggings" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_black.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_black.json new file mode 100644 index 000000000..975a1e989 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_black.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_black" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_blue.json new file mode 100644 index 000000000..b4a6e5927 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_brown.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_brown.json new file mode 100644 index 000000000..2796e1064 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_brown.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_brown" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_cyan.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_cyan.json new file mode 100644 index 000000000..02ef5fac9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_cyan.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_cyan" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_gray.json new file mode 100644 index 000000000..5c8108563 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_green.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_green.json new file mode 100644 index 000000000..f93992915 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_green.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_green" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_blue.json new file mode 100644 index 000000000..011cd56fb --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_light_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_gray.json new file mode 100644 index 000000000..b287c1695 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_light_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_light_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_lime.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_lime.json new file mode 100644 index 000000000..95afd3549 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_lime.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_lime" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_magenta.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_magenta.json new file mode 100644 index 000000000..be7be9e95 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_magenta.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_magenta" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_orange.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_orange.json new file mode 100644 index 000000000..b79a9a70d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_orange.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_orange" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_pink.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_pink.json new file mode 100644 index 000000000..c53b2f46c --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_pink.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_pink" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_purple.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_purple.json new file mode 100644 index 000000000..b1b7b53be --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_purple.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_purple" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_red.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_red.json new file mode 100644 index 000000000..a202e6a89 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_red.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_red" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_white.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_white.json new file mode 100644 index 000000000..655b80248 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_white.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_white" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_yellow.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_yellow.json new file mode 100644 index 000000000..17e183208 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_boots_yellow.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_boots_yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_boots_yellow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_black.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_black.json new file mode 100644 index 000000000..0b8425f59 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_black.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_black" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_blue.json new file mode 100644 index 000000000..a699e4cdf --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_brown.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_brown.json new file mode 100644 index 000000000..a9ca8d1ee --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_brown.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_brown" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_cyan.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_cyan.json new file mode 100644 index 000000000..7f0985e81 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_cyan.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_cyan" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_gray.json new file mode 100644 index 000000000..96f2b0123 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_green.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_green.json new file mode 100644 index 000000000..dcf3653ff --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_green.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_green" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_blue.json new file mode 100644 index 000000000..18aaf609f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_light_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_gray.json new file mode 100644 index 000000000..4a26eda86 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_light_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_light_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_lime.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_lime.json new file mode 100644 index 000000000..0898dc9f9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_lime.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_lime" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_magenta.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_magenta.json new file mode 100644 index 000000000..c75067057 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_magenta.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_magenta" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_orange.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_orange.json new file mode 100644 index 000000000..c0d972249 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_orange.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_orange" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_pink.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_pink.json new file mode 100644 index 000000000..cdff8611d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_pink.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_pink" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_purple.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_purple.json new file mode 100644 index 000000000..cc7f38c67 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_purple.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_purple" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_red.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_red.json new file mode 100644 index 000000000..1682d0370 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_red.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_red" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_white.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_white.json new file mode 100644 index 000000000..a0bce47cc --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_white.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_white" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_yellow.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_yellow.json new file mode 100644 index 000000000..c8c6dd357 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_chestplate_yellow.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_chestplate_yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_chestplate_yellow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_black.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_black.json new file mode 100644 index 000000000..b4ceadf2d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_black.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_black" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_blue.json new file mode 100644 index 000000000..4f6889de7 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_brown.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_brown.json new file mode 100644 index 000000000..644340103 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_brown.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_brown" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_cyan.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_cyan.json new file mode 100644 index 000000000..84f15992f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_cyan.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_cyan" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_gray.json new file mode 100644 index 000000000..f4ec71add --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_green.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_green.json new file mode 100644 index 000000000..36e06e650 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_green.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_green" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_blue.json new file mode 100644 index 000000000..f480ca2a4 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_light_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_gray.json new file mode 100644 index 000000000..79492d6d1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_light_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_light_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_lime.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_lime.json new file mode 100644 index 000000000..7629e3b8a --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_lime.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_lime" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_magenta.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_magenta.json new file mode 100644 index 000000000..eadbcd4ee --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_magenta.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_magenta" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_orange.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_orange.json new file mode 100644 index 000000000..5c54de2a9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_orange.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_orange" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_pink.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_pink.json new file mode 100644 index 000000000..904491cc0 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_pink.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_pink" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_purple.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_purple.json new file mode 100644 index 000000000..a5d990207 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_purple.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_purple" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_red.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_red.json new file mode 100644 index 000000000..e9296d67e --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_red.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_red" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_white.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_white.json new file mode 100644 index 000000000..4847362a9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_white.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_white" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_yellow.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_yellow.json new file mode 100644 index 000000000..acd0b532c --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_helmet_yellow.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_helmet_yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_helmet_yellow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_black.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_black.json new file mode 100644 index 000000000..a59c137dd --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_black.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_black" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_blue.json new file mode 100644 index 000000000..51d0d0d6f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_brown.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_brown.json new file mode 100644 index 000000000..52fced95a --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_brown.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_brown" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_cyan.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_cyan.json new file mode 100644 index 000000000..7874b9a15 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_cyan.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_cyan" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_gray.json new file mode 100644 index 000000000..a6cf2f7c8 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_green.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_green.json new file mode 100644 index 000000000..63be3add5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_green.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_green" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_blue.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_blue.json new file mode 100644 index 000000000..b7c47ba8f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_blue.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_light_blue" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_gray.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_gray.json new file mode 100644 index 000000000..b3efd7fc2 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_light_gray.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_light_gray" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_lime.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_lime.json new file mode 100644 index 000000000..2da4f4b2d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_lime.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_lime" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_magenta.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_magenta.json new file mode 100644 index 000000000..e69e6e556 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_magenta.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_magenta" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_orange.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_orange.json new file mode 100644 index 000000000..0e31fed08 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_orange.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_orange" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_pink.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_pink.json new file mode 100644 index 000000000..0cf2e0669 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_pink.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_pink" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_purple.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_purple.json new file mode 100644 index 000000000..d43bf893b --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_purple.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_purple" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_red.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_red.json new file mode 100644 index 000000000..c34f96996 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_red.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_red" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_white.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_white.json new file mode 100644 index 000000000..fdbf161d7 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_white.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_white" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_yellow.json b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_yellow.json new file mode 100644 index 000000000..f21996769 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/combat/smithing/default_anti_radiation_leggings_yellow.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cloth": { + "conditions": { + "items": [ + { + "tag": "createnuclear:cloth" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smithing/default_anti_radiation_leggings_yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smithing/default_anti_radiation_leggings_yellow" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/decorations/crafting/raw/raw_thorium_block.json b/src/generated/resources/data/createnuclear/advancements/recipes/decorations/crafting/raw/raw_thorium_block.json new file mode 100644 index 000000000..eef051ea1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/decorations/crafting/raw/raw_thorium_block.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_raw_materials_thorium": { + "conditions": { + "items": [ + { + "tag": "forge:raw_materials/thorium" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/raw/raw_thorium_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_raw_materials_thorium", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/raw/raw_thorium_block" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json index c183b29e3..b84799aac 100644 --- a/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/lead_ingot_for_lead_ore.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "createnuclear:lead_ores" + "tag": "forge:ores/lead" } ] }, diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 000000000..54f00179d --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:nitrate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:blasting/nitrogen_concentrate_for_nitrogen_concentrate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:blasting/nitrogen_concentrate_for_nitrogen_concentrate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json index 1f43dc31a..16c0707ac 100644 --- a/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "createnuclear:uranium_ores" + "tag": "forge:ores/uranium" } ] }, diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/biome_irradiation_extractor.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/biome_irradiation_extractor.json new file mode 100644 index 000000000..ffc2d3d66 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/biome_irradiation_extractor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_reinforced_glass_bottle": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:reinforced_glass_bottle" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/biome_irradiation_extractor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_reinforced_glass_bottle", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/biome_irradiation_extractor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/raw_thorium_from_decompacting.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/raw_thorium_from_decompacting.json new file mode 100644 index 000000000..8714d6c31 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/raw_thorium_from_decompacting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_storage_blocks_raw_thorium": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/raw_thorium" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/raw_thorium_from_decompacting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_storage_blocks_raw_thorium", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/raw_thorium_from_decompacting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_block_from_compacting.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_block_from_compacting.json new file mode 100644 index 000000000..41395a7df --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_block_from_compacting.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/thorium_block_from_compacting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/thorium_block_from_compacting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_compacting.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_compacting.json new file mode 100644 index 000000000..1a95a7462 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_compacting.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_nugget" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/thorium_ingot_from_compacting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/thorium_ingot_from_compacting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_decompacting.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_decompacting.json new file mode 100644 index 000000000..371a7ecb8 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_ingot_from_decompacting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_storage_blocks_thorium": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/thorium" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/thorium_ingot_from_decompacting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_storage_blocks_thorium", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/thorium_ingot_from_decompacting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_nugget_from_decompacting.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_nugget_from_decompacting.json new file mode 100644 index 000000000..59a82317c --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/crafting/thorium_nugget_from_decompacting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_storage_blocks_steel_nugget": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/thorium" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:crafting/thorium_nugget_from_decompacting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_storage_blocks_steel_nugget", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:crafting/thorium_nugget_from_decompacting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json index ef898e54a..41f985b73 100644 --- a/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/lead_ingot_for_lead_ore.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "createnuclear:lead_ores" + "tag": "forge:ores/lead" } ] }, diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 000000000..09ddb6b1f --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:nitrate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "createnuclear:smelting/nitrogen_concentrate_for_nitrogen_concentrate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "createnuclear:smelting/nitrogen_concentrate_for_nitrogen_concentrate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json index 9546f8e86..de59f0e21 100644 --- a/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json +++ b/src/generated/resources/data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "createnuclear:uranium_ores" + "tag": "forge:ores/uranium" } ] }, diff --git a/src/generated/resources/data/createnuclear/advancements/root.json b/src/generated/resources/data/createnuclear/advancements/root.json index 25c8d91c3..5bf588595 100644 --- a/src/generated/resources/data/createnuclear/advancements/root.json +++ b/src/generated/resources/data/createnuclear/advancements/root.json @@ -7,7 +7,7 @@ }, "display": { "announce_to_chat": false, - "background": "createnuclear:textures/block/steel_block.png", + "background": "createnuclear:textures/gui/advancements/backgrounds/background_advancement.png", "description": { "color": "#DBA213", "translate": "advancement.createnuclear.root.desc" diff --git a/src/generated/resources/data/createnuclear/advancements/silence_the_core.json b/src/generated/resources/data/createnuclear/advancements/silence_the_core.json new file mode 100644 index 000000000..9a043c6bf --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/silence_the_core.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:reactor_casing", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:silence_the_core_builtin" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.silence_the_core.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_alarm" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.silence_the_core" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/t1.json b/src/generated/resources/data/createnuclear/advancements/t1.json new file mode 100644 index 000000000..a455a01fd --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/t1.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:reactor_controller", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:t1_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.t1.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_controller" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.t1" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/t2.json b/src/generated/resources/data/createnuclear/advancements/t2.json new file mode 100644 index 000000000..f2b79c586 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/t2.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:t1", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:t2_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.t2.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_controller" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.t2" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/t3.json b/src/generated/resources/data/createnuclear/advancements/t3.json new file mode 100644 index 000000000..9ee16d3cb --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/t3.json @@ -0,0 +1,31 @@ +{ + "parent": "createnuclear:t2", + "criteria": { + "0": { + "conditions": {}, + "trigger": "createnuclear:t3_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.t3.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_controller" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.t3" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/thorium_dust.json b/src/generated/resources/data/createnuclear/advancements/thorium_dust.json new file mode 100644 index 000000000..12edf0406 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/thorium_dust.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:raw_thorium", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_dust" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.thorium_dust.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:thorium_dust" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.thorium_dust" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/thorium_ingot.json b/src/generated/resources/data/createnuclear/advancements/thorium_ingot.json new file mode 100644 index 000000000..24d367e92 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/thorium_ingot.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:thorium_liquid", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.thorium_ingot.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:thorium_ingot" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.thorium_ingot" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/thorium_liquid.json b/src/generated/resources/data/createnuclear/advancements/thorium_liquid.json new file mode 100644 index 000000000..9df58df6a --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/thorium_liquid.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:thorium_dust", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_bucket" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.thorium_liquid.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:thorium_bucket" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.thorium_liquid" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/thorium_rod.json b/src/generated/resources/data/createnuclear/advancements/thorium_rod.json new file mode 100644 index 000000000..8a9226505 --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/thorium_rod.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:thorium_ingot", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:thorium_rod" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.thorium_rod.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:thorium_rod" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.thorium_rod" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/unlimited_power.json b/src/generated/resources/data/createnuclear/advancements/unlimited_power.json new file mode 100644 index 000000000..afa6ecc5e --- /dev/null +++ b/src/generated/resources/data/createnuclear/advancements/unlimited_power.json @@ -0,0 +1,39 @@ +{ + "parent": "createnuclear:fueling_the_reactor", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "createnuclear:reactor_output" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.createnuclear.unlimited_power.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "createnuclear:reactor_output" + }, + "show_toast": true, + "title": { + "translate": "advancement.createnuclear.unlimited_power" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json new file mode 100644 index 000000000..ea208e24d --- /dev/null +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json @@ -0,0 +1,5 @@ +{ + "efficiency": -1, + "fluid": "minecraft:empty", + "maxHeat": -1 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json new file mode 100644 index 000000000..62e15f99d --- /dev/null +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json @@ -0,0 +1,5 @@ +{ + "efficiency": 100, + "fluid": "createnuclear:nitrogen", + "maxHeat": 8196 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json new file mode 100644 index 000000000..5a3ff5851 --- /dev/null +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json @@ -0,0 +1,5 @@ +{ + "efficiency": 1000, + "fluid": "minecraft:water", + "maxHeat": 2048 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json b/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json new file mode 100644 index 000000000..57c68b48d --- /dev/null +++ b/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json @@ -0,0 +1,7 @@ +{ + "type": "NONE", + "baseRodHeat": -1, + "item": "minecraft:air", + "proximityRodHeat": -1.0, + "rodTimer": -1 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/damage_type/fan_radiation.json b/src/generated/resources/data/createnuclear/damage_type/fan_radiation.json new file mode 100644 index 000000000..3e835918d --- /dev/null +++ b/src/generated/resources/data/createnuclear/damage_type/fan_radiation.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "createnuclear.fan_radiation", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/damage_type/radiation.json b/src/generated/resources/data/createnuclear/damage_type/radiation.json new file mode 100644 index 000000000..afbca531a --- /dev/null +++ b/src/generated/resources/data/createnuclear/damage_type/radiation.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "createnuclear.radiation", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/forge/biome_modifier/nitrate_ore.json b/src/generated/resources/data/createnuclear/forge/biome_modifier/nitrate_ore.json new file mode 100644 index 000000000..93d40d505 --- /dev/null +++ b/src/generated/resources/data/createnuclear/forge/biome_modifier/nitrate_ore.json @@ -0,0 +1,6 @@ +{ + "type": "forge:add_features", + "biomes": "#minecraft:is_overworld", + "features": "createnuclear:nitrate_ore", + "step": "underground_ores" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/forge/biome_modifier/thorium_ore.json b/src/generated/resources/data/createnuclear/forge/biome_modifier/thorium_ore.json new file mode 100644 index 000000000..a73171cf4 --- /dev/null +++ b/src/generated/resources/data/createnuclear/forge/biome_modifier/thorium_ore.json @@ -0,0 +1,6 @@ +{ + "type": "forge:add_features", + "biomes": "#minecraft:is_overworld", + "features": "createnuclear:thorium_ore", + "step": "underground_ores" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json index 7192930ea..0f0097b66 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_lead_ore.json @@ -29,10 +29,22 @@ { "type": "minecraft:item", "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, { "enchantment": "minecraft:fortune", - "formula": "minecraft:ore_drops", - "function": "minecraft:apply_bonus" + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 4 + } }, { "function": "minecraft:explosion_decay" diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_nitrate_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_nitrate_ore.json new file mode 100644 index 000000000..68e7454f0 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_nitrate_ore.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "createnuclear:deepslate_nitrate_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "createnuclear:nitrate" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/deepslate_nitrate_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_thorium_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_thorium_ore.json new file mode 100644 index 000000000..022ffce4c --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_thorium_ore.json @@ -0,0 +1,62 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "createnuclear:deepslate_thorium_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 5 + } + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "createnuclear:raw_thorium" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/deepslate_thorium_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json index 54ae2818a..f0281cdcd 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/deepslate_uranium_ore.json @@ -29,10 +29,22 @@ { "type": "minecraft:item", "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + }, { "enchantment": "minecraft:fortune", - "formula": "minecraft:ore_drops", - "function": "minecraft:apply_bonus" + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } }, { "function": "minecraft:explosion_decay" diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/lead_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/lead_ore.json index 0a862a1d9..ab97be78e 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/lead_ore.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/lead_ore.json @@ -29,10 +29,22 @@ { "type": "minecraft:item", "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, { "enchantment": "minecraft:fortune", - "formula": "minecraft:ore_drops", - "function": "minecraft:apply_bonus" + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 4 + } }, { "function": "minecraft:explosion_decay" diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/nitrate_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/nitrate_ore.json new file mode 100644 index 000000000..ca030c723 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/nitrate_ore.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "createnuclear:nitrate_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "createnuclear:nitrate" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/nitrate_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/raw_thorium_block.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/raw_thorium_block.json new file mode 100644 index 000000000..cb40bb6af --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/raw_thorium_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "createnuclear:raw_thorium_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/raw_thorium_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_alarm.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_alarm.json new file mode 100644 index 000000000..3a46c7a09 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_alarm.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "createnuclear:reactor_alarm" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/reactor_alarm" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json new file mode 100644 index 000000000..6fb4edd06 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "createnuclear:reactor_fluid_input" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/reactor_fluid_input" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_input.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_input.json deleted file mode 100644 index 12d085210..000000000 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_input.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "createnuclear:reactor_input" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "createnuclear:blocks/reactor_input" -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_rod_input.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_rod_input.json new file mode 100644 index 000000000..bc7116980 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_rod_input.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "createnuclear:reactor_rod_input" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/reactor_rod_input" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_block.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_block.json new file mode 100644 index 000000000..346c8684d --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "createnuclear:thorium_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/thorium_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_ore.json new file mode 100644 index 000000000..059c3dbf3 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_ore.json @@ -0,0 +1,62 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "createnuclear:thorium_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 5 + } + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "createnuclear:raw_thorium" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "createnuclear:blocks/thorium_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/uranium_ore.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/uranium_ore.json index 3cca83169..621d0daa0 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/uranium_ore.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/uranium_ore.json @@ -29,10 +29,22 @@ { "type": "minecraft:item", "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + }, { "enchantment": "minecraft:fortune", - "formula": "minecraft:ore_drops", - "function": "minecraft:apply_bonus" + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } }, { "function": "minecraft:explosion_decay" diff --git a/src/generated/resources/data/createnuclear/loot_tables/entities/irradiated_cow.json b/src/generated/resources/data/createnuclear/loot_tables/entities/irradiated_cow.json new file mode 100644 index 000000000..43e6419a1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/loot_tables/entities/irradiated_cow.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:entity", + "random_sequence": "createnuclear:entities/irradiated_cow" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json b/src/generated/resources/data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json index c23f6e805..7bd43baf4 100644 --- a/src/generated/resources/data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json +++ b/src/generated/resources/data/createnuclear/recipes/blasting/lead_ingot_for_lead_ore.json @@ -4,7 +4,7 @@ "cookingtime": 100, "experience": 0.1, "ingredient": { - "tag": "createnuclear:lead_ores" + "tag": "forge:ores/lead" }, "result": "createnuclear:lead_ingot" } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipes/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 000000000..5394b287d --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:blasting", + "category": "misc", + "cookingtime": 100, + "experience": 0.1, + "ingredient": { + "item": "createnuclear:nitrate" + }, + "result": "createnuclear:nitrogen_concentrate" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json b/src/generated/resources/data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json index c170a2b90..44017de5c 100644 --- a/src/generated/resources/data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json +++ b/src/generated/resources/data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.json @@ -4,7 +4,7 @@ "cookingtime": 100, "experience": 0.1, "ingredient": { - "tag": "createnuclear:uranium_ores" + "tag": "forge:ores/uranium" }, "result": "createnuclear:raw_uranium" } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/compacting/thorium_fluid_to_thorium_ingot.json b/src/generated/resources/data/createnuclear/recipes/compacting/thorium_fluid_to_thorium_ingot.json new file mode 100644 index 000000000..2bc6c7864 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/compacting/thorium_fluid_to_thorium_ingot.json @@ -0,0 +1,14 @@ +{ + "type": "create:compacting", + "ingredients": [ + { + "amount": 200, + "fluidTag": "createnuclear:thorium" + } + ], + "results": [ + { + "item": "createnuclear:thorium_ingot" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/biome_irradiation_extractor.json b/src/generated/resources/data/createnuclear/recipes/crafting/biome_irradiation_extractor.json new file mode 100644 index 000000000..614a619fc --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/biome_irradiation_extractor.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "B": { + "item": "createnuclear:reinforced_glass_bottle" + }, + "S": { + "item": "minecraft:nether_star" + } + }, + "pattern": [ + "BBB", + "BSB", + "BBB" + ], + "result": { + "count": 8, + "item": "createnuclear:biome_irradiation_extractor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/anti_radiation_boots.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/anti_radiation_boots.json deleted file mode 100644 index 35150c61b..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/anti_radiation_boots.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:white_cloth" - } - }, - "pattern": [ - "Y Y", - "X X" - ], - "result": { - "item": "createnuclear:anti_radiation_boots" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_chestplate.json deleted file mode 100644 index d9073104d..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:black_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:black_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_helmet.json deleted file mode 100644 index 36bde71e9..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:black_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:black_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_leggings.json deleted file mode 100644 index d6aff22ca..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/black_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:black_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:black_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_chestplate.json deleted file mode 100644 index 6f6c0c38a..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:blue_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:blue_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_helmet.json deleted file mode 100644 index 91fefbc14..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:blue_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:blue_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_leggings.json deleted file mode 100644 index ccd90d07e..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/blue_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:blue_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:blue_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_chestplate.json deleted file mode 100644 index 9dcb4b2f8..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:brown_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:brown_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_helmet.json deleted file mode 100644 index 8e2aa2e46..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:brown_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:brown_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_leggings.json deleted file mode 100644 index 03b12752b..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/brown_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:brown_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:brown_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_chestplate.json deleted file mode 100644 index 0349e2332..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:cyan_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:cyan_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_helmet.json deleted file mode 100644 index 31a6f90f1..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:cyan_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:cyan_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_leggings.json deleted file mode 100644 index b6e2185c0..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/cyan_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:cyan_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:cyan_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_boots.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_boots.json new file mode 100644 index 000000000..777e83f2c --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_boots.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "X": { + "tag": "forge:ingots/lead" + }, + "Y": { + "tag": "forge:ingots/brass" + } + }, + "pattern": [ + "Y Y", + "X X" + ], + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_chestplate.json new file mode 100644 index 000000000..f5e0849f0 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_chestplate.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "X": { + "tag": "forge:ingots/lead" + }, + "Y": { + "tag": "forge:ingots/brass" + }, + "Z": { + "item": "createnuclear:graphite_rod" + } + }, + "pattern": [ + "Y Y", + "XXX", + "ZXZ" + ], + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_helmet.json new file mode 100644 index 000000000..7919e5237 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_helmet.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "X": { + "tag": "forge:ingots/lead" + }, + "Y": { + "tag": "forge:ingots/brass" + }, + "Z": { + "item": "createnuclear:reinforced_glass" + } + }, + "pattern": [ + "YXY", + "XZX" + ], + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_leggings.json new file mode 100644 index 000000000..f92f44fb2 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_leggings.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "X": { + "tag": "forge:ingots/lead" + }, + "Y": { + "tag": "forge:ingots/brass" + } + }, + "pattern": [ + "YXY", + "X X", + "Y Y" + ], + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_chestplate.json deleted file mode 100644 index 20d987e9d..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:gray_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:gray_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_helmet.json deleted file mode 100644 index 94edf59fb..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:gray_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:gray_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_leggings.json deleted file mode 100644 index a0b40ba6c..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/gray_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:gray_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:gray_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_chestplate.json deleted file mode 100644 index 9e7750eeb..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:green_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:green_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_helmet.json deleted file mode 100644 index 326ed348e..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:green_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:green_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_leggings.json deleted file mode 100644 index d0151a022..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/green_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:green_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:green_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_chestplate.json deleted file mode 100644 index 96aa297c7..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_blue_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:light_blue_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_helmet.json deleted file mode 100644 index 9bcd4e3e7..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_blue_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:light_blue_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_leggings.json deleted file mode 100644 index 888a27c01..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_blue_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_blue_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:light_blue_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_chestplate.json deleted file mode 100644 index 1a35a6fe2..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_gray_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:light_gray_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_helmet.json deleted file mode 100644 index ca2caaf8e..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_gray_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:light_gray_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_leggings.json deleted file mode 100644 index 4caa0ef60..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/light_gray_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:light_gray_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:light_gray_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_chestplate.json deleted file mode 100644 index 642c0f656..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:lime_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:lime_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_helmet.json deleted file mode 100644 index fcab0ace7..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:lime_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:lime_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_leggings.json deleted file mode 100644 index a6352d552..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/lime_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:lime_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:lime_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_chestplate.json deleted file mode 100644 index 705708eb4..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:magenta_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:magenta_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_helmet.json deleted file mode 100644 index a2bd7f978..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:magenta_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:magenta_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_leggings.json deleted file mode 100644 index 3106d87bf..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/magenta_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:magenta_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:magenta_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_chestplate.json deleted file mode 100644 index 64b168fe6..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:orange_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:orange_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_helmet.json deleted file mode 100644 index a9da8cb86..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:orange_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:orange_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_leggings.json deleted file mode 100644 index f42ac77f2..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/orange_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:orange_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:orange_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_chestplate.json deleted file mode 100644 index 63191b246..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:pink_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:pink_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_helmet.json deleted file mode 100644 index b4be9ae90..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:pink_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:pink_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_leggings.json deleted file mode 100644 index 266f30a10..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/pink_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:pink_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:pink_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_chestplate.json deleted file mode 100644 index 08be0f1b8..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:purple_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:purple_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_helmet.json deleted file mode 100644 index 5b8df04fa..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:purple_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:purple_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_leggings.json deleted file mode 100644 index a60928b0e..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/purple_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:purple_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:purple_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_chestplate.json deleted file mode 100644 index 1f1f7b6c6..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:red_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:red_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_helmet.json deleted file mode 100644 index 1cffa5a48..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:red_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:red_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_leggings.json deleted file mode 100644 index 4e30f9ae5..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/red_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:red_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:red_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_chestplate.json deleted file mode 100644 index 1e59e7be5..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:white_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:white_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_helmet.json deleted file mode 100644 index b34562237..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:white_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:white_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_leggings.json deleted file mode 100644 index 746a84475..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/white_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:white_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:white_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_chestplate.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_chestplate.json deleted file mode 100644 index a3974a4a3..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_chestplate.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:yellow_cloth" - }, - "Z": { - "item": "createnuclear:graphite_rod" - } - }, - "pattern": [ - "Y Y", - "XXX", - "ZXZ" - ], - "result": { - "item": "createnuclear:yellow_anti_radiation_chestplate" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_helmet.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_helmet.json deleted file mode 100644 index 93ff086e0..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_helmet.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:yellow_cloth" - }, - "Z": { - "item": "createnuclear:reinforced_glass" - } - }, - "pattern": [ - "YXY", - "XZX" - ], - "result": { - "item": "createnuclear:yellow_anti_radiation_helmet" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_leggings.json b/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_leggings.json deleted file mode 100644 index c912c258a..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crafting/items/armors/yellow_anti_radiation_leggings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "equipment", - "key": { - "X": { - "tag": "forge:ingots/lead" - }, - "Y": { - "item": "createnuclear:yellow_cloth" - } - }, - "pattern": [ - "YXY", - "X X", - "Y Y" - ], - "result": { - "item": "createnuclear:yellow_anti_radiation_leggings" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/raw/raw_thorium_block.json b/src/generated/resources/data/createnuclear/recipes/crafting/raw/raw_thorium_block.json new file mode 100644 index 000000000..96297fcdf --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/raw/raw_thorium_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "R": { + "tag": "forge:raw_materials/thorium" + } + }, + "pattern": [ + "RRR", + "RRR", + "RRR" + ], + "result": { + "item": "createnuclear:raw_thorium_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/raw_thorium_from_decompacting.json b/src/generated/resources/data/createnuclear/recipes/crafting/raw_thorium_from_decompacting.json new file mode 100644 index 000000000..f2e1f2752 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/raw_thorium_from_decompacting.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/raw_thorium" + } + ], + "result": { + "count": 9, + "item": "createnuclear:raw_thorium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/reinforced_glass_bottle.json b/src/generated/resources/data/createnuclear/recipes/crafting/reinforced_glass_bottle.json new file mode 100644 index 000000000..2fb590a3f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/reinforced_glass_bottle.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "G": { + "item": "createnuclear:reinforced_glass" + } + }, + "pattern": [ + "G G", + " G " + ], + "result": { + "count": 3, + "item": "createnuclear:reinforced_glass_bottle" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/thorium_block_from_compacting.json b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_block_from_compacting.json new file mode 100644 index 000000000..e7a4037c1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_block_from_compacting.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "tag": "forge:ingots/thorium" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "createnuclear:thorium_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_compacting.json b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_compacting.json new file mode 100644 index 000000000..09d7e66d4 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_compacting.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "tag": "forge:nuggets/thorium" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "createnuclear:thorium_ingot" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_decompacting.json b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_decompacting.json new file mode 100644 index 000000000..4c062d448 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_ingot_from_decompacting.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/thorium" + } + ], + "result": { + "count": 9, + "item": "createnuclear:thorium_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crafting/thorium_nugget_from_decompacting.json b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_nugget_from_decompacting.json new file mode 100644 index 000000000..4f664dd18 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crafting/thorium_nugget_from_decompacting.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:ingots/thorium" + } + ], + "result": { + "count": 9, + "item": "createnuclear:thorium_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crushing/nitrate.json b/src/generated/resources/data/createnuclear/recipes/crushing/nitrate.json new file mode 100644 index 000000000..32ce6c228 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crushing/nitrate.json @@ -0,0 +1,19 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "tag": "create:stone_types/limestone" + } + ], + "processingTime": 250, + "results": [ + { + "chance": 0.6, + "item": "createnuclear:nitrate" + }, + { + "chance": 0.4, + "item": "createnuclear:lead_nugget" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json new file mode 100644 index 000000000..618069e91 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json @@ -0,0 +1,18 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "createnuclear:raw_thorium" + } + ], + "processingTime": 125, + "results": [ + { + "item": "createnuclear:thorium_dust" + }, + { + "chance": 0.75, + "item": "create:experience_nugget" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium_block.json b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium_block.json new file mode 100644 index 000000000..b786a807f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium_block.json @@ -0,0 +1,20 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "createnuclear:raw_thorium_block" + } + ], + "processingTime": 250, + "results": [ + { + "count": 9, + "item": "createnuclear:thorium_dust" + }, + { + "chance": 0.75, + "count": 9, + "item": "create:experience_nugget" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/crushing/raw_uranium_block.json b/src/generated/resources/data/createnuclear/recipes/crushing/raw_uranium_block.json deleted file mode 100644 index d029985c6..000000000 --- a/src/generated/resources/data/createnuclear/recipes/crushing/raw_uranium_block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:crushing", - "ingredients": [ - { - "item": "createnuclear:raw_uranium_block" - } - ], - "processingTime": 250, - "results": [ - { - "count": 81, - "item": "createnuclear:uranium_powder" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json new file mode 100644 index 000000000..c7a3c9643 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_fluid_input_from_fluid_pipe_and_reactor_casing.json @@ -0,0 +1,16 @@ +{ + "type": "create:deploying", + "ingredients": [ + { + "item": "createnuclear:reactor_casing" + }, + { + "item": "create:fluid_pipe" + } + ], + "results": [ + { + "item": "createnuclear:reactor_fluid_input" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/item_application/reactor_output_from_shaft_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_output_from_shaft_and_reactor_casing.json similarity index 84% rename from src/generated/resources/data/createnuclear/recipes/item_application/reactor_output_from_shaft_and_reactor_casing.json rename to src/generated/resources/data/createnuclear/recipes/deploying/reactor_output_from_shaft_and_reactor_casing.json index 9a1e6c116..c31c429f2 100644 --- a/src/generated/resources/data/createnuclear/recipes/item_application/reactor_output_from_shaft_and_reactor_casing.json +++ b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_output_from_shaft_and_reactor_casing.json @@ -1,5 +1,5 @@ { - "type": "create:item_application", + "type": "create:deploying", "ingredients": [ { "item": "createnuclear:reactor_casing" diff --git a/src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json new file mode 100644 index 000000000..e0d05ca41 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json @@ -0,0 +1,16 @@ +{ + "type": "create:deploying", + "ingredients": [ + { + "item": "createnuclear:reactor_casing" + }, + { + "item": "minecraft:hopper" + } + ], + "results": [ + { + "item": "createnuclear:reactor_rod_input" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json deleted file mode 100644 index f5690f240..000000000 --- a/src/generated/resources/data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "create:item_application", - "ingredients": [ - { - "item": "createnuclear:reactor_casing" - }, - { - "item": "minecraft:hopper" - } - ], - "results": [ - { - "item": "createnuclear:reactor_input" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_alarm.json b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_alarm.json new file mode 100644 index 000000000..01ad04cb0 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_alarm.json @@ -0,0 +1,28 @@ +{ + "type": "create:mechanical_crafting", + "acceptMirrored": true, + "key": { + "C": { + "item": "createnuclear:reactor_casing" + }, + "L": { + "item": "minecraft:clock" + }, + "N": { + "item": "minecraft:note_block" + }, + "R": { + "item": "minecraft:repeater" + } + }, + "pattern": [ + "CCCCC", + "CNRNC", + "CRLRC", + "CNRNC", + "CCCCC" + ], + "result": { + "item": "createnuclear:reactor_alarm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_frame.json b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_frame.json index a9e6a52b0..c29d711a2 100644 --- a/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_frame.json +++ b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/reactor_frame.json @@ -3,7 +3,7 @@ "acceptMirrored": true, "key": { "B": { - "item": "createnuclear:uranium_bucket" + "item": "minecraft:bucket" }, "C": { "item": "createnuclear:reactor_casing" diff --git a/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/thorium_rod.json b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/thorium_rod.json new file mode 100644 index 000000000..67d1df6ad --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/mechanical_crafting/thorium_rod.json @@ -0,0 +1,19 @@ +{ + "type": "create:mechanical_crafting", + "acceptMirrored": true, + "key": { + "U": { + "item": "createnuclear:thorium_ingot" + } + }, + "pattern": [ + "U ", + " U ", + " U ", + " U ", + " U" + ], + "result": { + "item": "createnuclear:thorium_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/mixing/liquid_nitrogen.json b/src/generated/resources/data/createnuclear/recipes/mixing/liquid_nitrogen.json new file mode 100644 index 000000000..6ff529926 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/mixing/liquid_nitrogen.json @@ -0,0 +1,18 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "createnuclear:cooled_nitrogen_concentrate" + }, + { + "item": "minecraft:ice" + } + ], + "processingTime": 20, + "results": [ + { + "amount": 100, + "fluid": "createnuclear:nitrogen" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/mixing/thorium_fluid.json b/src/generated/resources/data/createnuclear/recipes/mixing/thorium_fluid.json new file mode 100644 index 000000000..0644f8ef9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/mixing/thorium_fluid.json @@ -0,0 +1,15 @@ +{ + "type": "create:mixing", + "heatRequirement": "heated", + "ingredients": [ + { + "tag": "forge:dusts/thorium" + } + ], + "results": [ + { + "amount": 25, + "fluid": "createnuclear:thorium" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/pressing/graphene.json b/src/generated/resources/data/createnuclear/recipes/pressing/graphene.json index 36907359f..fa8ccf09e 100644 --- a/src/generated/resources/data/createnuclear/recipes/pressing/graphene.json +++ b/src/generated/resources/data/createnuclear/recipes/pressing/graphene.json @@ -2,7 +2,7 @@ "type": "create:pressing", "ingredients": [ { - "tag": "forge:coal_dusts" + "tag": "forge:dusts/coal" } ], "results": [ diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/black_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/black_cloth.json index c97772dba..823df2871 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/black_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/black_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + } + ], { "item": "minecraft:black_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/blue_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/blue_cloth.json index 7a88326c0..338c24c00 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/blue_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/blue_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:blue_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/brown_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/brown_cloth.json index 7c298c77d..b7fade830 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/brown_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/brown_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:brown_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json index ea1f9bb70..eec2232ea 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/cyan_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:cyan_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/gray_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/gray_cloth.json index 2a9a51800..02839f6be 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/gray_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/gray_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:gray_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/green_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/green_cloth.json index 9de6a6ef1..ac547d0e1 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/green_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/green_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:green_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json index b650ceded..d7a5328f9 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_blue_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:light_blue_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json index 7ad40ccc3..659206ecb 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/light_gray_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:light_gray_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/lime_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/lime_cloth.json index 5f5fed5fd..de11efb5b 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/lime_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/lime_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:lime_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json index d150ae229..24afa28df 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/magenta_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:magenta_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/orange_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/orange_cloth.json index 7e4cf94bc..3cd48ac66 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/orange_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/orange_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:orange_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/pink_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/pink_cloth.json index 4274a3aed..641842e45 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/pink_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/pink_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:pink_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/purple_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/purple_cloth.json index ccedaffe8..a5c906354 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/purple_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/purple_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:purple_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/red_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/red_cloth.json index 71820997b..3d8bc1cf1 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/red_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/red_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:red_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/white_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/white_cloth.json index f479aa894..94e55ede0 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/white_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/white_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:yellow_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:white_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json index 34bda8f14..9d97f8ab1 100644 --- a/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json +++ b/src/generated/resources/data/createnuclear/recipes/shapeless/cloth/yellow_cloth.json @@ -2,9 +2,53 @@ "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ - { - "tag": "createnuclear:cloth" - }, + [ + { + "item": "createnuclear:white_cloth" + }, + { + "item": "createnuclear:orange_cloth" + }, + { + "item": "createnuclear:magenta_cloth" + }, + { + "item": "createnuclear:light_blue_cloth" + }, + { + "item": "createnuclear:lime_cloth" + }, + { + "item": "createnuclear:pink_cloth" + }, + { + "item": "createnuclear:gray_cloth" + }, + { + "item": "createnuclear:light_gray_cloth" + }, + { + "item": "createnuclear:cyan_cloth" + }, + { + "item": "createnuclear:purple_cloth" + }, + { + "item": "createnuclear:blue_cloth" + }, + { + "item": "createnuclear:brown_cloth" + }, + { + "item": "createnuclear:green_cloth" + }, + { + "item": "createnuclear:red_cloth" + }, + { + "item": "createnuclear:black_cloth" + } + ], { "item": "minecraft:yellow_dye" } diff --git a/src/generated/resources/data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json b/src/generated/resources/data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json index 16a522a60..01b3b0586 100644 --- a/src/generated/resources/data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json +++ b/src/generated/resources/data/createnuclear/recipes/smelting/lead_ingot_for_lead_ore.json @@ -4,7 +4,7 @@ "cookingtime": 200, "experience": 0.1, "ingredient": { - "tag": "createnuclear:lead_ores" + "tag": "forge:ores/lead" }, "result": "createnuclear:lead_ingot" } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipes/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json new file mode 100644 index 000000000..ebc4487cb --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "misc", + "cookingtime": 200, + "experience": 0.1, + "ingredient": { + "item": "createnuclear:nitrate" + }, + "result": "createnuclear:nitrogen_concentrate" +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json b/src/generated/resources/data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json index f415f6865..52e1f3802 100644 --- a/src/generated/resources/data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json +++ b/src/generated/resources/data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.json @@ -4,7 +4,7 @@ "cookingtime": 200, "experience": 0.1, "ingredient": { - "tag": "createnuclear:uranium_ores" + "tag": "forge:ores/uranium" }, "result": "createnuclear:raw_uranium" } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_black.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_black.json new file mode 100644 index 000000000..08dd6c708 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_black.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:black_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_blue.json new file mode 100644 index 000000000..e10c632c1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_brown.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_brown.json new file mode 100644 index 000000000..13f449654 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_brown.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:brown_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_cyan.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_cyan.json new file mode 100644 index 000000000..f912b68f3 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_cyan.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:cyan_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_gray.json new file mode 100644 index 000000000..26a7ca699 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_green.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_green.json new file mode 100644 index 000000000..5d9b75741 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_green.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:green_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_blue.json new file mode 100644 index 000000000..0175d16d7 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_gray.json new file mode 100644 index 000000000..b286f3fe1 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_light_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_lime.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_lime.json new file mode 100644 index 000000000..057cb5b51 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_lime.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:lime_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_magenta.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_magenta.json new file mode 100644 index 000000000..dcb976d9e --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_magenta.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:magenta_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_orange.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_orange.json new file mode 100644 index 000000000..47bca1d1f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_orange.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:orange_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_pink.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_pink.json new file mode 100644 index 000000000..77a133874 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_pink.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:pink_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_purple.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_purple.json new file mode 100644 index 000000000..dcb5e6e41 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_purple.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:purple_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_red.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_red.json new file mode 100644 index 000000000..c1332872f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_red.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:red_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_white.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_white.json new file mode 100644 index 000000000..1d60f3acb --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_white.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:white_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_yellow.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_yellow.json new file mode 100644 index 000000000..01743d9dd --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_boots_yellow.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:yellow_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "result": { + "item": "createnuclear:default_anti_radiation_boots" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_black.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_black.json new file mode 100644 index 000000000..f5a18e020 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_black.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:black_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_blue.json new file mode 100644 index 000000000..a8f7c288c --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_brown.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_brown.json new file mode 100644 index 000000000..1e620a39a --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_brown.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:brown_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_cyan.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_cyan.json new file mode 100644 index 000000000..08aad7082 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_cyan.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:cyan_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_gray.json new file mode 100644 index 000000000..d2f2e0fb3 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_green.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_green.json new file mode 100644 index 000000000..da9e63648 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_green.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:green_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_blue.json new file mode 100644 index 000000000..a173eea3b --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_gray.json new file mode 100644 index 000000000..733310dc5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_light_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_lime.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_lime.json new file mode 100644 index 000000000..9d4b92e72 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_lime.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:lime_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_magenta.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_magenta.json new file mode 100644 index 000000000..21a0ab1ba --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_magenta.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:magenta_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_orange.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_orange.json new file mode 100644 index 000000000..2d6bf0abb --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_orange.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:orange_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_pink.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_pink.json new file mode 100644 index 000000000..a0bcca31f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_pink.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:pink_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_purple.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_purple.json new file mode 100644 index 000000000..204df48d7 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_purple.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:purple_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_red.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_red.json new file mode 100644 index 000000000..69245a251 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_red.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:red_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_white.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_white.json new file mode 100644 index 000000000..bf6b8a76b --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_white.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:white_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_yellow.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_yellow.json new file mode 100644 index 000000000..1481cf6a8 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_chestplate_yellow.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:yellow_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "result": { + "item": "createnuclear:default_anti_radiation_chestplate" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_black.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_black.json new file mode 100644 index 000000000..79878e39b --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_black.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:black_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_blue.json new file mode 100644 index 000000000..947fd93f5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_brown.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_brown.json new file mode 100644 index 000000000..95938e487 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_brown.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:brown_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_cyan.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_cyan.json new file mode 100644 index 000000000..5f09f7a5e --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_cyan.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:cyan_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_gray.json new file mode 100644 index 000000000..e9a96e535 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_green.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_green.json new file mode 100644 index 000000000..c540f3aee --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_green.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:green_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_blue.json new file mode 100644 index 000000000..15fc52bec --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_gray.json new file mode 100644 index 000000000..940c43aa7 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_light_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_lime.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_lime.json new file mode 100644 index 000000000..f13239a2a --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_lime.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:lime_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_magenta.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_magenta.json new file mode 100644 index 000000000..289fc132a --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_magenta.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:magenta_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_orange.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_orange.json new file mode 100644 index 000000000..d97403f5a --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_orange.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:orange_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_pink.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_pink.json new file mode 100644 index 000000000..a10c4fddf --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_pink.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:pink_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_purple.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_purple.json new file mode 100644 index 000000000..e1e2c7045 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_purple.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:purple_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_red.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_red.json new file mode 100644 index 000000000..eba00e9cb --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_red.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:red_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_white.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_white.json new file mode 100644 index 000000000..3871c3671 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_white.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:white_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_yellow.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_yellow.json new file mode 100644 index 000000000..5df191a23 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_helmet_yellow.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:yellow_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "result": { + "item": "createnuclear:default_anti_radiation_helmet" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_black.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_black.json new file mode 100644 index 000000000..9bb698db8 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_black.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:black_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_blue.json new file mode 100644 index 000000000..8bdff4a93 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_brown.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_brown.json new file mode 100644 index 000000000..d3c07626f --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_brown.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:brown_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_cyan.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_cyan.json new file mode 100644 index 000000000..7d98d23cc --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_cyan.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:cyan_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_gray.json new file mode 100644 index 000000000..e49483955 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_green.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_green.json new file mode 100644 index 000000000..6f26f2f10 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_green.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:green_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_blue.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_blue.json new file mode 100644 index 000000000..8c4b82ce0 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_blue.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_blue_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_gray.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_gray.json new file mode 100644 index 000000000..bec1f0c26 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_light_gray.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:light_gray_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_lime.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_lime.json new file mode 100644 index 000000000..cb143eb62 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_lime.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:lime_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_magenta.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_magenta.json new file mode 100644 index 000000000..f678d8916 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_magenta.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:magenta_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_orange.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_orange.json new file mode 100644 index 000000000..d4d07fc15 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_orange.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:orange_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_pink.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_pink.json new file mode 100644 index 000000000..6ecf4943d --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_pink.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:pink_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_purple.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_purple.json new file mode 100644 index 000000000..971de2e58 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_purple.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:purple_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_red.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_red.json new file mode 100644 index 000000000..1a19ec2aa --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_red.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:red_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_white.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_white.json new file mode 100644 index 000000000..98f0a7ff6 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_white.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:white_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_yellow.json b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_yellow.json new file mode 100644 index 000000000..0793fab95 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/smithing/default_anti_radiation_leggings_yellow.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:smithing_transform", + "addition": { + "item": "createnuclear:yellow_cloth" + }, + "base": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "result": { + "item": "createnuclear:default_anti_radiation_leggings" + }, + "template": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/recipes/snow_powder/cooled_nitrogen_concentrate.json b/src/generated/resources/data/createnuclear/recipes/snow_powder/cooled_nitrogen_concentrate.json new file mode 100644 index 000000000..0f0733b80 --- /dev/null +++ b/src/generated/resources/data/createnuclear/recipes/snow_powder/cooled_nitrogen_concentrate.json @@ -0,0 +1,13 @@ +{ + "type": "createnuclear:snow_powder", + "ingredients": [ + { + "item": "createnuclear:nitrogen_concentrate" + } + ], + "results": [ + { + "item": "createnuclear:cooled_nitrogen_concentrate" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/blocks/fan_processing_catalysts/snow_powder.json b/src/generated/resources/data/createnuclear/tags/blocks/fan_processing_catalysts/snow_powder.json new file mode 100644 index 000000000..38b8ecdb5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/tags/blocks/fan_processing_catalysts/snow_powder.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:powder_snow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/blocks/lead_ores.json b/src/generated/resources/data/createnuclear/tags/blocks/lead_ores.json deleted file mode 100644 index e456059a9..000000000 --- a/src/generated/resources/data/createnuclear/tags/blocks/lead_ores.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "createnuclear:deepslate_lead_ore", - "createnuclear:lead_ore" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/blocks/uranium_ores.json b/src/generated/resources/data/createnuclear/tags/blocks/uranium_ores.json deleted file mode 100644 index 548841c41..000000000 --- a/src/generated/resources/data/createnuclear/tags/blocks/uranium_ores.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/entity_types/irradiated_immune.json b/src/generated/resources/data/createnuclear/tags/entity_types/irradiated_immune.json index c12810e47..e21140dfe 100644 --- a/src/generated/resources/data/createnuclear/tags/entity_types/irradiated_immune.json +++ b/src/generated/resources/data/createnuclear/tags/entity_types/irradiated_immune.json @@ -2,6 +2,7 @@ "values": [ "createnuclear:irradiated_cat", "createnuclear:irradiated_chicken", - "createnuclear:irradiated_wolf" + "createnuclear:irradiated_wolf", + "createnuclear:irradiated_cow" ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/fluids/nitrogen.json b/src/generated/resources/data/createnuclear/tags/fluids/nitrogen.json new file mode 100644 index 000000000..027a7f71c --- /dev/null +++ b/src/generated/resources/data/createnuclear/tags/fluids/nitrogen.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:flowing_nitrogen", + "createnuclear:nitrogen" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/fluids/thorium.json b/src/generated/resources/data/createnuclear/tags/fluids/thorium.json new file mode 100644 index 000000000..b1583ad25 --- /dev/null +++ b/src/generated/resources/data/createnuclear/tags/fluids/thorium.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:flowing_thorium", + "createnuclear:thorium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/all_anti_radiation_armors.json b/src/generated/resources/data/createnuclear/tags/items/all_anti_radiation_armors.json index 4151900fa..f72d209df 100644 --- a/src/generated/resources/data/createnuclear/tags/items/all_anti_radiation_armors.json +++ b/src/generated/resources/data/createnuclear/tags/items/all_anti_radiation_armors.json @@ -1,53 +1,3 @@ { - "values": [ - "createnuclear:white_anti_radiation_helmet", - "createnuclear:orange_anti_radiation_helmet", - "createnuclear:magenta_anti_radiation_helmet", - "createnuclear:light_blue_anti_radiation_helmet", - "createnuclear:yellow_anti_radiation_helmet", - "createnuclear:lime_anti_radiation_helmet", - "createnuclear:pink_anti_radiation_helmet", - "createnuclear:gray_anti_radiation_helmet", - "createnuclear:light_gray_anti_radiation_helmet", - "createnuclear:cyan_anti_radiation_helmet", - "createnuclear:purple_anti_radiation_helmet", - "createnuclear:blue_anti_radiation_helmet", - "createnuclear:brown_anti_radiation_helmet", - "createnuclear:green_anti_radiation_helmet", - "createnuclear:red_anti_radiation_helmet", - "createnuclear:black_anti_radiation_helmet", - "createnuclear:white_anti_radiation_chestplate", - "createnuclear:orange_anti_radiation_chestplate", - "createnuclear:magenta_anti_radiation_chestplate", - "createnuclear:light_blue_anti_radiation_chestplate", - "createnuclear:yellow_anti_radiation_chestplate", - "createnuclear:lime_anti_radiation_chestplate", - "createnuclear:pink_anti_radiation_chestplate", - "createnuclear:gray_anti_radiation_chestplate", - "createnuclear:light_gray_anti_radiation_chestplate", - "createnuclear:cyan_anti_radiation_chestplate", - "createnuclear:purple_anti_radiation_chestplate", - "createnuclear:blue_anti_radiation_chestplate", - "createnuclear:brown_anti_radiation_chestplate", - "createnuclear:green_anti_radiation_chestplate", - "createnuclear:red_anti_radiation_chestplate", - "createnuclear:black_anti_radiation_chestplate", - "createnuclear:white_anti_radiation_leggings", - "createnuclear:orange_anti_radiation_leggings", - "createnuclear:magenta_anti_radiation_leggings", - "createnuclear:light_blue_anti_radiation_leggings", - "createnuclear:yellow_anti_radiation_leggings", - "createnuclear:lime_anti_radiation_leggings", - "createnuclear:pink_anti_radiation_leggings", - "createnuclear:gray_anti_radiation_leggings", - "createnuclear:light_gray_anti_radiation_leggings", - "createnuclear:cyan_anti_radiation_leggings", - "createnuclear:purple_anti_radiation_leggings", - "createnuclear:blue_anti_radiation_leggings", - "createnuclear:brown_anti_radiation_leggings", - "createnuclear:green_anti_radiation_leggings", - "createnuclear:red_anti_radiation_leggings", - "createnuclear:black_anti_radiation_leggings", - "createnuclear:anti_radiation_boots" - ] + "values": [] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_armor.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_armor.json index ae448c5b6..0fdc0c126 100644 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_armor.json +++ b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_armor.json @@ -1,8 +1,8 @@ { "values": [ - "createnuclear:white_anti_radiation_helmet", - "createnuclear:white_anti_radiation_chestplate", - "createnuclear:white_anti_radiation_leggings", - "createnuclear:anti_radiation_boots" + "createnuclear:default_anti_radiation_helmet", + "createnuclear:default_anti_radiation_chestplate", + "createnuclear:default_anti_radiation_leggings", + "createnuclear:default_anti_radiation_boots" ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_boots_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_boots_dye.json deleted file mode 100644 index 3e6a77536..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_boots_dye.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "createnuclear:anti_radiation_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_dye.json deleted file mode 100644 index a1ac43a95..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_dye.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "values": [ - "createnuclear:orange_anti_radiation_chestplate", - "createnuclear:magenta_anti_radiation_chestplate", - "createnuclear:light_blue_anti_radiation_chestplate", - "createnuclear:yellow_anti_radiation_chestplate", - "createnuclear:lime_anti_radiation_chestplate", - "createnuclear:pink_anti_radiation_chestplate", - "createnuclear:gray_anti_radiation_chestplate", - "createnuclear:light_gray_anti_radiation_chestplate", - "createnuclear:cyan_anti_radiation_chestplate", - "createnuclear:purple_anti_radiation_chestplate", - "createnuclear:blue_anti_radiation_chestplate", - "createnuclear:brown_anti_radiation_chestplate", - "createnuclear:green_anti_radiation_chestplate", - "createnuclear:red_anti_radiation_chestplate", - "createnuclear:black_anti_radiation_chestplate" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_full_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_full_dye.json deleted file mode 100644 index 8b659b88b..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_chestplate_full_dye.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "values": [ - "createnuclear:white_anti_radiation_chestplate", - "createnuclear:orange_anti_radiation_chestplate", - "createnuclear:magenta_anti_radiation_chestplate", - "createnuclear:light_blue_anti_radiation_chestplate", - "createnuclear:yellow_anti_radiation_chestplate", - "createnuclear:lime_anti_radiation_chestplate", - "createnuclear:pink_anti_radiation_chestplate", - "createnuclear:gray_anti_radiation_chestplate", - "createnuclear:light_gray_anti_radiation_chestplate", - "createnuclear:cyan_anti_radiation_chestplate", - "createnuclear:purple_anti_radiation_chestplate", - "createnuclear:blue_anti_radiation_chestplate", - "createnuclear:brown_anti_radiation_chestplate", - "createnuclear:green_anti_radiation_chestplate", - "createnuclear:red_anti_radiation_chestplate", - "createnuclear:black_anti_radiation_chestplate" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_dye.json deleted file mode 100644 index 7e34cb083..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_dye.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "values": [ - "createnuclear:orange_anti_radiation_helmet", - "createnuclear:magenta_anti_radiation_helmet", - "createnuclear:light_blue_anti_radiation_helmet", - "createnuclear:yellow_anti_radiation_helmet", - "createnuclear:lime_anti_radiation_helmet", - "createnuclear:pink_anti_radiation_helmet", - "createnuclear:gray_anti_radiation_helmet", - "createnuclear:light_gray_anti_radiation_helmet", - "createnuclear:cyan_anti_radiation_helmet", - "createnuclear:purple_anti_radiation_helmet", - "createnuclear:blue_anti_radiation_helmet", - "createnuclear:brown_anti_radiation_helmet", - "createnuclear:green_anti_radiation_helmet", - "createnuclear:red_anti_radiation_helmet", - "createnuclear:black_anti_radiation_helmet" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_full_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_full_dye.json deleted file mode 100644 index 7d378f7fa..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_helmet_full_dye.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "values": [ - "createnuclear:white_anti_radiation_helmet", - "createnuclear:orange_anti_radiation_helmet", - "createnuclear:magenta_anti_radiation_helmet", - "createnuclear:light_blue_anti_radiation_helmet", - "createnuclear:yellow_anti_radiation_helmet", - "createnuclear:lime_anti_radiation_helmet", - "createnuclear:pink_anti_radiation_helmet", - "createnuclear:gray_anti_radiation_helmet", - "createnuclear:light_gray_anti_radiation_helmet", - "createnuclear:cyan_anti_radiation_helmet", - "createnuclear:purple_anti_radiation_helmet", - "createnuclear:blue_anti_radiation_helmet", - "createnuclear:brown_anti_radiation_helmet", - "createnuclear:green_anti_radiation_helmet", - "createnuclear:red_anti_radiation_helmet", - "createnuclear:black_anti_radiation_helmet" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_dye.json deleted file mode 100644 index 155da4963..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_dye.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "values": [ - "createnuclear:orange_anti_radiation_leggings", - "createnuclear:magenta_anti_radiation_leggings", - "createnuclear:light_blue_anti_radiation_leggings", - "createnuclear:yellow_anti_radiation_leggings", - "createnuclear:lime_anti_radiation_leggings", - "createnuclear:pink_anti_radiation_leggings", - "createnuclear:gray_anti_radiation_leggings", - "createnuclear:light_gray_anti_radiation_leggings", - "createnuclear:cyan_anti_radiation_leggings", - "createnuclear:purple_anti_radiation_leggings", - "createnuclear:blue_anti_radiation_leggings", - "createnuclear:brown_anti_radiation_leggings", - "createnuclear:green_anti_radiation_leggings", - "createnuclear:red_anti_radiation_leggings", - "createnuclear:black_anti_radiation_leggings" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_full_dye.json b/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_full_dye.json deleted file mode 100644 index ea2384340..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/anti_radiation_leggings_full_dye.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "values": [ - "createnuclear:white_anti_radiation_leggings", - "createnuclear:orange_anti_radiation_leggings", - "createnuclear:magenta_anti_radiation_leggings", - "createnuclear:light_blue_anti_radiation_leggings", - "createnuclear:yellow_anti_radiation_leggings", - "createnuclear:lime_anti_radiation_leggings", - "createnuclear:pink_anti_radiation_leggings", - "createnuclear:gray_anti_radiation_leggings", - "createnuclear:light_gray_anti_radiation_leggings", - "createnuclear:cyan_anti_radiation_leggings", - "createnuclear:purple_anti_radiation_leggings", - "createnuclear:blue_anti_radiation_leggings", - "createnuclear:brown_anti_radiation_leggings", - "createnuclear:green_anti_radiation_leggings", - "createnuclear:red_anti_radiation_leggings", - "createnuclear:black_anti_radiation_leggings" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/fuel.json b/src/generated/resources/data/createnuclear/tags/items/fuel.json index 951757d99..9efea370f 100644 --- a/src/generated/resources/data/createnuclear/tags/items/fuel.json +++ b/src/generated/resources/data/createnuclear/tags/items/fuel.json @@ -1,5 +1,6 @@ { "values": [ - "createnuclear:uranium_rod" + "createnuclear:uranium_rod", + "createnuclear:thorium_rod" ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/lead_ores.json b/src/generated/resources/data/createnuclear/tags/items/lead_ores.json deleted file mode 100644 index e456059a9..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/lead_ores.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "createnuclear:deepslate_lead_ore", - "createnuclear:lead_ore" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/items/uranium_ores.json b/src/generated/resources/data/createnuclear/tags/items/uranium_ores.json deleted file mode 100644 index 548841c41..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/uranium_ores.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json b/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json new file mode 100644 index 000000000..c69706c5f --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json @@ -0,0 +1,40 @@ +{ + "carvers": {}, + "downfall": 0.0, + "effects": { + "ambient_sound": "createnuclear:biomes/wasteland", + "fog_color": 4742718, + "foliage_color": 5660222, + "grass_color": 9211739, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "particle": { + "options": { + "type": "createnuclear:irradiated_particles", + "t": 0 + }, + "probability": 0.025 + }, + "sky_color": 3293490, + "water_color": 3887411, + "water_fog_color": 658954 + }, + "features": [], + "has_precipitation": false, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 2.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/configured_feature/lead_ore.json b/src/generated/resources/data/createnuclear/worldgen/configured_feature/lead_ore.json index 75f7246f9..1825d43f7 100644 --- a/src/generated/resources/data/createnuclear/worldgen/configured_feature/lead_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/configured_feature/lead_ore.json @@ -2,7 +2,7 @@ "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, - "size": 7, + "size": 12, "targets": [ { "state": { diff --git a/src/generated/resources/data/createnuclear/worldgen/configured_feature/nitrate_ore.json b/src/generated/resources/data/createnuclear/worldgen/configured_feature/nitrate_ore.json new file mode 100644 index 000000000..2287b3ddd --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/configured_feature/nitrate_ore.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 10, + "targets": [ + { + "state": { + "Name": "createnuclear:nitrate_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + }, + { + "state": { + "Name": "createnuclear:deepslate_nitrate_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:deepslate_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/configured_feature/thorium_ore.json b/src/generated/resources/data/createnuclear/worldgen/configured_feature/thorium_ore.json new file mode 100644 index 000000000..f0e17e287 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/configured_feature/thorium_ore.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 12, + "targets": [ + { + "state": { + "Name": "createnuclear:thorium_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + }, + { + "state": { + "Name": "createnuclear:deepslate_thorium_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:deepslate_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/erosion.json b/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/erosion.json new file mode 100644 index 000000000..feb1cdbd3 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/erosion.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:add", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 1.0, + "from_y": 0, + "to_value": -1.0, + "to_y": 90 + }, + "argument2": { + "type": "minecraft:old_blended_noise", + "smear_scale_multiplier": 8.0, + "xz_factor": 80.0, + "xz_scale": 0.25, + "y_factor": 160.0, + "y_scale": 0.375 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/final_density.json b/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/final_density.json new file mode 100644 index 000000000..feb1cdbd3 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/density_function/irradiated/final_density.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:add", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 1.0, + "from_y": 0, + "to_value": -1.0, + "to_y": 90 + }, + "argument2": { + "type": "minecraft:old_blended_noise", + "smear_scale_multiplier": 8.0, + "xz_factor": 80.0, + "xz_scale": 0.25, + "y_factor": 160.0, + "y_scale": 0.375 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/noise/irradiated/erosion.json b/src/generated/resources/data/createnuclear/worldgen/noise/irradiated/erosion.json new file mode 100644 index 000000000..5cb782332 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/noise/irradiated/erosion.json @@ -0,0 +1,10 @@ +{ + "amplitudes": [ + 1.0, + 1.0, + 0.0, + 1.0, + 1.0 + ], + "firstOctave": -9 +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/noise_settings/irradiated_noise.json b/src/generated/resources/data/createnuclear/worldgen/noise_settings/irradiated_noise.json new file mode 100644 index 000000000..b59dbcfe9 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/noise_settings/irradiated_noise.json @@ -0,0 +1,327 @@ +{ + "aquifers_enabled": false, + "default_block": { + "Name": "createnuclear:steel_block" + }, + "default_fluid": { + "Name": "minecraft:air" + }, + "disable_mob_generation": false, + "legacy_random_source": false, + "noise": { + "height": 256, + "min_y": -32, + "size_horizontal": 1, + "size_vertical": 2 + }, + "noise_router": { + "barrier": 1.0, + "continents": "minecraft:overworld/continents", + "depth": "minecraft:overworld/depth", + "erosion": "createnuclear:irradiated/erosion", + "final_density": { + "type": "minecraft:blend_density", + "argument": "createnuclear:irradiated/final_density" + }, + "fluid_level_floodedness": 0.0, + "fluid_level_spread": 0.0, + "initial_density_without_jaggedness": { + "type": "minecraft:add", + "argument1": 0.1171875, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 0.0, + "from_y": -30, + "to_value": 1.0, + "to_y": -40 + }, + "argument2": { + "type": "minecraft:add", + "argument1": -0.1171875, + "argument2": { + "type": "minecraft:add", + "argument1": -0.078125, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 1.0, + "from_y": 240, + "to_value": 0.0, + "to_y": 256 + }, + "argument2": { + "type": "minecraft:add", + "argument1": 0.078125, + "argument2": { + "type": "minecraft:clamp", + "input": { + "type": "minecraft:add", + "argument1": -0.703125, + "argument2": { + "type": "minecraft:mul", + "argument1": 4.0, + "argument2": { + "type": "minecraft:quarter_negative", + "argument": { + "type": "minecraft:mul", + "argument1": "minecraft:overworld/depth", + "argument2": { + "type": "minecraft:cache_2d", + "argument": "minecraft:overworld/factor" + } + } + } + } + }, + "max": 64.0, + "min": -30.0 + } + } + } + } + } + } + }, + "lava": 0.0, + "ridges": "minecraft:overworld/ridges", + "temperature": { + "type": "minecraft:shifted_noise", + "noise": "minecraft:temperature", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "xz_scale": 0.25, + "y_scale": 0.0 + }, + "vegetation": { + "type": "minecraft:shifted_noise", + "noise": "minecraft:vegetation", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "xz_scale": 0.0, + "y_scale": 0.0 + }, + "vein_gap": 0.0, + "vein_ridged": 0.0, + "vein_toggle": 0.0 + }, + "ore_veins_enabled": false, + "sea_level": 32, + "spawn_target": [ + { + "continentalness": [ + -0.11, + 1.0 + ], + "depth": 0.0, + "erosion": [ + -1.0, + 1.0 + ], + "humidity": [ + -1.0, + 1.0 + ], + "offset": 0.0, + "temperature": [ + -1.0, + 1.0 + ], + "weirdness": [ + -1.0, + -0.16 + ] + }, + { + "continentalness": [ + -0.11, + 1.0 + ], + "depth": 0.0, + "erosion": [ + -1.0, + 1.0 + ], + "humidity": [ + -1.0, + 1.0 + ], + "offset": 0.0, + "temperature": [ + -1.0, + 1.0 + ], + "weirdness": [ + 0.16, + 1.0 + ] + } + ], + "surface_rule": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "createnuclear:irradiated_land" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.0465, + "min_threshold": 0.035, + "noise": "createnuclear:irradiated/erosion" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:lead_ore" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.0545, + "min_threshold": 0.039, + "noise": "createnuclear:irradiated/erosion" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:lead_block" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.069, + "min_threshold": 0.0545, + "noise": "createnuclear:irradiated/erosion" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:raw_lead_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "above_bottom": 5 + }, + "random_name": "minecraft:bedrock_floor", + "true_at_and_below": { + "above_bottom": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:bedrock" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:above_preliminary_surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "createnuclear:irradiated_land" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:raw_lead_block" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "createnuclear:irradiated_land" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:raw_lead_block" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "absolute": 4 + }, + "random_name": "minecraft:enriched", + "true_at_and_below": { + "absolute": -4 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "createnuclear:enriched_soul_soil" + } + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json index e9eff2632..0cc2bfabc 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/lead_ore.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:count", - "count": 6 + "count": 10 }, { "type": "minecraft:in_square" @@ -13,15 +13,15 @@ "height": { "type": "minecraft:trapezoid", "max_inclusive": { - "absolute": 64 + "absolute": 60 }, "min_inclusive": { - "absolute": -64 + "absolute": -16 } } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json new file mode 100644 index 000000000..cdfa1f6b5 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/nitrate_ore.json @@ -0,0 +1,27 @@ +{ + "feature": "createnuclear:nitrate_ore", + "placement": [ + { + "type": "minecraft:count", + "count": 6 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 64 + }, + "min_inclusive": { + "absolute": -63 + } + } + }, + { + "type": "createnuclear:config_filter" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json index d5ec73f0a..87db06f6a 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 18 + "chance": 64 }, { "type": "minecraft:in_square" @@ -13,15 +13,15 @@ "height": { "type": "minecraft:uniform", "max_inclusive": { - "absolute": 70 + "absolute": 16 }, "min_inclusive": { - "absolute": -30 + "absolute": -63 } } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json new file mode 100644 index 000000000..3a1cfe261 --- /dev/null +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json @@ -0,0 +1,27 @@ +{ + "feature": "createnuclear:thorium_ore", + "placement": [ + { + "type": "minecraft:count", + "count": 6 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 55 + }, + "min_inclusive": { + "absolute": -16 + } + } + }, + { + "type": "createnuclear:config_filter" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json b/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json index 5613d1528..848720413 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/uranium_ore.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:count", - "count": 6 + "count": 4 }, { "type": "minecraft:in_square" @@ -13,15 +13,15 @@ "height": { "type": "minecraft:trapezoid", "max_inclusive": { - "absolute": 64 + "absolute": 16 }, "min_inclusive": { - "absolute": -64 + "absolute": -63 } } }, { - "type": "create:config_filter" + "type": "createnuclear:config_filter" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores.json b/src/generated/resources/data/forge/tags/blocks/ores.json index 52471c4ab..c393b2056 100644 --- a/src/generated/resources/data/forge/tags/blocks/ores.json +++ b/src/generated/resources/data/forge/tags/blocks/ores.json @@ -1,8 +1,12 @@ { "values": [ + "createnuclear:deepslate_uranium_ore", "createnuclear:deepslate_lead_ore", + "createnuclear:deepslate_thorium_ore", + "createnuclear:uranium_ore", "createnuclear:lead_ore", - "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore" + "createnuclear:thorium_ore", + "createnuclear:nitrate_ore", + "createnuclear:deepslate_nitrate_ore" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores/nitrate.json b/src/generated/resources/data/forge/tags/blocks/ores/nitrate.json new file mode 100644 index 000000000..e306fa649 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores/nitrate.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:nitrate_ore", + "createnuclear:deepslate_nitrate_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores/thorium.json b/src/generated/resources/data/forge/tags/blocks/ores/thorium.json new file mode 100644 index 000000000..c5f8a4240 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores/thorium.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:deepslate_thorium_ore", + "createnuclear:thorium_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json index f66bbd403..5d99e44fe 100644 --- a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json +++ b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -1,6 +1,8 @@ { "values": [ + "createnuclear:deepslate_uranium_ore", "createnuclear:deepslate_lead_ore", - "createnuclear:deepslate_uranium_ore" + "createnuclear:deepslate_thorium_ore", + "createnuclear:deepslate_nitrate_ore" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json index a8a95f51a..c257624a2 100644 --- a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json +++ b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json @@ -1,6 +1,8 @@ { "values": [ + "createnuclear:uranium_ore", "createnuclear:lead_ore", - "createnuclear:uranium_ore" + "createnuclear:thorium_ore", + "createnuclear:nitrate_ore" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks/raw_thorium.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/raw_thorium.json new file mode 100644 index 000000000..3bb2b80c9 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks/raw_thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:raw_thorium_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks/thorium.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/thorium.json new file mode 100644 index 000000000..6ea006dfe --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/boots.json b/src/generated/resources/data/forge/tags/items/armors/boots.json index 3e6a77536..c945fe9f3 100644 --- a/src/generated/resources/data/forge/tags/items/armors/boots.json +++ b/src/generated/resources/data/forge/tags/items/armors/boots.json @@ -1,5 +1,5 @@ { "values": [ - "createnuclear:anti_radiation_boots" + "createnuclear:default_anti_radiation_boots" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/chestplates.json b/src/generated/resources/data/forge/tags/items/armors/chestplates.json index 8b659b88b..6ee7aa949 100644 --- a/src/generated/resources/data/forge/tags/items/armors/chestplates.json +++ b/src/generated/resources/data/forge/tags/items/armors/chestplates.json @@ -1,20 +1,5 @@ { "values": [ - "createnuclear:white_anti_radiation_chestplate", - "createnuclear:orange_anti_radiation_chestplate", - "createnuclear:magenta_anti_radiation_chestplate", - "createnuclear:light_blue_anti_radiation_chestplate", - "createnuclear:yellow_anti_radiation_chestplate", - "createnuclear:lime_anti_radiation_chestplate", - "createnuclear:pink_anti_radiation_chestplate", - "createnuclear:gray_anti_radiation_chestplate", - "createnuclear:light_gray_anti_radiation_chestplate", - "createnuclear:cyan_anti_radiation_chestplate", - "createnuclear:purple_anti_radiation_chestplate", - "createnuclear:blue_anti_radiation_chestplate", - "createnuclear:brown_anti_radiation_chestplate", - "createnuclear:green_anti_radiation_chestplate", - "createnuclear:red_anti_radiation_chestplate", - "createnuclear:black_anti_radiation_chestplate" + "createnuclear:default_anti_radiation_chestplate" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/helmets.json b/src/generated/resources/data/forge/tags/items/armors/helmets.json index 7d378f7fa..855fd1a52 100644 --- a/src/generated/resources/data/forge/tags/items/armors/helmets.json +++ b/src/generated/resources/data/forge/tags/items/armors/helmets.json @@ -1,20 +1,5 @@ { "values": [ - "createnuclear:white_anti_radiation_helmet", - "createnuclear:orange_anti_radiation_helmet", - "createnuclear:magenta_anti_radiation_helmet", - "createnuclear:light_blue_anti_radiation_helmet", - "createnuclear:yellow_anti_radiation_helmet", - "createnuclear:lime_anti_radiation_helmet", - "createnuclear:pink_anti_radiation_helmet", - "createnuclear:gray_anti_radiation_helmet", - "createnuclear:light_gray_anti_radiation_helmet", - "createnuclear:cyan_anti_radiation_helmet", - "createnuclear:purple_anti_radiation_helmet", - "createnuclear:blue_anti_radiation_helmet", - "createnuclear:brown_anti_radiation_helmet", - "createnuclear:green_anti_radiation_helmet", - "createnuclear:red_anti_radiation_helmet", - "createnuclear:black_anti_radiation_helmet" + "createnuclear:default_anti_radiation_helmet" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/leggings.json b/src/generated/resources/data/forge/tags/items/armors/leggings.json index ea2384340..cbd5fb4fa 100644 --- a/src/generated/resources/data/forge/tags/items/armors/leggings.json +++ b/src/generated/resources/data/forge/tags/items/armors/leggings.json @@ -1,20 +1,5 @@ { "values": [ - "createnuclear:white_anti_radiation_leggings", - "createnuclear:orange_anti_radiation_leggings", - "createnuclear:magenta_anti_radiation_leggings", - "createnuclear:light_blue_anti_radiation_leggings", - "createnuclear:yellow_anti_radiation_leggings", - "createnuclear:lime_anti_radiation_leggings", - "createnuclear:pink_anti_radiation_leggings", - "createnuclear:gray_anti_radiation_leggings", - "createnuclear:light_gray_anti_radiation_leggings", - "createnuclear:cyan_anti_radiation_leggings", - "createnuclear:purple_anti_radiation_leggings", - "createnuclear:blue_anti_radiation_leggings", - "createnuclear:brown_anti_radiation_leggings", - "createnuclear:green_anti_radiation_leggings", - "createnuclear:red_anti_radiation_leggings", - "createnuclear:black_anti_radiation_leggings" + "createnuclear:default_anti_radiation_leggings" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/buckets/nitrogen.json b/src/generated/resources/data/forge/tags/items/buckets/nitrogen.json new file mode 100644 index 000000000..062ab2cc1 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/buckets/nitrogen.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:nitrogen_bucket" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/buckets/thorium.json b/src/generated/resources/data/forge/tags/items/buckets/thorium.json new file mode 100644 index 000000000..6aec42449 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/buckets/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_bucket" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/coal_dusts.json b/src/generated/resources/data/forge/tags/items/coal_dusts.json deleted file mode 100644 index 84c8f5690..000000000 --- a/src/generated/resources/data/forge/tags/items/coal_dusts.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "createnuclear:coal_dust" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/dusts.json b/src/generated/resources/data/forge/tags/items/dusts.json index 16ed22994..3bf9b0389 100644 --- a/src/generated/resources/data/forge/tags/items/dusts.json +++ b/src/generated/resources/data/forge/tags/items/dusts.json @@ -1,5 +1,6 @@ { "values": [ + "createnuclear:thorium_dust", "createnuclear:uranium_powder", "createnuclear:coal_dust" ] diff --git a/src/generated/resources/data/forge/tags/items/dusts/thorium.json b/src/generated/resources/data/forge/tags/items/dusts/thorium.json new file mode 100644 index 000000000..9b0a35348 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/dusts/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_dust" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots.json b/src/generated/resources/data/forge/tags/items/ingots.json index 70e4923e4..069fcb892 100644 --- a/src/generated/resources/data/forge/tags/items/ingots.json +++ b/src/generated/resources/data/forge/tags/items/ingots.json @@ -1,6 +1,7 @@ { "values": [ "createnuclear:steel_ingot", - "createnuclear:lead_ingot" + "createnuclear:lead_ingot", + "createnuclear:thorium_ingot" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots/thorium.json b/src/generated/resources/data/forge/tags/items/ingots/thorium.json new file mode 100644 index 000000000..ebbb559f0 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/nuggets.json b/src/generated/resources/data/forge/tags/items/nuggets.json index 8cf12e202..4683ae5fc 100644 --- a/src/generated/resources/data/forge/tags/items/nuggets.json +++ b/src/generated/resources/data/forge/tags/items/nuggets.json @@ -1,6 +1,7 @@ { "values": [ "createnuclear:steel_nugget", - "createnuclear:lead_nugget" + "createnuclear:lead_nugget", + "createnuclear:thorium_nugget" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/nuggets/thorium.json b/src/generated/resources/data/forge/tags/items/nuggets/thorium.json new file mode 100644 index 000000000..6e41e836d --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/nuggets/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_nugget" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores/nitrate.json b/src/generated/resources/data/forge/tags/items/ores/nitrate.json new file mode 100644 index 000000000..e306fa649 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores/nitrate.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:nitrate_ore", + "createnuclear:deepslate_nitrate_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores/thorium.json b/src/generated/resources/data/forge/tags/items/ores/thorium.json new file mode 100644 index 000000000..c5f8a4240 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores/thorium.json @@ -0,0 +1,6 @@ +{ + "values": [ + "createnuclear:deepslate_thorium_ore", + "createnuclear:thorium_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_materials.json b/src/generated/resources/data/forge/tags/items/raw_materials.json index 801e2f126..53e805f60 100644 --- a/src/generated/resources/data/forge/tags/items/raw_materials.json +++ b/src/generated/resources/data/forge/tags/items/raw_materials.json @@ -1,6 +1,7 @@ { "values": [ "createnuclear:raw_lead", - "createnuclear:raw_uranium" + "createnuclear:raw_uranium", + "createnuclear:raw_thorium" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_materials/thorium.json b/src/generated/resources/data/forge/tags/items/raw_materials/thorium.json new file mode 100644 index 000000000..e2f43fb91 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/raw_materials/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:raw_thorium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_ores.json b/src/generated/resources/data/forge/tags/items/raw_ores.json index 801e2f126..53e805f60 100644 --- a/src/generated/resources/data/forge/tags/items/raw_ores.json +++ b/src/generated/resources/data/forge/tags/items/raw_ores.json @@ -1,6 +1,7 @@ { "values": [ "createnuclear:raw_lead", - "createnuclear:raw_uranium" + "createnuclear:raw_uranium", + "createnuclear:raw_thorium" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/rods.json b/src/generated/resources/data/forge/tags/items/rods.json index b665274d5..657901035 100644 --- a/src/generated/resources/data/forge/tags/items/rods.json +++ b/src/generated/resources/data/forge/tags/items/rods.json @@ -1,6 +1,7 @@ { "values": [ "createnuclear:graphite_rod", - "createnuclear:uranium_rod" + "createnuclear:uranium_rod", + "createnuclear:thorium_rod" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/raw_thorium.json b/src/generated/resources/data/forge/tags/items/storage_blocks/raw_thorium.json new file mode 100644 index 000000000..3bb2b80c9 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/raw_thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:raw_thorium_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/thorium.json b/src/generated/resources/data/forge/tags/items/storage_blocks/thorium.json new file mode 100644 index 000000000..6ea006dfe --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/thorium.json @@ -0,0 +1,5 @@ +{ + "values": [ + "createnuclear:thorium_block" + ] +} \ 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 index cbc315dc7..ef0c10843 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -4,18 +4,26 @@ "createnuclear:reactor_core", "createnuclear:reactor_frame", "createnuclear:reactor_cooler", - "createnuclear:reactor_input", + "createnuclear:reactor_rod_input", + "createnuclear:reactor_fluid_input", "createnuclear:reactor_output", "createnuclear:reactor_controller", "createnuclear:enriching_campfire", + "createnuclear:deepslate_uranium_ore", "createnuclear:deepslate_lead_ore", + "createnuclear:deepslate_thorium_ore", + "createnuclear:uranium_ore", "createnuclear:lead_ore", + "createnuclear:thorium_ore", + "createnuclear:nitrate_ore", + "createnuclear:deepslate_nitrate_ore", "createnuclear:raw_uranium_block", "createnuclear:raw_lead_block", + "createnuclear:raw_thorium_block", "createnuclear:lead_block", - "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore", + "createnuclear:thorium_block", "createnuclear:steel_block", + "createnuclear:reactor_alarm", "createnuclear:autunite", "createnuclear:cut_autunite", "createnuclear:cut_autunite_stairs", diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json index e661e22b7..188e478f3 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json @@ -4,12 +4,16 @@ "createnuclear:reactor_core", "createnuclear:reactor_frame", "createnuclear:reactor_cooler", - "createnuclear:reactor_input", + "createnuclear:reactor_rod_input", + "createnuclear:reactor_fluid_input", "createnuclear:reactor_output", "createnuclear:reactor_controller", - "createnuclear:raw_uranium_block", "createnuclear:enriched_soul_soil", "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore" + "createnuclear:deepslate_thorium_ore", + "createnuclear:uranium_ore", + "createnuclear:thorium_ore", + "createnuclear:raw_uranium_block", + "createnuclear:raw_thorium_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json index 52471c4ab..c393b2056 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -1,8 +1,12 @@ { "values": [ + "createnuclear:deepslate_uranium_ore", "createnuclear:deepslate_lead_ore", + "createnuclear:deepslate_thorium_ore", + "createnuclear:uranium_ore", "createnuclear:lead_ore", - "createnuclear:deepslate_uranium_ore", - "createnuclear:uranium_ore" + "createnuclear:thorium_ore", + "createnuclear:nitrate_ore", + "createnuclear:deepslate_nitrate_ore" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/fluids/water.json b/src/generated/resources/data/minecraft/tags/fluids/water.json new file mode 100644 index 000000000..64bc4a875 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/fluids/water.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#createnuclear:nitrogen" + ] +} \ No newline at end of file diff --git a/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java b/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java index 77d9321a7..77b34369f 100644 --- a/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java +++ b/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java @@ -4,14 +4,12 @@ import com.google.common.collect.Maps; import lib.multiblock.impl.IMultiBlockPatternBuilder; import lib.multiblock.impl.IMultiBlockPattern; -import lib.multiblock.impl.IMultiBlockPatternBuilder; import lib.multiblock.impl.IPatternBuilder; import lib.multiblock.misc.MultiBlockOffsetPos; import lib.multiblock.misc.Util; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.pattern.BlockInWorld; -import net.nuclearteam.createnuclear.CreateNuclear; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java b/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java index d67ad5c0f..0d8ef6aae 100644 --- a/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java +++ b/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java @@ -18,20 +18,20 @@ import java.util.function.Predicate; import java.util.function.Supplier; -public final class SimpleMultiBlockPattern implements IMultiBlockPattern { - private final List multiBlockOffsetPosList; - private final Map> predicateHashMap; - private final Map> blockProvider; - public SimpleMultiBlockPattern(List multiBlockOffsetPosList, Map> predicateMap, Map> blockSuppliers) { +public record SimpleMultiBlockPattern(List multiBlockOffsetPosList, + Map> predicateHashMap, + Map> blockProvider) implements IMultiBlockPattern { + + public SimpleMultiBlockPattern(List multiBlockOffsetPosList, Map> predicateHashMap, Map> blockProvider) { this.multiBlockOffsetPosList = List.copyOf(multiBlockOffsetPosList); - this.predicateHashMap = Map.copyOf(predicateMap); - this.blockProvider = Map.copyOf(blockSuppliers); + this.predicateHashMap = Map.copyOf(predicateHashMap); + this.blockProvider = Map.copyOf(blockProvider); } public boolean matches(Level level, BlockPos blockPos, Rotation rotation) { for (MultiBlockOffsetPos multiBlockOffsetPos : multiBlockOffsetPosList) { - char character = multiBlockOffsetPos.caracter(); + char character = multiBlockOffsetPos.character(); Predicate predicate = predicateHashMap.get(character); BlockInWorld block = new BlockInWorld(level, blockPos.offset(multiBlockOffsetPos.pos().rotate(rotation)), false); @@ -43,7 +43,7 @@ public boolean matches(Level level, BlockPos blockPos, Rotation rotation) { public MultiblockMatchResult matchesWithResult(Level level, BlockPos blockPos, Rotation rotation) { List result = new ArrayList<>(); for (MultiBlockOffsetPos multiBlockOffsetPos : multiBlockOffsetPosList) { - char character = multiBlockOffsetPos.caracter(); + char character = multiBlockOffsetPos.character(); Predicate predicate = predicateHashMap.get(character); BlockInWorld block = new BlockInWorld(level, blockPos.offset(multiBlockOffsetPos.pos().rotate(rotation)), false); if (predicate == null || !predicate.test(block)) return null; @@ -58,22 +58,14 @@ public void construct(Level level, BlockPos blockPos, BiPredicate stateSupplier = blockProvider.get(character); if (stateSupplier != null) { var pos = blockPos.offset(multiBlockOffsetPos.pos().rotate(Rotation.NONE)); var state = stateSupplier.get(); - if (stateBiPredicate.test(character, state)) level.getServer().tell(new TickTask(3, () -> level.setBlock(pos, state, Block.UPDATE_ALL))); + if (stateBiPredicate.test(character, state)) + level.getServer().tell(new TickTask(3, () -> level.setBlock(pos, state, Block.UPDATE_ALL))); } } } - - @Override - public boolean matches(java.util.logging.Level level, BlockPos pos, Rotation rotation) { - return false; - } - - public List test() { - return this.multiBlockOffsetPosList; - } } diff --git a/src/main/java/lib/multiblock/SimpleMultiBlockPatternBuilder.java b/src/main/java/lib/multiblock/SimpleMultiBlockPatternBuilder.java deleted file mode 100644 index e7a56b706..000000000 --- a/src/main/java/lib/multiblock/SimpleMultiBlockPatternBuilder.java +++ /dev/null @@ -1,68 +0,0 @@ -package lib.multiblock; - -import com.google.common.base.Joiner; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import lib.multiblock.impl.IMultiBlockPatternBuilder; -import lib.multiblock.impl.IMultiBlockPatternBuilder; -import lib.multiblock.impl.IPatternBuilder; -import lib.multiblock.misc.MultiBlockOffsetPos; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.pattern.BlockInWorld; -import lib.multiblock.impl.IMultiBlockPattern; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; -import java.util.function.Supplier; - -public final class SimpleMultiBlockPatternBuilder implements IMultiBlockPatternBuilder { - private static final Joiner COMA_SEPARATOR = Joiner.on(','); - public static SimpleMultiBlockPatternBuilder start() { - return new SimpleMultiBlockPatternBuilder(); - } - - private final Map> multiBlockOffsetPosList = Maps.newHashMap(); - private final Map> predicateHashMap = Maps.newHashMap(); - private final Map> blockProvider = Maps.newHashMap(); - - private SimpleMultiBlockPatternBuilder() {} - - private void ensureProperlyBuilt(List list) { - HashSet characters = new HashSet<>(); - list.forEach(multiBlockOffsetPos -> { - if (!predicateHashMap.containsKey(multiBlockOffsetPos.caracter())) - characters.add(multiBlockOffsetPos.caracter()); - }); - if (!characters.isEmpty()) - throw new IllegalStateException("Missing the following: \"%s\" for MultiBlock Pattern as they have not been defined".formatted(COMA_SEPARATOR.join(characters))); - } - - public SimpleMultiBlockPatternBuilder add(char character, BlockPos relativePos) { - multiBlockOffsetPosList.computeIfAbsent(character, ArrayList::new).add(new MultiBlockOffsetPos(character, relativePos)); - return this; - } - - public SimpleMultiBlockPatternBuilder where(char character, Predicate worldPredicate) { - if (!predicateHashMap.containsKey(character)) predicateHashMap.put(character, worldPredicate); - return this; - } - - public SimpleMultiBlockPatternBuilder block(char pSymbol, Supplier blockStateSupplier) { - blockProvider.put(pSymbol, blockStateSupplier); - return this; - } - - - public T build(IPatternBuilder builder) { - var coreList = multiBlockOffsetPosList.get('*'); - if (coreList == null || coreList.size() != 1) - throw new IllegalArgumentException("Failed to build pattern due to having more or less than one \"*\" defined! Have: %s Expected: 1".formatted(coreList != null ? coreList.size() : 0)); - List list = Lists.newArrayList(); - multiBlockOffsetPosList.forEach((k, v) -> list.addAll(v)); - return builder.make(list, predicateHashMap, blockProvider); - } -} diff --git a/src/main/java/lib/multiblock/impl/IBetterPattern.java b/src/main/java/lib/multiblock/impl/IBetterPattern.java deleted file mode 100644 index f992135e5..000000000 --- a/src/main/java/lib/multiblock/impl/IBetterPattern.java +++ /dev/null @@ -1,31 +0,0 @@ -package lib.multiblock.impl; - -import lib.multiblock.misc.MultiblockMatchResult; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.function.BiPredicate; - -public class IBetterPattern implements IMultiBlockPattern { - @Override - public boolean matches(Level level, BlockPos pos, Rotation rotation) { - return false; - } - - @Override - public MultiblockMatchResult matchesWithResult(Level level, BlockPos pos, Rotation rotation) { - return null; - } - - @Override - public void construct(Level level, BlockPos pos, BiPredicate blockStateBiPredicate) { - - } - - @Override - public boolean matches(java.util.logging.Level level, BlockPos pos, Rotation rotation) { - return false; - } -} diff --git a/src/main/java/lib/multiblock/impl/IMultiBlockPattern.java b/src/main/java/lib/multiblock/impl/IMultiBlockPattern.java index 7453566f7..25d7ae6aa 100644 --- a/src/main/java/lib/multiblock/impl/IMultiBlockPattern.java +++ b/src/main/java/lib/multiblock/impl/IMultiBlockPattern.java @@ -34,7 +34,4 @@ default MultiblockMatchResult matchesWithResult(Level level, BlockPos pos) { default void contruct(Level level, BlockPos pos) { construct(level, pos, (a,b) -> true); } - - - boolean matches(java.util.logging.Level level, BlockPos pos, Rotation rotation); } diff --git a/src/main/java/lib/multiblock/impl/IMultiBlockPatternBuilder.java b/src/main/java/lib/multiblock/impl/IMultiBlockPatternBuilder.java index 17c87dd34..b5c34c567 100644 --- a/src/main/java/lib/multiblock/impl/IMultiBlockPatternBuilder.java +++ b/src/main/java/lib/multiblock/impl/IMultiBlockPatternBuilder.java @@ -2,6 +2,7 @@ import lib.multiblock.SimpleMultiBlockPattern; +@SuppressWarnings("unchecked") public interface IMultiBlockPatternBuilder { < T extends IMultiBlockPattern> T build(IPatternBuilder builder); diff --git a/src/main/java/lib/multiblock/manager/MultiBlockCache.java b/src/main/java/lib/multiblock/manager/MultiBlockCache.java deleted file mode 100644 index 5a2c97f1d..000000000 --- a/src/main/java/lib/multiblock/manager/MultiBlockCache.java +++ /dev/null @@ -1,25 +0,0 @@ -package lib.multiblock.manager; - -import lib.multiblock.impl.IMultiBlockPattern; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.Rotation; - -import java.util.logging.Level; - -public class MultiBlockCache { - private T cachedResult; - public MultiBlockCache(){} - - public void updateStructure(T blockPattern) { - this.cachedResult = blockPattern; - } - - public boolean isValid(Level level, BlockPos pos, Rotation rotation) { - return cachedResult != null && cachedResult.matches(level, pos, rotation); - } - - public boolean isCached() { - return cachedResult == null; - } -} diff --git a/src/main/java/lib/multiblock/manager/MultiBlockManager.java b/src/main/java/lib/multiblock/manager/MultiBlockManager.java deleted file mode 100644 index dd8dbf4e2..000000000 --- a/src/main/java/lib/multiblock/manager/MultiBlockManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package lib.multiblock.manager; - -import lib.multiblock.impl.IMultiBlockPattern; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Rotation; - -import java.util.ArrayList; - -public class MultiBlockManager { - private final ArrayList> registeredMultiBlockPatterns = new ArrayList>(); - - public MultiBlockManager(){} - - public E register(String ID, T data, E blockPattern) { - registeredMultiBlockPatterns.add(new RegisteredMultiBlockPattern<>(ID, data, blockPattern)); - return blockPattern; - } - - public RegisteredMultiBlockPattern findStructure(Level level, BlockPos pos, Rotation rotation) { - for (RegisteredMultiBlockPattern registeredMultiBlockPattern : registeredMultiBlockPatterns) { - var result = registeredMultiBlockPattern.pattern().matches(level, pos, rotation); - if(result) return registeredMultiBlockPattern; - } - return null; - } -} diff --git a/src/main/java/lib/multiblock/manager/RegisteredMultiBlockPattern.java b/src/main/java/lib/multiblock/manager/RegisteredMultiBlockPattern.java deleted file mode 100644 index 264af6d8f..000000000 --- a/src/main/java/lib/multiblock/manager/RegisteredMultiBlockPattern.java +++ /dev/null @@ -1,6 +0,0 @@ -package lib.multiblock.manager; - -import lib.multiblock.impl.IMultiBlockPattern; - -public record RegisteredMultiBlockPattern (String ID, T data, IMultiBlockPattern pattern) { -} diff --git a/src/main/java/lib/multiblock/misc/MultiBlockOffsetPos.java b/src/main/java/lib/multiblock/misc/MultiBlockOffsetPos.java index a388a68d8..11801a72c 100644 --- a/src/main/java/lib/multiblock/misc/MultiBlockOffsetPos.java +++ b/src/main/java/lib/multiblock/misc/MultiBlockOffsetPos.java @@ -2,5 +2,5 @@ import net.minecraft.core.BlockPos; -public record MultiBlockOffsetPos(char caracter, BlockPos pos) { +public record MultiBlockOffsetPos(char character, BlockPos pos) { } diff --git a/src/main/java/lib/multiblock/misc/Util.java b/src/main/java/lib/multiblock/misc/Util.java index 81eb1ef5b..184f03483 100644 --- a/src/main/java/lib/multiblock/misc/Util.java +++ b/src/main/java/lib/multiblock/misc/Util.java @@ -20,14 +20,12 @@ public static Map> parseBlockPattern(List> blockOffsets = new HashMap<>(); - int starX = -1; - int starY = -1; - int starZ = -1; + int starX = -1, starY = -1, starZ = -1; for (int y = 0; y < aisles.size(); y++) { String[] aisle = aisles.get(y); - for (int x=0; x < aisle.length; x++) { + for (int x = 0; x < aisle.length; x++) { for (int z = 0; z < aisle[x].length(); z++) { if (aisle[x].charAt(z) == '*') { starX = x; diff --git a/src/main/java/net/nuclearteam/createnuclear/CNAttributes.java b/src/main/java/net/nuclearteam/createnuclear/CNAttributes.java new file mode 100644 index 000000000..a2af67d68 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNAttributes.java @@ -0,0 +1,18 @@ +package net.nuclearteam.createnuclear; + +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.RangedAttribute; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class CNAttributes { + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, CreateNuclear.MOD_ID); + + public static final RegistryObject IRRADIATED_RESISTANCE = ATTRIBUTES.register("generic.irradiated_resistance", () -> new RangedAttribute("attribute.name.createnuclear.generic.irradiated_resistance", 0, 0, 1).setSyncable(true)); + + public static void register(IEventBus eventBus) { + ATTRIBUTES.register(eventBus); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java index f8a469cfa..6489ae40f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java @@ -4,10 +4,14 @@ import com.simibubi.create.content.kinetics.base.OrientedRotatingVisual; import com.tterrag.registrate.util.entry.BlockEntityEntry; import net.nuclearteam.createnuclear.content.enriching.campfire.EnrichingCampfireBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarmEntity; import net.nuclearteam.createnuclear.content.multiblock.casing.ReactorCasingEntity; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; import net.nuclearteam.createnuclear.content.multiblock.core.ReactorCoreEntity; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInputEntity; +import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameEntity; +import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameRenderer; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputRenderer; @@ -27,9 +31,20 @@ public class CNBlockEntityTypes { .validBlocks(CNBlocks.REACTOR_CORE) .register(); - public static final BlockEntityEntry REACTOR_INPUT = - CreateNuclear.REGISTRATE.blockEntity("reactor_input", ReactorInputEntity::new) - .validBlocks(CNBlocks.REACTOR_INPUT) + public static final BlockEntityEntry REACTOR_FRAME = + CreateNuclear.REGISTRATE.blockEntity("reactor_frame", ReactorFrameEntity::new) + .validBlocks(CNBlocks.REACTOR_FRAME) + .renderer(() -> ReactorFrameRenderer::new) + .register(); + + public static final BlockEntityEntry REACTOR_ROD_INPUT = + CreateNuclear.REGISTRATE.blockEntity("reactor_rod_input", ReactorRodInputEntity::new) + .validBlocks(CNBlocks.REACTOR_ROD_INPUT) + .register(); + + public static final BlockEntityEntry REACTOR_FLUID_INPUT = + CreateNuclear.REGISTRATE.blockEntity("reactor_fluid_input", ReactorFluidInputEntity::new) + .validBlocks(CNBlocks.REACTOR_FLUID_INPUT) .register(); public static final BlockEntityEntry REACTOR_OUTPUT = @@ -44,5 +59,10 @@ public class CNBlockEntityTypes { .validBlocks(CNBlocks.REACTOR_CONTROLLER) .register(); + public static final BlockEntityEntry REACTOR_ALARM = + CreateNuclear.REGISTRATE.blockEntity("reactor_alarm", ReactorAlarmEntity::new) + .validBlocks(CNBlocks.REACTOR_ALARM) + .register(); + public static void register() {} } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java index 39724348f..02159b2d7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java @@ -6,16 +6,20 @@ import com.simibubi.create.foundation.data.AssetLookup; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.SharedProperties; +import static com.simibubi.create.api.behaviour.display.DisplaySource.displaySource; + + import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.data.loot.BlockLootSubProvider; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; + import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.Enchantments; @@ -28,123 +32,144 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.Tags; import net.nuclearteam.createnuclear.content.enriching.campfire.EnrichingCampfireBlock; import net.nuclearteam.createnuclear.content.enriching.fire.EnrichingFireBlock; -import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; +import net.minecraftforge.common.Tags; + +import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm; import net.nuclearteam.createnuclear.content.multiblock.casing.ReactorCasing; import net.nuclearteam.createnuclear.CNTags.CNBlockTags; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerGenerator; +import net.nuclearteam.createnuclear.content.multiblock.cooler.ReactorCooler; import net.nuclearteam.createnuclear.content.multiblock.core.ReactorCore; import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrame; import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorframeItem; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInput; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInputGenerator; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInput; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputGenerator; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInput; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputGenerator; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputGenerator; -import net.nuclearteam.createnuclear.content.multiblock.reactorCooler.ReactorCooler; import net.nuclearteam.createnuclear.content.multiblock.reinforced.ReinforcedGlassBlock; import net.nuclearteam.createnuclear.content.uraniumOre.UraniumOreBlock; +import net.nuclearteam.createnuclear.content.uraniumOre.UraniumOreItem; import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.axeOrPickaxe; import static com.simibubi.create.foundation.data.TagGen.pickaxeOnly; +@SuppressWarnings("removal") public class CNBlocks { - public static final BlockEntry REACTOR_CASING = - CreateNuclear.REGISTRATE.block("reactor_casing", properties -> new ReactorCasing(properties, ReactorCasing.TypeBlock.CASING)) - .properties(p -> p.explosionResistance(3F) - .destroyTime(4F)) - .blockstate((c,p) -> - p.getVariantBuilder(c.getEntry()).forAllStates((state) -> ConfiguredModel.builder() - .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/casing/block"))) - .build())) - .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(CNSpriteShifts.REACTOR_CASING))) - .onRegister(casingConnectivity((block,cc) -> cc.makeCasing(block, CNSpriteShifts.REACTOR_CASING))) - .tag(BlockTags.NEEDS_DIAMOND_TOOL) - .simpleItem() - .transform(pickaxeOnly()) - .register(); + public static final BlockEntry REACTOR_CASING = CreateNuclear.REGISTRATE + .block("reactor_casing", properties -> new ReactorCasing(properties, ReactorCasing.TypeBlock.CASING)) + .properties(p -> p + .explosionResistance(3F) + .destroyTime(4F) + ) + .blockstate((c, p) -> p.getVariantBuilder(c.getEntry()).forAllStates((state) -> ConfiguredModel.builder() + .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/casing/block"))) + .build())) + .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(CNSpriteShifts.REACTOR_CASING))) + .onRegister(casingConnectivity((block, cc) -> cc.makeCasing(block, CNSpriteShifts.REACTOR_CASING))) + .tag(BlockTags.NEEDS_DIAMOND_TOOL) + .simpleItem() + .transform(pickaxeOnly()) + .transform(displaySource(CNDisplaySources.HEAT)) + .transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) + .transform(displaySource(CNDisplaySources.FUEL)) + .transform(displaySource(CNDisplaySources.COOLER)) + .transform(displaySource(CNDisplaySources.REACTOR_SIZE)) + .transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) + .register(); - public static final BlockEntry REACTOR_CORE = - CreateNuclear.REGISTRATE.block("reactor_core", ReactorCore::new) - .properties(p -> p.explosionResistance(6F)) - .properties(p -> p.destroyTime(4F)) - .tag(BlockTags.NEEDS_DIAMOND_TOOL) - .blockstate((c, p) -> - p.getVariantBuilder(c.getEntry()) - .forAllStates(state -> ConfiguredModel.builder() - .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/core/block"))) - .uvLock(false) - .build() - ) - ) - .transform(pickaxeOnly()) - .simpleItem() - .register(); + public static final BlockEntry REACTOR_CORE = CreateNuclear.REGISTRATE + .block("reactor_core", ReactorCore::new) + .properties(p -> p.explosionResistance(6F)) + .properties(p -> p.destroyTime(4F)) + .tag(BlockTags.NEEDS_DIAMOND_TOOL) + .blockstate((c, p) -> p.getVariantBuilder(c.getEntry()) + .forAllStates(state -> ConfiguredModel.builder() + .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/core/block"))) + .uvLock(false) + .build())) + .transform(pickaxeOnly()) + .simpleItem() + .register(); - public static final BlockEntry REACTOR_FRAME = - CreateNuclear.REGISTRATE.block("reactor_frame", ReactorFrame::new) - .initialProperties(SharedProperties::stone) - .properties(p -> p.explosionResistance(3F).destroyTime(2F)) - .addLayer(() -> RenderType::cutoutMipped) - .transform(pickaxeOnly()) - .tag(BlockTags.NEEDS_DIAMOND_TOOL) - .blockstate((c, p) -> - p.getVariantBuilder(c.getEntry()) - .forAllStatesExcept(state -> { - ReactorFrame.Part part = state.getValue(ReactorFrame.PART); - String baseFile = "block/reactor/frame/frame_"; - ModelFile start = p.models().getExistingFile(p.modLoc(baseFile + "top")); - ModelFile middle = p.models().getExistingFile(p.modLoc(baseFile + "middle")); - ModelFile bottom = p.models().getExistingFile(p.modLoc(baseFile + "bottom")); - ModelFile none = p.models().getExistingFile(p.modLoc(baseFile + "none")); - return ConfiguredModel.builder().modelFile(switch (part) { + public static final BlockEntry REACTOR_FRAME = CreateNuclear.REGISTRATE + .block("reactor_frame", ReactorFrame::new) + .initialProperties(SharedProperties::stone) + .properties(p -> p.explosionResistance(3F).destroyTime(2F).noOcclusion()) + .addLayer(() -> RenderType::cutoutMipped) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_DIAMOND_TOOL) + .blockstate((c, p) -> p.getVariantBuilder(c.getEntry()) + .forAllStatesExcept(state -> { + ReactorFrame.Part part = state.getValue(ReactorFrame.PART); + String baseFile = "block/reactor/frame/frame_"; + ModelFile start = p.models().getExistingFile(p.modLoc(baseFile + "top")); + ModelFile middle = p.models().getExistingFile(p.modLoc(baseFile + "middle")); + ModelFile bottom = p.models().getExistingFile(p.modLoc(baseFile + "bottom")); + ModelFile none = p.models().getExistingFile(p.modLoc(baseFile + "none")); + return ConfiguredModel.builder().modelFile(switch (part) { case START -> start; case MIDDLE -> middle; case END -> bottom; default -> none; - }) - .uvLock(false) - .build(); }) - ) + .uvLock(false) + .build(); + })) .item(ReactorframeItem::new) .model(AssetLookup.customBlockItemModel("reactor", "frame", "item")) .build() .register(); - public static final BlockEntry REACTOR_COOLER = - CreateNuclear.REGISTRATE.block("reactor_cooler", ReactorCooler::new) - .properties(p -> p.explosionResistance(3F) - .destroyTime(4F)) - .blockstate((c,p) -> - p.getVariantBuilder(c.getEntry()).forAllStates((state) -> ConfiguredModel.builder() - .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/cooler/block"))) - .build())) + public static final BlockEntry REACTOR_COOLER = CreateNuclear.REGISTRATE + .block("reactor_cooler", ReactorCooler::new) + .properties(p -> p + .explosionResistance(3F) + .destroyTime(4F)) + .blockstate((c, p) -> p.getVariantBuilder(c.getEntry()).forAllStates((state) -> ConfiguredModel.builder() + .modelFile(p.models().getExistingFile(p.modLoc("block/reactor/cooler/block"))) + .build())) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .simpleItem() .transform(pickaxeOnly()) .register(); + public static final BlockEntry REACTOR_ROD_INPUT = CreateNuclear.REGISTRATE + .block("reactor_rod_input", ReactorRodInput::new) + .initialProperties(SharedProperties::stone) + .properties(p -> p.explosionResistance(6F)) + .properties(p -> p.destroyTime(2F)) + .addLayer(() -> RenderType::cutoutMipped) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_DIAMOND_TOOL) + .blockstate(new ReactorRodInputGenerator()::generate) + .item() + .transform(customItemModel("reactor", "rod_input", "item")) + .register(); + - public static final BlockEntry REACTOR_INPUT = - CreateNuclear.REGISTRATE.block("reactor_input", ReactorInput::new) + public static final BlockEntry REACTOR_FLUID_INPUT = + CreateNuclear.REGISTRATE.block("reactor_fluid_input", ReactorFluidInput::new) .initialProperties(SharedProperties::stone) .properties(p -> p.explosionResistance(6F)) .properties(p -> p.destroyTime(2F)) .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) - .blockstate(new ReactorInputGenerator()::generate) + .blockstate(new ReactorFluidInputGenerator()::generate) .item() - .transform(customItemModel("reactor", "input", "item")) + .transform(customItemModel("reactor", "fluid_input", "item")) .register(); public static final BlockEntry REACTOR_OUTPUT = @@ -155,19 +180,25 @@ public class CNBlocks { .tag(AllTags.AllBlockTags.SAFE_NBT.tag, BlockTags.NEEDS_DIAMOND_TOOL) .transform(pickaxeOnly()) .blockstate(new ReactorOutputGenerator()::generate) - .onRegister(block -> BlockStressValues.CAPACITIES.register(block, () -> 10240.0)) + .onRegister(block -> BlockStressValues.CAPACITIES.register(block, () -> 64000.0)) .item() .transform(customItemModel("reactor", "output", "item")) .register(); - public static final BlockEntry REACTOR_CONTROLLER = - CreateNuclear.REGISTRATE.block("reactor_controller", ReactorControllerBlock::new) + public static final BlockEntry REACTOR_CONTROLLER = CreateNuclear.REGISTRATE + .block("reactor_controller", ReactorControllerBlock::new) .initialProperties(SharedProperties::stone) .properties(p -> p.explosionResistance(6F)) .properties(p -> p.destroyTime(4F)) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .blockstate(new ReactorControllerGenerator()::generate) + .transform(displaySource(CNDisplaySources.HEAT)) + .transform(displaySource(CNDisplaySources.LIQUID_LEVEL)) + .transform(displaySource(CNDisplaySources.FUEL)) + .transform(displaySource(CNDisplaySources.COOLER)) + .transform(displaySource(CNDisplaySources.REACTOR_SIZE)) + .transform(displaySource(CNDisplaySources.REACTOR_SUMMARY)) .item() .transform(customItemModel("reactor", "controller", "item")) .register(); @@ -175,7 +206,7 @@ public class CNBlocks { public static final BlockEntry REINFORCED_GLASS = CreateNuclear.REGISTRATE .block("reinforced_glass", ReinforcedGlassBlock::new) .initialProperties(() -> Blocks.GLASS) - .properties(p -> p.explosionResistance(7.0F).destroyTime(2F)) + .properties(p -> p.explosionResistance(1200.0F).destroyTime(2F)) .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(CNSpriteShifts.REACTOR_GLASS))) .onRegister(casingConnectivity((block,cc) -> cc.makeCasing(block, CNSpriteShifts.REACTOR_GLASS))) .loot(RegistrateBlockLootTables::dropWhenSilkTouch) @@ -203,10 +234,8 @@ public class CNBlocks { .build() .register(); - - - public static final BlockEntry ENRICHING_FIRE = - CreateNuclear.REGISTRATE.block("enriching_fire", properties -> new EnrichingFireBlock(properties, 3.0f)) + public static final BlockEntry ENRICHING_FIRE = CreateNuclear.REGISTRATE + .block("enriching_fire", properties -> new EnrichingFireBlock(properties, 3.0f)) .initialProperties(() -> Blocks.FIRE) .properties(Properties::replaceable) .properties(Properties::noCollission) @@ -263,16 +292,15 @@ public class CNBlocks { .addModel() .end(); }) - .register() - ; + .register(); - public static final BlockEntry ENRICHING_CAMPFIRE = - CreateNuclear.REGISTRATE.block("enriching_campfire", properties -> new EnrichingCampfireBlock(properties, true, 5)) + public static final BlockEntry ENRICHING_CAMPFIRE = CreateNuclear.REGISTRATE + .block("enriching_campfire", properties -> new EnrichingCampfireBlock(properties, true, 5)) .properties(p -> p.mapColor(MapColor.PODZOL) - .instrument(NoteBlockInstrument.BASS) - .strength(2.0F) - .sound(SoundType.WOOD) - .lightLevel(EnrichingCampfireBlock::getLight)) + .instrument(NoteBlockInstrument.BASS) + .strength(2.0F) + .sound(SoundType.WOOD) + .lightLevel(EnrichingCampfireBlock::getLight)) .properties(Properties::noOcclusion) .properties(Properties::ignitedByLava) .addLayer(() -> RenderType::cutoutMipped) @@ -302,62 +330,204 @@ public class CNBlocks { default -> 0; }) .build(); - }, BlockStateProperties.SIGNAL_FIRE, BlockStateProperties.WATERLOGGED - ) - ) + }, BlockStateProperties.SIGNAL_FIRE, BlockStateProperties.WATERLOGGED)) .item() - .model((c, p) -> - p.withExistingParent(c.getName(), new ResourceLocation("item/generated")) - .texture("layer0", p.modLoc("item/enriched/campfire")) - ) + .model((c, p) -> p.withExistingParent(c.getName(), new ResourceLocation("item/generated")) + .texture("layer0", p.modLoc("item/enriched/campfire"))) .build() .tag(CNBlockTags.FAN_PROCESSING_CATALYSTS_ENRICHED.tag) .register(); + + public static final BlockEntry ENRICHED_SOUL_SOIL = + CreateNuclear.REGISTRATE.block("enriched_soul_soil", Block::new) + .initialProperties(() -> Blocks.SOUL_SOIL) + .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, c.get()) + .unlockedBy("has_nether_star", RegistrateRecipeProvider.has(Items.NETHER_STAR)) + .define('S', Blocks.SOUL_SOIL) + .define('O', Blocks.OBSIDIAN) + .define('N', Items.NETHER_STAR) + .pattern("SOS") + .pattern("ONO") + .pattern("SOS") + .showNotification(true) + .save(p, CreateNuclear.asResource("crafting/" + c.getName())) + ) + .simpleItem() + .tag(BlockTags.MINEABLE_WITH_SHOVEL) + .tag(CNBlockTags.ENRICHING_FIRE_BASE_BLOCKS.tag, BlockTags.NEEDS_DIAMOND_TOOL) + .register(); + + public static final BlockEntry DEEPSLATE_URANIUM_ORE = + CreateNuclear.REGISTRATE.block("deepslate_uranium_ore", UraniumOreBlock::new) + .initialProperties(() -> Blocks.DIAMOND_ORE) + .properties(UraniumOreBlock.litBlockEmission()) + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_URANIUM) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(3.0F, 4.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 1)) + )))) + .tag(BlockTags.NEEDS_DIAMOND_TOOL, + BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/deepslate"), + CNTags.forgeBlockTag("ores/uranium") + ) + .item((b, p) -> new UraniumOreItem(b, p, 3)) + .tag(CNTags.forgeItemTag("ores/uranium")) + .build() + .register(); + public static final BlockEntry DEEPSLATE_LEAD_ORE = CreateNuclear.REGISTRATE.block("deepslate_lead_ore", Block::new) + .initialProperties(() -> Blocks.DIAMOND_ORE) + .simpleItem() + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_LEAD) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 4.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 4)) + )))) + .tag(BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/deepslate"), + CNTags.forgeBlockTag("ores/lead") + ) + .item() + .tag(CNTags.forgeItemTag("ores/lead")) + .build() + .register(); + + public static final BlockEntry DEEPSLATE_THORIUM_ORE = + CreateNuclear.REGISTRATE.block("deepslate_thorium_ore", Block::new) .initialProperties(() -> Blocks.DIAMOND_ORE) .simpleItem() .transform(pickaxeOnly()) .loot((lt, b) -> lt.add(b, RegistrateBlockLootTables.createSilkTouchDispatchTable(b, - lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_LEAD) - .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_THORIUM) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 5.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 5)) )))) - .tag(BlockTags.NEEDS_IRON_TOOL, + .tag(BlockTags.NEEDS_DIAMOND_TOOL, + BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/deepslate"), - CNTags.forgeBlockTag("ores/lead"), - CNBlockTags.LEAD_ORES.tag + CNTags.forgeBlockTag("ores/thorium") ) .item() - .tag(CNItemTags.LEAD_ORES.tag, - CNTags.forgeItemTag("ores/lead")) + .tag(CNTags.forgeItemTag("ores/thorium")) .build() .register(); - public static final BlockEntry LEAD_ORE = - CreateNuclear.REGISTRATE.block("lead_ore", Block::new) + public static final BlockEntry URANIUM_ORE = + CreateNuclear.REGISTRATE.block("uranium_ore", UraniumOreBlock::new) .initialProperties(SharedProperties::stone) + .properties(UraniumOreBlock.litBlockEmission()) .simpleItem() .transform(pickaxeOnly()) .loot((lt, b) -> lt.add(b, RegistrateBlockLootTables.createSilkTouchDispatchTable(b, - lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_LEAD) - .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_URANIUM) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(3.0F, 4.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 1)) )))) + .tag(BlockTags.NEEDS_DIAMOND_TOOL, + BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/stone"), + CNTags.forgeBlockTag("ores/uranium") + ) + .item((b, p) -> new UraniumOreItem(b, p, 3)) + .tag(CNTags.forgeItemTag("ores/uranium")) + .build() + .register(); + + public static final BlockEntry LEAD_ORE = CreateNuclear.REGISTRATE.block("lead_ore", Block::new) + .initialProperties(SharedProperties::stone) + .simpleItem() + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_LEAD) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 4.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 4)) + )))) .tag(BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/stone"), + CNTags.forgeBlockTag("ores/lead") + ) + .item() + .tag(CNTags.forgeItemTag("ores/lead")) + .build() + .register(); + + + public static final BlockEntry THORIUM_ORE = + CreateNuclear.REGISTRATE.block("thorium_ore", Block::new) + .initialProperties(SharedProperties::stone) + .simpleItem() + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_THORIUM) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 5.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 5)) + )))) + .tag(BlockTags.NEEDS_DIAMOND_TOOL, + BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/stone"), - CNTags.forgeBlockTag("ores/lead"), - CNBlockTags.LEAD_ORES.tag + CNTags.forgeBlockTag("ores/thorium") ) .item() - .tag(CNItemTags.LEAD_ORES.tag, - CNTags.forgeItemTag("ores/lead")) + .tag(CNTags.forgeItemTag("ores/thorium")) .build() .register(); + public static final BlockEntry NITRATE_ORE = + CreateNuclear.REGISTRATE.block("nitrate_ore", Block::new) + .initialProperties(SharedProperties::stone) + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.NITRATE) + .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) + )))) + .tag(BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/stone"), + CNTags.forgeBlockTag("ores/nitrate") + ) + .item() + .tag(CNTags.forgeItemTag("ores/nitrate")) + .build() + .register(); + + public static final BlockEntry DEEPSLATE_NITRATE_ORE = + CreateNuclear.REGISTRATE.block("deepslate_nitrate_ore", Block::new) + .initialProperties(SharedProperties::stone) + .simpleItem() + .transform(pickaxeOnly()) + .loot((lt, b) -> lt.add(b, + RegistrateBlockLootTables.createSilkTouchDispatchTable(b, + lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.NITRATE) + .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) + )))) + .tag(BlockTags.NEEDS_IRON_TOOL, + CNTags.forgeBlockTag("ores"), + CNTags.forgeBlockTag("ores_in_ground/deepslate"), + CNTags.forgeBlockTag("ores/nitrate") + ) + .item() + .tag(CNTags.forgeItemTag("ores/nitrate")) + .build() + .register(); + public static final BlockEntry RAW_URANIUM_BLOCK = CreateNuclear.REGISTRATE.block("raw_uranium_block", Block::new) .initialProperties(SharedProperties::stone) @@ -371,13 +541,12 @@ public class CNBlocks { .pattern("RRR") .pattern("RRR") .save(p, CreateNuclear.asResource("crafting/" + c.getName()))) - .item() + .item((b, p) -> new UraniumOreItem(b, p, 27)) .tag(CNTags.forgeItemTag("storage_blocks/raw_uranium")) .build() .register(); - public static final BlockEntry RAW_LEAD_BLOCK = - CreateNuclear.REGISTRATE.block("raw_lead_block", Block::new) + public static final BlockEntry RAW_LEAD_BLOCK = CreateNuclear.REGISTRATE.block("raw_lead_block", Block::new) .initialProperties(SharedProperties::stone) .transform(pickaxeOnly()) .tag(CNTags.forgeBlockTag("storage_blocks/raw_lead")) @@ -393,6 +562,24 @@ public class CNBlocks { .build() .register(); + + public static final BlockEntry RAW_THORIUM_BLOCK = + CreateNuclear.REGISTRATE.block("raw_thorium_block", Block::new) + .initialProperties(SharedProperties::stone) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_DIAMOND_TOOL, CNTags.forgeBlockTag("storage_blocks/raw_thorium")) + .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, c.get()) + .unlockedBy("has_raw_materials_thorium", RegistrateRecipeProvider.has(CNTags.forgeItemTag("raw_materials/thorium"))) + .define('R', CNTags.forgeItemTag("raw_materials/thorium")) + .pattern("RRR") + .pattern("RRR") + .pattern("RRR") + .save(p, CreateNuclear.asResource("crafting/raw/" + c.getName()))) + .item() + .tag(CNTags.forgeItemTag("storage_blocks/raw_thorium")) + .build() + .register(); + public static final BlockEntry LEAD_BLOCK = CreateNuclear.REGISTRATE.block("lead_block", Block::new) .initialProperties(SharedProperties::stone) @@ -402,91 +589,36 @@ public class CNBlocks { .tag(CNTags.forgeItemTag("storage_blocks/lead")) .build() .register(); - - public static final BlockEntry ENRICHED_SOUL_SOIL = - CreateNuclear.REGISTRATE.block("enriched_soul_soil", Block::new) - .initialProperties(() -> Blocks.SOUL_SOIL) - .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, c.get()) - .unlockedBy("has_nether_star", RegistrateRecipeProvider.has(Items.NETHER_STAR)) - .define('S', Blocks.SOUL_SOIL) - .define('O', Blocks.OBSIDIAN) - .define('N', Items.NETHER_STAR) - .pattern("SOS") - .pattern("ONO") - .pattern("SOS") - .showNotification(true) - .save(p, CreateNuclear.asResource("crafting/" + c.getName())) - ) - .simpleItem() - .tag(BlockTags.MINEABLE_WITH_SHOVEL) - .tag(CNBlockTags.ENRICHING_FIRE_BASE_BLOCKS.tag, BlockTags.NEEDS_DIAMOND_TOOL) - .register(); - - public static final BlockEntry DEEPSLATE_URANIUM_ORE = - CreateNuclear.REGISTRATE.block("deepslate_uranium_ore", UraniumOreBlock::new) - .initialProperties(() -> Blocks.DIAMOND_ORE) - .properties(UraniumOreBlock.litBlockEmission()) + + public static final BlockEntry THORIUM_BLOCK = + CreateNuclear.REGISTRATE.block("thorium_block", Block::new) + .initialProperties(SharedProperties::stone) .transform(pickaxeOnly()) - .loot((lt, b) -> lt.add(b, - RegistrateBlockLootTables.createSilkTouchDispatchTable(b, - lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_URANIUM) - .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) - )))) - .tag(BlockTags.NEEDS_DIAMOND_TOOL, - BlockTags.NEEDS_IRON_TOOL, - CNTags.forgeBlockTag("ores"), - CNTags.forgeBlockTag("ores_in_ground/deepslate"), - CNTags.forgeBlockTag("ores/uranium"), - CNBlockTags.URANIUM_ORES.tag - ) + .tag(CNTags.forgeBlockTag("storage_blocks/thorium")) .item() - .tag(CNItemTags.URANIUM_ORES.tag, - CNTags.forgeItemTag("ores/uranium")) + .tag(CNTags.forgeItemTag("storage_blocks/thorium")) .build() .register(); - public static final BlockEntry URANIUM_ORE = - CreateNuclear.REGISTRATE.block("uranium_ore", UraniumOreBlock::new) + public static final BlockEntry STEEL_BLOCK = CreateNuclear.REGISTRATE.block("steel_block", Block::new) .initialProperties(SharedProperties::stone) - .properties(UraniumOreBlock.litBlockEmission()) - .simpleItem() .transform(pickaxeOnly()) - .loot((lt, b) -> lt.add(b, - RegistrateBlockLootTables.createSilkTouchDispatchTable(b, - lt.applyExplosionDecay(b, LootItem.lootTableItem(CNItems.RAW_URANIUM) - .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) - )))) - .tag(BlockTags.NEEDS_DIAMOND_TOOL, - BlockTags.NEEDS_IRON_TOOL, - CNTags.forgeBlockTag("ores"), - CNTags.forgeBlockTag("ores_in_ground/stone"), - CNTags.forgeBlockTag("ores/uranium"), - CNBlockTags.URANIUM_ORES.tag - ) + .tag(CNTags.forgeBlockTag("storage_blocks/steel")) .item() - .tag(CNItemTags.URANIUM_ORES.tag, - CNTags.forgeItemTag("ores/uranium")) + .tag(CNTags.forgeItemTag("storage_blocks/steel")) .build() .register(); - public static final BlockEntry STEEL_BLOCK = - CreateNuclear.REGISTRATE.block("steel_block", Block::new) + public static final BlockEntry REACTOR_ALARM = + CreateNuclear.REGISTRATE.block("reactor_alarm", ReactorAlarm::new) .initialProperties(SharedProperties::stone) .transform(pickaxeOnly()) - .tag(CNTags.forgeBlockTag("storage_blocks/steel")) .item() - .tag(CNTags.forgeItemTag("storage_blocks/steel")) .build() .register(); - /*public static final BlockEntry TEST_EVENT_TRIGGER_BLOCK = CreateNuclear.REGISTRATE.block("test_event_trigger_block", EventTriggerBlock::new) - .defaultBlockstate() - .defaultLang() - .simpleItem() - .register();*/ - public static void register() { CreateNuclear.LOGGER.info("Registering ModBlocks for " + CreateNuclear.MOD_ID); } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/CNClientProxy.java b/src/main/java/net/nuclearteam/createnuclear/CNClientProxy.java new file mode 100644 index 000000000..15095a99e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNClientProxy.java @@ -0,0 +1,72 @@ +package net.nuclearteam.createnuclear; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +@OnlyIn(Dist.CLIENT) +public class CNClientProxy { + + public static final ResourceLocation BOMB_FLASH = CreateNuclear.asResource("textures/misc/bomb_flash.png"); + + public static int muteNonNukeSoundsFor = 0; + public static int renderNukeFlashFor = 0; + public static int renderNukeSkyDarkFor = 0; + public static float prevNukeFlashAmount = 0; + public static float nukeFlashAmount = 0; + + public static int lastTremorTick = -1; + public static float[] randomTremorOffsets = new float[3]; + + public static final Int2ObjectMap ENTITY_SOUND_INSTANCE_MAP = new Int2ObjectOpenHashMap<>(); + + public static float getNukeFlashAmount(float partialTicks) { + return prevNukeFlashAmount + (nukeFlashAmount - prevNukeFlashAmount) * partialTicks; + } + + public static void preScreenRender(float partialTick) { + float screenEffectIntensity = Minecraft.getInstance().options.screenEffectScale().get().floatValue(); + float currentNukeFlash = getNukeFlashAmount(partialTick); + + if (currentNukeFlash > 0 && CNConfigs.client().nuclearBombFlash.get()) { + int screenWidth = Minecraft.getInstance().getWindow().getGuiScaledWidth(); + int screenHeight = Minecraft.getInstance().getWindow().getGuiScaledHeight(); + + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, currentNukeFlash * screenEffectIntensity); + RenderSystem.setShaderTexture(0, BOMB_FLASH); + + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + bufferbuilder.vertex(0.0D, screenHeight, -90.0D).uv(0.0F, 1.0F).endVertex(); + bufferbuilder.vertex(screenWidth, screenHeight, -90.0D).uv(1.0F, 1.0F).endVertex(); + bufferbuilder.vertex(screenWidth, 0.0D, -90.0D).uv(1.0F, 0.0F).endVertex(); + bufferbuilder.vertex(0.0D, 0.0D, -90.0D).uv(0.0F, 0.0F).endVertex(); + tesselator.end(); + + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } + + public static boolean isFarFromCamera(double x, double y, double z) { + return Minecraft.getInstance().gameRenderer.getMainCamera().getPosition().distanceToSqr(x, y, z) >= 256.0D; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java index 301ae82d4..0488909fe 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNDamageTypes.java @@ -1,5 +1,6 @@ package net.nuclearteam.createnuclear; +import com.simibubi.create.foundation.damageTypes.DamageTypeBuilder; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceKey; @@ -7,11 +8,17 @@ @SuppressWarnings("unused") public class CNDamageTypes { + public static final ResourceKey + RADIATION = key("radiation"), + FAN_RADIATION = key("fan_radiation") + ; + private static ResourceKey key(String name) { return ResourceKey.create(Registries.DAMAGE_TYPE, CreateNuclear.asResource(name)); } public static void bootstrap(BootstapContext ctx) { - + new DamageTypeBuilder(RADIATION).register(ctx); + new DamageTypeBuilder(FAN_RADIATION).register(ctx); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java b/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java new file mode 100644 index 000000000..24b9afd11 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNDisplaySources.java @@ -0,0 +1,26 @@ +package net.nuclearteam.createnuclear; + +import com.simibubi.create.api.behaviour.display.DisplaySource; +import com.simibubi.create.foundation.data.CreateRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.nuclearteam.createnuclear.content.redstone.displayLink.source.*; + +import java.util.function.Supplier; + +public class CNDisplaySources { + private static final CreateRegistrate REGISTRATE = CreateNuclear.REGISTRATE; + + public static final RegistryEntry HEAT = simple("heat", HeatDisplaySource::new); + public static final RegistryEntry LIQUID_LEVEL = simple("liquid_level", LiquidLevelDisplaySource::new); + public static final RegistryEntry REACTOR_SUMMARY = simple("reactor_summary", ReactorSummaryDisplaySource::new); + public static final RegistryEntry FUEL = simple("fuel", FuelDisplaySource::new); + public static final RegistryEntry COOLER = simple("cooler", CoolerDisplaySource::new); + public static final RegistryEntry REACTOR_SIZE = simple("reactor_size", ReactorSizeDisplaySource::new); + + private static RegistryEntry simple(String name, Supplier supplier) { + return REGISTRATE.displaySource(name, supplier).register(); + } + + public static void register() { + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNEffects.java b/src/main/java/net/nuclearteam/createnuclear/CNEffects.java index a3be985a5..b2d72e951 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNEffects.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNEffects.java @@ -5,12 +5,14 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import net.nuclearteam.createnuclear.content.effects.RadiationEffect; +import net.nuclearteam.createnuclear.content.effects.IodineEffect; +import net.nuclearteam.createnuclear.content.radiation.RadiationEffect; public class CNEffects { public static final DeferredRegister EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, CreateNuclear.MOD_ID); public static final RegistryObject RADIATION = EFFECTS.register("radiation", RadiationEffect::new); + public static final RegistryObject IODINE = EFFECTS.register("iodine", IodineEffect::new); public static void register(IEventBus eventBus) { EFFECTS.register(eventBus); diff --git a/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java b/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java index 335bc01e7..1dc3ee45d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java @@ -1,6 +1,8 @@ package net.nuclearteam.createnuclear; import com.tterrag.registrate.util.entry.EntityEntry; +import net.minecraft.client.renderer.entity.NoopRenderer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraftforge.client.event.EntityRenderersEvent; @@ -12,9 +14,14 @@ import net.nuclearteam.createnuclear.content.contraptions.irradiated.chicken.IrradiatedChicken; import net.nuclearteam.createnuclear.content.contraptions.irradiated.chicken.IrradiatedChickenModel; import net.nuclearteam.createnuclear.content.contraptions.irradiated.chicken.IrradiatedChickenRenderer; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.cow.IrradiatedCow; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.cow.IrradiatedCowModel; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.cow.IrradiatedCowRenderer; import net.nuclearteam.createnuclear.content.contraptions.irradiated.wolf.IrradiatedWolf; import net.nuclearteam.createnuclear.content.contraptions.irradiated.wolf.IrradiatedWolfModel; import net.nuclearteam.createnuclear.content.contraptions.irradiated.wolf.IrradiatedWolfRenderer; +import net.nuclearteam.createnuclear.content.explosion.NuclearExplosionEntity; +import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorModel; public class CNEntityType { @@ -48,10 +55,36 @@ public class CNEntityType { .attributes(IrradiatedWolf::createAttributes) .register(); + public static final EntityEntry IRRADIATED_COW = CreateNuclear.REGISTRATE + .entity("irradiated_cow", IrradiatedCow::new, MobCategory.CREATURE) + .loot((tb, e) -> tb.add(e, LootTable.lootTable())) + .tag(CNEntityTags.IRRADIATED_IMMUNE.tag) + .properties(p -> p.sized(0.6f, 0.85f)) + .lang("Irradiated Cow") + .renderer(() -> IrradiatedCowRenderer::new) + .attributes(IrradiatedCow::createAttributes) + .register(); + + public static final EntityEntry NUCLEAR_EXPLOSION = + CreateNuclear.REGISTRATE.entity("nuclear_explosion", NuclearExplosionEntity::new, MobCategory.MISC) + .properties(builder -> builder + .sized(0.2F, 0.2F) + .setTrackingRange(128) + .setUpdateInterval(1) + .setShouldReceiveVelocityUpdates(true) + ) + // Invisible entity: the mushroom cloud particle does the actual rendering + .renderer(() -> NoopRenderer::new) + .register(); + public static void registerModelLayer(EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(CNModelLayers.IRRADIATED_CAT, IrradiatedCatModel::createBodyLayer); event.registerLayerDefinition(CNModelLayers.IRRADIATED_CHICKEN, IrradiatedChickenModel::createBodyLayer); event.registerLayerDefinition(CNModelLayers.IRRADIATED_WOLF, IrradiatedWolfModel::createBodyLayer); + event.registerLayerDefinition(CNModelLayers.IRRADIATED_COW, IrradiatedCowModel::createBodyLayer); + + event.registerLayerDefinition(CNModelLayers.ANTI_IRRADIATION_ARMOR, AntiRadiationArmorModel::createBodyLayer); + } public static void register() {} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNFluids.java b/src/main/java/net/nuclearteam/createnuclear/CNFluids.java index ba0eb278f..abffe7d1c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNFluids.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNFluids.java @@ -5,14 +5,22 @@ import com.tterrag.registrate.util.entry.FluidEntry; import net.createmod.catnip.theme.Color; import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.core.dispenser.DispenseItemBehavior; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.DispensibleContainerItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraftforge.common.ForgeMod; @@ -24,6 +32,10 @@ import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.ForgeFlowingFluid; import net.nuclearteam.createnuclear.content.decoration.palettes.CNPaletteStoneTypes; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.content.radiation.RadiationBucketItem; + import org.joml.Vector3f; import net.nuclearteam.createnuclear.CNTags.CNFluidTags; @@ -31,6 +43,8 @@ import java.util.function.Supplier; public class CNFluids { + private static final double URANIUM_FLUID_DOSE = 5.0D; + public static final FluidEntry URANIUM = CreateNuclear.REGISTRATE.standardFluid("uranium", SolidRenderedPlaceableFluidtype.create(0x38FF08, () -> 1f / 32f)) .lang("Liquid Uranium") @@ -48,23 +62,113 @@ public class CNFluids { .explosionResistance(100f) ) .source(ForgeFlowingFluid.Source::new) - .bucket() + .bucket((s, p) -> new RadiationBucketItem(s, p, 20)) + .onRegister(CNFluids::registerFluidDispenseBehavior) .tag(CNTags.forgeItemTag("buckets/uranium")) .lang("Uranium Bucket") .build() .register(); + public static final FluidEntry THORIUM = + CreateNuclear.REGISTRATE.standardFluid("thorium", SolidRenderedPlaceableFluidtype.create(0x38f9ff, () -> 1f / 32f)) + .lang("Liquid Thorium") + .tag(CNFluidTags.THORIUM.tag) + .properties(p -> p.viscosity(200) + .density(100) + .canSwim(false) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL_LAVA) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY_LAVA) + .canDrown(false) + ) + .fluidProperties(f -> f.levelDecreasePerBlock(2) + .tickRate(15) + .slopeFindDistance(6) + .explosionResistance(100f) + ) + .source(ForgeFlowingFluid.Source::new) + .bucket() + .onRegister(CNFluids::registerFluidDispenseBehavior) + .tag(CNTags.forgeItemTag("buckets/thorium")) + .lang("Thorium Bucket") + .build() + .register(); + + public static final FluidEntry LIQUID_NITROGEN = + CreateNuclear.REGISTRATE.standardFluid("nitrogen", SolidRenderedPlaceableFluidtype.create(0x23ECD5, () -> 1f / 16f)) + .lang("Liquid Nitrogen") + .tag(CNFluidTags.NITROGEN.tag) + .properties(p -> p.viscosity(1000) + .density(1000) + .canSwim(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL_AXOLOTL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY_FISH) + .canDrown(false) + ) + .fluidProperties(f -> f.levelDecreasePerBlock(5) + .tickRate(10) + .slopeFindDistance(6) + .explosionResistance(100f) + ) + .source(ForgeFlowingFluid.Source::new) + //.onRegister(ReactorFluidTypesValue.setReactorFluidTypeInfos(8196, 100)) + .bucket() + .onRegister(CNFluids::registerFluidDispenseBehavior) + .lang("Nitrogen Bucket") + .tag(CNTags.forgeItemTag("buckets/nitrogen")) + .build() + .register(); + + public static void register() {} public static void handleFluidEffect(LivingEvent.LivingTickEvent event) { LivingEntity entity = event.getEntity(); - if (entity.isAlive() && !(entity.isSpectator())) { - if (entity.tickCount % 20 == 0) return; - if (entity.isInFluidType(URANIUM.getType())) { - entity.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 100, 0)); + if (!entity.isAlive() || entity.isSpectator()) return; + + Level level = entity.level(); + + // 1. Uranium: applies radiation contagion + if (entity.isInFluidType(URANIUM.getType())) { + if (entity.tickCount % 20 == 0) { + RadiationCapability.applyContagion(entity, URANIUM_FLUID_DOSE, 100); } } + // 2. Liquid nitrogen: freezes the entity like powder snow + else if (entity.isInFluidType(LIQUID_NITROGEN.getType())) { + // Extinguish fire immediately on contact + if (entity.isOnFire()) { + entity.clearFire(); + } + + if (entity instanceof Player player && player.isSwimming()) { + CNAdvancement.CRYOGENIC_BAPTISM.awardTo(player); + } + + int currentTicks = entity.getTicksFrozen(); + int maxTicks = entity.getTicksRequiredToFreeze(); + int freezeSpeed = 3; + + if (level.isClientSide) { + // Target maxTicks + 1 so vanilla's client-side -1 decay settles exactly at maxTicks + entity.setTicksFrozen(Math.min(maxTicks + 1, currentTicks + freezeSpeed + 1)); + } else { + // Target maxTicks + 2 so vanilla's server-side -2 decay settles exactly at maxTicks + entity.setTicksFrozen(Math.min(maxTicks + 2, currentTicks + freezeSpeed + 2)); + + // Check the freeze state after applying the compensation above + if (entity.getTicksFrozen() >= maxTicks && entity.tickCount % 10 == 0) { + entity.hurt(entity.damageSources().freeze(), 2.0F); + } + + entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 40, 1, true, false, false)); + } + } + + // 3. Thorium: burns the entity like lava + else if (entity.isInFluidType(THORIUM.getType())) { + entity.lavaHurt(); + } } public static void registerFluidInteractions() { @@ -89,17 +193,20 @@ public static void registerFluidInteractions() { private static class SolidRenderedPlaceableFluidtype extends AllFluids.TintedFluidType { private Vector3f fogColor; + private int fogIntColor; private Supplier fogDistance; public static FluidTypeFactory create(int fogColor, Supplier fogDistance) { return (p, s, f) -> { SolidRenderedPlaceableFluidtype fluidtype = new SolidRenderedPlaceableFluidtype(p,s,f); fluidtype.fogColor = new Color(fogColor, false).asVectorF(); + fluidtype.fogIntColor = fogColor; fluidtype.fogDistance = fogDistance; return fluidtype; }; } + private SolidRenderedPlaceableFluidtype(Properties properties, ResourceLocation stillTecture, ResourceLocation flowingTexture) { super(properties, stillTecture, flowingTexture); } @@ -111,7 +218,7 @@ protected int getTintColor(FluidStack stack) { @Override protected int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) { - return 0x38FF08; + return fogIntColor; } @Override @@ -124,4 +231,22 @@ protected float getFogDistanceModifier() { return fogDistance.get(); } } + + private static final DispenseItemBehavior DEFAULT = new DefaultDispenseItemBehavior(); + private static final DispenseItemBehavior DISPENSE_FLUID = new DefaultDispenseItemBehavior(){ + @Override + protected ItemStack execute(BlockSource pSource, ItemStack pStack) { + DispensibleContainerItem dispensibleContainerItem = (DispensibleContainerItem) pStack.getItem(); + BlockPos pos = pSource.getPos().relative(pSource.getBlockState().getValue(DispenserBlock.FACING)); + Level level = pSource.getLevel(); + if (dispensibleContainerItem.emptyContents(null, level, pos, null, pStack)) { + return new ItemStack(Items.BUCKET); + } + return DEFAULT.dispense(pSource, pStack); + } + }; + + private static void registerFluidDispenseBehavior(BucketItem bucket) { + DispenserBlock.registerBehavior(bucket, DISPENSE_FLUID); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNItems.java b/src/main/java/net/nuclearteam/createnuclear/CNItems.java index a37e3504e..ee3b7054b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNItems.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNItems.java @@ -1,61 +1,68 @@ package net.nuclearteam.createnuclear; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Boot; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Chestplate; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Chestplate.getChestplateTag; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Helmet; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Helmet.getHelmetTag; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Leggings; - -import static net.nuclearteam.createnuclear.CNTags.CNItemTags; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Leggings.getLeggingsTag; - +import com.tterrag.registrate.util.entry.ItemEntry; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.tterrag.registrate.providers.RegistrateRecipeProvider; -import com.tterrag.registrate.util.entry.ItemEntry; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.ShapelessRecipeBuilder; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Mob; import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.common.ForgeSpawnEggItem; +import net.nuclearteam.createnuclear.content.biome.BiomeIrradiationExtractorItem; +import net.nuclearteam.createnuclear.foundation.data.CNBuilderTransformers; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; +import net.nuclearteam.createnuclear.api.data.recipe.SmithingClothRecipeBuilder; +import net.nuclearteam.createnuclear.content.radiation.RadiationItem; +import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; +import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem.Cloths; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem; +import net.nuclearteam.createnuclear.foundation.utility.TextUtils; +import net.minecraft.world.item.Items; import net.nuclearteam.createnuclear.CNTags.CNItemTags; -import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem; +import net.nuclearteam.createnuclear.api.ItemRodTypesValue; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Boot; import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Chestplate; import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Helmet; import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.Leggings; -import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; -import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem; import net.nuclearteam.createnuclear.foundation.item.DyedItemsList; -import net.nuclearteam.createnuclear.foundation.utility.TextUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.function.Supplier; -@SuppressWarnings({"deprecation"}) +import static net.nuclearteam.createnuclear.foundation.data.CNBuilderTransformers.biomeRestoreModel; +import static net.nuclearteam.createnuclear.foundation.data.CNBuilderTransformers.coloredArmorModel; + +@SuppressWarnings({"unused", "deprecation"}) public class CNItems { - public static final ItemEntry + public static final ItemEntry YELLOWCAKE = CreateNuclear.REGISTRATE - .item("yellowcake", Item::new) + .item("yellowcake", p -> new RadiationItem(p, 4)) .properties(p -> p.food(new FoodProperties.Builder() .nutrition(20) .saturationMod(0.3F) .alwaysEat() - .effect((new MobEffectInstance(CNEffects.RADIATION.get(),600,2)) , 1.0F) + .effect(new MobEffectInstance(CNEffects.RADIATION.get(),600,2), 1.0F) .build()) ) .register(), + GRAPHENE = CreateNuclear.REGISTRATE + .item("graphene", Item::new) + .register(), + + ENRICHED_YELLOWCAKE = CreateNuclear.REGISTRATE + .item("enriched_yellowcake", p -> new RadiationItem(p, 2)) + .register(), + RAW_LEAD = CreateNuclear.REGISTRATE .item("raw_lead", Item::new) .tag(CNTags.forgeItemTag("raw_ores"), CNTags.forgeItemTag("raw_materials"), CNTags.forgeItemTag("raw_materials/lead")) @@ -67,37 +74,59 @@ public class CNItems { .register(), RAW_URANIUM = CreateNuclear.REGISTRATE - .item("raw_uranium", Item::new) + .item("raw_uranium", p -> new RadiationItem(p, 3)) .tag(CNTags.forgeItemTag("raw_ores"), CNTags.forgeItemTag("raw_materials"), CNTags.forgeItemTag("raw_materials/uranium")) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) - .unlockedBy("has_storage_blocks_raw_uranium", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/raw_uranium"))) - .requires(CNTags.forgeItemTag("storage_blocks/raw_uranium")) + .unlockedBy("has_storage_blocks_raw_uranium", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/raw_uranium"))) + .requires(CNTags.forgeItemTag("storage_blocks/raw_uranium")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + ) + .register(), + + RAW_THORIUM = CreateNuclear.REGISTRATE + .item("raw_thorium", Item::new) + .tag(CNTags.forgeItemTag("raw_ores"), CNTags.forgeItemTag("raw_materials"), CNTags.forgeItemTag("raw_materials/thorium")) + .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .unlockedBy("has_storage_blocks_raw_thorium", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/raw_thorium"))) + .requires(CNTags.forgeItemTag("storage_blocks/raw_thorium")) .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) ) .register(), + THORIUM_DUST = CreateNuclear.REGISTRATE + .item("thorium_dust", Item::new) + .tag(CNTags.forgeItemTag("dusts"), CNTags.forgeItemTag("dusts/thorium")) + .register(), + URANIUM_POWDER = CreateNuclear.REGISTRATE - .item("uranium_powder", Item::new) + .item("uranium_powder", p -> new RadiationItem(p, 2)) .tag(CNTags.forgeItemTag("dusts"), CNTags.forgeItemTag("dusts/uranium")) .register(), + COAL_DUST = CreateNuclear.REGISTRATE + .item("coal_dust", Item::new) + .tag(CNTags.forgeItemTag("dusts"), CNTags.forgeItemTag("dusts/coal")) + .register(), + + STEEL_INGOT = CreateNuclear.REGISTRATE .item("steel_ingot", Item::new) .tag(CNTags.forgeItemTag("ingots"), CNTags.forgeItemTag("ingots/steel")) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) - .unlockedBy("has_storage_blocks_steel", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/steel"))) - .requires(CNTags.forgeItemTag("storage_blocks/steel")) - .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + .unlockedBy("has_storage_blocks_steel", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/steel"))) + .requires(CNTags.forgeItemTag("storage_blocks/steel")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) ) .register(), - COAL_DUST = CreateNuclear.REGISTRATE - .item("coal_dust", Item::new) - .tag(CNTags.forgeItemTag("dusts"), CNTags.forgeItemTag("coal_dusts"), CNTags.forgeItemTag("dusts/coal")) - .register(), - GRAPHITE_ROD = CreateNuclear.REGISTRATE .item("graphite_rod", Item::new) + .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() + .baseRodHeat(() -> CNConfigs.server().rods.graphiteBaseValue.get()) + .proximityRodHeat(() -> CNConfigs.server().rods.graphiteProximityMalus.getF()) + .rodTimer(() -> CNConfigs.server().rods.graphiteRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.graphiteHeatRatio.get()) + .coolerRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.COOLER.tag) .register(), @@ -105,24 +134,42 @@ public class CNItems { .item("lead_ingot", Item::new) .tag(CNTags.forgeItemTag("ingots"), CNTags.forgeItemTag("ingots/lead")) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(),9) - .unlockedBy("has_storage_blocks_lead", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/lead"))) - .requires(CNTags.forgeItemTag("storage_blocks/lead")) + .unlockedBy("has_storage_blocks_lead", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/lead"))) + .requires(CNTags.forgeItemTag("storage_blocks/lead")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + ) + .register(), + + THORIUM_INGOT = CreateNuclear.REGISTRATE + .item("thorium_ingot", Item::new) + .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/thorium_ingot"))) + .tag(CNTags.forgeItemTag("ingots"), CNTags.forgeItemTag("ingots/thorium")) + .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .unlockedBy("has_storage_blocks_thorium", RegistrateRecipeProvider.has(CNTags.forgeItemTag("storage_blocks/thorium"))) + .requires(CNTags.forgeItemTag("storage_blocks/thorium")) .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) ) .register(), + STEEL_NUGGET = CreateNuclear.REGISTRATE .item("steel_nugget", Item::new) .tag(CNTags.forgeItemTag("nuggets"), CNTags.forgeItemTag("nuggets/steel")) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) - .unlockedBy("has_storage_blocks_steel_nugget", RegistrateRecipeProvider.has(CNTags.forgeItemTag("ingots/steel"))) - .requires(CNTags.forgeItemTag("ingots/steel")) - .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + .unlockedBy("has_storage_blocks_steel_nugget", RegistrateRecipeProvider.has(CNTags.forgeItemTag("ingots/steel"))) + .requires(CNTags.forgeItemTag("ingots/steel")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) ) .register(), URANIUM_ROD = CreateNuclear.REGISTRATE - .item("uranium_rod", Item::new) + .item("uranium_rod", p -> new RadiationItem(p, 100)) + .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() + .baseRodHeat(() -> CNConfigs.server().rods.uraniumBaseValue.get()) + .proximityRodHeat(() ->(float) CNConfigs.server().rods.uraniumProximityBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.uraniumRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.uraniumHeatRatio.get()) + .fuelRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) .register(), @@ -130,117 +177,184 @@ public class CNItems { .item("lead_nugget", Item::new) .tag(CNTags.forgeItemTag("nuggets"), CNTags.forgeItemTag("nuggets/lead")) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) - .unlockedBy("has_storage_blocks_lead_nugget", RegistrateRecipeProvider.has(CNTags.forgeItemTag("ingots/lead"))) - .requires(CNTags.forgeItemTag("ingots/lead")) - .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + .unlockedBy("has_storage_blocks_lead_nugget", RegistrateRecipeProvider.has(CNTags.forgeItemTag("ingots/lead"))) + .requires(CNTags.forgeItemTag("ingots/lead")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) ) .register(), - GRAPHENE = CreateNuclear.REGISTRATE - .item("graphene", Item::new) + THORIUM_NUGGET = CreateNuclear.REGISTRATE + .item("thorium_nugget", Item::new) + .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/thorium_nugget"))) + .tag(CNTags.forgeItemTag("nuggets"), CNTags.forgeItemTag("nuggets/thorium")) + .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .unlockedBy("has_storage_blocks_steel_nugget", RegistrateRecipeProvider.has(CNTags.forgeItemTag("ingots/thorium"))) + .requires(CNTags.forgeItemTag("ingots/thorium")) + .save(p, CreateNuclear.asResource("crafting/" + c.getName() + "_from_decompacting")) + ) .register(), - ENRICHED_YELLOWCAKE = CreateNuclear.REGISTRATE - .item("enriched_yellowcake", Item::new) - .register() - ; - - public static final DyedItemsList ANTI_RADIATION_HELMETS = new DyedItemsList<>(color -> { - String colorName = color.getSerializedName(); - - return CreateNuclear.REGISTRATE.item(colorName + "_anti_radiation_helmet", p -> new Helmet(p, color)) - .tag( - CNTags.forgeItemTag("armors/helmets"), - getHelmetTag(colorName), - CNItemTags.ALL_ANTI_RADIATION_ARMORS.tag, - CNItemTags.ANTI_RADIATION_HELMET_FULL_DYE.tag - ) - .recipe((c, p) -> { - ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) - .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) - .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', ClothItem.Cloths.getByColor(color).get()) - .define('Z', CNBlocks.REINFORCED_GLASS.asItem()) - .pattern("YXY") - .pattern("XZX") - .showNotification(true) - .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName())); - }) - .lang(TextUtils.titleCaseConversion(color.getName()) + " Anti Radiation Helmet") - .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/armors/helmets/" + colorName + "_anti_radiation_helmet"))) - .register(); - }); - - public static final DyedItemsList ANTI_RADIATION_CHESTPLATES = new DyedItemsList<>(color -> { - String colorName = color.getSerializedName(); - - return CreateNuclear.REGISTRATE.item(colorName + "_anti_radiation_chestplate", p -> new Chestplate(p, color)) - .tag( - CNTags.forgeItemTag("armors/chestplates"), - getChestplateTag(colorName), - CNItemTags.ALL_ANTI_RADIATION_ARMORS.tag, - CNItemTags.ANTI_RADIATION_CHESTPLATE_FULL_DYE.tag - ) - .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) - .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) - .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', ClothItem.Cloths.getByColor(color).get()) - .define('Z', CNItems.GRAPHITE_ROD) - .pattern("Y Y") - .pattern("XXX") - .pattern("ZXZ") - .showNotification(true) - .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName()))) - .lang(TextUtils.titleCaseConversion(color.getName()) +" Anti Radiation Chestplate") - .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/armors/chestplates/" + colorName + "_anti_radiation_chestplate"))) - .register(); + NITRATE = CreateNuclear.REGISTRATE + .item("nitrate", Item::new) + .lang("Nitrate") + .register(), - }); + NITROGEN_CONCENTRATE = CreateNuclear.REGISTRATE + .item("nitrogen_concentrate", Item::new) + .lang("Nitrogen Concentrate") + .register(), - public static final DyedItemsList ANTI_RADIATION_LEGGINGS = new DyedItemsList<>(color -> { - String colorName = color.getSerializedName(); + COOLED_NITROGEN_CONCENTRATE = CreateNuclear.REGISTRATE + .item("cooled_nitrogen_concentrate", Item::new) + .lang("Cooled Nitrogen Concentrate") + .register(), - return CreateNuclear.REGISTRATE.item(colorName + "_anti_radiation_leggings", p -> new Leggings(p, color)) - .tag( - CNTags.forgeItemTag("armors/leggings"), - getLeggingsTag(colorName), - CNItemTags.ALL_ANTI_RADIATION_ARMORS.tag, - CNItemTags.ANTI_RADIATION_LEGGINGS_FULL_DYE.tag - ) - .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) - .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) - .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', ClothItem.Cloths.getByColor(color).get()) - .pattern("YXY") - .pattern("X X") - .pattern("Y Y") - .showNotification(true) - .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName()))) - .lang(TextUtils.titleCaseConversion(color.getName()) +" Anti Radiation Leggings") - .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/armors/leggings/" + colorName + "_anti_radiation_leggings"))) - .register(); - }); + THORIUM_ROD = CreateNuclear.REGISTRATE + .item("thorium_rod", Item::new) + .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() + .baseRodHeat(() -> CNConfigs.server().rods.baseValueThorium.get()) + .proximityRodHeat(() -> (float) CNConfigs.server().rods.thoriumProxyBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.thoriumRodLifetime.get()) + .ratio(() -> CNConfigs.server().rods.thoriumHeatRatio.get()) + .fuelRodType())) + .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) + .register() + ; + public static final ItemEntry ANTI_RADIATION_HELMETS = CreateNuclear.REGISTRATE + .item("default_anti_radiation_helmet", p -> new Helmet(p, DyeColor.BLACK)) + .tag( + CNTags.forgeItemTag("armors/helmets"), + CNItemTags.ANTI_RADIATION_ARMOR.tag + ) + .recipe((c, p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) + .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .define('X', CNTags.forgeItemTag("ingots/lead")) + .define('Y', CNTags.forgeItemTag("ingots/brass")) + .define('Z', CNBlocks.REINFORCED_GLASS.asItem()) + .pattern("YXY") + .pattern("XZX") + .showNotification(true) + .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName())); + + for (Cloths cloth : Cloths.values()) { + SmithingClothRecipeBuilder + .smithingCloth( + Ingredient.EMPTY, + Ingredient.of(c.get()), + Ingredient.of(cloth.getItem()), + RecipeCategory.COMBAT, + new ItemStack(c.get()) + ) + .unlocks("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .save(p, CreateNuclear.asResource("smithing/" + c.getName() + "_" + cloth.getColor().getSerializedName())); + } + }) + .lang("Anti Radiation Helmet") + .model(coloredArmorModel("helmet", "layer0", "particle")) + .register(); - public static final ItemEntry - ANTI_RADIATION_BOOTS = CreateNuclear.REGISTRATE.item("anti_radiation_boots", Boot::new) - .tag( - CNTags.forgeItemTag("armors/boots"), - CNItemTags.ANTI_RADIATION_BOOTS_DYE.tag, - CNItemTags.ANTI_RADIATION_ARMOR.tag, - CNItemTags.ALL_ANTI_RADIATION_ARMORS.tag - ) - .lang("Anti Radiation Boots") - .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) + public static final ItemEntry ANTI_RADIATION_CHESTPLATES = CreateNuclear.REGISTRATE + .item("default_anti_radiation_chestplate", p -> new Chestplate(p, DyeColor.BLACK)) + .tag( + CNTags.forgeItemTag("armors/chestplates"), + CNTags.CNItemTags.ANTI_RADIATION_ARMOR.tag + ) + .recipe((c, p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', ClothItem.Cloths.WHITE_CLOTH.getItem()) + .define('Y', CNTags.forgeItemTag("ingots/brass")) + .define('Z', CNItems.GRAPHITE_ROD) .pattern("Y Y") - .pattern("X X") + .pattern("XXX") + .pattern("ZXZ") .showNotification(true) - .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName()))) - .model((c, p) -> p.generated(c, CreateNuclear.asResource("item/armors/anti_radiation_boots"))) - .register(); + .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName())); + for (Cloths cloth : Cloths.values()) { + SmithingClothRecipeBuilder + .smithingCloth( + Ingredient.EMPTY, + Ingredient.of(c.get()), + Ingredient.of(cloth.getItem()), + RecipeCategory.COMBAT, + new ItemStack(c.get()) + ) + .unlocks("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .save(p, CreateNuclear.asResource("smithing/" + c.getName() + "_" + cloth.getColor().getSerializedName())); + } + }) + .lang("Anti Radiation Chestplate") + .model(coloredArmorModel("chestplate", "14")) + .register(); + + public static final ItemEntry ANTI_RADIATION_LEGGINGS = CreateNuclear.REGISTRATE + .item("default_anti_radiation_leggings", p -> new Leggings(p, DyeColor.BLACK)) + .tag( + CNTags.forgeItemTag("armors/leggings"), + CNTags.CNItemTags.ANTI_RADIATION_ARMOR.tag + ) + .recipe((c, p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) + .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .define('X', CNTags.forgeItemTag("ingots/lead")) + .define('Y', CNTags.forgeItemTag("ingots/brass")) + .pattern("YXY") + .pattern("X X") + .pattern("Y Y") + .showNotification(true) + .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName())); + + for (Cloths cloth : Cloths.values()) { + SmithingClothRecipeBuilder + .smithingCloth( + Ingredient.EMPTY, + Ingredient.of(c.get()), + Ingredient.of(cloth.getItem()), + RecipeCategory.COMBAT, + new ItemStack(c.get()) + ) + .unlocks("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .save(p, CreateNuclear.asResource("smithing/" + c.getName() + "_" + cloth.getColor().getSerializedName())); + } + }) + .lang("Anti Radiation Leggings") + .model(coloredArmorModel("leggings", "14")) + .register(); + + public static final ItemEntry ANTI_RADIATION_BOOTS = CreateNuclear.REGISTRATE + .item("default_anti_radiation_boots", p -> new Boot(p, DyeColor.BLACK)) + .tag( + CNTags.forgeItemTag("armors/boots"), + CNTags.CNItemTags.ANTI_RADIATION_ARMOR.tag + ) + .recipe((c, p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) + .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .define('X', CNTags.forgeItemTag("ingots/lead")) + .define('Y', CNTags.forgeItemTag("ingots/brass")) + .pattern("Y Y") + .pattern("X X") + .showNotification(true) + .save(p, CreateNuclear.asResource("crafting/items/armors/" + c.getName())); + + for (Cloths cloth : Cloths.values()) { + SmithingClothRecipeBuilder + .smithingCloth( + Ingredient.EMPTY, + Ingredient.of(c.get()), + Ingredient.of(cloth.getItem()), + RecipeCategory.COMBAT, + new ItemStack(c.get()) + ) + .unlocks("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) + .save(p, CreateNuclear.asResource("smithing/" + c.getName() + "_" + cloth.getColor().getSerializedName())); + } + }) + .lang("Anti Radiation Boots") + .model(coloredArmorModel("boots", "14")) + .register(); public static final DyedItemsList CLOTHS = new DyedItemsList<>(color -> { String colorName = color.getSerializedName(); @@ -250,7 +364,12 @@ public class CNItems { .tag(CNItemTags.CLOTH.tag) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, c.get()) .unlockedBy("has_white_cloth", RegistrateRecipeProvider.has(ClothItem.Cloths.WHITE_CLOTH.getItem())) - .requires(CNItemTags.CLOTH.tag) + // Accept any cloth EXCEPT one already of the target color, otherwise the + // recipe would let you "dye" a cloth into the color it already is. + .requires(Ingredient.of(Arrays.stream(DyeColor.values()) + .filter(other -> other != color) + .map(other -> ClothItem.Cloths.getByColor(other).get()) + .toArray(ClothItem[]::new))) .requires(ingredients.get(color.ordinal())) .save(p, CreateNuclear.asResource("shapeless/cloth/" + c.getName())) ) @@ -259,9 +378,9 @@ public class CNItems { .register(); }); - public static final ItemEntry SPAWN_WOLF = registerSpawnEgg("wolf_irradiated_spawn_egg", CNEntityType.IRRADIATED_WOLF, 0x42452B,0x4C422B, "Irradiated Wolf Spawn Egg"); - public static final ItemEntry SPAWN_CAT = registerSpawnEgg("cat_irradiated_spawn_egg", CNEntityType.IRRADIATED_CAT, 0x382C19, 0x742728, "Irradiated Cat Spawn Egg"); - public static final ItemEntry SPAWN_CHICKEN = registerSpawnEgg("chicken_irradiated_spawn_egg", CNEntityType.IRRADIATED_CHICKEN, 0x6B9455, 0x95393C, "Irradiated Chicken Spawn Egg"); + public static final ItemEntry SPAWN_WOLF = CNBuilderTransformers.spawnEgg("wolf_irradiated_spawn_egg", CNEntityType.IRRADIATED_WOLF, 0x42452B, 0x4C422B, "Irradiated Wolf Spawn Egg"); + public static final ItemEntry SPAWN_CAT = CNBuilderTransformers.spawnEgg("cat_irradiated_spawn_egg", CNEntityType.IRRADIATED_CAT, 0x382C19, 0x742728, "Irradiated Cat Spawn Egg"); + public static final ItemEntry SPAWN_CHICKEN = CNBuilderTransformers.spawnEgg("chicken_irradiated_spawn_egg", CNEntityType.IRRADIATED_CHICKEN, 0x6B9455, 0x95393C, "Irradiated Chicken Spawn Egg"); public static final ItemEntry REACTOR_BLUEPRINT = CreateNuclear.REGISTRATE .item("reactor_blueprint_item", ReactorBluePrintItem::new) @@ -286,15 +405,32 @@ public class CNItems { .properties(p -> p.stacksTo(1)) .register(); + public static final ItemEntry REINFORCED_GLASS_BOTTLE = CreateNuclear.REGISTRATE + .item("reinforced_glass_bottle", Item::new) + .lang("Reinforced Glass Bottle") + .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.BREWING, c.get(), 3) + .unlockedBy("has_reinforced_glass", RegistrateRecipeProvider.has(CNBlocks.REINFORCED_GLASS.get())) + .define('G', CNBlocks.REINFORCED_GLASS) + .pattern("G G") + .pattern(" G ") + .save(p, CreateNuclear.asResource("crafting/" + c.getName()))) + .properties(p -> p.stacksTo(16)) + .register(); - private static ItemEntry registerSpawnEgg(String name, Supplier> entity, int backgroundColor, int highlightColor, String nameItems) { - return CreateNuclear.REGISTRATE - .item(name, p -> new ForgeSpawnEggItem(entity, backgroundColor, highlightColor, p)) - .lang(nameItems) - .model((c, p) -> p.withExistingParent(c.getName(), new ResourceLocation("item/template_spawn_egg"))) - .register(); - - } + public static final ItemEntry IRRADIATION_BIOME_EXTRACTOR = CreateNuclear.REGISTRATE + .item("biome_irradiation_extractor", BiomeIrradiationExtractorItem::new) + .lang("Biome Irradiation Extractor") + .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 8) + .unlockedBy("has_reinforced_glass_bottle", RegistrateRecipeProvider.has(CNItems.REINFORCED_GLASS_BOTTLE.get())) + .define('B', CNItems.REINFORCED_GLASS_BOTTLE) + .define('S', Items.NETHER_STAR) + .pattern("BBB") + .pattern("BSB") + .pattern("BBB") + .save(p, CreateNuclear.asResource("crafting/" + c.getName()))) + .properties(p -> p.stacksTo(16).fireResistant().setNoRepair()) + .model(biomeRestoreModel()) + .register(); public static void register() {} } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNMenus.java b/src/main/java/net/nuclearteam/createnuclear/CNMenus.java index 29d2993ad..ff5856585 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNMenus.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNMenus.java @@ -9,12 +9,12 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItemScreen; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintMenu; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInputMenu; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInputScreen; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputMenu; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputScreen; public class CNMenus { public static final MenuEntry REACTOR_BLUEPRINT_MENU = menu("reactor_blueprint_menu", ReactorBluePrintMenu::new, () -> ReactorBluePrintItemScreen::new); - public static final MenuEntry SLOT_ITEM_STORAGE = menu("slot_item_menu", ReactorInputMenu::new, () -> ReactorInputScreen::new); + public static final MenuEntry SLOT_ITEM_STORAGE = menu("slot_item_menu", ReactorRodInputMenu::new, () -> ReactorRodInputScreen::new); private static > MenuEntry menu(String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { return CreateNuclear.REGISTRATE diff --git a/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java b/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java new file mode 100644 index 000000000..225109af3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java @@ -0,0 +1,10 @@ +package net.nuclearteam.createnuclear; + +import com.simibubi.create.api.effect.OpenPipeEffectHandler; +import net.nuclearteam.createnuclear.content.radiation.RadiationEffectHandler; + +public class CNOpenPipeEffectHandlers { + public static void registerDefaults() { + OpenPipeEffectHandler.REGISTRY.register(CNFluids.URANIUM.getSource(), new RadiationEffectHandler()); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNPackets.java b/src/main/java/net/nuclearteam/createnuclear/CNPackets.java index 2befcc463..4f9ecb0e9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNPackets.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNPackets.java @@ -15,7 +15,6 @@ import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent.Context; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItemPacket; -import net.nuclearteam.createnuclear.content.multiblock.controller.EventTriggerPacket; import java.util.function.BiConsumer; import java.util.function.Function; @@ -23,9 +22,6 @@ public enum CNPackets { CONFIGURE_REACTOR_PATTERN(ReactorBluePrintItemPacket.class, ReactorBluePrintItemPacket::new, PLAY_TO_SERVER), - - // To client - TRIGGER_EVENT_TEXT_OVERLAY(EventTriggerPacket.class, EventTriggerPacket::new, PLAY_TO_CLIENT), ; public static final ResourceLocation CHANNEL_NAME = CreateNuclear.asResource("main"); public static final int NETWORK_VERSION = 0; diff --git a/src/main/java/net/nuclearteam/createnuclear/CNParticleRegistry.java b/src/main/java/net/nuclearteam/createnuclear/CNParticleRegistry.java new file mode 100644 index 000000000..d46cb45a7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNParticleRegistry.java @@ -0,0 +1,42 @@ +package net.nuclearteam.createnuclear; + +import com.mojang.serialization.Codec; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class CNParticleRegistry { + public static final DeferredRegister> DEF_REG; + + public static final RegistryObject NUCLEAR_MUSHROOM_CLOUD; + public static final RegistryObject NUCLEAR_MUSHROOM_CLOUD_SMOKE; + public static final RegistryObject NUCLEAR_MUSHROOM_CLOUD_EXPLOSION; + + private static ParticleType createBlockParticleType() { + return new ParticleType(false, BlockParticleOption.DESERIALIZER) { + public Codec codec() { + return BlockParticleOption.codec(this); + } + }; + } + + private static ParticleType createItemParticleType() { + return new ParticleType(false, ItemParticleOption.DESERIALIZER) { + public Codec codec() { + return ItemParticleOption.codec(this); + } + }; + } + + static { + DEF_REG = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, "createnuclear"); + NUCLEAR_MUSHROOM_CLOUD = DEF_REG.register("nuclear_mushroom_cloud", () -> new SimpleParticleType(false)); + NUCLEAR_MUSHROOM_CLOUD_SMOKE = DEF_REG.register("nuclear_mushroom_cloud_smoke", () -> new SimpleParticleType(false)); + NUCLEAR_MUSHROOM_CLOUD_EXPLOSION = DEF_REG.register("nuclear_mushroom_cloud_explosion", () -> new SimpleParticleType(false)); + } + +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java new file mode 100644 index 000000000..6a6be8603 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java @@ -0,0 +1,69 @@ +package net.nuclearteam.createnuclear; + +import com.simibubi.create.foundation.particle.ICustomParticleData; +import net.createmod.catnip.lang.Lang; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RegisterParticleProvidersEvent; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.nuclearteam.createnuclear.content.particles.IrradiatedParticlesData; + +import java.util.function.Supplier; + +public enum CNParticleTypes { + + IRRADIATED_PARTICLES(IrradiatedParticlesData::new), + ; + + private final ParticleEntry entry; + + CNParticleTypes(Supplier> typeFactory) { + String name = Lang.asId(name()); + entry = new ParticleEntry<>(name, typeFactory); + } + + public static void register(IEventBus modEventBus) { + ParticleEntry.REGISTER.register(modEventBus); + } + + @OnlyIn(Dist.CLIENT) + public static void registerFactories(RegisterParticleProvidersEvent event) { + for (CNParticleTypes particle : values()) + particle.entry.registerFactory(event); + } + + public ParticleType get() { + return entry.object.get(); + } + + public String parameter() { + return entry.name; + } + + + private static class ParticleEntry { + private static final DeferredRegister> REGISTER = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, CreateNuclear.MOD_ID); + + private final String name; + private final Supplier> typeFactory; + private final RegistryObject> object; + + public ParticleEntry(String name, Supplier> typeFactory) { + this.name = name; + this.typeFactory = typeFactory; + + object = REGISTER.register(name, () -> this.typeFactory.get().createType()); + } + + @OnlyIn(Dist.CLIENT) + public void registerFactory(RegisterParticleProvidersEvent event) { + typeFactory.get() + .register(object.get(), event); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNPotions.java b/src/main/java/net/nuclearteam/createnuclear/CNPotions.java index 6d72ab695..5b5f70913 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNPotions.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNPotions.java @@ -22,6 +22,13 @@ public class CNPotions { public static final RegistryObject POTION_2 = CN_POTIONS.register("potion_of_radiation_2", () -> new Potion(new MobEffectInstance(CNEffects.RADIATION.get(), 410, 1))); + public static final RegistryObject POTION_1_IODINE = CN_POTIONS.register("potion_of_iodine", + () -> new Potion(new MobEffectInstance(CNEffects.IODINE.get(), 900)) + ); + public static final RegistryObject POTION_AUGMENT_1_IODINE = CN_POTIONS.register("potion_of_iodine_augment", + () -> new Potion(new MobEffectInstance(CNEffects.IODINE.get(), 1800)) + ); + public static void register(IEventBus eventBus) { CN_POTIONS.register(eventBus); } @@ -30,5 +37,8 @@ public static void registerPotionsRecipes() { PotionBrewing.addMix(Potions.AWKWARD, CNItems.ENRICHED_YELLOWCAKE.get(), POTION_1.get()); PotionBrewing.addMix(POTION_1.get(), Items.REDSTONE, POTION_AUGMENT_1.get()); PotionBrewing.addMix(POTION_1.get(), Items.GLOWSTONE_DUST, POTION_2.get()); + + PotionBrewing.addMix(Potions.AWKWARD, Items.DRIED_KELP, POTION_1_IODINE.get()); + PotionBrewing.addMix(POTION_1_IODINE.get(), Items.REDSTONE, POTION_AUGMENT_1_IODINE.get()); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java index 546632b5d..d84ebd2de 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java @@ -17,21 +17,18 @@ import net.minecraftforge.registries.RegistryObject; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; import org.jetbrains.annotations.Nullable; import java.util.Optional; -import java.util.function.Predicate; import java.util.function.Supplier; @SuppressWarnings({"unused", "unchecked"}) public enum CNRecipeTypes implements IRecipeTypeInfo { - ENRICHED(EnrichedRecipe::new) + ENRICHED(EnrichedRecipe::new), + SNOW_POWDER(SnowPowderRecipe::new) ; - public static final Predicate> CAN_BE_AUTOMATED = r -> !r.getId() - .getPath() - .endsWith("_manual_only"); - private final ResourceLocation id; private final RegistryObject> serializerObject; private final Supplier> type; diff --git a/src/main/java/net/nuclearteam/createnuclear/CNShapes.java b/src/main/java/net/nuclearteam/createnuclear/CNShapes.java index b32f6d2f9..602dfc49f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNShapes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNShapes.java @@ -16,7 +16,8 @@ public class CNShapes { // Independent Shapers public static final VoxelShaper REACTOR_OUTPUT = shape(0, 0, 0, 16, 14, 16).forDirectional(), - REACTOR_INPUT = shape(0,0,0,16,16,16).forDirectional() + REACTOR_ROD_INPUT = shape(0,0,0,16,16,16).forDirectional(), + REACTOR_FLUID_INPUT = shape(0,0,0,16,16,16).forDirectional() ; private static Builder shape(VoxelShape shape) { diff --git a/src/main/java/net/nuclearteam/createnuclear/CNSoundEvents.java b/src/main/java/net/nuclearteam/createnuclear/CNSoundEvents.java new file mode 100644 index 000000000..7b5fa807c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/CNSoundEvents.java @@ -0,0 +1,418 @@ +package net.nuclearteam.createnuclear; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.simibubi.create.AllSoundEvents.ConfiguredSoundEvent; +import com.simibubi.create.AllSoundEvents.SoundEntry; +import com.simibubi.create.Create; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryObject; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class CNSoundEvents { + + public static final Map ALL = new HashMap<>(); + + public static final SoundEntry + + REACTOR_ACTIVATION = create("reacteur/activation") + .subtitle("Reactor Activation") + .category(SoundSource.BLOCKS) + .build(), + + REACTOR_RUNNING = create("reacteur/running") + .subtitle("Reactor Running") + .category(SoundSource.BLOCKS) + .build(), + + REACTOR_SHUT_OFF = create("reacteur/shut_off") + .subtitle("Reactor Shut Off") + .category(SoundSource.BLOCKS) + .build(), + + REACTOR_ALARM_ONESHOT = create("alarm/reactor", "alarm") + .subtitle("Reactor Alarm") + .category(SoundSource.BLOCKS) + .build(), + + REACTOR_ALARM_LOOP = create("alarm/alarm") + .subtitle("Reactor Alarm Loop") + .category(SoundSource.BLOCKS) + .build(), + + NUCLEAR_EXPLOSION = create("explosion/nuclear_explosion") + .subtitle("Nuclear Explosion") + .category(SoundSource.AMBIENT) + .build(), + + NUCLEAR_EXPLOSION_LARGE = create("explosion/large_nuclear_explosion") + .subtitle("Large Nuclear Explosion") + .category(SoundSource.AMBIENT) + .build(), + + NUCLEAR_EXPLOSION_RINGING = create("explosion/ringing") + .subtitle("Nuclear Explosion Ringing") + .category(SoundSource.AMBIENT) + .build(), + + NUCLEAR_EXPLOSION_RUMBLE = create("explosion/nuclear_explosion_rumble") + .subtitle("Nuclear Explosion Rumble") + .category(SoundSource.AMBIENT) + .build(), + + MOTOR_ASSEMBLE = create("reacteur/assemble_deassemble/motor_assemble") + .subtitle("Motor Assemble") + .category(SoundSource.BLOCKS) + .build(), + + MOTOR_DISASSEMBLE = create("reacteur/assemble_deassemble/motor_disassemble") + .subtitle("Motor Disassemble") + .category(SoundSource.BLOCKS) + .build(), + + NUCLEAR_EXPLOSION_RUMBLE_2 = create("explosion/rumble") + .subtitle("Nuclear Explosion Rumble") + .category(SoundSource.AMBIENT) + .build(), + + NUCLEAR_EXPLOSION_MAIN = create("explosion/main") + .subtitle("Nuclear Explosion Main") + .category(SoundSource.AMBIENT) + .build(), + + NUCLEAR_EXPLOSION_SHOCKWAVE = create("explosion/shockwave") + .subtitle("Nuclear Explosion Shockwave") + .category(SoundSource.AMBIENT) + .build(), + + GEIGER_HIGH = create("geiger/high") + .subtitle("Geiger High") + .category(SoundSource.AMBIENT) + .build(), + + GEIGER_LOW = create("geiger/low") + .subtitle("Geiger Low") + .category(SoundSource.AMBIENT) + .build(), + + GEIGER_MEDIUM = create("geiger/medium") + .subtitle("Geiger Medium") + .category(SoundSource.AMBIENT) + .build(), + + BIOME_WASTELAND = create("biomes/wasteland") + .subtitle("Wasteland") + .category(SoundSource.AMBIENT) + .build() + ; + + private static SoundEntryBuilder create(String... pathParts) { + String name = String.join("_", pathParts); + return create(CreateNuclear.asResource(name)); + } + + private static SoundEntryBuilder create(ResourceLocation id) { + return new SoundEntryBuilder(id); + } + + public static void prepare() { + for (SoundEntry entry : ALL.values()) entry.prepare(); + } + + public static void register(RegisterEvent event) { + event.register(Registries.SOUND_EVENT, helper -> { + for (SoundEntry entry : ALL.values()) entry.register(helper); + }); + } + + public static void provideLang(BiConsumer consumer) { + for (SoundEntry entry : ALL.values()) + if (entry.hasSubtitle()) + consumer.accept(entry.getSubtitleKey(), entry.getSubtitle()); + } + + public static SoundEntryProvider provider(DataGenerator generator) { + return new SoundEntryProvider(generator); + } + + public static void playItemPickup(Player player) { + player.level() + .playSound(null, player.blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, + 1f + player.level().random.nextFloat()); + } + + public static class SoundEntryProvider implements DataProvider { + + private PackOutput output; + + public SoundEntryProvider(DataGenerator generator) { + output = generator.getPackOutput(); + } + + @Override + public CompletableFuture run(CachedOutput cache) { + return generate(output.getOutputFolder(), cache); + } + + @Override + public String getName() { + return "CreateNuclear's Custom Sounds"; + } + + public CompletableFuture generate(Path path, CachedOutput cache) { + path = path.resolve("assets/createnuclear"); + JsonObject json = new JsonObject(); + ALL.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + entry.getValue() + .write(json); + }); + return DataProvider.saveStable(cache, json, path.resolve("sounds.json")); + } + + } + + public static class SoundEntryBuilder { + + protected ResourceLocation id; + protected String subtitle = "unregistered"; + protected SoundSource category = SoundSource.BLOCKS; + protected List wrappedEvents; + protected List variants; + protected int attenuationDistance; + + public SoundEntryBuilder(ResourceLocation id) { + wrappedEvents = new ArrayList<>(); + variants = new ArrayList<>(); + this.id = id; + } + + public SoundEntryBuilder subtitle(String subtitle) { + this.subtitle = subtitle; + return this; + } + + public SoundEntryBuilder attenuationDistance(int distance) { + this.attenuationDistance = distance; + return this; + } + + public SoundEntryBuilder noSubtitle() { + this.subtitle = null; + return this; + } + + public SoundEntryBuilder category(SoundSource category) { + this.category = category; + return this; + } + + public SoundEntryBuilder addVariant(String name) { + return addVariant(Create.asResource(name)); + } + + public SoundEntryBuilder addVariant(ResourceLocation id) { + variants.add(id); + return this; + } + + public SoundEntryBuilder playExisting(Supplier event, float volume, float pitch) { + wrappedEvents.add(new ConfiguredSoundEvent(event, volume, pitch)); + return this; + } + + public SoundEntryBuilder playExisting(SoundEvent event, float volume, float pitch) { + return playExisting(() -> event, volume, pitch); + } + + public SoundEntryBuilder playExisting(SoundEvent event) { + return playExisting(event, 1, 1); + } + + public SoundEntryBuilder playExisting(Holder event) { + return playExisting(event::get, 1, 1); + } + + public SoundEntry build() { + SoundEntry entry = + wrappedEvents.isEmpty() ? new CustomSoundEntry(id, variants, subtitle, category, attenuationDistance) + : new WrappedSoundEntry(id, subtitle, wrappedEvents, category, attenuationDistance); + ALL.put(entry.getId(), entry); + return entry; + } + + } + + private static class CustomSoundEntry extends SoundEntry { + + protected List variants; + protected RegistryObject event; + + public CustomSoundEntry(ResourceLocation id, List variants, String subtitle, + SoundSource category, int attenuationDistance) { + super(id, subtitle, category, attenuationDistance); + this.variants = variants; + } + + @Override + public void prepare() { + event = RegistryObject.create(id, ForgeRegistries.SOUND_EVENTS); + } + + @Override + public void register(RegisterEvent.RegisterHelper helper) { + ResourceLocation location = event.getId(); + helper.register(location, SoundEvent.createVariableRangeEvent(location)); + } + + @Override + public SoundEvent getMainEvent() { + return event.get(); + } + + @Override + public void write(JsonObject json) { + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + + JsonObject s = new JsonObject(); + s.addProperty("name", id.toString()); + s.addProperty("type", "file"); + if (attenuationDistance != 0) + s.addProperty("attenuation_distance", attenuationDistance); + list.add(s); + + for (ResourceLocation variant : variants) { + s = new JsonObject(); + s.addProperty("name", variant.toString()); + s.addProperty("type", "file"); + if (attenuationDistance != 0) + s.addProperty("attenuation_distance", attenuationDistance); + list.add(s); + } + + entry.add("sounds", list); + if (hasSubtitle()) + entry.addProperty("subtitle", getSubtitleKey()); + json.add(id.getPath(), entry); + } + + @Override + public void play(Level world, Player entity, double x, double y, double z, float volume, float pitch) { + world.playSound(entity, x, y, z, event.get(), category, volume, pitch); + } + + @Override + public void playAt(Level world, double x, double y, double z, float volume, float pitch, boolean fade) { + world.playLocalSound(x, y, z, event.get(), category, volume, pitch, fade); + } + + } + + private static class WrappedSoundEntry extends SoundEntry { + + private List wrappedEvents; + private List compiledEvents; + + public WrappedSoundEntry(ResourceLocation id, String subtitle, + List wrappedEvents, SoundSource category, int attenuationDistance) { + super(id, subtitle, category, attenuationDistance); + this.wrappedEvents = wrappedEvents; + compiledEvents = new ArrayList<>(); + } + + @Override + public void prepare() { + for (int i = 0; i < wrappedEvents.size(); i++) { + ConfiguredSoundEvent wrapped = wrappedEvents.get(i); + ResourceLocation location = getIdOf(i); + RegistryObject event = RegistryObject.create(location, ForgeRegistries.SOUND_EVENTS); + compiledEvents.add(new WrappedSoundEntry.CompiledSoundEvent(event, wrapped.volume(), wrapped.pitch())); + } + } + + @Override + public void register(RegisterEvent.RegisterHelper helper) { + for (WrappedSoundEntry.CompiledSoundEvent compiledEvent : compiledEvents) { + ResourceLocation location = compiledEvent.event().getId(); + helper.register(location, SoundEvent.createVariableRangeEvent(location)); + } + } + + @Override + public SoundEvent getMainEvent() { + return compiledEvents.get(0) + .event().get(); + } + + protected ResourceLocation getIdOf(int i) { + return new ResourceLocation(id.getNamespace(), i == 0 ? id.getPath() : id.getPath() + "_compounded_" + i); + } + + @Override + public void write(JsonObject json) { + for (int i = 0; i < wrappedEvents.size(); i++) { + ConfiguredSoundEvent event = wrappedEvents.get(i); + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + JsonObject s = new JsonObject(); + s.addProperty("name", event.event() + .get() + .getLocation() + .toString()); + s.addProperty("type", "event"); + if (attenuationDistance != 0) + s.addProperty("attenuation_distance", attenuationDistance); + list.add(s); + entry.add("sounds", list); + if (i == 0 && hasSubtitle()) + entry.addProperty("subtitle", getSubtitleKey()); + json.add(getIdOf(i).getPath(), entry); + } + } + + @Override + public void play(Level world, Player entity, double x, double y, double z, float volume, float pitch) { + for (WrappedSoundEntry.CompiledSoundEvent event : compiledEvents) { + world.playSound(entity, x, y, z, event.event().get(), category, event.volume() * volume, + event.pitch() * pitch); + } + } + + @Override + public void playAt(Level world, double x, double y, double z, float volume, float pitch, boolean fade) { + for (WrappedSoundEntry.CompiledSoundEvent event : compiledEvents) { + world.playLocalSound(x, y, z, event.event().get(), category, event.volume() * volume, + event.pitch() * pitch, fade); + } + } + + private record CompiledSoundEvent(RegistryObject event, float volume, float pitch) { + } + + } + +} diff --git a/src/main/java/net/nuclearteam/createnuclear/CNTags.java b/src/main/java/net/nuclearteam/createnuclear/CNTags.java index e3340ddf0..fd28b0c48 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNTags.java @@ -70,10 +70,9 @@ public enum NameSpace { public enum CNBlockTags { FAN_PROCESSING_CATALYSTS_ENRICHED(MOD, "fan_processing_catalysts/enriched"), + FAN_PROCESSING_CATALYSTS_SNOW_POWDER(MOD, "fan_processing_catalysts/snow_powder"), ENRICHING_FIRE_BASE_BLOCKS, ALL_CAMPFIRES(MINECRAFT, "all/campfires"), - URANIUM_ORES, - LEAD_ORES ; public final TagKey tag; @@ -124,17 +123,9 @@ public enum CNItemTags { CLOTH, FUEL, COOLER, - URANIUM_ORES, - LEAD_ORES, - ANTI_RADIATION_HELMET_DYE, - ANTI_RADIATION_CHESTPLATE_DYE, - ANTI_RADIATION_LEGGINGS_DYE, - ANTI_RADIATION_BOOTS_DYE, ANTI_RADIATION_ARMOR, - ALL_ANTI_RADIATION_ARMORS, - ANTI_RADIATION_HELMET_FULL_DYE, - ANTI_RADIATION_CHESTPLATE_FULL_DYE, - ANTI_RADIATION_LEGGINGS_FULL_DYE, + COMPOSTABLE(FORGE), + ALL_ANTI_RADIATION_ARMORS ; public final TagKey tag; @@ -178,7 +169,10 @@ private static void init() {} } public enum CNFluidTags { - URANIUM + URANIUM, + THORIUM, + NITROGEN + ; public final TagKey tag; diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java index 938e3b477..db73cafd6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -1,8 +1,8 @@ package net.nuclearteam.createnuclear; - import com.mojang.logging.LogUtils; import com.simibubi.create.CreateBuildInfo; +import com.simibubi.create.content.equipment.goggles.GogglesItem; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.KineticStats; @@ -10,6 +10,7 @@ import net.createmod.catnip.lang.FontHelper; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.CreativeModeTab; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; @@ -21,22 +22,30 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegisterEvent; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.IrradiatedAnimal; import net.nuclearteam.createnuclear.content.decoration.palettes.CNPaletteBlocks; +import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.IGoggleHelmet; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.CNFanProcessingTypes; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNTriggers; +import net.nuclearteam.createnuclear.foundation.item.RodsStats; +import net.nuclearteam.createnuclear.content.radiation.CNRadiationValues; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import net.nuclearteam.createnuclear.infrastructure.data.CreateNuclearDatagen; +import net.nuclearteam.createnuclear.infrastructure.worldgen.CNPlacementModifiers; import org.slf4j.Logger; @Mod(CreateNuclear.MOD_ID) public class CreateNuclear { public static final String MOD_ID = "createnuclear"; public static final Logger LOGGER = LogUtils.getLogger(); + public static final CreateRegistrate REGISTRATE = CreateRegistrate.create(MOD_ID) - .defaultCreativeTab((ResourceKey) null); + .defaultCreativeTab((ResourceKey) null); static { REGISTRATE.setTooltipModifierFactory(item -> new ItemDescription.Modifier(item, FontHelper.Palette.STANDARD_CREATE) - .andThen(TooltipModifier.mapNull(KineticStats.create(item)))); + .andThen(TooltipModifier.mapNull(KineticStats.create(item))).andThen(RodsStats.create(item))); } public CreateNuclear() { @@ -54,7 +63,8 @@ public static void onInitialize() { REGISTRATE.registerEventListeners(modEventBus); - + CNSoundEvents.prepare(); + CNDisplaySources.register(); CNTags.init(); CNBlocks.register(); CNBlockEntityTypes.register(); @@ -67,33 +77,44 @@ public static void onInitialize() { CNConfigs.register(modLoadingContext); + CNPlacementModifiers.register(modEventBus); CNCreativeModeTabs.register(modEventBus); CNEffects.register(modEventBus); CNPotions.register(modEventBus); + CNParticleTypes.register(modEventBus); + CNParticleRegistry.DEF_REG.register(modEventBus); CNRecipeTypes.register(modEventBus); + CNAttributes.register(modEventBus); + + GogglesItem.addIsWearingPredicate(IGoggleHelmet::isGoggleHelmet); modEventBus.addListener(CreateNuclear::init); modEventBus.addListener(CreateNuclear::onRegister); modEventBus.addListener(EventPriority.LOWEST, CreateNuclearDatagen::gatherData); + modEventBus.addListener(CNSoundEvents::register); forgeEventBus.addListener(CNFluids::handleFluidEffect); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateNuclearClient.onCtorClient(modEventBus, forgeEventBus)); } public static void init(final FMLCommonSetupEvent event) { CNFluids.registerFluidInteractions(); - event.enqueueWork(CNPotions::registerPotionsRecipes); + event.enqueueWork(() -> IrradiatedAnimal.VANILLA_TO_IRRADIATED.put(EntityType.CHICKEN, CNEntityType.IRRADIATED_CHICKEN.get())); + event.enqueueWork(() -> { + CNPotions.registerPotionsRecipes(); + CNOpenPipeEffectHandlers.registerDefaults(); + CNRadiationValues.register(); + }); + + CNAdvancement.register(); + CNTriggers.register(); } public static void onRegister(final RegisterEvent event) { CNFanProcessingTypes.register(); - } - public static ResourceLocation asResource(String path) { return new ResourceLocation(MOD_ID, path); } - } diff --git a/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java b/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java index fbf158233..bc9973d79 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java @@ -1,20 +1,83 @@ package net.nuclearteam.createnuclear; import net.createmod.ponder.foundation.PonderIndex; +import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.client.renderer.item.ItemPropertyFunction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraftforge.client.event.RegisterParticleProvidersEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.nuclearteam.createnuclear.content.particles.NuclearMushroomCloudParticle; +import net.nuclearteam.createnuclear.content.particles.SmallNuclearExplosionParticle; +import net.nuclearteam.createnuclear.content.biome.BiomeIrradiationExtractorItem; import net.nuclearteam.createnuclear.foundation.ponder.CreateNuclearPonderPlugin; +import net.nuclearteam.createnuclear.foundation.utility.ClothTagHelper; @SuppressWarnings("unused") public class CreateNuclearClient { public static void onCtorClient(IEventBus modEventBus, IEventBus forgeEventBus) { modEventBus.addListener(CreateNuclearClient::clientInit); - + modEventBus.addListener(CreateNuclearClient::setupParticles); + modEventBus.addListener(CNParticleTypes::registerFactories); } public static void clientInit(final FMLClientSetupEvent event) { PonderIndex.addPlugin(new CreateNuclearPonderPlugin()); + event.enqueueWork(CreateNuclearClient::registerItemProperties); + } + + + private static void registerItemProperties() { + clothItemProperties(); + biomeRestoreItemProperties(); + } + + /** + * Registers the {@code createnuclear:cloth_color} item property used by the anti-radiation + * armor item models to pick the right colored icon based on the {@code ClothColor} NBT tag. + *

+ * {@link ItemProperties#register(Item, ResourceLocation, ItemPropertyFunction)} clamps the value to {@code [0,1]}, so the dyed color id is + * normalized to {@code (id+1)/16} (range {@code 0.0625..1.0}) and undyed maps to {@code 0} — + * below the smallest override threshold, so no override fires and the default icon shows. + * The model overrides in {@code CNItems.coloredArmorModel} use the matching {@code (id+1)/16} + * predicate values. Mirrors the dyed worn-armor texture selected by + * {@code AntiRadiationArmorItem.getArmorTexture}. + */ + private static void clothItemProperties() { + ResourceLocation clothColor = CreateNuclear.asResource("cloth_color"); + ClampedItemPropertyFunction fn = (stack, level, entity, seed) -> { + DyeColor dye = DyeColor.byName(ClothTagHelper.getClothColor(stack, "default"), null); + return dye == null ? 0f : (dye.getId() + 1) / 16f; + }; + ItemProperties.register(CNItems.ANTI_RADIATION_HELMETS.get(), clothColor, fn); + ItemProperties.register(CNItems.ANTI_RADIATION_CHESTPLATES.get(), clothColor, fn); + ItemProperties.register(CNItems.ANTI_RADIATION_LEGGINGS.get(), clothColor, fn); + ItemProperties.register(CNItems.ANTI_RADIATION_BOOTS.get(), clothColor, fn); + } + + /** + * Registers the {@code createnuclear:charge} item property used by the biome restore cell's + * model to pick a texture variant based on its current charge ratio (0.0 = empty, 1.0 = full). + */ + private static void biomeRestoreItemProperties() { + ResourceLocation biomeRestore = CreateNuclear.asResource(BiomeIrradiationExtractorItem.TAG); + ClampedItemPropertyFunction fn = ((stack, level, entity, seed) -> { + int max = BiomeIrradiationExtractorItem.getMaxCharge(); + + return (float) BiomeIrradiationExtractorItem.getChargeTag(stack, 0) / max; + }); + + ItemProperties.register(CNItems.IRRADIATION_BIOME_EXTRACTOR.get(), biomeRestore, fn); + } + public static void setupParticles(RegisterParticleProvidersEvent registry) { + CreateNuclear.LOGGER.debug("Registered particle factories"); + registry.registerSpecial(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD.get(), new NuclearMushroomCloudParticle.Factory()); + registry.registerSpriteSet(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD_SMOKE.get(), SmallNuclearExplosionParticle.NukeFactory::new); + registry.registerSpriteSet(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD_EXPLOSION.get(), SmallNuclearExplosionParticle.NukeFactory::new); } } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java new file mode 100644 index 000000000..c720e43d3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java @@ -0,0 +1,22 @@ +package net.nuclearteam.createnuclear.api; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; + + +public class CreateNuclearRegistries { + public static final ResourceKey> ROD_TYPE = key("rods/type"); + public static final ResourceKey> FLUID_TYPE = key("fluids/type"); + + public static final ResourceKey FALLBACK_ROD = ResourceKey.create(CreateNuclearRegistries.ROD_TYPE, CreateNuclear.asResource("fallback")); + public static final ResourceKey FALLBACK_FLUID = ResourceKey.create(CreateNuclearRegistries.FLUID_TYPE, CreateNuclear.asResource("fallback")); + + + + private static ResourceKey> key(String name) { + return ResourceKey.createRegistryKey(CreateNuclear.asResource(name)); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java b/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java new file mode 100644 index 000000000..cdf011092 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java @@ -0,0 +1,74 @@ +package net.nuclearteam.createnuclear.api; + +import com.simibubi.create.api.registry.SimpleRegistry; +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import static net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod.NONE; + +public class ItemRodTypesValue { + public static final SimpleRegistry ROD_TYPE = SimpleRegistry.create(); + /** + * Default RodType returned when no mapping exists in the registry. + * Built once to avoid allocating a new instance on each lookup. + */ + public static final RodType DEFAULT_ROD_TYPE = new RodType(Items.AIR.builtInRegistryHolder(), -1, -1, -1, NONE); + + /** + * Get the {@link RodType} associated with the given {@link Item}. + * If no mapping exists, a default empty {@link RodType} is returned. + * + * @param item the item to look up (must not be null) + * @return the associated {@link RodType} or a default instance if none present + * @throws NullPointerException if {@code item} is null + */ + public static RodType getRodType(Item item) { + RodType type = ROD_TYPE.get(item); + return type == null ? DEFAULT_ROD_TYPE : type; + } + + /** + * Create a consumer that registers the given {@link RodType} for an item. + * + * @param type the rod type to register (must not be null) + * @return a non-null consumer that registers the mapping + * @throws NullPointerException if {@code type} is null + */ + public static NonNullConsumer setRodTypeInfos(RodType.Builder type) { + return item -> ROD_TYPE.register(item, type.item(item).build()); + } + + /** + * Create a consumer that builds a {@link RodType} using the provided numeric + * parameters and registers it for the item passed to the consumer. + * + * The {@code type} parameter controls whether the builder configures the + * rod as a cooler, fuel or keeps the default mixed behaviour. For MIXTE + * we keep the builder default and do not call any explicit setter. + * + * @param baseRodHeat base heat value + * @param proximityRodHeat heat influenced by proximity + * @param rodTimer rod life / timer value + * @param type enum controlling cooler/fuel/mixte behaviour (must not be null) + * @return a non-null consumer that registers the built RodType + * @throws NullPointerException if {@code type} is null + */ + public static NonNullConsumer setRodTypeInfos(int baseRodHeat, int proximityRodHeat, int rodTimer, RodType.TypeRod type) { + RodType.Builder builder = new RodType.Builder() + .baseRodHeat(baseRodHeat) + .proximityRodHeat(proximityRodHeat) + .rodTimer(rodTimer); + + switch (type) { + case COOLER -> builder.coolerRodType(); + case FUEL -> builder.fuelRodType(); + default -> throw new IllegalArgumentException("Unsupported TypeRod: " + type + ". This error occurred during rod stats initialization in the CreateNuclearForge mod."); + } + + return item -> { + RodType built = builder.item(item).build(); + ROD_TYPE.register(item, built); + }; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java b/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java new file mode 100644 index 000000000..f9bd55025 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java @@ -0,0 +1,82 @@ +package net.nuclearteam.createnuclear.api; + +import com.simibubi.create.api.registry.SimpleRegistry; +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; + +/** + * Registry-backed accessors for {@link ReactorFluidType} mappings. + *

+ * This class provides a simple registry that maps {@link Fluid} instances to + * their corresponding {@link ReactorFluidType} definitions. It also exposes + * helper methods that produce consumers suitable for registering reactor + * fluid type information during mod initialization. + */ +public class ReactorFluidTypesValue { + /** + * Simple in-memory registry mapping fluids to {@link ReactorFluidType}. + */ + public static final SimpleRegistry REACTOR_FLUID_TYPE = SimpleRegistry.create(); + + /** + * Default {@link ReactorFluidType} returned when no mapping exists in the + * registry. Constructed once to avoid allocating a new instance on each lookup. + */ + public static final ReactorFluidType DEFAULT_REACTOR_FLUID_TYPE = new ReactorFluidType(Fluids.EMPTY.builtInRegistryHolder(), -1, -1); + + /** + * Get the {@link ReactorFluidType} associated with the given {@link Fluid}. + * If no mapping exists, a default empty {@link ReactorFluidType} is returned. + * + * @param fluid the fluid to look up (must not be null) + * @return the associated {@link ReactorFluidType} or a default instance if none present + * @throws NullPointerException if {@code fluid} is null + */ + public static ReactorFluidType getReactorFluidType(Fluid fluid) { + ReactorFluidType type = REACTOR_FLUID_TYPE.get(fluid); + return type == null ? DEFAULT_REACTOR_FLUID_TYPE : type; + } + + /** + * Create a consumer that registers the given {@link ReactorFluidType} + * builder for a fluid. + *

+ * The returned consumer will call {@link ReactorFluidType.Builder#fluid(Fluid)} + * with the provided fluid and then build and register the resulting + * {@link ReactorFluidType} into the registry. + * + * @param type the reactor fluid type builder to register (must not be null) + * @return a non-null consumer that registers the mapping + */ + public static NonNullConsumer setReactorFluidTypeInfos(ReactorFluidType.Builder type) { + return fluid -> REACTOR_FLUID_TYPE.register(fluid, type.fluid(fluid).build()); + } + + /** + * Create a consumer that builds a {@link ReactorFluidType} using the + * provided numeric parameters and registers it for the fluid passed to + * the consumer. + *

+ * The returned consumer will construct a builder pre-configured with the + * provided {@code maxHeat} and {@code efficiency} values, then call + * {@link ReactorFluidType.Builder#fluid(Fluid)} and register the built + * instance for the supplied fluid. + * + * @param maxHeat maximum heat value to apply to the built type + * @param efficiency efficiency value to apply to the built type + * @return a non-null consumer that registers the built {@link ReactorFluidType} + */ + public static NonNullConsumer setReactorFluidTypeInfos(int maxHeat, int efficiency) { + ReactorFluidType.Builder builder = new ReactorFluidType.Builder() + .maxHeat(maxHeat) + .efficiency(efficiency); + + return fluid -> { + ReactorFluidType built = builder.fluid(fluid).build(); + REACTOR_FLUID_TYPE.register(fluid, built); + }; + } + +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SmithingClothRecipeBuilder.java b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SmithingClothRecipeBuilder.java new file mode 100644 index 000000000..45a9f9bcd --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SmithingClothRecipeBuilder.java @@ -0,0 +1,105 @@ +package net.nuclearteam.createnuclear.api.data.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.CriterionTriggerInstance; +import net.minecraft.advancements.RequirementsStrategy; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeBuilder; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.registries.ForgeRegistries; + +import javax.annotation.Nullable; +import java.util.function.Consumer; + +public class SmithingClothRecipeBuilder { + private final Ingredient template; + private final Ingredient base; + private final Ingredient addition; + private final RecipeCategory category; + private final ItemStack result; + private final Advancement.Builder advancement = Advancement.Builder.recipeAdvancement(); + private final RecipeSerializer type; + + public SmithingClothRecipeBuilder(RecipeSerializer pType, Ingredient pTemplate, Ingredient pBase, Ingredient pAddition, RecipeCategory pCategory, ItemStack pResult) { + this.category = pCategory; + this.type = pType; + this.template = pTemplate; + this.base = pBase; + this.addition = pAddition; + this.result = pResult; + } + + public static SmithingClothRecipeBuilder smithingCloth(Ingredient pTemplate, Ingredient pBase, Ingredient pAddition, RecipeCategory pCategory, ItemStack pResult) { + return new SmithingClothRecipeBuilder(RecipeSerializer.SMITHING_TRANSFORM, pTemplate, pBase, pAddition, pCategory, pResult); + } + + public SmithingClothRecipeBuilder unlocks(String pKey, CriterionTriggerInstance pCriterion) { + this.advancement.addCriterion(pKey, pCriterion); + return this; + } + + public void save(Consumer pRecipeConsumer, ResourceLocation pLocation) { + this.ensureValid(pLocation); + this.advancement.parent(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT).addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(pLocation)).rewards(AdvancementRewards.Builder.recipe(pLocation)).requirements(RequirementsStrategy.OR); + pRecipeConsumer.accept(new SmithingClothRecipeBuilder.Result(pLocation, this.type, this.template, this.base, this.addition, this.result, this.advancement, pLocation.withPrefix("recipes/" + this.category.getFolderName() + "/"))); + } + + private void ensureValid(ResourceLocation pLocation) { + if (this.advancement.getCriteria().isEmpty()) { + throw new IllegalStateException("No way of obtaining recipe " + pLocation); + } + } + + public static record Result(ResourceLocation id, RecipeSerializer type, Ingredient template, Ingredient base, Ingredient addition, ItemStack result, Advancement.Builder advancement, ResourceLocation advancementId) implements FinishedRecipe { + public void serializeRecipeData(JsonObject jObject) { + jObject.add("template", this.template.toJson()); + jObject.add("base", this.base.toJson()); + jObject.add("addition", this.addition.toJson()); + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("item", ForgeRegistries.ITEMS.getKey(this.result.getItem()).toString()); + if (!this.result.getOrCreateTag().isEmpty() && this.result.getOrCreateTag().contains("Cloth")) { + CompoundTag nbt = new CompoundTag(); + nbt.putString("Cloth", this.result.getOrCreateTag().getString("Cloth")); + jsonobject.addProperty("nbt", nbt.toString()); + } + jObject.add("result", jsonobject); + } + + /** + * Gets the ID for the recipe. + */ + public ResourceLocation getId() { + return this.id; + } + + public RecipeSerializer getType() { + return this.type; + } + + /** + * Gets the JSON for the advancement that unlocks this recipe. Null if there is no advancement. + */ + @Nullable + public JsonObject serializeAdvancement() { + return this.advancement.serializeToJson(); + } + + /** + * Gets the ID for the advancement associated with this recipe. Should not be null if {@link #getAdvancementJson} + * is non-null. + */ + @Nullable + public ResourceLocation getAdvancementId() { + return this.advancementId; + } + } +} + diff --git a/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java new file mode 100644 index 000000000..b0cfd1fe5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SnowPowderRecipeGen.java @@ -0,0 +1,31 @@ +package net.nuclearteam.createnuclear.api.data.recipe; + +import com.simibubi.create.api.data.recipe.DatagenMod; +import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; +import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; +import net.minecraft.data.PackOutput; +import net.nuclearteam.createnuclear.CNRecipeTypes; + +public abstract class SnowPowderRecipeGen extends ProcessingRecipeGen { + protected GeneratedRecipe moddedCompacting(DatagenMod mod, String input, String output) { + return create("compat/" + mod.getId() + "/" + output, b -> b.require(mod, input) + .output(mod, output) + .whenModLoaded(mod.getId())); + } + + protected GeneratedRecipe moddedPaths(DatagenMod mod, String... blocks) { + for(String block : blocks) { + moddedCompacting(mod, block, block + "_path"); + } + return null; + } + + public SnowPowderRecipeGen(PackOutput generator, String defaultNamespace) { + super(generator, defaultNamespace); + } + + @Override + protected IRecipeTypeInfo getRecipeType() { + return CNRecipeTypes.SNOW_POWDER; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java new file mode 100644 index 000000000..7a9478dce --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/IMultiblockController.java @@ -0,0 +1,8 @@ +package net.nuclearteam.createnuclear.api.multiblock; + +import net.minecraft.core.Direction; + +public interface IMultiblockController { + void setMultiblockFacing(Direction f); + Direction getMultiblockFacing(); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java index ce79b0120..a0178483f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java @@ -17,7 +17,7 @@ public void register(String id, T data, IMultiBlockPattern blockPattern) { structures.add(new BlockPattern<>(id, data, blockPattern)); } - public BlockPattern findStructure(Level level, BlockPos pos) { + public BlockPattern findStructure(Level level, BlockPos pos, IMultiblockController entity) { List directions = new ArrayList<>(); directions.add(Direction.NORTH); directions.add(Direction.WEST); @@ -26,8 +26,11 @@ public BlockPattern findStructure(Level level, BlockPos pos) { for (Direction direction : directions) { for (BlockPattern structure : structures) { - var result = structure.structure().matches(level, pos, direction); - if (result) return structure; + boolean result = structure.structure().matches(level, pos, direction); + if (result){ + entity.setMultiblockFacing(direction.getCounterClockWise()); + return structure; + } } } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/TypeMultiblock.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/TypeMultiblock.java index e22beb151..9f52c6ba0 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/TypeMultiblock.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/TypeMultiblock.java @@ -1,5 +1,26 @@ package net.nuclearteam.createnuclear.api.multiblock; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + public enum TypeMultiblock { - REACTOR + REACTOR_T1(5), + REACTOR_T2(7), + REACTOR_T3(9) + ; + + private final int size; + private final String name; + + TypeMultiblock(int size) { + this.size = size; + this.name = CreateNuclearLang.asId(name()); + } + + public int getSize() { + return this.size; + } + + public String getName() { + return this.name; + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java new file mode 100644 index 000000000..a84782323 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java @@ -0,0 +1,186 @@ +package net.nuclearteam.createnuclear.api.multiblock.fluid; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.core.Holder.Reference; +import net.minecraft.resources.RegistryFixedCodec; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.api.ReactorFluidTypesValue; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Represents a reactor fluid type used by the mod's multiblock. + *

+ * A {@code ReactorFluidType} holds the single fluid that identifies this + * fluid type, along with its heat-related and efficiency values. + */ +public record ReactorFluidType(Holder fluid, int maxHeat, int efficiency) { + + /** Serialization codec for saving/loading {@link ReactorFluidType} instances. */ + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + RegistryFixedCodec.create(Registries.FLUID).fieldOf("fluid").forGetter(ReactorFluidType::fluid), + Codec.INT.fieldOf("maxHeat").forGetter(ReactorFluidType::maxHeat), + Codec.INT.fieldOf("efficiency").forGetter(ReactorFluidType::efficiency) + ).apply(i, ReactorFluidType::new)); + + /** + * Searches the {@code FLUID_TYPE} registry for a {@link ReactorFluidType} + * matching the provided {@link Fluid}. + * + * @param registryAccess registry access for the world + * @param fluid the fluid to look up + * @return an {@link Optional} containing a {@link Reference} to the matching + * {@code ReactorFluidType} if found, otherwise {@link Optional#empty()} + */ + public static Optional> getTypeForFluid(RegistryAccess registryAccess, Fluid fluid) { + ResourceLocation fluidKey = ForgeRegistries.FLUIDS.getKey(fluid); + if (fluidKey == null) return Optional.empty(); + + return registryAccess.lookupOrThrow(CreateNuclearRegistries.FLUID_TYPE) + .listElements() + .filter(ref -> ref.value().fluid.unwrapKey() + .map(k -> k.location().equals(fluidKey)) + .orElse(false)) + .findFirst(); + } + + /** + * Resolves the {@code ReactorFluidType} for a given {@link Fluid}. + *

+ * The resolution first checks the world's registries, then falls back to + * {@link ReactorFluidTypesValue}, and finally returns the registry fallback + * value if none is found. + * + * @param fluid the fluid whose reactor type should be resolved + * @param world the level used to access registries + * @return the resolved {@code ReactorFluidType} (never {@code null}) + */ + public static ReactorFluidType resolveReactorFluidType(Fluid fluid, Level world) { + return ReactorFluidType.getTypeForFluid(world.registryAccess(), fluid) + .map(Holder.Reference::value) + .orElseGet(() -> { + ReactorFluidType fromFluid = ReactorFluidTypesValue.getReactorFluidType(fluid); + return fromFluid.isNotEmptyFluid() + ? fromFluid + : world.registryAccess() + .registryOrThrow(CreateNuclearRegistries.FLUID_TYPE) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_FLUID) + .value(); + }); + } + + + /** + * Returns whether this {@code ReactorFluidType} has an associated fluid + * (i.e. is not the empty/sentinel fluid). + * + * @return {@code true} if a real fluid is defined, {@code false} otherwise + */ + public boolean isNotEmptyFluid() { + return this.fluid.value() != Fluids.EMPTY; + } + + /** + * Fluent builder for creating an immutable {@link ReactorFluidType} instance. + *

+ * Use the configuration methods and class {@link #build()} to obtain the + * resulting instance. + */ + public static class Builder { + private Holder fluid = null; + private int maxHeat = 0; + private int efficiency = 0; + private boolean maxHeatSet = false; + private boolean efficiencySet = false; + + /** + * Sets the maximum heat value for the built {@link ReactorFluidType}. + * + * @param maxHeat maximum heat value + * @return this builder + */ + public Builder maxHeat(int maxHeat) { + this.maxHeat = maxHeat; + this.maxHeatSet = true; + return this; + } + + /** + * Sets the efficiency value for the built {@link ReactorFluidType}. + * + * @param efficiency efficiency value + * @return this builder + */ + public Builder efficiency(int efficiency) { + this.efficiency = efficiency; + this.efficiencySet = true; + return this; + } + + /** + * Sets the fluid identifying this type from a {@link FluidStack}. + * + * @param fluidStack the fluid stack providing the fluid + * @return this builder + */ + public Builder fluid(FluidStack fluidStack) { + return fluid(fluidStack.getFluid()); + } + + /** + * Sets the fluid identifying this type. Calling this again replaces + * the previously set fluid. + * + * @param fluid the fluid to associate with this type + * @return this builder + */ + public Builder fluid(Fluid fluid) { + this.fluid = fluid.builtInRegistryHolder(); + return this; + } + + /** + * Builds the immutable {@link ReactorFluidType} instance. + * + * @throws IllegalStateException if required fields are missing + * @return the created instance + */ + public ReactorFluidType build() { + List missing = new ArrayList<>(); + if (fluid == null) missing.add("fluid"); + if (!maxHeatSet) missing.add("maxHeat"); + if (!efficiencySet) missing.add("efficiency"); + + if (!missing.isEmpty()) + throw new IllegalStateException("Missing required ReactorFluidType fields: " + String.join(", ", missing)); + + return new ReactorFluidType(fluid, maxHeat, efficiency); + } + } + + @Override + public @NotNull String toString() { + String fluidName = this.fluid.unwrapKey() + .map(k -> k.location().toString()) + .orElseGet(() -> { + ResourceLocation rl = ForgeRegistries.FLUIDS.getKey(this.fluid.value()); + return rl != null ? rl.toString() : this.fluid.value().toString(); + }); + + return "ReactorFluidType{fluid=" + fluidName + ", maxHeat=" + maxHeat() + ", efficiency=" + efficiency() + "}"; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java new file mode 100644 index 000000000..03e1eafd9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -0,0 +1,376 @@ +package net.nuclearteam.createnuclear.api.multiblock.rods; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.RegistryFixedCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.api.ItemRodTypesValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * Represents a rod type used by the mod's multiblock. + *

+ * A {@code RodType} holds the single item that represents this rod type, + * heat-related values, a timing value, and a {@link TypeRod} indicating the + * category (fuel, cooler, or mixed). + */ +@MethodsReturnNonnullByDefault +public record RodType(Holder item, + Supplier baseRodHeat, + Supplier proximityRodHeat, + Supplier rodTimer, + Supplier ratio, + TypeRod type) { + + public RodType(Holder item, + int baseRodHeat, float proximityRodHeat, + int rodTimer, TypeRod type) { + this(item, baseRodHeat, proximityRodHeat, rodTimer, type, 1); + } + + public RodType(Holder item, + int baseRodHeat, float proximityRodHeat, + int rodTimer, TypeRod type, int ratio) { + this(item, () -> baseRodHeat, () -> proximityRodHeat, () -> rodTimer, () -> ratio, type); + } + + /** + * Serialization codec for saving/loading {@link RodType} instances. + */ + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + RegistryFixedCodec.create(Registries.ITEM).fieldOf("item").forGetter(RodType::item), + Codec.INT.fieldOf("baseRodHeat").forGetter(rt -> rt.baseRodHeat().get()), + Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(rt -> rt.proximityRodHeat().get()), + Codec.INT.fieldOf("rodTimer").forGetter(rt -> rt.rodTimer().get()), + StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type), + Codec.INT.optionalFieldOf("ratio", 1).forGetter(rt -> rt.ratio().get()) + ).apply(i, RodType::new)); + + /** + * Searches the {@code ROD_TYPE} registry for a {@link RodType} matching the + * provided {@link Item}. + * + * @param registryAccess registry access for the world + * @param item the item to look up + * @return an {@link Optional} containing a {@link Reference} to the matching + * {@code RodType} if found, otherwise {@link Optional#empty()} + */ + public static Optional> getTypeForItem(RegistryAccess registryAccess, Item item) { + return registryAccess.lookupOrThrow(CreateNuclearRegistries.ROD_TYPE) + .listElements() + .filter(ref -> ref.value().item.equals(item.builtInRegistryHolder())) + .findFirst(); + } + + /** + * Resolves the {@code RodType} for a given {@link Item}. The method first + * checks the world's registries, then falls back to {@link ItemRodTypesValue}, + * and lastly returns a fallback registry value if none is found. + * + * @param item the item whose rod type should be resolved + * @param world the world (level) used to access registries + * @return the resolved {@code RodType} (never {@code null}) + */ + public static RodType resolveRodType(Item item, Level world) { + return RodType.getTypeForItem(world.registryAccess(), item) + .map(Holder.Reference::value) + .orElseGet(() -> { + RodType fromItem = ItemRodTypesValue.getRodType(item); + return fromItem.isNotEmptyItem() + ? fromItem + : world.registryAccess() + .registryOrThrow(CreateNuclearRegistries.ROD_TYPE) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_ROD) + .value(); + }); + } + + /** + * Returns whether this {@code RodType} has an associated item (i.e. is + * not the empty/sentinel item). + * + * @return {@code true} if a real item is defined, {@code false} otherwise + */ + public boolean isNotEmptyItem() { + return this.item.value() != Items.AIR; + } + + /** + * Fluent builder for creating an immutable {@link RodType} instance. + *

+ * Every heat/timing value ({@code baseRodHeat}, {@code proximityRodHeat}, + * {@code rodTimer}, {@code ratio}) can be set either as a fixed + * primitive (evaluated once, at build time) or as a {@link Supplier} + * (re-evaluated on every call to the corresponding {@link RodType} + * accessor). The primitive overloads are pure convenience: they simply + * wrap the given value in a constant supplier, e.g. + * {@code baseRodHeat(5)} is equivalent to {@code baseRodHeat(() -> 5)}. + * Use the {@link Supplier} overloads to back a value with a live source + * such as a config option (see {@code CNItems} for examples), so that + * changes are picked up without rebuilding the {@code RodType}. + *

+ * {@code item}, {@code type}, {@code baseRodHeat}, {@code proximityRodHeat} + * and {@code rodTimer} are required; {@code ratio} defaults to a + * constant {@code 1} and never needs to be set explicitly. Call + * {@link #build()} once all required values are configured. + */ + public static class Builder { + private Holder item = null; + private Supplier baseRodHeat = null; + private Supplier proximityRodHeat = null; + private Supplier rodTimer = null; + private Supplier ratio = () -> 1; + private TypeRod type = TypeRod.NONE; + + /** + * Sets a fixed base heat value, evaluated once at build time. + * Equivalent to {@code baseRodHeat(() -> baseRodHeat)}. + * + * @param baseRodHeat constant base heat value + * @return this builder + */ + public Builder baseRodHeat(int baseRodHeat) { + return baseRodHeat(() -> baseRodHeat); + } + + /** + * Sets a dynamic base heat value, re-evaluated every time + * {@link RodType#baseRodHeat()} is called (e.g. to reflect a live + * config option instead of a value frozen at registration time). + * + * @param baseRodHeat supplier producing the base heat value on demand + * @return this builder + */ + public Builder baseRodHeat(Supplier baseRodHeat) { + this.baseRodHeat = baseRodHeat; + return this; + } + + /** + * Sets a fixed proximity heat value (heat contributed by nearby rods), + * evaluated once at build time. + * Equivalent to {@code proximityRodHeat(() -> proximityRodHeat)}. + * + * @param proximityRodHeat constant proximity heat value + * @return this builder + */ + public Builder proximityRodHeat(float proximityRodHeat) { + return proximityRodHeat(() -> proximityRodHeat) ; + } + + /** + * Sets a dynamic proximity heat value, re-evaluated every time + * {@link RodType#proximityRodHeat()} is called. + * + * @param proximityRodHeat supplier producing the proximity heat value on demand + * @return this builder + */ + public Builder proximityRodHeat(Supplier proximityRodHeat) { + this.proximityRodHeat = proximityRodHeat; + return this; + } + + /** + * Sets a fixed timer (duration) for the rod's behavior, evaluated + * once at build time. Equivalent to {@code rodTimer(() -> rodTimer)}. + * + * @param rodTimer constant duration in ticks or mod-specific units + * @return this builder + */ + public Builder rodTimer(int rodTimer) { + return rodTimer(() -> rodTimer); + } + + /** + * Sets a dynamic timer (duration) for the rod's behavior, + * re-evaluated every time {@link RodType#rodTimer()} is called. + * + * @param rodTimer supplier producing the duration on demand + * @return this builder + */ + public Builder rodTimer(Supplier rodTimer) { + this.rodTimer = rodTimer; + return this; + } + + /** + * Sets a fixed heat ratio, evaluated once at build time. Optional: + * defaults to a constant {@code 1} if never called. + * Equivalent to {@code ratio(() -> ratio)}. + * + * @param ratio constant heat ratio value + * @return this builder + */ + public Builder ratio(int ratio) { + return ratio(() -> ratio); + } + + /** + * Sets a dynamic heat ratio, re-evaluated every time + * {@link RodType#ratio()} is called. Optional: defaults to a + * constant {@code 1} if never called. + * + * @param ratio supplier producing the heat ratio on demand + * @return this builder + */ + public Builder ratio(Supplier ratio) { + this.ratio = ratio; + return this; + } + + /** + * Sets the rod category directly. Prefer the {@link #coolerRodType()} + * and {@link #fuelRodType()} convenience methods for the common + * cases; use this overload only to set {@link TypeRod#NONE} + * explicitly (e.g. for a fallback/sentinel rod type). + * + * @param type the rod category to assign + * @return this builder + */ + public Builder type(TypeRod type) { + this.type = type; + return this; + } + + /** + * Sets the rod type to {@link TypeRod#COOLER}. + * + * @return this builder + */ + public Builder coolerRodType() { + return type(TypeRod.COOLER); + } + + /** + * Sets the rod type to {@link TypeRod#FUEL}. + * + * @return this builder + */ + public Builder fuelRodType() { + return type(TypeRod.FUEL); + } + + /** + * Sets the item that represents this rod type. Calling this again + * replaces the previously set item. + * + * @param item the item to associate with this rod type + * @return this builder + */ + public Builder item(ItemLike item) { + this.item = item.asItem().builtInRegistryHolder(); + return this; + } + + /** + * Builds the immutable {@link RodType} instance. + *

+ * Validates that {@code item} and {@code type}, {@code baseRodHeat}, + * {@code proximityRodHeat} and {@code rodTimer} have all been set + * (either as a fixed value or as a dynamic {@link Supplier}); + * {@code ratio} is exempt since it defaults to a constant + * {@code 1}. + * + * @throws IllegalStateException if one or more required fields are missing, + * naming every missing field in the exception message + * @return the created instance + */ + public RodType build() { + List missing = new ArrayList<>(); + if (item == null) missing.add("item"); + if (type == null) missing.add("type"); + if (baseRodHeat == null) missing.add("baseRodHeat"); + if (proximityRodHeat == null) missing.add("proximityRodHeat"); + if (rodTimer == null) missing.add("rodTimer"); + + if (!missing.isEmpty()) + throw new IllegalStateException("Missing required RodType fields: " + String.join(", ", missing)); + + return new RodType(item, baseRodHeat, proximityRodHeat, rodTimer, ratio, type); + } + } + + public enum TypeRod implements StringRepresentable { + /** + * Fuel rod: generates heat via reaction. + */ + FUEL, + /** + * Cooler rod: reduces or absorbs heat. + */ + COOLER, + /** + * Sentinel value for the fallback/default rod type — no real category. + */ + NONE + ; + + @Override + public String getSerializedName() { + return name(); + } + } + + public static final class TypeRodPredicate { + public static final Predicate IS_NOT_NULL = Objects::nonNull; + + public static boolean isFuel(ItemStack stack, Level level) { + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.FUEL; + } + + public static boolean isFuel(RodType rodType) { + return rodType != null && rodType.type() == TypeRod.FUEL; + } + + public static boolean isCooled(ItemStack stack, Level level) { + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.COOLER; + } + + public static boolean isCooled(RodType rodType) { + return rodType != null && rodType.type() == TypeRod.COOLER; + } + + public static String tooltipKey(ItemStack stack, Level level) { + if (!IS_NOT_NULL.test(stack)) return "unknown"; + if (isFuel(stack, level)) return "fuel"; + if (isCooled(stack, level)) return "cooled"; + return "unknown"; + } + } + + @Override + public String toString() { + String itemName = this.item.unwrapKey() + .map(k -> k.location().toString()) + .orElseGet(() -> { + ResourceLocation rl = ForgeRegistries.ITEMS.getKey(this.item.value()); + return rl != null ? rl.toString() : this.item.value().toString(); + }); + + return "RodType [item: " + itemName + + ", baseRodHeat: " + this.baseRodHeat().get() + + ", proximityRodHeat: " + this.proximityRodHeat().get() + + ", rodTimer: " + this.rodTimer().get() + + ", ratio: " + this.ratio().get() + + ", type: " + this.type() + "]"; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/radiation/IRadiationSource.java b/src/main/java/net/nuclearteam/createnuclear/api/radiation/IRadiationSource.java new file mode 100644 index 000000000..11e1d7fbb --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/radiation/IRadiationSource.java @@ -0,0 +1,9 @@ +package net.nuclearteam.createnuclear.api.radiation; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public interface IRadiationSource { + double getRadiation(ItemStack stack, LivingEntity entity); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java b/src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java new file mode 100644 index 000000000..9a878a943 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java @@ -0,0 +1,96 @@ +package net.nuclearteam.createnuclear.api.radiation; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +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.biome.Biome; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +public class RadiationRegistry { + private static final Map ITEM_VALUE = new HashMap<>(); + private static final Map, Double> TAG_VALUE = new HashMap<>(); + private static final Map, Double> BIOME_VALUE = new HashMap<>(); + + private RadiationRegistry() {} + + public static Builder register() { + return new Builder(); + } + + public static double get(ItemStack stack) { + Item item = stack.getItem(); + + Double value = ITEM_VALUE.get(item); + if (value != null) return value; + + for (Entry, Double> entry : TAG_VALUE.entrySet()) { + if (stack.is(entry.getKey())) { + return entry.getValue(); + } + } + + return 0D; + } + + public static double get(ResourceKey stack) { + Double value = BIOME_VALUE.get(stack); + if (value != null) return value; + + return 0D; + } + + public static double getRadiation(ItemStack stack, LivingEntity entity) { + return get(stack) * stack.getCount(); + } + public static double getRadiation(ResourceKey biome, LivingEntity entity) { + return get(biome); + } + + public static class Builder { + private Item item; + private TagKey tag; + private ResourceKey biome; + private double value; + + public Builder item(Item item) { + this.item = item; + return this; + } + + public Builder tag(TagKey tag) { + this.tag = tag; + return this; + } + + public Builder biome(ResourceKey biome) { + this.biome = biome; + return this; + } + + public Builder value(double value) { + this.value = value; + return this; + } + + public void build() { + if (item != null) { + if (item instanceof IRadiationSource) + throw new IllegalStateException("Item " + item + " implements IRadiationSource and should not also be registered in RadiationRegistry (would cause double counting)."); + ITEM_VALUE.put(item, value); + } + + if (tag != null) { + TAG_VALUE.put(tag, value); + } + + if (biome != null) { + BIOME_VALUE.put(biome, value); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java b/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java new file mode 100644 index 000000000..494b62448 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/Mods.java @@ -0,0 +1,86 @@ +package net.nuclearteam.createnuclear.compat; + +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.platform.CatnipServices; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.fml.loading.LoadingModList; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.Optional; +import java.util.function.Supplier; + +public enum Mods { + ALEXS_CAVE("alexscaves") + ; + + private final String id; + + Mods(String name) { + id = Lang.asId(name); + } + + Mods() { + id = Lang.asId(name()); + } + + /** + * @return the mod id + */ + public String id() { + return id; + } + + public ResourceLocation rl(String path) { + return new ResourceLocation(id, path); + } + + public Block getBlock(String id) { + return ForgeRegistries.BLOCKS.getValue(rl(id)); + } + + public Item getItem(String id) { + return ForgeRegistries.ITEMS.getValue(rl(id)); + } + + public boolean contains(ItemLike entry) { + if (!isLoaded()) + return false; + Item asItem = entry.asItem(); + return asItem != null && CatnipServices.REGISTRIES.getKeyOrThrow(asItem) + .getNamespace() + .equals(id); + } + + /** + * @return a boolean of whether the mod is loaded or not based on mod id + */ + public boolean isLoaded() { + return LoadingModList.get().getModFileById(id) != null; + } + + /** + * Simple hook to run code if a mod is installed + * + * @param toRun will be run only if the mod is loaded + * @return Optional.empty() if the mod is not loaded, otherwise an Optional of the return value of the given supplier + */ + public Optional runIfInstalled(Supplier> toRun) { + if (isLoaded()) + return Optional.of(toRun.get().get()); + return Optional.empty(); + } + + /** + * Simple hook to execute code if a mod is installed + * + * @param toExecute will be executed only if the mod is loaded + */ + public void executeIfInstalled(Supplier toExecute) { + if (isLoaded()) { + toExecute.get().run(); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java b/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java new file mode 100644 index 000000000..207f5683c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/alexscave/AlexscaveCompat.java @@ -0,0 +1,76 @@ +package net.nuclearteam.createnuclear.compat.alexscave; + +import com.github.alexmodguy.alexscaves.AlexsCaves; +import com.github.alexmodguy.alexscaves.client.ClientProxy; +import com.github.alexmodguy.alexscaves.server.block.ACBlockRegistry; +import com.github.alexmodguy.alexscaves.server.block.TremorzillaEggBlock; +import com.github.alexmodguy.alexscaves.server.entity.living.RaycatEntity; +import com.github.alexmodguy.alexscaves.server.entity.living.TremorzillaEntity; +import com.github.alexmodguy.alexscaves.server.misc.ACSoundRegistry; +import com.github.alexmodguy.alexscaves.server.misc.ACTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +import static com.github.alexmodguy.alexscaves.client.ClientProxy.random; + +public class AlexscaveCompat { + + public AlexscaveCompat() {} + + public boolean MobSpawn(BlockState state, Level level, BlockPos.MutableBlockPos carve, float itemDropModifier, Explosion dummyExplosion){ + if(state.is(ACBlockRegistry.TREMORZILLA_EGG.get()) && state.getBlock() instanceof TremorzillaEggBlock tremorzillaEggBlock){ + tremorzillaEggBlock.spawnDinosaurs(level, carve, state); + return true; + } + else if (AlexsCaves.COMMON_CONFIG.nukesSpawnItemDrops.get() && random.nextFloat() < itemDropModifier && state.getFluidState().isEmpty()) { + level.destroyBlock(carve, true); + } else { + state.onBlockExploded(level, carve, dummyExplosion); + } + return false; + } + + public boolean isRaycat(LivingEntity entity) { + return entity instanceof RaycatEntity; + } + + public boolean isTremorzilla(LivingEntity entity){ + return entity instanceof TremorzillaEntity; + } + + public boolean ACResConfig(){ + return AlexsCaves.COMMON_CONFIG.nukeMaxBlockExplosionResistance.get() <= 0; + } + + public boolean ACDestroyable(BlockState state) { + return !state.is(ACTagRegistry.NUKE_PROOF) && + (state.getBlock().getExplosionResistance() < AlexsCaves.COMMON_CONFIG.nukeMaxBlockExplosionResistance.get() + || state.is(ACBlockRegistry.TREMORZILLA_EGG.get())); + } + + public void NukeParam() { + ((ClientProxy) AlexsCaves.PROXY).renderNukeSkyDarkFor = 70; + ((ClientProxy) AlexsCaves.PROXY).muteNonNukeSoundsFor = 50; + } + + public SoundEvent[] GetACSounds(){ + return new SoundEvent[] { + ACSoundRegistry.LARGE_NUCLEAR_EXPLOSION.get(), + ACSoundRegistry.NUCLEAR_EXPLOSION.get(), + ACSoundRegistry.NUCLEAR_EXPLOSION_RINGING.get(), + ACSoundRegistry.NUCLEAR_EXPLOSION_RUMBLE.get() + }; + } + + public boolean GetACConfig(){ + return AlexsCaves.CLIENT_CONFIG.nuclearBombFlash.get(); + } + + public void UpdateACProxy() { + ((ClientProxy) AlexsCaves.PROXY).renderNukeFlashFor = 16; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java b/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java index febadd4e5..0f29cc818 100644 --- a/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java +++ b/src/main/java/net/nuclearteam/createnuclear/compat/jei/CreateNuclearJEI.java @@ -18,10 +18,12 @@ import mezz.jei.api.registration.IRecipeRegistration; import mezz.jei.api.registration.IRecipeTransferRegistration; import mezz.jei.api.runtime.IIngredientManager; +import mezz.jei.api.runtime.IJeiRuntime; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; @@ -29,7 +31,9 @@ import net.nuclearteam.createnuclear.CNRecipeTypes; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.compat.jei.category.FanEnrichedCategory; +import net.nuclearteam.createnuclear.compat.jei.category.FanSnowPowderCategory; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import javax.annotation.ParametersAreNonnullByDefault; @@ -47,41 +51,54 @@ @MethodsReturnNonnullByDefault public class CreateNuclearJEI implements IModPlugin { private static final ResourceLocation MOD_ID = CreateNuclear.asResource("jei_plugin"); - @Override - public ResourceLocation getPluginUid() { - return MOD_ID; - } + private final List> allCategories = new ArrayList<>(); public IIngredientManager ingredientManager; - private static final List> Categories = new ArrayList<>(); + + public static IJeiRuntime runtime; private void loadCategories() { - Categories.clear(); + allCategories.clear(); CreateRecipeCategory enriched = builder(EnrichedRecipe.class) .addTypedRecipes(CNRecipeTypes.ENRICHED::getType) .catalystStack(ProcessingViaFanCategory.getFan("fan_enriched")) .doubleItemIcon(AllItems.PROPELLER.get(), CNBlocks.ENRICHING_CAMPFIRE.get()) .emptyBackground(178, 72) - .build("fan_enriched", FanEnrichedCategory::new) + .build("fan_enriched", FanEnrichedCategory::new), + snow_powder = builder(SnowPowderRecipe.class) + .addTypedRecipes(CNRecipeTypes.SNOW_POWDER::getType) + .catalystStack(ProcessingViaFanCategory.getFan("fan_snow_powder")) + .doubleItemIcon(AllItems.PROPELLER.get(), Items.POWDER_SNOW_BUCKET) + .emptyBackground(178, 72) + .build("fan_snow_powder", FanSnowPowderCategory::new) ; } + private > CategoryBuilder builder(Class recipeClass) { + return new CategoryBuilder<>(recipeClass, allCategories); + } + @Override - public void registerRecipes(IRecipeRegistration registration) { - ingredientManager = registration.getIngredientManager(); - Categories.forEach(c -> c.registerRecipes(registration)); + public ResourceLocation getPluginUid() { + return MOD_ID; } @Override public void registerCategories(IRecipeCategoryRegistration registration) { loadCategories(); - registration.addRecipeCategories(Categories.toArray(IRecipeCategory[]::new)); + registration.addRecipeCategories(allCategories.toArray(IRecipeCategory[]::new)); + } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + ingredientManager = registration.getIngredientManager(); + allCategories.forEach(c -> c.registerRecipes(registration)); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - Categories.forEach(c -> c.registerCatalysts(registration)); + allCategories.forEach(c -> c.registerCatalysts(registration)); } @Override @@ -89,12 +106,9 @@ public void registerRecipeTransferHandlers(IRecipeTransferRegistration registrat registration.addRecipeTransferHandler(new BlueprintTransferHandler(), RecipeTypes.CRAFTING); } - private > CategoryBuilder builder(Class recipeClass) { - return new CategoryBuilder<>(recipeClass); - } - private static class CategoryBuilder> { private final Class recipeClass; + private final List> targetCategories; private Predicate predicate = cRecipes -> true; private IDrawable background; @@ -103,8 +117,9 @@ private static class CategoryBuilder> { private final List>> recipeListConsumers = new ArrayList<>(); private final List> catalysts = new ArrayList<>(); - public CategoryBuilder(Class recipeClass) { + public CategoryBuilder(Class recipeClass, List> targetCategories) { this.recipeClass = recipeClass; + this.targetCategories = targetCategories; } public CategoryBuilder enableIf(Predicate predicate) { @@ -126,6 +141,7 @@ public CategoryBuilder addRecipes(Supplier> collectio return addRecipeListConsumer(recipes -> recipes.addAll(collection.get())); } + @SuppressWarnings("unchecked") public CategoryBuilder addAllRecipesIf(Predicate> pred) { return addRecipeListConsumer(recipes -> consumeAllRecipes(recipe -> { if (pred.test(recipe)) { @@ -274,7 +290,7 @@ public CreateRecipeCategory build(String name, CreateRecipeCategory.Factory(CreateNuclear.asResource(name), recipeClass), CreateNuclearLang.translateDirect("recipe." + name), background, icon, recipesSupplier, catalysts); CreateRecipeCategory category = factory.create(info); - Categories.add(category); + targetCategories.add(category); return category; } } @@ -286,6 +302,11 @@ public static void consumeAllRecipes(Consumer> consumer) { .getRecipes() .forEach(consumer); } + + @Override + public void onRuntimeAvailable(IJeiRuntime runtime) { + CreateNuclearJEI.runtime = runtime; + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java b/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java new file mode 100644 index 000000000..0593fc4e9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/compat/jei/category/FanSnowPowderCategory.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.compat.jei.category; + +import com.simibubi.create.compat.jei.category.ProcessingViaFanCategory; +import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Blocks; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe; + +public class FanSnowPowderCategory extends ProcessingViaFanCategory.MultiOutput { + public FanSnowPowderCategory(Info info) { + super(info); + } + + @Override + protected AllGuiTextures getBlockShadow() { + return AllGuiTextures.JEI_LIGHT; + } + + @Override + protected void renderAttachedBlock(GuiGraphics graphics) { + GuiGameElement.of(Blocks.POWDER_SNOW.defaultBlockState()) + .scale(SCALE) + .atLocal(0, 0, 2) + .lighting(AnimatedKinetics.DEFAULT_LIGHTING) + .render(graphics); + } + + @Override + public Component getTitle() { + return Component.translatable("createnuclear.snow_powder.fan.recipe"); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/biome/BiomeIrradiationExtractorItem.java b/src/main/java/net/nuclearteam/createnuclear/content/biome/BiomeIrradiationExtractorItem.java new file mode 100644 index 000000000..1cb82467c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/biome/BiomeIrradiationExtractorItem.java @@ -0,0 +1,100 @@ +package net.nuclearteam.createnuclear.content.biome; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +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.level.Level; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.BiomeIrradiationService; + +import java.util.List; + +public class BiomeIrradiationExtractorItem extends Item { + public static final String TAG = "biome_restore"; + private static final int CHARGE_PER_CLICK = 1; + + public BiomeIrradiationExtractorItem(Properties pProperties) { + super(pProperties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand interactionHand) { + ItemStack stack = player.getItemInHand(interactionHand); + + if (level.isClientSide || !(level instanceof ServerLevel serverLevel)) { + return InteractionResultHolder.success(stack); + } + + if (getCharge(stack) >= getMaxCharge()) return InteractionResultHolder.pass(stack); + + boolean restored = BiomeIrradiationService.restoreArea(serverLevel, player.blockPosition()); + if (!restored) return InteractionResultHolder.pass(stack); + + ItemStack charged = stack.copyWithCount(1); + addCharge(charged, CHARGE_PER_CLICK); + + stack.shrink(1); + if (stack.isEmpty()) { + return InteractionResultHolder.success(charged); + } + + if (!player.getInventory().add(charged)) { + player.drop(charged, false); + } + return InteractionResultHolder.success(stack); + } + + @Override + public void appendHoverText(ItemStack stack, Level level, List tooltip, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, level, tooltip, tooltipFlag); + if (tooltipFlag.isAdvanced() && getCharge(stack) > 0) { + tooltip + .add(CreateNuclearLang.translateDirect("tooltip.biome_irradiation_extractor." + TAG, getCharge(stack), getMaxCharge()) + .withStyle(ChatFormatting.GRAY)); + } + } + + @Override + public int getMaxStackSize(ItemStack stack) { + return getCharge(stack) > 0 ? 1 : this.getMaxStackSize(); + } + + @Override + public int getBarWidth(ItemStack stack) { + return Math.round(13.0f * getCharge(stack) / getMaxCharge()); + } + + @Override + public int getBarColor(ItemStack stack) { + return 0x4A90D9; + } + + public static int getCharge(ItemStack stack) { + return getChargeTag(stack, 0); + } + + public static int getMaxCharge() { + return CNConfigs.server().biomeRestore.maxCharge.get(); + } + + public static void addCharge(ItemStack stack, int amount) { + int current = getCharge(stack); + int next = Mth.clamp(current + amount, 0, getMaxCharge()); + stack.getOrCreateTag().putInt(TAG, next); + } + + public static int getChargeTag(ItemStack stack, int defaultValue) { + if (stack == null) return defaultValue; + CompoundTag tag = stack.getTag(); + return (tag != null && tag.contains(TAG)) ? tag.getInt(TAG) : defaultValue; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/AnimalUtil.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/AnimalUtil.java new file mode 100644 index 000000000..1ac5958bd --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/AnimalUtil.java @@ -0,0 +1,40 @@ +package net.nuclearteam.createnuclear.content.contraptions.irradiated; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.function.Predicate; + +public class AnimalUtil { + private AnimalUtil() {} + + public static boolean isFood(ItemStack stack, Ingredient foodItems) { + return isFood(stack, foodItems, $ -> true); + } + + public static boolean isFood(ItemStack stack, Ingredient foodItems, Predicate extraTest) { + if (stack.is(CNItems.YELLOWCAKE.get())) { + return true; + } + + return foodItems.test(stack) || extraTest.test(stack); + } + + /** + * Taming for irradiated creatures is still work in progress: rather than actually + * taming the mob, this informs the player and consumes the interaction. + */ + public static InteractionResult blockTamingWip(Player player, Level level) { + if (!level.isClientSide) { + player.sendSystemMessage(Component.translatable("irradiated.taming.wip")); + } + + return InteractionResult.sidedSuccess(level.isClientSide); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/CNModelLayers.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/CNModelLayers.java index e62c7855f..ee9ebede5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/CNModelLayers.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/CNModelLayers.java @@ -2,6 +2,7 @@ import com.google.common.collect.Sets; import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraftforge.fml.common.Mod; import net.nuclearteam.createnuclear.CreateNuclear; import java.util.Set; @@ -12,6 +13,9 @@ public class CNModelLayers { public static final ModelLayerLocation IRRADIATED_CHICKEN = register("irradiated_chicken"); public static final ModelLayerLocation IRRADIATED_WOLF = register("irradiated_wolf"); public static final ModelLayerLocation IRRADIATED_CAT = register("irradiated_cat"); + public static final ModelLayerLocation IRRADIATED_COW = register("irradiated_cow"); + + public static final ModelLayerLocation ANTI_IRRADIATION_ARMOR = register("default_anti_radiation_suit"); private static ModelLayerLocation register(String path) { return register(path, "main"); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/IrradiatedAnimal.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/IrradiatedAnimal.java new file mode 100644 index 000000000..288339aec --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/IrradiatedAnimal.java @@ -0,0 +1,90 @@ +package net.nuclearteam.createnuclear.content.contraptions.irradiated; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.event.ForgeEventFactory; + +import java.util.HashMap; +import java.util.Map; + +public interface IrradiatedAnimal { + Map, EntityType> VANILLA_TO_IRRADIATED = new HashMap<>(); + + EntityType getNormalVariant(); + + default void readFromVanilla(Animal animal) {} + + default void writeToVanilla(Animal animal) {} + + boolean isConverting(); + + void setConverting(); + + void setConversionTime(int conversionTime); + + int getConversionTime(); + + default void startConverting(int conversionTime) { + Animal animal = (Animal) this; + + setConversionTime(conversionTime); + setConverting(); + animal.removeEffect(MobEffects.WEAKNESS); + animal.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, conversionTime, Math.min(animal.level().getDifficulty().getId() -1, 0))); + animal.level().broadcastEntityEvent(animal, EntityEvent.ZOMBIE_CONVERTING); + } + + default void finishConversion(ServerLevel level) { + Animal irradifiedAnimal = (Animal) this; + Animal vanillaAnimal = irradifiedAnimal.convertTo(getNormalVariant(), false); + + if (vanillaAnimal != null) { + vanillaAnimal.finalizeSpawn(level, level.getCurrentDifficultyAt(vanillaAnimal.blockPosition()), MobSpawnType.CONVERSION, null, null); + writeToVanilla(vanillaAnimal); + vanillaAnimal.addEffect(new MobEffectInstance(MobEffects.CONFUSION, 200, 0)); + + if (!irradifiedAnimal.isSilent()) { + level.levelEvent(null, LevelEvent.SOUND_ZOMBIE_CONVERTED, irradifiedAnimal.blockPosition(), 0); + } + + ForgeEventFactory.onLivingConvert(irradifiedAnimal, vanillaAnimal); + } + } + + default int getConversionProgress() { + int progress = 1; + Animal animal = (Animal) this; + + if (animal.getRandom().nextFloat() < 0.01F) { + int buffCount = 0; + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + + for (int x = (int) animal.getX() - 4; x < animal.getX() + 4 && buffCount < 14; ++x) { + for (int y = (int) animal.getY() - 4; y < animal.getY() + 4 && buffCount < 14; ++y) { + for (int z = (int) animal.getZ() - 4; z < animal.getZ() + 4 && buffCount < 14; ++z) { + BlockState state = animal.level().getBlockState(pos.set(x, y, z)); + + if (state.is(BlockTags.WOODEN_FENCES) || state.is(Blocks.HAY_BLOCK)) { + if (animal.getRandom().nextFloat() < 0.3F) + ++progress; + + ++buffCount; + } + } + } + } + } + + return progress; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java index 2da168ecf..a5fa9852f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/CatSitOnBlockGoal.java @@ -38,6 +38,7 @@ public void tick() { this.cat.setInSittingPose(this.isReachedTarget()); } + @SuppressWarnings("null") protected boolean isValidTarget(LevelReader level, BlockPos pos) { if (!level.isEmptyBlock(pos.above())) { return false; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java index bdda3854a..12cf7c258 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCat.java @@ -38,6 +38,8 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.AABB; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.AnimalUtil; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -56,7 +58,6 @@ public class IrradiatedCat extends TamableAnimal { private static final Ingredient TEMPT_INGREDIENT; private static final EntityDataAccessor IS_LYING; private static final EntityDataAccessor RELAX_STATE_ONE; - private static final EntityDataAccessor DATA_COLLAR_COLOR; private CatAvoidEntityGoal avoidPlayersGoal; @Nullable private TemptGoal temptGoal; @@ -71,6 +72,7 @@ public IrradiatedCat(EntityType entityType, Level level super(entityType, level); } + @SuppressWarnings({ "rawtypes", "unchecked" }) protected void registerGoals() { this.temptGoal = new CatTemptGoal(this, 0.6, TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -106,33 +108,18 @@ public boolean isRelaxStateOne() { return this.entityData.get(RELAX_STATE_ONE); } - public DyeColor getCollarColor() { - return DyeColor.byId(this.entityData.get(DATA_COLLAR_COLOR)); - } - - public void setCollarColor(DyeColor color) { - this.entityData.set(DATA_COLLAR_COLOR, color.getId()); - } - protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(IS_LYING, false); this.entityData.define(RELAX_STATE_ONE, false); - this.entityData.define(DATA_COLLAR_COLOR, DyeColor.RED.getId()); } public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putByte("CollarColor", (byte)this.getCollarColor().getId()); } public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); - - if (compound.contains("CollarColor", 99)) { - this.setCollarColor(DyeColor.byId(compound.getInt("CollarColor"))); - } - } public void customServerAiStep() { @@ -266,11 +253,6 @@ public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { if (this.isTame()) { cat.setOwnerUUID(this.getOwnerUUID()); cat.setTame(true); - if (this.random.nextBoolean()) { - cat.setCollarColor(this.getCollarColor()); - } else { - cat.setCollarColor(cat2.getCollarColor()); - } } } @@ -288,6 +270,7 @@ public boolean canMate(Animal otherAnimal) { } } + @SuppressWarnings("null") public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData spawnData, @Nullable CompoundTag dataTag) { spawnData = super.finalizeSpawn(level, difficulty, reason, spawnData, dataTag); boolean bl = level.getMoonBrightness() > 0.9F; @@ -299,6 +282,7 @@ public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstanc return spawnData; } + @SuppressWarnings("null") public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemStack = player.getItemInHand(hand); Item item = itemStack.getItem(); @@ -312,44 +296,21 @@ public InteractionResult mobInteract(Player player, InteractionHand hand) { InteractionResult interactionResult; if (this.isTame()) { if (this.isOwnedBy(player)) { - if (!(item instanceof DyeItem)) { - if (item.isEdible() && this.isFood(itemStack) && this.getHealth() < this.getMaxHealth()) { - this.usePlayerItem(player, hand, itemStack); - this.heal((float)item.getFoodProperties().getNutrition()); - return InteractionResult.CONSUME; - } - - interactionResult = super.mobInteract(player, hand); - if (!interactionResult.consumesAction() || this.isBaby()) { - this.setOrderedToSit(!this.isOrderedToSit()); - } - - return interactionResult; + if (item.isEdible() && this.isFood(itemStack) && this.getHealth() < this.getMaxHealth()) { + this.usePlayerItem(player, hand, itemStack); + this.heal((float)item.getFoodProperties().getNutrition()); + return InteractionResult.CONSUME; } - DyeColor dyeColor = ((DyeItem)item).getDyeColor(); - if (dyeColor != this.getCollarColor()) { - this.setCollarColor(dyeColor); - if (!player.getAbilities().instabuild) { - itemStack.shrink(1); - } - - this.setPersistenceRequired(); - return InteractionResult.CONSUME; + interactionResult = super.mobInteract(player, hand); + if (!interactionResult.consumesAction() || this.isBaby()) { + this.setOrderedToSit(!this.isOrderedToSit()); } - } - } else if (this.isFood(itemStack)) { - this.usePlayerItem(player, hand, itemStack); - if (this.random.nextInt(3) == 0) { - this.tame(player); - this.setOrderedToSit(true); - this.level().broadcastEntityEvent(this, (byte)7); - } else { - this.level().broadcastEntityEvent(this, (byte)6); - } - this.setPersistenceRequired(); - return InteractionResult.CONSUME; + return interactionResult; + } + } else if (itemStack.is(CNItems.YELLOWCAKE.get())) { + return AnimalUtil.blockTamingWip(player, this.level()); } interactionResult = super.mobInteract(player, hand); @@ -390,10 +351,9 @@ public boolean isSteppingCarefully() { } static { - TEMPT_INGREDIENT = Ingredient.of(new ItemLike[]{Items.COD, Items.SALMON}); + TEMPT_INGREDIENT = Ingredient.of(new ItemLike[]{Items.COD, Items.SALMON, CNItems.YELLOWCAKE}); IS_LYING = SynchedEntityData.defineId(IrradiatedCat.class, EntityDataSerializers.BOOLEAN); RELAX_STATE_ONE = SynchedEntityData.defineId(IrradiatedCat.class, EntityDataSerializers.BOOLEAN); - DATA_COLLAR_COLOR = SynchedEntityData.defineId(IrradiatedCat.class, EntityDataSerializers.INT); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatCollarLayer.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatCollarLayer.java deleted file mode 100644 index 83d842f8c..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cat/IrradiatedCatCollarLayer.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.nuclearteam.createnuclear.content.contraptions.irradiated.cat; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelLayers; -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; - -import javax.annotation.ParametersAreNonnullByDefault; - -@SuppressWarnings("unused") -@ParametersAreNonnullByDefault -public class IrradiatedCatCollarLayer extends RenderLayer> { - private static final ResourceLocation CAT_COLLAR_LOCATION = new ResourceLocation("textures/entity/cat/cat_collar.png"); - private final IrradiatedCatModel irrigatedCatCollarModel; - - public IrradiatedCatCollarLayer(RenderLayerParent> render, EntityModelSet modelSet) { - super(render); - this.irrigatedCatCollarModel = new IrradiatedCatModel<>(modelSet.bakeLayer(ModelLayers.CAT_COLLAR)); - } - - - @Override - public void render(PoseStack matrixStack, MultiBufferSource buffer, int packedLight, IrradiatedCat livingEntity, float limbSwing, float limbSwingAmount, float partialTick, float ageInTicks, float netHeadYaw, float headPitch) { - if (livingEntity.isTame()) { - float[] fs = livingEntity.getCollarColor().getTextureDiffuseColors(); - coloredCutoutModelCopyLayerRender(this.getParentModel(), this.irrigatedCatCollarModel, CAT_COLLAR_LOCATION, matrixStack, buffer, packedLight, livingEntity, limbSwing, limbSwingAmount, partialTick, ageInTicks, netHeadYaw, headPitch, fs[0], fs[1], fs[2]); - } - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/chicken/IrradiatedChicken.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/chicken/IrradiatedChicken.java index 1fa24f4b0..cf86a9d26 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/chicken/IrradiatedChicken.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/chicken/IrradiatedChicken.java @@ -3,16 +3,23 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; 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.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; 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.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Chicken; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -23,6 +30,9 @@ import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; import net.nuclearteam.createnuclear.CNEntityType; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.AnimalUtil; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.IrradiatedAnimal; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -30,10 +40,11 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @SuppressWarnings("unused") -public class IrradiatedChicken extends Animal { +public class IrradiatedChicken extends Animal implements IrradiatedAnimal { private static final Ingredient FOOD_ITEMS = Ingredient.of( Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, - Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD + Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD, + CNItems.YELLOWCAKE ); public float flap; public float flapSpeed; @@ -44,12 +55,21 @@ public class IrradiatedChicken extends Animal { public int eggTime; public boolean isChickenJockey; + private static final EntityDataAccessor DATA_CONVERTING_ID = SynchedEntityData.defineId(IrradiatedChicken.class, EntityDataSerializers.BOOLEAN); + private int conversionTime; + public IrradiatedChicken(EntityType entityType, Level level) { super(entityType, level); this.eggTime = this.random.nextInt(6000) + 6000; this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); } + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + entityData.define(DATA_CONVERTING_ID, false); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -130,7 +150,8 @@ public IrradiatedChicken getBreedOffspring(ServerLevel level, AgeableMob otherPa @Override public boolean isFood(ItemStack stack) { - return FOOD_ITEMS.test(stack); + // Check if the stack is a valid Yellowcake or the base food + return AnimalUtil.isFood(stack, FOOD_ITEMS); } @Override @@ -146,6 +167,8 @@ public void readAdditionalSaveData(CompoundTag compound) { this.eggTime = compound.getInt("EggLayTime"); } + if (compound.contains("ConversionTime", Tag.TAG_ANY_NUMERIC) && compound.getInt("ConversionTime") > -1) + startConverting(compound.getInt("ConversionTime")); } @Override @@ -153,6 +176,7 @@ public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); compound.putBoolean("IsChickenJockey", this.isChickenJockey); compound.putInt("EggLayTime", this.eggTime); + compound.putInt("ConversionTime", isConverting() ? conversionTime : -1); } @Override @@ -181,4 +205,41 @@ public boolean isChickenJockey() { public void setChickenJockey(boolean isChickenJockey) { this.isChickenJockey = isChickenJockey; } + + @Override + public EntityType getNormalVariant() { + return EntityType.CHICKEN; + } + + @Override + public void readFromVanilla(Animal animal) { + if (animal instanceof Chicken chicken) + setChickenJockey(chicken.isChickenJockey()); + } + + @Override + public void writeToVanilla(Animal animal) { + if (animal instanceof Chicken chicken) + chicken.setChickenJockey(isChickenJockey()); + } + + @Override + public boolean isConverting() { + return getEntityData().get(DATA_CONVERTING_ID); + } + + @Override + public void setConverting() { + getEntityData().set(DATA_CONVERTING_ID, true); + } + + @Override + public void setConversionTime(int conversionTime) { + this.conversionTime = conversionTime; + } + + @Override + public int getConversionTime() { + return conversionTime; + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCow.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCow.java new file mode 100644 index 000000000..b8a6c8782 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCow.java @@ -0,0 +1,100 @@ +package net.nuclearteam.createnuclear.content.contraptions.irradiated.cow; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.CNEntityType; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.AnimalUtil; + +import javax.annotation.Nullable; + +public class IrradiatedCow extends Animal { + public IrradiatedCow(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + // Define the base food of the animal (e.g., Wheat for Cows) + private static final Ingredient FOOD_ITEMS = Ingredient.of(CNItems.YELLOWCAKE); + + @Override + public boolean isFood(ItemStack stack) { + // Check if the stack is a valid Yellowcake or the base food + return AnimalUtil.isFood(stack, FOOD_ITEMS); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F); + } + + protected SoundEvent getAmbientSound() { + return SoundEvents.COW_AMBIENT; + } + + protected SoundEvent getHurtSound(DamageSource pDamageSource) { + return SoundEvents.COW_HURT; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COW_DEATH; + } + + protected void playStepSound(BlockPos pPos, BlockState pBlock) { + this.playSound(SoundEvents.COW_STEP, 0.15F, 1.0F); + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() { + return 0.4F; + } + + public InteractionResult mobInteract(Player pPlayer, InteractionHand pHand) { + ItemStack itemstack = pPlayer.getItemInHand(pHand); + if (itemstack.is(Items.BUCKET) && !this.isBaby()) { + pPlayer.playSound(SoundEvents.COW_MILK, 1.0F, 1.0F); + ItemStack itemstack1 = ItemUtils.createFilledResult(itemstack, pPlayer, Items.MILK_BUCKET.getDefaultInstance()); + pPlayer.setItemInHand(pHand, itemstack1); + return InteractionResult.sidedSuccess(this.level().isClientSide); + } else { + return super.mobInteract(pPlayer, pHand); + } + } + + @Nullable + public IrradiatedCow getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + return CNEntityType.IRRADIATED_COW.create(pLevel); + } + + protected float getStandingEyeHeight(Pose pPose, EntityDimensions pSize) { + return this.isBaby() ? pSize.height * 0.95F : 1.3F; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowModel.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowModel.java new file mode 100644 index 000000000..1f1ba5062 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowModel.java @@ -0,0 +1,109 @@ +// Made with Blockbench 5.0.4 +// Exported for Minecraft version 1.17 or later with Mojang mappings +// Paste this class into your mod and generate all required imports +package net.nuclearteam.createnuclear.content.contraptions.irradiated.cow; + + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; + +public class IrradiatedCowModel extends AgeableListModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor + private final ModelPart head; + private final ModelPart pustule; + private final ModelPart body; + private final ModelPart pustule3; + private final ModelPart legs; + private final ModelPart leg1; + private final ModelPart leg2; + private final ModelPart leg3; + private final ModelPart leg4; + private final ModelPart pustule2; + + public IrradiatedCowModel(ModelPart root) { + this.head = root.getChild("head"); + this.pustule = this.head.getChild("pustule"); + this.body = root.getChild("body"); + this.pustule3 = this.body.getChild("pustule3"); + this.legs = root.getChild("legs"); + this.leg1 = this.legs.getChild("leg1"); + this.leg2 = this.legs.getChild("leg2"); + this.leg3 = this.legs.getChild("leg3"); + this.leg4 = this.legs.getChild("leg4"); + this.pustule2 = this.leg4.getChild("pustule2"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -4.0F, -6.0F, 8.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(22, 0).addBox(4.0F, -5.0F, -4.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(22, 0).addBox(-5.0F, -5.0F, -4.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 4.0F, -8.0F)); + + PartDefinition pustule = head.addOrReplaceChild("pustule", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition pustule_head_r1 = pustule.addOrReplaceChild("pustule_head_r1", CubeListBuilder.create().texOffs(54, 9).addBox(-1.1F, -0.8F, -0.6F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(3.4F, -4.0F, -1.0F, -0.2739F, 0.2947F, -0.0814F)); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(18, 4).addBox(-6.0F, -10.0F, -7.0F, 12.0F, 18.0F, 10.0F, new CubeDeformation(0.0F)) + .texOffs(52, 0).addBox(-2.0F, 2.0F, -8.0F, 4.0F, 6.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 5.0F, 2.0F, 1.5708F, 0.0F, 0.0F)); + + PartDefinition pustule3 = body.addOrReplaceChild("pustule3", CubeListBuilder.create(), PartPose.offsetAndRotation(1.5724F, 9.1193F, -7.1515F, 2.8289F, -0.5338F, 2.1369F)); + + PartDefinition pustule_back_r1 = pustule3.addOrReplaceChild("pustule_back_r1", CubeListBuilder.create().texOffs(54, 9).addBox(3.4F, 0.0F, -4.7F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.309F, -2.9436F, -13.0622F, 2.0131F, -0.1273F, -1.056F)); + + PartDefinition pustule_belly_r1 = pustule3.addOrReplaceChild("pustule_belly_r1", CubeListBuilder.create().texOffs(54, 9).addBox(-2.0F, -0.6F, 5.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -2.0159F, 0.1667F, 2.0666F)); + + PartDefinition legs = partdefinition.addOrReplaceChild("legs", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition leg1 = legs.addOrReplaceChild("leg1", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -12.0F, 7.0F)); + + PartDefinition leg2 = legs.addOrReplaceChild("leg2", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -12.0F, 7.0F)); + + PartDefinition leg3 = legs.addOrReplaceChild("leg3", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -1.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -12.0F, -6.0F)); + + PartDefinition leg4 = legs.addOrReplaceChild("leg4", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -1.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -12.0F, -6.0F)); + + PartDefinition pustule2 = leg4.addOrReplaceChild("pustule2", CubeListBuilder.create(), PartPose.offsetAndRotation(0.4249F, 7.2997F, 2.3458F, -2.5307F, 0.0F, 0.0F)); + + PartDefinition pustule_leg_r1 = pustule2.addOrReplaceChild("pustule_leg_r1", CubeListBuilder.create().texOffs(54, 9).addBox(-1.0F, 0.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.1064F, 2.3852F, -0.6084F, 0.1272F, 0.3997F, 1.5682F)); + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch * ((float)Math.PI / 180F); + this.head.yRot = netHeadYaw * ((float)Math.PI / 180F); + this.leg3.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leg4.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.leg1.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.leg2.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + legs.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(this.head); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(this.body, this.leg1, this.leg2, this.leg3, this.leg4); + } + +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowRenderer.java new file mode 100644 index 000000000..a82c603bf --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/cow/IrradiatedCowRenderer.java @@ -0,0 +1,25 @@ +package net.nuclearteam.createnuclear.content.contraptions.irradiated.cow; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.CNModelLayers; + +@OnlyIn(Dist.CLIENT) +public class IrradiatedCowRenderer extends MobRenderer> { + private static final ResourceLocation COW_LOCATION = CreateNuclear.asResource("textures/entity/irradiated_cow.png"); + + public IrradiatedCowRenderer(EntityRendererProvider.Context context) { + super(context, new IrradiatedCowModel<>(context.bakeLayer(CNModelLayers.IRRADIATED_COW)), 0.7f); + } + + /** + * Returns the location of an entity's texture. + */ + public ResourceLocation getTextureLocation(IrradiatedCow pEntity) { + return COW_LOCATION; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWoldCollarLayer.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWoldCollarLayer.java deleted file mode 100644 index 78e3f5990..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWoldCollarLayer.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.nuclearteam.createnuclear.content.contraptions.irradiated.wolf; - -import com.mojang.blaze3d.vertex.PoseStack; -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; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@SuppressWarnings("unused") -public class IrradiatedWoldCollarLayer extends RenderLayer> { - private static final ResourceLocation WOLF_COLLAR_LOCATION = new ResourceLocation("textures/entity/wolf/wolf_collar.png"); - - public IrradiatedWoldCollarLayer(RenderLayerParent> renderer) { - super(renderer); - } - - @Override - public void render(PoseStack matrixStack, MultiBufferSource buffer, int packedLight, IrradiatedWolf livingEntity, float limbSwing, float limbSwingAmount, float partialTick, float ageInTicks, float netHeadYaw, float headPitch) { - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWolf.java b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWolf.java index 1f62b103d..e89345851 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWolf.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/wolf/IrradiatedWolf.java @@ -35,7 +35,7 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; @@ -44,6 +44,7 @@ import net.minecraft.world.phys.Vec3; import net.nuclearteam.createnuclear.CNEntityType; import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.AnimalUtil; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -300,7 +301,7 @@ public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemStack = player.getItemInHand(hand); Item item = itemStack.getItem(); if (this.level().isClientSide) { - boolean bl = this.isOwnedBy(player) || this.isTame() || itemStack.is(Items.BONE) && !this.isTame() && !this.isAngry(); + boolean bl = this.isOwnedBy(player) || this.isTame() || this.isFood(itemStack) && !this.isTame() && !this.isAngry(); return bl ? InteractionResult.CONSUME : InteractionResult.PASS; } else { { @@ -313,6 +314,8 @@ public InteractionResult mobInteract(Player player, InteractionHand hand) { this.heal((float) item.getFoodProperties().getNutrition()); return InteractionResult.SUCCESS; } + } else if (this.isFood(itemStack)) { + return AnimalUtil.blockTamingWip(player, this.level()); } return super.mobInteract(player, hand); @@ -340,10 +343,13 @@ public float getTailAngle() { return this.isTame() ? (0.55F - (this.getMaxHealth() - this.getHealth()) * 0.02F) * 3.1415927F : 0.62831855F; } } + // Define the base food of the animal (e.g., Wheat for Cows) + private static final Ingredient FOOD_ITEMS = Ingredient.of(CNItems.YELLOWCAKE); + @Override public boolean isFood(ItemStack stack) { - //Item item = stack.getItem(); - return stack.is(CNItems.YELLOWCAKE.asItem());//stack.is(CNItems.URANIUM_POWDER.get()); //item.isEdible() && item.getFoodProperties().isMeat(); + // Check if the stack is a valid Yellowcake or the base food + return AnimalUtil.isFood(stack, FOOD_ITEMS); } public int getMaxSpawnClusterSize() { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PaletteBlockPattern.java b/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PaletteBlockPattern.java index f06ddf5f1..4359b8dcc 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PaletteBlockPattern.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PaletteBlockPattern.java @@ -18,6 +18,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraft.core.Direction.Axis; +import net.minecraftforge.client.model.generators.BlockModelBuilder; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.nuclearteam.createnuclear.CreateNuclear; @@ -140,16 +141,24 @@ private PaletteBlockPattern connectedTextures(Function prov.simpleBlock(ctx.get(), prov.models() - .cubeAll(createName(variant), all)); + return (ctx, prov) -> { + BlockModelBuilder builder = prov.models() + .cubeAll(createName(variant), all); + if (isTranslucent) builder.renderType("translucent"); + prov.simpleBlock(ctx.get(), builder); + }; } public IBlockStateProvider cubeBottomTop(String variant) { ResourceLocation side = toLocation(variant, textures[0]); ResourceLocation bottom = toLocation(variant, textures[1]); ResourceLocation top = toLocation(variant, textures[2]); - return (ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models() - .cubeBottomTop(createName(variant), side, bottom, top)); + return (ctx, prov) -> { + BlockModelBuilder builder = prov.models() + .cubeBottomTop(createName(variant), side, bottom, top); + if (isTranslucent) builder.renderType("translucent"); + prov.simpleBlock(ctx.get(), builder); + }; } public IBlockStateProvider pillar(String variant) { @@ -159,15 +168,19 @@ public IBlockStateProvider pillar(String variant) { return (ctx, prov) -> prov.getVariantBuilder(ctx.getEntry()) .forAllStatesExcept(state -> { Axis axis = state.getValue(BlockStateProperties.AXIS); - if (axis == Axis.Y) + BlockModelBuilder builder; + if (axis == Axis.Y) { + builder = prov.models().cubeColumn(createName(variant), side, end); + if (isTranslucent) builder.renderType("translucent"); return ConfiguredModel.builder() - .modelFile(prov.models() - .cubeColumn(createName(variant), side, end)) + .modelFile(builder) .uvLock(false) .build(); + } + builder = prov.models().cubeColumnHorizontal(createName(variant) + "_horizontal", side, end); + if (isTranslucent) builder.renderType("translucent"); return ConfiguredModel.builder() - .modelFile(prov.models() - .cubeColumnHorizontal(createName(variant) + "_horizontal", side, end)) + .modelFile(builder) .uvLock(false) .rotationX(90) .rotationY(axis == Axis.X ? 90 : 0) @@ -179,8 +192,12 @@ public IBlockStateProvider pillar(String variant) { public IBlockStateProvider cubeColumn(String variant) { ResourceLocation side = toLocation(variant, textures[0]); ResourceLocation end = toLocation(variant, textures[1]); - return (ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models() - .cubeColumn(createName(variant), side, end)); + return (ctx, prov) -> { + BlockModelBuilder builder = prov.models() + .cubeColumn(createName(variant), side, end); + if (isTranslucent) builder.renderType("translucent"); + prov.simpleBlock(ctx.get(), builder); + }; } // Utility diff --git a/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PalettesVariantEntry.java b/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PalettesVariantEntry.java index 9f2bd9aa3..2db86abb5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PalettesVariantEntry.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/decoration/palettes/PalettesVariantEntry.java @@ -37,10 +37,9 @@ public PalettesVariantEntry(String name, CNPaletteStoneTypes paletteStoneVariant .transform(pickaxeOnly()) .blockstate(pattern.getBlockStateGenerator() .apply(pattern) - .apply(name)::accept - ); - ItemBuilder> itemBuilder = - builder.item(); + .apply(name)::accept); + ItemBuilder> itemBuilder = builder + .item(); TagKey[] blockTags = pattern.getBlockTags(); if (blockTags != null) @@ -51,10 +50,8 @@ public PalettesVariantEntry(String name, CNPaletteStoneTypes paletteStoneVariant itemBuilder.tag(paletteStoneVariants.materialTag); - if (pattern.isTranslucent()) - builder.addLayer(() -> RenderType::translucent); pattern.createCTBehaviour(name) - .ifPresent(b -> builder.onRegister(connectedTextures(b))); + .ifPresent(b -> builder.onRegister(CreateRegistrate.connectedTextures(b))); builder.recipe((c, p) -> { p.stonecutting(DataIngredient.tag(paletteStoneVariants.materialTag), RecipeCategory.BUILDING_BLOCKS, c); @@ -71,7 +68,8 @@ public PalettesVariantEntry(String name, CNPaletteStoneTypes paletteStoneVariant } REGISTRATE.addDataGenerator(ProviderType.RECIPE, - p -> p.stonecutting(DataIngredient.tag(paletteStoneVariants.materialTag), RecipeCategory.BUILDING_BLOCKS, + p -> p.stonecutting(DataIngredient.tag(paletteStoneVariants.materialTag), + RecipeCategory.BUILDING_BLOCKS, baseBlock)); REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, p -> p.addTag(paletteStoneVariants.materialTag) .add(baseBlock.get() diff --git a/src/main/java/net/nuclearteam/createnuclear/content/effects/IodineEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/effects/IodineEffect.java new file mode 100644 index 000000000..71fb76735 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/effects/IodineEffect.java @@ -0,0 +1,27 @@ +package net.nuclearteam.createnuclear.content.effects; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.nuclearteam.createnuclear.CNAttributes; + +import java.util.UUID; + +public class IodineEffect extends MobEffect { + public static final UUID IODINE_UUID = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); + + protected IodineEffect(MobEffectCategory pCategory, int pColor) { + super(pCategory, pColor); + + this.addAttributeModifier(CNAttributes.IRRADIATED_RESISTANCE.get(), IODINE_UUID.toString(), 1D, AttributeModifier.Operation.ADDITION); + } + + public IodineEffect() { + this(MobEffectCategory.BENEFICIAL, 7328217); + } + + @Override + public boolean isDurationEffectTick(int pDuration, int pAmplifier) { + return true; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/effects/RadiationEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/effects/RadiationEffect.java deleted file mode 100644 index e0eee6b65..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/RadiationEffect.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.nuclearteam.createnuclear.content.effects; - -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; - -public class RadiationEffect extends MobEffect { - - /** - * Constructs the RadiationEffect with harmful category and color. - * Also applies attribute modifiers to reduce speed, attack damage, and attack speed. - */ - public RadiationEffect() { - super(MobEffectCategory.HARMFUL, 15453236); // Custom color (hex value) - - // Reduces movement speed by 20% - this.addAttributeModifier(Attributes.MOVEMENT_SPEED, - "91AEAA56-376B-4498-935B-2F7F68070635", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); - - // Reduces attack damage by 20% - this.addAttributeModifier(Attributes.ATTACK_DAMAGE, - "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); - - // Reduces attack speed by 20% - this.addAttributeModifier(Attributes.ATTACK_SPEED, - "55FCED67-E92A-486E-9800-B47F202C4386", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); - } - - /** - * Determines if the effect should be applied this tick. - * Returning true causes the effect to apply every tick. - * - * @param duration The remaining duration of the effect. - * @param amplifier The strength (level) of the effect. - * @return true if the effect should apply on this tick. - */ - @Override - public boolean isDurationEffectTick(int duration, int amplifier) { - return true; - } - - /** - * Applies the radiation effect to the entity. - * - Does nothing if the entity is immune via tag. - * - Skips damage if the entity wears any anti-radiation armor. - * - Otherwise, applies magic damage based on the amplifier. - * - * @param livingEntity The affected living entity. - * @param amplifier The strength (level) of the effect. - */ - @Override - public void applyEffectTick(LivingEntity livingEntity, int amplifier) { - // If the entity is immune to radiation, remove the effect - if (livingEntity.getType().is(CNTags.CNEntityTags.IRRADIATED_IMMUNE.tag)) { - livingEntity.removeEffect(this); - return; - } - - // Check if the entity is wearing any anti-radiation armor - boolean isWearingAntiRadiationArmor = false; - for (ItemStack armor : livingEntity.getArmorSlots()) { - if (AntiRadiationArmorItem.Armor.isArmored(armor)) { - isWearingAntiRadiationArmor = true; - break; - } - } - - // If protected by armor, do not apply damage - if (isWearingAntiRadiationArmor) { - return; - - } - - // Apply radiation damage (magic type), scaled by amplifier - int damage = 1 << amplifier; - livingEntity.hurt(livingEntity.damageSources().magic(), damage); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java new file mode 100644 index 000000000..9b5590b01 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java @@ -0,0 +1,64 @@ +package net.nuclearteam.createnuclear.content.effects; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.*; + +public abstract class VicinityEffect extends MobEffect { + private final UnaryOperator areaSize; + private final Predicate filter; + + // Stores the GameTime tick when the cooldown expires for each entity + private final Map cooldowns = new HashMap<>(); + + protected VicinityEffect(MobEffectCategory category, int color, UnaryOperator areaSize, Predicate filter, Consumer timer) { + super(category, color); + + this.areaSize = areaSize; + this.filter = filter; + } + + @Override + public void applyEffectTick(LivingEntity entity, int amplifier) { + long currentTime = entity.level().getGameTime(); + + List nearbyEntities = entity.level().getEntities( + entity, + entity.getBoundingBox().inflate(areaSize.apply(amplifier)), + e -> e instanceof LivingEntity target && filter.test(target) + ); + + for (Entity nearbyEntity : nearbyEntities) { + LivingEntity nearby = (LivingEntity) nearbyEntity; + UUID entityUuid = nearby.getUUID(); + + // Check if the cooldown has expired + if (currentTime >= cooldowns.getOrDefault(entityUuid, 0L)) { + onContaminate(nearby); + + // Set a 100-tick (5 seconds) cooldown before refreshing the effect again + cooldowns.put(entityUuid, currentTime + 100); + } + } + } + + /** + * Called for each eligible nearby entity once its cooldown expires. Each subclass + * decides how it actually delivers the effect (e.g. RadiationEffect feeds the dose + * into RadiationCapability rather than adding a MobEffect directly). + */ + protected abstract void onContaminate(LivingEntity nearby); + + @Override + public boolean isDurationEffectTick(int duration, int amplifier) { + return duration % 5 == 0; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java index 1b210938c..a64993350 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/enriching/campfire/EnrichingCampfireBlock.java @@ -10,7 +10,6 @@ import net.minecraft.util.RandomSource; 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.player.Player; @@ -37,7 +36,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.nuclearteam.createnuclear.CNBlockEntityTypes; -import net.nuclearteam.createnuclear.CNEffects; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -46,6 +45,8 @@ @ParametersAreNonnullByDefault @SuppressWarnings({"deprecation", "unused"}) public class EnrichingCampfireBlock extends BaseEntityBlock implements SimpleWaterloggedBlock, IBE { + private static final double CAMPFIRE_DOSE = 5.0D; + protected static final VoxelShape SHAPE = Block.box(0.0, 0.0, 0.0, 16.0, 7.0, 16.0); public static final BooleanProperty LIT = BlockStateProperties.LIT; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; @@ -65,8 +66,8 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player @Override public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { - if (state.getValue(LIT) && entity instanceof LivingEntity && !EnchantmentHelper.hasFrostWalker((LivingEntity)entity)) { - ((LivingEntity) entity).addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 100, 0)); + if (state.getValue(LIT) && entity instanceof LivingEntity livingEntity && !EnchantmentHelper.hasFrostWalker(livingEntity)) { + RadiationCapability.applyContagion(livingEntity, CAMPFIRE_DOSE, 100); } super.entityInside(state, level, pos, entity); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/enriching/fire/EnrichingFireBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/enriching/fire/EnrichingFireBlock.java index 94e27c612..afd2c89a4 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/enriching/fire/EnrichingFireBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/enriching/fire/EnrichingFireBlock.java @@ -4,6 +4,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.BaseFireBlock; @@ -35,9 +36,24 @@ public BlockState updateShape(BlockState pState, Direction pFacing, BlockState p @Override public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) { - return EnrichingFireBlock.canSurviveOnBlock(worldIn.getBlockState(pos.below())); + BlockPos blockpos = pos.below(); + return worldIn.getBlockState(blockpos).isFaceSturdy(worldIn, blockpos, Direction.UP) || this.isValidFireLocation(worldIn, pos); } + private boolean isValidFireLocation(BlockGetter pLevel, BlockPos pPos) { + for(Direction direction : Direction.values()) { + if (this.canCatchFire(pLevel, pPos.relative(direction), direction.getOpposite())) { + return true; + } + } + + return false; + } + + public boolean canCatchFire(BlockGetter world, BlockPos pos, Direction face) { + return world.getBlockState(pos).isFlammable(world, pos, face); + } + @Override protected boolean canBurn(BlockState p_49284_) { return true; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java new file mode 100644 index 000000000..765ba8b24 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java @@ -0,0 +1,32 @@ +package net.nuclearteam.createnuclear.content.equipment.armor; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.nuclearteam.createnuclear.content.contraptions.irradiated.CNModelLayers; +import org.jetbrains.annotations.NotNull; + +public final class AntiRadiationArmorClientExtensions implements IClientItemExtensions { + private AntiRadiationArmorModel model; + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { + if (this.model == null) { + EntityModelSet entityModelSet = Minecraft.getInstance().getEntityModels(); + ModelPart root = entityModelSet.bakeLayer(CNModelLayers.ANTI_IRRADIATION_ARMOR); + this.model = new AntiRadiationArmorModel(root); + } + + // Forge copies the body pose + standard part visibility from `original` onto the + // model after this returns, but it can't tell LEGS from FEET (both make the vanilla + // legs visible) and knows nothing about our custom boot parts. We pass the slot so + // renderToBuffer can show legs for leggings vs. only boots for the FEET slot. + this.model.currentSlot = equipmentSlot; + return this.model; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java index 7a88940b1..6b8238245 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorItem.java @@ -1,316 +1,126 @@ package net.nuclearteam.createnuclear.content.equipment.armor; -import com.tterrag.registrate.util.entry.ItemEntry; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.Util; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; +import net.minecraft.world.level.Level; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; + +import net.nuclearteam.createnuclear.CNAttributes; import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; -import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.foundation.utility.ClothTagHelper; import java.util.*; -import java.util.function.Function; - -@SuppressWarnings("unused") -public class AntiRadiationArmorItem { - - public static final ArmorItem.Type HELMET = ArmorItem.Type.HELMET; - public static final ArmorItem.Type CHESTPLATE = ArmorItem.Type.CHESTPLATE; - public static final ArmorItem.Type LEGGINGS = ArmorItem.Type.LEGGINGS; - public static final ArmorItem.Type BOOTS = ArmorItem.Type.BOOTS; - public static final ArmorMaterial ARMOR_MATERIAL = ArmorMaterials.ANTI_RADIATION_SUIT; - - - public static class Helmet extends ArmorItem { - protected final DyeColor color; - public Helmet(Properties properties, DyeColor color) { - super(ARMOR_MATERIAL, HELMET, properties); - this.color = color; - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { - return String.valueOf(CreateNuclear.asResource("textures/models/armor/"+color+"_anti_radiation_suit_layer_"+(slot == EquipmentSlot.LEGS ? 2 : 1)+".png")); - } - - public static class DyeItemHelmetList implements Iterable> { - private static final int COLOR_AMOUNT = DyeColor.values().length; - - private final ItemEntry[] entry = new ItemEntry[COLOR_AMOUNT]; - - public DyeItemHelmetList(Function> filler) { - for (DyeColor color : DyeColor.values()) { - entry[color.ordinal()] = filler.apply(color); - } - } - - @SuppressWarnings("unchecked") - public ItemEntry get(DyeColor color) { - return (ItemEntry) entry[color.ordinal()]; - } - - public boolean contains(Item block) { - for (ItemEntry entry : entry) { - if (entry.is(block)) return true; - } - return false; - } - - @SuppressWarnings("unchecked") - public ItemEntry[] toArray() { - return (ItemEntry[]) Arrays.copyOf(entry, entry.length); - } - - @Override - public Iterator> iterator() { - return new Iterator<>() { - private int index = 0; - @Override - public boolean hasNext() { - return index < entry.length; - } - - @SuppressWarnings("unchecked") - @Override - public ItemEntry next() { - if (!hasNext()) throw new NoSuchElementException(); - return (ItemEntry) entry[index++]; - } - }; - } - } +import java.util.function.Consumer; - public static TagKey getHelmetTag(String key) { - return key.equals("white") - ? CNItemTags.ANTI_RADIATION_ARMOR.tag - : CNItemTags.ANTI_RADIATION_HELMET_DYE.tag; - } +public abstract class AntiRadiationArmorItem extends ArmorItem { + public static final double RADIATION_VALUE = 0.25; + protected final DyeColor color; + public AntiRadiationArmorItem(ArmorMaterials materials, Type type, Properties properties, DyeColor color) { + super(materials, type, properties); + this.color = color; + } + private static final EnumMap ARMOR_MODIFIER_UUID_PER_TYPE = Util.make(new EnumMap<>(ArmorItem.Type.class), (p_266744_) -> { + p_266744_.put(ArmorItem.Type.BOOTS, UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B")); + p_266744_.put(ArmorItem.Type.LEGGINGS, UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D")); + p_266744_.put(ArmorItem.Type.CHESTPLATE, UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E")); + p_266744_.put(ArmorItem.Type.HELMET, UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")); + }); + + private static Multimap irradiatedArmorAttribute(Multimap map, ArmorItem.Type type) { + UUID uuid = ARMOR_MODIFIER_UUID_PER_TYPE.get(type); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.putAll(map); + // Use ADDITION so pieces add up to a resistance fraction (e.g. 0.25 per piece -> full set = 1.0) + builder.put(CNAttributes.IRRADIATED_RESISTANCE.get(), new AttributeModifier(uuid, "Armor Resistance Irradiation", RADIATION_VALUE, AttributeModifier.Operation.ADDITION)); + + return builder.build(); } - public static class Chestplate extends ArmorItem { - protected final DyeColor color; + // Tells the game where to find the armor's PNG texture + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { + return ClothTagHelper.getArmorTexturePath(stack, "anti_radiation_suit.png"); + } - public Chestplate(Properties properties, DyeColor color) { - super(ARMOR_MATERIAL, CHESTPLATE, properties); - this.color = color; + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new AntiRadiationArmorClientExtensions()); + } + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + super.inventoryTick(stack, level, entity, slotId, isSelected); + if (level.isClientSide || !(entity instanceof Player player)) return; + if (!stack.hasTag() || !stack.getTag().contains(ClothTagHelper.COLOR)) return; + if (CNAdvancement.DYE_ANTI_RADIATION_ARMOR.isAlreadyAwardedTo(player)) return; + CNAdvancement.DYE_ANTI_RADIATION_ARMOR.awardTo(player); + } + + public static class Helmet extends AntiRadiationArmorItem implements IGoggleHelmet { + public Helmet(Properties p, DyeColor color) { + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.HELMET, p, color); } @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { - return String.valueOf(CreateNuclear.asResource("textures/models/armor/"+color+"_anti_radiation_suit_layer_"+(slot == EquipmentSlot.LEGS ? 2 : 1)+".png")); - } - - public static class DyeItemChestplateList implements Iterable> { - private static final int COLOR_AMOUNT = DyeColor.values().length; - - private final ItemEntry[] entry = new ItemEntry[COLOR_AMOUNT]; - - public DyeItemChestplateList(Function> filler) { - for (DyeColor color : DyeColor.values()) { - entry[color.ordinal()] = filler.apply(color); - } - } - - @SuppressWarnings("unchecked") - public ItemEntry get(DyeColor color) { - return (ItemEntry) entry[color.ordinal()]; - } - - public boolean contains(Item block) { - for (ItemEntry entry : entry) { - if (entry.is(block)) return true; - } - return false; - } - - @SuppressWarnings("unchecked") - public ItemEntry[] toArray() { - return (ItemEntry[]) Arrays.copyOf(entry, entry.length); - } - - @Override - public Iterator> iterator() { - return new Iterator<>() { - private int index = 0; - @Override - public boolean hasNext() { - return index < entry.length; - } - - @SuppressWarnings("unchecked") - @Override - public ItemEntry next() { - if (!hasNext()) throw new NoSuchElementException(); - return (ItemEntry) entry[index++]; - } - }; - } - } - - public static TagKey getChestplateTag(String key) { - return key.equals("white") - ? CNItemTags.ANTI_RADIATION_ARMOR.tag - : CNItemTags.ANTI_RADIATION_CHESTPLATE_DYE.tag; + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + if (slot != this.getType().getSlot()) return super.getDefaultAttributeModifiers(slot); + Multimap map = super.getDefaultAttributeModifiers(slot); + return AntiRadiationArmorItem.irradiatedArmorAttribute(map, Type.HELMET); } } - public static class Leggings extends ArmorItem { - protected final DyeColor color; - - public Leggings(Properties properties, DyeColor color) { - super(ARMOR_MATERIAL, LEGGINGS, properties); - this.color = color; - + public static class Chestplate extends AntiRadiationArmorItem { + public Chestplate(Properties p, DyeColor color) { + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.CHESTPLATE, p, color); } @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { - return String.valueOf(CreateNuclear.asResource("textures/models/armor/"+color+"_anti_radiation_suit_layer_"+(slot == EquipmentSlot.LEGS ? 2 : 1)+".png")); - } - - public static class DyeItemLeggingsList implements Iterable> { - private static final int COLOR_AMOUNT = DyeColor.values().length; - - private final ItemEntry[] entry = new ItemEntry[COLOR_AMOUNT]; - - public DyeItemLeggingsList(Function> filler) { - for (DyeColor color : DyeColor.values()) { - entry[color.ordinal()] = filler.apply(color); - } - } - - @SuppressWarnings("unchecked") - public ItemEntry get(DyeColor color) { - return (ItemEntry) entry[color.ordinal()]; - } - - public boolean contains(Item block) { - for (ItemEntry entry : entry) { - if (entry.is(block)) return true; - } - return false; - } - - @SuppressWarnings("unchecked") - public ItemEntry[] toArray() { - return (ItemEntry[]) Arrays.copyOf(entry, entry.length); - } - - @Override - public Iterator> iterator() { - return new Iterator<>() { - private int index = 0; - @Override - public boolean hasNext() { - return index < entry.length; - } - - @SuppressWarnings("unchecked") - @Override - public ItemEntry next() { - if (!hasNext()) throw new NoSuchElementException(); - return (ItemEntry) entry[index++]; - } - }; - } - } - - public static TagKey getLeggingsTag(String key) { - return key.equals("white") - ? CNItemTags.ANTI_RADIATION_ARMOR.tag - : CNItemTags.ANTI_RADIATION_LEGGINGS_DYE.tag; + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + if (slot != this.getType().getSlot()) return super.getDefaultAttributeModifiers(slot); + Multimap map = super.getDefaultAttributeModifiers(slot); + return AntiRadiationArmorItem.irradiatedArmorAttribute(map, Type.CHESTPLATE); } } - public static class Boot extends ArmorItem { - public Boot(Properties properties) { - super(ARMOR_MATERIAL, BOOTS, properties); + public static class Leggings extends AntiRadiationArmorItem { + public Leggings(Properties p, DyeColor color) { + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.LEGGINGS, p, color); } @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { - return String.valueOf(CreateNuclear.asResource("textures/models/armor/white_anti_radiation_suit_layer_1.png")); - + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + if (slot != this.getType().getSlot()) return super.getDefaultAttributeModifiers(slot); + Multimap map = super.getDefaultAttributeModifiers(slot); + return AntiRadiationArmorItem.irradiatedArmorAttribute(map, Type.LEGGINGS); } } - public enum Armor { - WHITE_ARMOR(DyeColor.WHITE), - YELLOW_ARMOR(DyeColor.YELLOW), - RED_ARMOR(DyeColor.RED), - BLUE_ARMOR(DyeColor.BLUE), - GREEN_ARMOR(DyeColor.GREEN), - BLACK_ARMOR(DyeColor.BLACK), - ORANGE_ARMOR(DyeColor.ORANGE), - PURPLE_ARMOR(DyeColor.PURPLE), - BROWN_ARMOR(DyeColor.BROWN), - PINK_ARMOR(DyeColor.PINK), - CYAN_ARMOR(DyeColor.CYAN), - LIGHT_GRAY_ARMOR(DyeColor.LIGHT_GRAY), - GRAY_ARMOR(DyeColor.GRAY), - LIGHT_BLUE_ARMOR(DyeColor.LIGHT_BLUE), - LIME_ARMOR(DyeColor.LIME), - MAGENTA_ARMOR(DyeColor.MAGENTA); - - private static final Map> helmetMap = new EnumMap<>(DyeColor.class); - private static final Map> chestplateMap = new EnumMap<>(DyeColor.class); - private static final Map> leggingsMap = new EnumMap<>(DyeColor.class); - - static { - for (DyeColor color : DyeColor.values()) { - helmetMap.put(color, CNItems.ANTI_RADIATION_HELMETS.get(color)); - chestplateMap.put(color, CNItems.ANTI_RADIATION_CHESTPLATES.get(color)); - leggingsMap.put(color, CNItems.ANTI_RADIATION_LEGGINGS.get(color)); - } - } - - private final DyeColor color; - - Armor(DyeColor dyeColor) { - this.color = dyeColor; + public static class Boot extends AntiRadiationArmorItem { + public Boot(Properties p, DyeColor color) { + super(ArmorMaterials.ANTI_RADIATION_SUIT, Type.BOOTS, p, color); } - public ItemEntry getHelmetItem() { - return helmetMap.get(this.color); - } - - public static ItemEntry getHelmetByColor(DyeColor color) { - return helmetMap.get(color); - } - - public ItemEntry getChestplateItem() { - return chestplateMap.get(this.color); - } - - public static ItemEntry getChestplateByColor(DyeColor color) { - return chestplateMap.get(color); - } - - public ItemEntry getLeggingsItem() { - return leggingsMap.get(this.color); - } - - public static ItemEntry getLeggingsByColor(DyeColor color) { - return leggingsMap.get(color); - } - - public static boolean isArmored(ItemStack item) { - return helmetMap.values().stream().anyMatch(entry -> entry.is(item.getItem())) || - chestplateMap.values().stream().anyMatch(entry -> entry.is(item.getItem())) || - leggingsMap.values().stream().anyMatch(entry -> entry.is(item.getItem())); + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + if (slot != this.getType().getSlot()) return super.getDefaultAttributeModifiers(slot); + Multimap map = super.getDefaultAttributeModifiers(slot); + return AntiRadiationArmorItem.irradiatedArmorAttribute(map, Type.BOOTS); } + } - public static boolean isArmored2(ItemStack item) { - return CNItems.ANTI_RADIATION_HELMETS.contains(item.getItem()) - || CNItems.ANTI_RADIATION_CHESTPLATES.contains(item.getItem()) - || CNItems.ANTI_RADIATION_LEGGINGS.contains(item.getItem()) - || CNItems.ANTI_RADIATION_BOOTS.is(item.getItem()) - ; + public interface IGoggleHelmet { + static boolean isGoggleHelmet(LivingEntity entity) { + ItemStack headSlot = entity.getItemBySlot(EquipmentSlot.HEAD); + return CNItems.ANTI_RADIATION_HELMETS.isIn(headSlot); } } - -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorModel.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorModel.java new file mode 100644 index 000000000..7fa8caa82 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorModel.java @@ -0,0 +1,99 @@ +package net.nuclearteam.createnuclear.content.equipment.armor; + + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; + +public class AntiRadiationArmorModel extends HumanoidModel { + private final ModelPart head; + private final ModelPart body; + private final ModelPart right_arm; + private final ModelPart left_arm; + private final ModelPart right_leg; + private final ModelPart left_leg; + private final ModelPart left_boot; + private final ModelPart right_boot; + + // Set per render pass by AntiRadiationArmorClientExtensions so renderToBuffer can show + // the legs for LEGS (leggings) but only the boots for FEET (boots) — Forge makes the + // vanilla leg parts visible for BOTH slots, so we disambiguate here. + public EquipmentSlot currentSlot = EquipmentSlot.HEAD; + + public AntiRadiationArmorModel(ModelPart root) { + super(root); + this.head = root.getChild("head"); + this.body = root.getChild("body"); + this.right_arm = root.getChild("right_arm"); + this.left_arm = root.getChild("left_arm"); + this.right_leg = root.getChild("right_leg"); + this.left_leg = root.getChild("left_leg"); + this.left_boot = root.getChild("left_boot"); + this.right_boot = root.getChild("right_boot"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + // HumanoidModel's constructor requires a "hat" child; keep it empty. + partdefinition.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(30, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.2F)) + .texOffs(30, 16).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 19).addBox(-3.7F, 0.0F, -2.8F, 8.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-4.4F, -1.0F, -3.1F, 9.0F, 13.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(0, 36).addBox(-4.0F, 0.0F, -2.7F, 8.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(-4.5F, -1.0F, -3.0F, 9.0F, 13.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition right_arm = partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(45, 32).mirror().addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.45F)).mirror(false) + .texOffs(29, 32).mirror().addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.55F)).mirror(false), PartPose.offset(-5.0F, 2.0F, 0.0F)); + + PartDefinition left_arm = partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(45, 32).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)) + .texOffs(29, 32).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(5.0F, 2.0F, 0.0F)); + + PartDefinition right_leg = partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(29, 48).mirror().addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false) + .texOffs(45, 48).mirror().addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)).mirror(false), PartPose.offset(1.9F, 12.0F, 0.0F)); + + PartDefinition left_leg = partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(29, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(45, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(-1.9F, 12.0F, 0.0F)); + + partdefinition.addOrReplaceChild("left_boot", CubeListBuilder.create().texOffs(61, 39).addBox(-2.0F, 8.3F, -2.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(-1.9F, 12.0F, 0.0F)); + + partdefinition.addOrReplaceChild("right_boot", CubeListBuilder.create().texOffs(61, 39).mirror().addBox(-2.0F, 8.3F, -2.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.25F)).mirror(false), PartPose.offset(1.9F, 12.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 96, 96); + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + // Make the boots follow the (already animated) legs. + this.right_boot.copyFrom(this.right_leg); + this.left_boot.copyFrom(this.left_leg); + + // Control part visibility based on the slot being rendered + this.head.visible = this.currentSlot == EquipmentSlot.HEAD; + this.body.visible = this.currentSlot == EquipmentSlot.CHEST; + this.right_arm.visible = this.currentSlot == EquipmentSlot.CHEST; + this.left_arm.visible = this.currentSlot == EquipmentSlot.CHEST; + this.right_leg.visible = this.currentSlot == EquipmentSlot.LEGS; + this.left_leg.visible = this.currentSlot == EquipmentSlot.LEGS; + this.right_boot.visible = this.currentSlot == EquipmentSlot.FEET; + this.left_boot.visible = this.currentSlot == EquipmentSlot.FEET; + + if (this.head.visible) head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.body.visible) body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.right_arm.visible) right_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.left_arm.visible) left_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.right_leg.visible) right_leg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.left_leg.visible) left_leg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.right_boot.visible) right_boot.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + if (this.left_boot.visible) left_boot.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/equipment/cloth/ClothItem.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/cloth/ClothItem.java index 6d6856828..2cef1a8c4 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/cloth/ClothItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/cloth/ClothItem.java @@ -6,7 +6,6 @@ import net.nuclearteam.createnuclear.CNItems; import java.util.*; -import java.util.function.Function; @SuppressWarnings("unused") public class ClothItem extends Item { @@ -18,6 +17,10 @@ public ClothItem(Item.Properties properties, DyeColor color) { this.color = color; } + public DyeColor getColor() { + return color; + } + public enum Cloths { WHITE_CLOTH(DyeColor.WHITE), YELLOW_CLOTH(DyeColor.YELLOW), @@ -54,6 +57,10 @@ public ItemEntry getItem() { return clothMap.get(this.color); } + public DyeColor getColor() { + return color; + } + public static ItemEntry getByColor(DyeColor color) { return clothMap.get(color); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java new file mode 100644 index 000000000..81ca034a1 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java @@ -0,0 +1,32 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public abstract class CNAdvancedEntityModel extends CNBasicEntityModel { + private float movementScale = 1.0F; + public int texWidth = 32; + public int texHeight = 32; + + public void updateDefaultPose() { + this.getAllParts().forEach(CNAdvancedModelBox::updateDefaultPose); + } + + public void resetToDefaultPose() { + this.getAllParts().forEach(CNAdvancedModelBox::resetToDefaultPose); + } + + public float getMovementScale() { + return this.movementScale; + } + + public void setRotateAngle(CNAdvancedModelBox model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public abstract Iterable getAllParts(); +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedModelBox.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedModelBox.java new file mode 100644 index 000000000..06bf89c0c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedModelBox.java @@ -0,0 +1,208 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import it.unimi.dsi.fastutil.objects.ObjectListIterator; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; + +@OnlyIn(Dist.CLIENT) +public class CNAdvancedModelBox extends CNBasicModelPart { + public float defaultRotationX; + public float defaultRotationY; + public float defaultRotationZ; + public float defaultPositionX; + public float defaultPositionY; + public float defaultPositionZ; + public float scaleX; + public float scaleY; + public float scaleZ; + public int textureOffsetX; + public int textureOffsetY; + public boolean scaleChildren; + private CNAdvancedEntityModel model; + private CNAdvancedModelBox parent; + public ObjectList cubeList; + public ObjectList childModels; + private float textureWidth; + private float textureHeight; + public String boxName; + + public CNAdvancedModelBox(CNAdvancedEntityModel model, String name) { + super(model); + this.scaleX = 1.0F; + this.scaleY = 1.0F; + this.scaleZ = 1.0F; + this.boxName = ""; + this.textureWidth = (float)model.texWidth; + this.textureHeight = (float)model.texHeight; + this.model = model; + this.cubeList = new ObjectArrayList(); + this.childModels = new ObjectArrayList(); + this.boxName = name; + } + + public CNAdvancedModelBox(CNAdvancedEntityModel model) { + this(model, null); + this.textureWidth = (float)model.texWidth; + this.textureHeight = (float)model.texHeight; + this.cubeList = new ObjectArrayList(); + this.childModels = new ObjectArrayList(); + } + + public CNBasicModelPart addBox(String p_217178_1_, float p_217178_2_, float p_217178_3_, float p_217178_4_, int p_217178_5_, int p_217178_6_, int p_217178_7_, float p_217178_8_, int p_217178_9_, int p_217178_10_) { + this.setTextureOffset(p_217178_9_, p_217178_10_); + this.addBox(this.textureOffsetX, this.textureOffsetY, p_217178_2_, p_217178_3_, p_217178_4_, (float)p_217178_5_, (float)p_217178_6_, (float)p_217178_7_, p_217178_8_, p_217178_8_, p_217178_8_, this.mirror, false); + return this; + } + + public CNBasicModelPart addBox(float p_228300_1_, float p_228300_2_, float p_228300_3_, float p_228300_4_, float p_228300_5_, float p_228300_6_) { + this.addBox(this.textureOffsetX, this.textureOffsetY, p_228300_1_, p_228300_2_, p_228300_3_, p_228300_4_, p_228300_5_, p_228300_6_, 0.0F, 0.0F, 0.0F, this.mirror, false); + return this; + } + + public CNBasicModelPart addBox(float p_228304_1_, float p_228304_2_, float p_228304_3_, float p_228304_4_, float p_228304_5_, float p_228304_6_, boolean p_228304_7_) { + this.addBox(this.textureOffsetX, this.textureOffsetY, p_228304_1_, p_228304_2_, p_228304_3_, p_228304_4_, p_228304_5_, p_228304_6_, 0.0F, 0.0F, 0.0F, p_228304_7_, false); + return this; + } + + public void addBox(float p_228301_1_, float p_228301_2_, float p_228301_3_, float p_228301_4_, float p_228301_5_, float p_228301_6_, float p_228301_7_) { + this.addBox(this.textureOffsetX, this.textureOffsetY, p_228301_1_, p_228301_2_, p_228301_3_, p_228301_4_, p_228301_5_, p_228301_6_, p_228301_7_, p_228301_7_, p_228301_7_, this.mirror, false); + } + + public void addBox(float p_228302_1_, float p_228302_2_, float p_228302_3_, float p_228302_4_, float p_228302_5_, float p_228302_6_, float p_228302_7_, float p_228302_8_, float p_228302_9_) { + this.addBox(this.textureOffsetX, this.textureOffsetY, p_228302_1_, p_228302_2_, p_228302_3_, p_228302_4_, p_228302_5_, p_228302_6_, p_228302_7_, p_228302_8_, p_228302_9_, this.mirror, false); + } + + public void addBox(float p_228303_1_, float p_228303_2_, float p_228303_3_, float p_228303_4_, float p_228303_5_, float p_228303_6_, float p_228303_7_, boolean p_228303_8_) { + this.addBox(this.textureOffsetX, this.textureOffsetY, p_228303_1_, p_228303_2_, p_228303_3_, p_228303_4_, p_228303_5_, p_228303_6_, p_228303_7_, p_228303_7_, p_228303_7_, p_228303_8_, false); + } + + private void addBox(int p_228305_1_, int p_228305_2_, float p_228305_3_, float p_228305_4_, float p_228305_5_, float p_228305_6_, float p_228305_7_, float p_228305_8_, float p_228305_9_, float p_228305_10_, float p_228305_11_, boolean p_228305_12_, boolean p_228305_13_) { + this.cubeList.add(new CNTabulaModelRenderUtils.ModelBox(p_228305_1_, p_228305_2_, p_228305_3_, p_228305_4_, p_228305_5_, p_228305_6_, p_228305_7_, p_228305_8_, p_228305_9_, p_228305_10_, p_228305_11_, p_228305_12_, this.textureWidth, this.textureHeight)); + } + + public void setScale(float scaleX, float scaleY, float scaleZ) { + this.scaleX = scaleX; + this.scaleY = scaleY; + this.scaleZ = scaleZ; + } + + public void updateDefaultPose() { + this.defaultRotationX = this.rotateAngleX; + this.defaultRotationY = this.rotateAngleY; + this.defaultRotationZ = this.rotateAngleZ; + this.defaultPositionX = this.rotationPointX; + this.defaultPositionY = this.rotationPointY; + this.defaultPositionZ = this.rotationPointZ; + } + + public void resetToDefaultPose() { + this.rotateAngleX = this.defaultRotationX; + this.rotateAngleY = this.defaultRotationY; + this.rotateAngleZ = this.defaultRotationZ; + this.rotationPointX = this.defaultPositionX; + this.rotationPointY = this.defaultPositionY; + this.rotationPointZ = this.defaultPositionZ; + } + + public void addChild(CNBasicModelPart child) { + super.addChild(child); + this.childModels.add(child); + if (child instanceof CNAdvancedModelBox advancedChild) { + advancedChild.setParent(this); + } + } + + public CNAdvancedModelBox getParent() { + return this.parent; + } + + public void setParent(CNAdvancedModelBox parent) { + this.parent = parent; + } + + public void translateAndRotate(PoseStack matrixStackIn) { + matrixStackIn.translate(this.rotationPointX / 16.0F, this.rotationPointY / 16.0F, (double)(this.rotationPointZ / 16.0F)); + if (this.rotateAngleZ != 0.0F) { + matrixStackIn.mulPose(Axis.ZP.rotation(this.rotateAngleZ)); + } + + if (this.rotateAngleY != 0.0F) { + matrixStackIn.mulPose(Axis.YP.rotation(this.rotateAngleY)); + } + + if (this.rotateAngleX != 0.0F) { + matrixStackIn.mulPose(Axis.XP.rotation(this.rotateAngleX)); + } + + matrixStackIn.scale(this.scaleX, this.scaleY, this.scaleZ); + } + + public void render(PoseStack p_228309_1_, VertexConsumer p_228309_2_, int p_228309_3_, int p_228309_4_, float p_228309_5_, float p_228309_6_, float p_228309_7_, float p_228309_8_) { + if (this.showModel && (!this.cubeList.isEmpty() || !this.childModels.isEmpty())) { + p_228309_1_.pushPose(); + this.translateAndRotate(p_228309_1_); + this.doRender(p_228309_1_.last(), p_228309_2_, p_228309_3_, p_228309_4_, p_228309_5_, p_228309_6_, p_228309_7_, p_228309_8_); + ObjectListIterator var9 = this.childModels.iterator(); + if (!this.scaleChildren) { + p_228309_1_.scale(1.0F / Math.max(this.scaleX, 1.0E-4F), 1.0F / Math.max(this.scaleY, 1.0E-4F), 1.0F / Math.max(this.scaleZ, 1.0E-4F)); + } + + while(var9.hasNext()) { + CNBasicModelPart lvt_10_1_ = (CNBasicModelPart)var9.next(); + lvt_10_1_.render(p_228309_1_, p_228309_2_, p_228309_3_, p_228309_4_, p_228309_5_, p_228309_6_, p_228309_7_, p_228309_8_); + } + + p_228309_1_.popPose(); + } + + } + + private void doRender(PoseStack.Pose p_228306_1_, VertexConsumer p_228306_2_, int p_228306_3_, int p_228306_4_, float p_228306_5_, float p_228306_6_, float p_228306_7_, float p_228306_8_) { + Matrix4f lvt_9_1_ = p_228306_1_.pose(); + Matrix3f lvt_10_1_ = p_228306_1_.normal(); + ObjectListIterator var11 = this.cubeList.iterator(); + + while(var11.hasNext()) { + CNTabulaModelRenderUtils.ModelBox lvt_12_1_ = (CNTabulaModelRenderUtils.ModelBox)var11.next(); + + for(CNTabulaModelRenderUtils.TexturedQuad lvt_16_1_ : lvt_12_1_.quads) { + Vector3f lvt_17_1_ = new Vector3f(lvt_16_1_.normal); + lvt_17_1_.mul(lvt_10_1_); + float lvt_18_1_ = lvt_17_1_.x(); + float lvt_19_1_ = lvt_17_1_.y(); + float lvt_20_1_ = lvt_17_1_.z(); + + for(int lvt_21_1_ = 0; lvt_21_1_ < 4; ++lvt_21_1_) { + CNTabulaModelRenderUtils.PositionTextureVertex lvt_22_1_ = lvt_16_1_.vertexPositions[lvt_21_1_]; + float lvt_23_1_ = lvt_22_1_.position.x() / 16.0F; + float lvt_24_1_ = lvt_22_1_.position.y() / 16.0F; + float lvt_25_1_ = lvt_22_1_.position.z() / 16.0F; + Vector4f lvt_26_1_ = new Vector4f(lvt_23_1_, lvt_24_1_, lvt_25_1_, 1.0F); + lvt_26_1_.mul(lvt_9_1_); + p_228306_2_.vertex(lvt_26_1_.x(), lvt_26_1_.y(), lvt_26_1_.z(), p_228306_5_, p_228306_6_, p_228306_7_, p_228306_8_, lvt_22_1_.textureU, lvt_22_1_.textureV, p_228306_4_, p_228306_3_, lvt_18_1_, lvt_19_1_, lvt_20_1_); + } + } + } + + } + + public CNAdvancedEntityModel getModel() { + return this.model; + } + + public CNAdvancedModelBox setTextureOffset(int textureOffsetX, int textureOffsetY) { + this.textureOffsetX = textureOffsetX; + this.textureOffsetY = textureOffsetY; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicEntityModel.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicEntityModel.java new file mode 100644 index 000000000..57fc33c1a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicEntityModel.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import java.util.function.Function; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; + +public abstract class CNBasicEntityModel extends EntityModel { + public int textureWidth; + public int textureHeight; + + protected CNBasicEntityModel() { + this(RenderType::entityCutoutNoCull); + } + + protected CNBasicEntityModel(Function p_102613_) { + super(p_102613_); + this.textureWidth = 64; + this.textureHeight = 32; + } + + public void renderToBuffer(PoseStack p_103013_, VertexConsumer p_103014_, int p_103015_, int p_103016_, float p_103017_, float p_103018_, float p_103019_, float p_103020_) { + this.parts().forEach((p_103030_) -> p_103030_.render(p_103013_, p_103014_, p_103015_, p_103016_, p_103017_, p_103018_, p_103019_, p_103020_)); + } + + public abstract Iterable parts(); + + public abstract void setupAnim(T var1, float var2, float var3, float var4, float var5, float var6); + + public void prepareMobModel(T p_102614_, float p_102615_, float p_102616_, float p_102617_) { + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicModelPart.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicModelPart.java new file mode 100644 index 000000000..29a5b3c2d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNBasicModelPart.java @@ -0,0 +1,315 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import it.unimi.dsi.fastutil.objects.ObjectListIterator; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; + +@OnlyIn(Dist.CLIENT) +public class CNBasicModelPart { + public float textureWidth; + public float textureHeight; + public int textureOffsetX; + public int textureOffsetY; + public float rotationPointX; + public float rotationPointY; + public float rotationPointZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + public boolean mirror; + public boolean showModel; + private final ObjectList cubeList; + private final ObjectList childModels; + + public CNBasicModelPart(CNBasicEntityModel model) { + this.textureWidth = 64.0F; + this.textureHeight = 32.0F; + this.showModel = true; + this.cubeList = new ObjectArrayList(); + this.childModels = new ObjectArrayList(); + this.setTextureSize(model.textureWidth, model.textureHeight); + } + + public CNBasicModelPart(CNBasicEntityModel model, int texOffX, int texOffY) { + this(model.textureWidth, model.textureHeight, texOffX, texOffY); + } + + public CNBasicModelPart(int textureWidthIn, int textureHeightIn, int textureOffsetXIn, int textureOffsetYIn) { + this.textureWidth = 64.0F; + this.textureHeight = 32.0F; + this.showModel = true; + this.cubeList = new ObjectArrayList(); + this.childModels = new ObjectArrayList(); + this.setTextureSize(textureWidthIn, textureHeightIn); + this.setTextureOffset(textureOffsetXIn, textureOffsetYIn); + } + + private CNBasicModelPart() { + this.textureWidth = 64.0F; + this.textureHeight = 32.0F; + this.showModel = true; + this.cubeList = new ObjectArrayList(); + this.childModels = new ObjectArrayList(); + } + + public CNBasicModelPart getModelAngleCopy() { + CNBasicModelPart CNBasicModelPart = new CNBasicModelPart(); + CNBasicModelPart.copyModelAngles(this); + return CNBasicModelPart; + } + + public void copyModelAngles(CNBasicModelPart CNBasicModelPartIn) { + this.rotateAngleX = CNBasicModelPartIn.rotateAngleX; + this.rotateAngleY = CNBasicModelPartIn.rotateAngleY; + this.rotateAngleZ = CNBasicModelPartIn.rotateAngleZ; + this.rotationPointX = CNBasicModelPartIn.rotationPointX; + this.rotationPointY = CNBasicModelPartIn.rotationPointY; + this.rotationPointZ = CNBasicModelPartIn.rotationPointZ; + } + + public void addChild(CNBasicModelPart renderer) { + this.childModels.add(renderer); + } + + public CNBasicModelPart setTextureOffset(int x, int y) { + this.textureOffsetX = x; + this.textureOffsetY = y; + return this; + } + + public CNBasicModelPart addBox(String partName, float x, float y, float z, int width, int height, int depth, float delta, int texX, int texY) { + this.setTextureOffset(texX, texY); + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, (float)width, (float)height, (float)depth, delta, delta, delta, this.mirror, false); + return this; + } + + public CNBasicModelPart addBox(float x, float y, float z, float width, float height, float depth) { + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, 0.0F, 0.0F, 0.0F, this.mirror, false); + return this; + } + + public CNBasicModelPart addBox(float x, float y, float z, float width, float height, float depth, boolean mirrorIn) { + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, 0.0F, 0.0F, 0.0F, mirrorIn, false); + return this; + } + + public void addBox(float x, float y, float z, float width, float height, float depth, float delta) { + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, delta, delta, delta, this.mirror, false); + } + + public void addBox(float x, float y, float z, float width, float height, float depth, float deltaX, float deltaY, float deltaZ) { + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, deltaX, deltaY, deltaZ, this.mirror, false); + } + + public void addBox(float x, float y, float z, float width, float height, float depth, float delta, boolean mirrorIn) { + this.addBox(this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, delta, delta, delta, mirrorIn, false); + } + + private void addBox(int texOffX, int texOffY, float x, float y, float z, float width, float height, float depth, float deltaX, float deltaY, float deltaZ, boolean mirorIn, boolean p_228305_13_) { + this.cubeList.add(new CNBasicModelPart.ModelBox(texOffX, texOffY, x, y, z, width, height, depth, deltaX, deltaY, deltaZ, mirorIn, this.textureWidth, this.textureHeight)); + } + + public void setRotationPoint(float rotationPointXIn, float rotationPointYIn, float rotationPointZIn) { + this.rotationPointX = rotationPointXIn; + this.rotationPointY = rotationPointYIn; + this.rotationPointZ = rotationPointZIn; + } + + public void render(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn) { + this.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, 1.0F, 1.0F, 1.0F, 1.0F); + } + + public void render(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { + if (this.showModel && (!this.cubeList.isEmpty() || !this.childModels.isEmpty())) { + matrixStackIn.pushPose(); + this.translateRotate(matrixStackIn); + this.doRender(matrixStackIn.last(), bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); + ObjectListIterator var9 = this.childModels.iterator(); + + while(var9.hasNext()) { + CNBasicModelPart CNBasicModelPart = (CNBasicModelPart)var9.next(); + CNBasicModelPart.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); + } + + matrixStackIn.popPose(); + } + + } + + public void translateRotate(PoseStack matrixStackIn) { + matrixStackIn.translate((double)(this.rotationPointX / 16.0F), (double)(this.rotationPointY / 16.0F), (double)(this.rotationPointZ / 16.0F)); + if (this.rotateAngleZ != 0.0F) { + matrixStackIn.mulPose(Axis.ZP.rotation(this.rotateAngleZ)); + } + + if (this.rotateAngleY != 0.0F) { + matrixStackIn.mulPose(Axis.YP.rotation(this.rotateAngleY)); + } + + if (this.rotateAngleX != 0.0F) { + matrixStackIn.mulPose(Axis.XP.rotation(this.rotateAngleX)); + } + + } + + private void doRender(PoseStack.Pose matrixEntryIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { + Matrix4f matrix4f = matrixEntryIn.pose(); + Matrix3f matrix3f = matrixEntryIn.normal(); + ObjectListIterator var11 = this.cubeList.iterator(); + + while(var11.hasNext()) { + CNBasicModelPart.ModelBox CNBasicModelPart$modelbox = (CNBasicModelPart.ModelBox)var11.next(); + + for(CNBasicModelPart.TexturedQuad CNBasicModelPart$texturedquad : CNBasicModelPart$modelbox.quads) { + Vector3f vector3f = new Vector3f(CNBasicModelPart$texturedquad.normal); + vector3f.mul(matrix3f); + float f = vector3f.x(); + float f1 = vector3f.y(); + float f2 = vector3f.z(); + + for(int i = 0; i < 4; ++i) { + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex = CNBasicModelPart$texturedquad.vertexPositions[i]; + float f3 = CNBasicModelPart$positiontexturevertex.position.x() / 16.0F; + float f4 = CNBasicModelPart$positiontexturevertex.position.y() / 16.0F; + float f5 = CNBasicModelPart$positiontexturevertex.position.z() / 16.0F; + Vector4f vector4f = new Vector4f(f3, f4, f5, 1.0F); + vector4f.mul(matrix4f); + bufferIn.vertex(vector4f.x(), vector4f.y(), vector4f.z(), red, green, blue, alpha, CNBasicModelPart$positiontexturevertex.textureU, CNBasicModelPart$positiontexturevertex.textureV, packedOverlayIn, packedLightIn, f, f1, f2); + } + } + } + + } + + public CNBasicModelPart setTextureSize(int textureWidthIn, int textureHeightIn) { + this.textureWidth = (float)textureWidthIn; + this.textureHeight = (float)textureHeightIn; + return this; + } + + public CNBasicModelPart.ModelBox getRandomCube(RandomSource randomIn) { + return this.cubeList.size() > 0 ? (CNBasicModelPart.ModelBox)this.cubeList.get(randomIn.nextInt(this.cubeList.size())) : null; + } + + @OnlyIn(Dist.CLIENT) + public static class ModelBox { + private final CNBasicModelPart.TexturedQuad[] quads; + public final float posX1; + public final float posY1; + public final float posZ1; + public final float posX2; + public final float posY2; + public final float posZ2; + + public ModelBox(int texOffX, int texOffY, float x, float y, float z, float width, float height, float depth, float deltaX, float deltaY, float deltaZ, boolean mirorIn, float texWidth, float texHeight) { + this.posX1 = x; + this.posY1 = y; + this.posZ1 = z; + this.posX2 = x + width; + this.posY2 = y + height; + this.posZ2 = z + depth; + this.quads = new CNBasicModelPart.TexturedQuad[6]; + float f = x + width; + float f1 = y + height; + float f2 = z + depth; + x -= deltaX; + y -= deltaY; + z -= deltaZ; + f += deltaX; + f1 += deltaY; + f2 += deltaZ; + if (mirorIn) { + float f3 = f; + f = x; + x = f3; + } + + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex7 = new CNBasicModelPart.PositionTextureVertex(x, y, z, 0.0F, 0.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex = new CNBasicModelPart.PositionTextureVertex(f, y, z, 0.0F, 8.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex1 = new CNBasicModelPart.PositionTextureVertex(f, f1, z, 8.0F, 8.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex2 = new CNBasicModelPart.PositionTextureVertex(x, f1, z, 8.0F, 0.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex3 = new CNBasicModelPart.PositionTextureVertex(x, y, f2, 0.0F, 0.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex4 = new CNBasicModelPart.PositionTextureVertex(f, y, f2, 0.0F, 8.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex5 = new CNBasicModelPart.PositionTextureVertex(f, f1, f2, 8.0F, 8.0F); + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex6 = new CNBasicModelPart.PositionTextureVertex(x, f1, f2, 8.0F, 0.0F); + float f4 = (float)texOffX; + float f5 = (float)texOffX + depth; + float f6 = (float)texOffX + depth + width; + float f7 = (float)texOffX + depth + width + width; + float f8 = (float)texOffX + depth + width + depth; + float f9 = (float)texOffX + depth + width + depth + width; + float f10 = (float)texOffY; + float f11 = (float)texOffY + depth; + float f12 = (float)texOffY + depth + height; + this.quads[2] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex4, CNBasicModelPart$positiontexturevertex3, CNBasicModelPart$positiontexturevertex7, CNBasicModelPart$positiontexturevertex}, f5, f10, f6, f11, texWidth, texHeight, mirorIn, Direction.DOWN); + this.quads[3] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex1, CNBasicModelPart$positiontexturevertex2, CNBasicModelPart$positiontexturevertex6, CNBasicModelPart$positiontexturevertex5}, f6, f11, f7, f10, texWidth, texHeight, mirorIn, Direction.UP); + this.quads[1] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex7, CNBasicModelPart$positiontexturevertex3, CNBasicModelPart$positiontexturevertex6, CNBasicModelPart$positiontexturevertex2}, f4, f11, f5, f12, texWidth, texHeight, mirorIn, Direction.WEST); + this.quads[4] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex, CNBasicModelPart$positiontexturevertex7, CNBasicModelPart$positiontexturevertex2, CNBasicModelPart$positiontexturevertex1}, f5, f11, f6, f12, texWidth, texHeight, mirorIn, Direction.NORTH); + this.quads[0] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex4, CNBasicModelPart$positiontexturevertex, CNBasicModelPart$positiontexturevertex1, CNBasicModelPart$positiontexturevertex5}, f6, f11, f8, f12, texWidth, texHeight, mirorIn, Direction.EAST); + this.quads[5] = new CNBasicModelPart.TexturedQuad(new CNBasicModelPart.PositionTextureVertex[]{CNBasicModelPart$positiontexturevertex3, CNBasicModelPart$positiontexturevertex4, CNBasicModelPart$positiontexturevertex5, CNBasicModelPart$positiontexturevertex6}, f8, f11, f9, f12, texWidth, texHeight, mirorIn, Direction.SOUTH); + } + } + + @OnlyIn(Dist.CLIENT) + static class PositionTextureVertex { + public final Vector3f position; + public final float textureU; + public final float textureV; + + public PositionTextureVertex(float x, float y, float z, float texU, float texV) { + this(new Vector3f(x, y, z), texU, texV); + } + + public CNBasicModelPart.PositionTextureVertex setTextureUV(float texU, float texV) { + return new CNBasicModelPart.PositionTextureVertex(this.position, texU, texV); + } + + public PositionTextureVertex(Vector3f posIn, float texU, float texV) { + this.position = posIn; + this.textureU = texU; + this.textureV = texV; + } + } + + @OnlyIn(Dist.CLIENT) + static class TexturedQuad { + public final CNBasicModelPart.PositionTextureVertex[] vertexPositions; + public final Vector3f normal; + + public TexturedQuad(CNBasicModelPart.PositionTextureVertex[] positionsIn, float u1, float v1, float u2, float v2, float texWidth, float texHeight, boolean mirrorIn, Direction directionIn) { + this.vertexPositions = positionsIn; + float f = 0.0F / texWidth; + float f1 = 0.0F / texHeight; + positionsIn[0] = positionsIn[0].setTextureUV(u2 / texWidth - f, v1 / texHeight + f1); + positionsIn[1] = positionsIn[1].setTextureUV(u1 / texWidth + f, v1 / texHeight + f1); + positionsIn[2] = positionsIn[2].setTextureUV(u1 / texWidth + f, v2 / texHeight - f1); + positionsIn[3] = positionsIn[3].setTextureUV(u2 / texWidth - f, v2 / texHeight - f1); + if (mirrorIn) { + int i = positionsIn.length; + + for(int j = 0; j < i / 2; ++j) { + CNBasicModelPart.PositionTextureVertex CNBasicModelPart$positiontexturevertex = positionsIn[j]; + positionsIn[j] = positionsIn[i - 1 - j]; + positionsIn[i - 1 - j] = CNBasicModelPart$positiontexturevertex; + } + } + + this.normal = directionIn.step(); + if (mirrorIn) { + this.normal.mul(-1.0F, 1.0F, 1.0F); + } + + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNNuclearExplosionSound.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNNuclearExplosionSound.java new file mode 100644 index 000000000..1e3ed148a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNNuclearExplosionSound.java @@ -0,0 +1,62 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; + +public class CNNuclearExplosionSound extends AbstractTickableSoundInstance { + + /** + * Inflated starting volume, set only so the sound carries across the whole blast radius. + * {@code SoundEngine#play} derives the linear attenuation radius from + * {@code max(volume, 1) * attenuationDistance} once, and never recomputes it, so + * 20 here means ~320 blocks of reach instead of the default 16. + */ + private static final float RANGE_BOOST = 20F; + + private int tickCount = 0; + private final int duration; + private final int fadesAt; + private final float fadeInBy; + + public CNNuclearExplosionSound(SoundEvent soundEvent, double x, double y, double z, int duration, int fadesAt, float fadeInBy, boolean looping) { + super(soundEvent, SoundSource.NEUTRAL, SoundInstance.createUnseededRandom()); + this.attenuation = Attenuation.LINEAR; + this.looping = looping; + this.x = x; + this.y = y; + this.z = z; + this.duration = duration; + this.fadesAt = fadesAt; + this.fadeInBy = fadeInBy; + this.delay = 0; + this.volume = RANGE_BOOST; + } + + public void tick() { + if (tickCount == 0) { + // Queued ticking sounds are played before the tick loop runs (SoundEngine#tickNonPaused), + // so by now the attenuation radius is locked in and RANGE_BOOST has done its job. It has + // to come back down to the [0,1] gain range: SoundEngine#calculateVolume clamps gain to + // 1.0, so any value above 1 makes the fades below inaudible until the very last tick. + volume = 1F; + } + + if(tickCount < this.duration){ + if(tickCount >= fadesAt){ + float shrinkVolumeFor = 1F / Math.max(this.duration - fadesAt, 1F); + volume = Math.max(0, volume - shrinkVolumeFor); + }else if(volume < 1F){ + volume = Math.min(1F, volume + fadeInBy); + } + tickCount++; + }else{ + stop(); + } + } + + public boolean canStartSilent() { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTabulaModelRenderUtils.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTabulaModelRenderUtils.java new file mode 100644 index 000000000..fd88ab92f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTabulaModelRenderUtils.java @@ -0,0 +1,119 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import net.minecraft.core.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Vector3f; + +public class CNTabulaModelRenderUtils { + @OnlyIn(Dist.CLIENT) + static class PositionTextureVertex { + public final Vector3f position; + public final float textureU; + public final float textureV; + + public PositionTextureVertex(float p_i1158_1_, float p_i1158_2_, float p_i1158_3_, float p_i1158_4_, float p_i1158_5_) { + this(new Vector3f(p_i1158_1_, p_i1158_2_, p_i1158_3_), p_i1158_4_, p_i1158_5_); + } + + public PositionTextureVertex setTextureUV(float p_78240_1_, float p_78240_2_) { + return new PositionTextureVertex(this.position, p_78240_1_, p_78240_2_); + } + + public PositionTextureVertex(Vector3f p_i225952_1_, float p_i225952_2_, float p_i225952_3_) { + this.position = p_i225952_1_; + this.textureU = p_i225952_2_; + this.textureV = p_i225952_3_; + } + } + + @OnlyIn(Dist.CLIENT) + static class TexturedQuad { + public final PositionTextureVertex[] vertexPositions; + public final Vector3f normal; + + public TexturedQuad(PositionTextureVertex[] p_i225951_1_, float p_i225951_2_, float p_i225951_3_, float p_i225951_4_, float p_i225951_5_, float p_i225951_6_, float p_i225951_7_, boolean p_i225951_8_, Direction p_i225951_9_) { + this.vertexPositions = p_i225951_1_; + float lvt_10_1_ = 0.0F / p_i225951_6_; + float lvt_11_1_ = 0.0F / p_i225951_7_; + p_i225951_1_[0] = p_i225951_1_[0].setTextureUV(p_i225951_4_ / p_i225951_6_ - lvt_10_1_, p_i225951_3_ / p_i225951_7_ + lvt_11_1_); + p_i225951_1_[1] = p_i225951_1_[1].setTextureUV(p_i225951_2_ / p_i225951_6_ + lvt_10_1_, p_i225951_3_ / p_i225951_7_ + lvt_11_1_); + p_i225951_1_[2] = p_i225951_1_[2].setTextureUV(p_i225951_2_ / p_i225951_6_ + lvt_10_1_, p_i225951_5_ / p_i225951_7_ - lvt_11_1_); + p_i225951_1_[3] = p_i225951_1_[3].setTextureUV(p_i225951_4_ / p_i225951_6_ - lvt_10_1_, p_i225951_5_ / p_i225951_7_ - lvt_11_1_); + if (p_i225951_8_) { + int lvt_12_1_ = p_i225951_1_.length; + + for(int lvt_13_1_ = 0; lvt_13_1_ < lvt_12_1_ / 2; ++lvt_13_1_) { + PositionTextureVertex lvt_14_1_ = p_i225951_1_[lvt_13_1_]; + p_i225951_1_[lvt_13_1_] = p_i225951_1_[lvt_12_1_ - 1 - lvt_13_1_]; + p_i225951_1_[lvt_12_1_ - 1 - lvt_13_1_] = lvt_14_1_; + } + } + + this.normal = p_i225951_9_.step(); + if (p_i225951_8_) { + this.normal.mul(-1.0F, 1.0F, 1.0F); + } + + } + } + + @OnlyIn(Dist.CLIENT) + public static class ModelBox { + public final TexturedQuad[] quads; + public final float posX1; + public final float posY1; + public final float posZ1; + public final float posX2; + public final float posY2; + public final float posZ2; + + public ModelBox(int p_i225950_1_, int p_i225950_2_, float p_i225950_3_, float p_i225950_4_, float p_i225950_5_, float p_i225950_6_, float p_i225950_7_, float p_i225950_8_, float p_i225950_9_, float p_i225950_10_, float p_i225950_11_, boolean p_i225950_12_, float p_i225950_13_, float p_i225950_14_) { + this.posX1 = p_i225950_3_; + this.posY1 = p_i225950_4_; + this.posZ1 = p_i225950_5_; + this.posX2 = p_i225950_3_ + p_i225950_6_; + this.posY2 = p_i225950_4_ + p_i225950_7_; + this.posZ2 = p_i225950_5_ + p_i225950_8_; + this.quads = new TexturedQuad[6]; + float lvt_15_1_ = p_i225950_3_ + p_i225950_6_; + float lvt_16_1_ = p_i225950_4_ + p_i225950_7_; + float lvt_17_1_ = p_i225950_5_ + p_i225950_8_; + p_i225950_3_ -= p_i225950_9_; + p_i225950_4_ -= p_i225950_10_; + p_i225950_5_ -= p_i225950_11_; + lvt_15_1_ += p_i225950_9_; + lvt_16_1_ += p_i225950_10_; + lvt_17_1_ += p_i225950_11_; + if (p_i225950_12_) { + float lvt_18_1_ = lvt_15_1_; + lvt_15_1_ = p_i225950_3_; + p_i225950_3_ = lvt_18_1_; + } + + PositionTextureVertex lvt_18_2_ = new PositionTextureVertex(p_i225950_3_, p_i225950_4_, p_i225950_5_, 0.0F, 0.0F); + PositionTextureVertex lvt_19_1_ = new PositionTextureVertex(lvt_15_1_, p_i225950_4_, p_i225950_5_, 0.0F, 8.0F); + PositionTextureVertex lvt_20_1_ = new PositionTextureVertex(lvt_15_1_, lvt_16_1_, p_i225950_5_, 8.0F, 8.0F); + PositionTextureVertex lvt_21_1_ = new PositionTextureVertex(p_i225950_3_, lvt_16_1_, p_i225950_5_, 8.0F, 0.0F); + PositionTextureVertex lvt_22_1_ = new PositionTextureVertex(p_i225950_3_, p_i225950_4_, lvt_17_1_, 0.0F, 0.0F); + PositionTextureVertex lvt_23_1_ = new PositionTextureVertex(lvt_15_1_, p_i225950_4_, lvt_17_1_, 0.0F, 8.0F); + PositionTextureVertex lvt_24_1_ = new PositionTextureVertex(lvt_15_1_, lvt_16_1_, lvt_17_1_, 8.0F, 8.0F); + PositionTextureVertex lvt_25_1_ = new PositionTextureVertex(p_i225950_3_, lvt_16_1_, lvt_17_1_, 8.0F, 0.0F); + float lvt_26_1_ = (float)p_i225950_1_; + float lvt_27_1_ = (float)p_i225950_1_ + p_i225950_8_; + float lvt_28_1_ = (float)p_i225950_1_ + p_i225950_8_ + p_i225950_6_; + float lvt_29_1_ = (float)p_i225950_1_ + p_i225950_8_ + p_i225950_6_ + p_i225950_6_; + float lvt_30_1_ = (float)p_i225950_1_ + p_i225950_8_ + p_i225950_6_ + p_i225950_8_; + float lvt_31_1_ = (float)p_i225950_1_ + p_i225950_8_ + p_i225950_6_ + p_i225950_8_ + p_i225950_6_; + float lvt_32_1_ = (float)p_i225950_2_; + float lvt_33_1_ = (float)p_i225950_2_ + p_i225950_8_; + float lvt_34_1_ = (float)p_i225950_2_ + p_i225950_8_ + p_i225950_7_; + this.quads[2] = new TexturedQuad(new PositionTextureVertex[]{lvt_23_1_, lvt_22_1_, lvt_18_2_, lvt_19_1_}, lvt_27_1_, lvt_32_1_, lvt_28_1_, lvt_33_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.DOWN); + this.quads[3] = new TexturedQuad(new PositionTextureVertex[]{lvt_20_1_, lvt_21_1_, lvt_25_1_, lvt_24_1_}, lvt_28_1_, lvt_33_1_, lvt_29_1_, lvt_32_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.UP); + this.quads[1] = new TexturedQuad(new PositionTextureVertex[]{lvt_18_2_, lvt_22_1_, lvt_25_1_, lvt_21_1_}, lvt_26_1_, lvt_33_1_, lvt_27_1_, lvt_34_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.WEST); + this.quads[4] = new TexturedQuad(new PositionTextureVertex[]{lvt_19_1_, lvt_18_2_, lvt_21_1_, lvt_20_1_}, lvt_27_1_, lvt_33_1_, lvt_28_1_, lvt_34_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.NORTH); + this.quads[0] = new TexturedQuad(new PositionTextureVertex[]{lvt_23_1_, lvt_19_1_, lvt_20_1_, lvt_24_1_}, lvt_28_1_, lvt_33_1_, lvt_30_1_, lvt_34_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.EAST); + this.quads[5] = new TexturedQuad(new PositionTextureVertex[]{lvt_22_1_, lvt_23_1_, lvt_24_1_, lvt_25_1_}, lvt_30_1_, lvt_33_1_, lvt_31_1_, lvt_34_1_, p_i225950_13_, p_i225950_14_, p_i225950_12_, Direction.SOUTH); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/NuclearExplosionEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/NuclearExplosionEntity.java new file mode 100644 index 000000000..9ce068b5e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/NuclearExplosionEntity.java @@ -0,0 +1,289 @@ +package net.nuclearteam.createnuclear.content.explosion; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Explosion; +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.minecraftforge.common.world.ForgeChunkManager; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PlayMessages; +import net.nuclearteam.createnuclear.*; +import net.nuclearteam.createnuclear.compat.Mods; +import net.nuclearteam.createnuclear.foundation.utility.Maths; +import net.nuclearteam.createnuclear.compat.alexscave.AlexscaveCompat; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; + +import java.util.List; +import java.util.Stack; + +public class NuclearExplosionEntity extends Entity { + + private boolean spawnedParticle = false; + private Stack destroyingChunks = new Stack<>(); + private static final EntityDataAccessor SIZE = SynchedEntityData.defineId(NuclearExplosionEntity.class, EntityDataSerializers.FLOAT); + private static final EntityDataAccessor NO_GRIEFING = SynchedEntityData.defineId(NuclearExplosionEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor INTENTIONAL_GAME_DESIGN = SynchedEntityData.defineId(NuclearExplosionEntity.class, EntityDataSerializers.BOOLEAN); + private boolean loadingChunks = false; + + private Explosion dummyExplosion; + + // Typed as Object (not AlexscaveCompat) so this field can exist even when Alex's Caves + // isn't installed and its classes are unavailable on the classpath + private Object alexscaveHandler; + + public NuclearExplosionEntity(EntityType entityType, Level level) { + super(entityType, level); + // Only instantiate the compat handler when the addon is actually loaded + if (Mods.ALEXS_CAVE.isLoaded()) { + this.alexscaveHandler = new AlexscaveCompat(); + } + } + + public NuclearExplosionEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { + this(CNEntityType.NUCLEAR_EXPLOSION.get(), level); + this.setBoundingBox(this.makeBoundingBox()); + } + + @Override + public Packet getAddEntityPacket() { + return (Packet) NetworkHooks.getEntitySpawningPacket(this); + } + + public void tick() { + super.tick(); + int chunksAffected = getChunksAffected(); + int radius = chunksAffected * 15; + if (!spawnedParticle) { + spawnedParticle = true; + int particleY = (int) Math.ceil(this.getY()); + while (particleY > level().getMinBuildHeight() && particleY > this.getY() - radius / 2F && isDestroyable(level().getBlockState(BlockPos.containing(this.getX(), particleY, this.getZ())))) { + particleY--; + } + level().addAlwaysVisibleParticle(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD.get(), true, this.getX(), particleY + 2, this.getZ(), this.getSize(), isIntentionalGameDesign() ? 1.0F : 0.0F, 0); + } + if (tickCount > 40 && destroyingChunks.isEmpty()) { + this.remove(RemovalReason.DISCARDED); + } else { + if (!level().isClientSide && !isNoGriefing()) { + if (!loadingChunks && !this.isRemoved()) { + loadingChunks = true; + loadChunksAround(true); + } + if (destroyingChunks.isEmpty()) { + BlockPos center = this.blockPosition(); + int chunks = chunksAffected; + for (int i = -chunks; i <= chunks; i++) { + for (int j = -chunks; j <= chunks; j++) { + for (int k = -chunks; k <= chunks; k++) { + destroyingChunks.push(center.offset(i * 16, j * 16, k * 16)); + } + } + } + destroyingChunks.sort((blockPos1, blockPos2) -> Double.compare(blockPos2.distManhattan(this.blockPosition()), blockPos1.distManhattan(this.blockPosition()))); + } else { + int tickChunkCount = Math.min(destroyingChunks.size(), 3); + for (int i = 0; i < tickChunkCount; i++) { + removeChunk(radius); + } + } + } + AABB killBox = this.getBoundingBox().inflate(radius + radius * 0.5F, radius * 0.6, radius + radius * 0.5F); + float flingStrength = getSize() * 0.33F; + float maximumDistance = radius + radius * 0.5F + 1; + + for (LivingEntity entity : this.level().getEntitiesOfClass(LivingEntity.class, killBox)) { + float dist = entity.distanceTo(this); + float damage = calculateDamage(dist, maximumDistance); + Vec3 vec3 = entity.position().subtract(this.position()).add(0, 0.3, 0).normalize(); + float playerFling = entity instanceof Player ? 0.5F * flingStrength : flingStrength; + + if (damage > 0) { + // Raycat (Alex's Caves) is immune to the explosion + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + if (((AlexscaveCompat) alexscaveHandler).isRaycat(entity)) { + damage = 0; + } + } + + if (entity.getType().is(CNTags.CNEntityTags.IRRADIATED_IMMUNE.tag)) { + damage *= 0.25F; + playerFling *= 0.1F; + + // Tremorzilla (Alex's Caves) is fully immune, on top of the irradiated-immune reduction above + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + if (((AlexscaveCompat) alexscaveHandler).isTremorzilla(entity)) { + CreateNuclear.LOGGER.warn("Entity explosion compatibility with Alex's Cave"); + damage = 0; + playerFling = 0; + } + } + } + + if (damage > 0) { + entity.hurt(CNDamageSources.radiation(entity.level()), damage); + } + } + entity.setDeltaMovement(vec3.scale(damage * 0.1F * playerFling)); + } + } + } + + @Override + public void remove(Entity.RemovalReason removalReason) { + if (!level().isClientSide && loadingChunks) { + loadingChunks = false; + loadChunksAround(false); + } + super.remove(removalReason); + } + + + private int getChunksAffected() { + return (int) Math.ceil(this.getSize()); + } + + private void loadChunksAround(boolean load) { + if (this.level() instanceof ServerLevel serverLevel) { + ChunkPos chunkPos = new ChunkPos(this.blockPosition()); + int dist = Math.max(getChunksAffected(), serverLevel.getServer().getPlayerList().getViewDistance() / 2); + for (int i = -dist; i <= dist; i++) { + for (int j = -dist; j <= dist; j++) { + ForgeChunkManager.forceChunk(serverLevel, CreateNuclear.MOD_ID, this, chunkPos.x + i, chunkPos.z + j, load, load); + } + } + } + } + + private float calculateDamage(float dist, float max) { + float revert = (max - dist) / max; + float baseDmg = this.getSize() <= 1.5F ? 100 : 100 + (this.getSize() - 1.5F) * 400; + return revert * baseDmg; + } + + private void removeChunk(int radius) { + BlockPos chunkCorner = destroyingChunks.pop(); + BlockPos.MutableBlockPos carve = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos carveBelow = new BlockPos.MutableBlockPos(); + carve.set(chunkCorner); + carveBelow.set(chunkCorner); + float itemDropModifier = 0.025F / Math.min(1, this.getSize()); + + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null){ + boolean resBool = ((AlexscaveCompat) alexscaveHandler).ACResConfig(); + if (resBool) { + return; + } + } + + if (dummyExplosion == null) { + dummyExplosion = new Explosion(level(), null, this.getX(), this.getY(), this.getZ(), 10.0F, List.of()); + } + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 15; y >= 0; y--) { + boolean canSetToFire = false; + carve.set(chunkCorner.getX() + x, Mth.clamp(chunkCorner.getY() + y, level().getMinBuildHeight(), level().getMaxBuildHeight()), chunkCorner.getZ() + z); + float widthSimplexNoise1 = (Maths.sampleNoise3D(carve.getX(), carve.getY(), carve.getZ(), radius) - 0.5F) * 0.45F + 0.55F; + double yDist = Maths.smin(0.6F - Math.abs(this.blockPosition().getY() - carve.getY()) / (float) radius, 0.6F, 0.2F); + double distToCenter = carve.distToLowCornerSqr(this.blockPosition().getX(), carve.getY() - 1, this.blockPosition().getZ()); + double targetRadius = yDist * (radius + widthSimplexNoise1 * radius) * radius; + + if (distToCenter <= targetRadius) { + BlockState state = level().getBlockState(carve); + if ((!state.isAir() || !state.getFluidState().isEmpty()) && isDestroyable(state)) { + carveBelow.set(carve.getX(), carve.getY() - 1, carve.getZ()); + canSetToFire = true; + + // ALEX'S CAVES compatibility handling + boolean handledByAlex = false; + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null){ + handledByAlex = ((AlexscaveCompat) alexscaveHandler).MobSpawn(state, level(), carve, itemDropModifier, dummyExplosion); + } + + if (handledByAlex) continue; + + // 1. Create an immutable copy of the position + BlockPos immutablePos = carve.immutable(); + + // 2. Call the explosion behavior + state.onBlockExploded(level(), immutablePos, dummyExplosion); + + // 3. onBlockExploded() doesn't remove plain vanilla blocks (e.g. stone/dirt) by + // itself, so force removal here and let items drop normally + if (level().getBlockState(immutablePos).is(state.getBlock())) { + level().destroyBlock(immutablePos, true); + } + } + } + if (canSetToFire && random.nextFloat() < 0.15 && !level().getBlockState(carveBelow).isAir()) { + level().setBlockAndUpdate(carveBelow.above(), CNBlocks.ENRICHING_FIRE.get().defaultBlockState()); + } + } + } + } + } + + private boolean isDestroyable(BlockState state) { + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + return ((AlexscaveCompat) alexscaveHandler).ACDestroyable(state); + } + return !(state.getBlock().getExplosionResistance() >= 3600000); + } + + @Override + protected void defineSynchedData() { + this.entityData.define(SIZE, 1.0F); + this.entityData.define(NO_GRIEFING, false); + this.entityData.define(INTENTIONAL_GAME_DESIGN, false); + } + + public float getSize() { + return this.entityData.get(SIZE); + } + + public void setSize(float f) { + this.entityData.set(SIZE, f); + } + + public boolean isNoGriefing() { + return this.entityData.get(NO_GRIEFING); + } + + public void setNoGriefing(boolean noGriefing) { + this.entityData.set(NO_GRIEFING, noGriefing); + } + + public boolean isIntentionalGameDesign() { + return this.entityData.get(INTENTIONAL_GAME_DESIGN); + } + + public void setIntentionalGameDesign(boolean intentionalGameDesign) { + this.entityData.set(INTENTIONAL_GAME_DESIGN, intentionalGameDesign); + } + + + @Override + protected void readAdditionalSaveData(CompoundTag compoundTag) { + loadingChunks = compoundTag.getBoolean("WasLoadingChunks"); + } + + @Override + protected void addAdditionalSaveData(CompoundTag compoundTag) { + compoundTag.putBoolean("WasLoadingChunks", loadingChunks); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java index c30917354..9ed4d2e7d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/CNFanProcessingTypes.java @@ -11,6 +11,7 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.RandomSource; import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; @@ -20,6 +21,9 @@ import net.nuclearteam.createnuclear.*; import net.nuclearteam.createnuclear.content.enriching.campfire.EnrichingCampfireBlock; import net.nuclearteam.createnuclear.content.kinetics.fan.processing.EnrichedRecipe.EnrichedWrapper; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe.SnowPowderWrapper; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; import javax.annotation.Nullable; import java.util.List; @@ -29,12 +33,14 @@ @SuppressWarnings("unused") public class CNFanProcessingTypes { public static final EnrichedType ENRICHED = register("enriched", new EnrichedType()); + public static final SnowPowderType SNOW_POWDER = register("snow_powder", new SnowPowderType()); private static final Map LEGACY_NAME_MAP; static { Object2ReferenceOpenHashMap map = new Object2ReferenceOpenHashMap<>(); map.put("ENRICHED", ENRICHED); + map.put("SNOW_POWDER", SNOW_POWDER); map.trim(); LEGACY_NAME_MAP = map; } @@ -59,6 +65,8 @@ public static FanProcessingType parseLegacy(String str) { } public static class EnrichedType implements FanProcessingType { + private static final double FAN_ENRICHING_DOSE = 5.0D; + private static final EnrichedWrapper ENRICHED_WRAPPER = new EnrichedWrapper(); @Override @@ -113,7 +121,65 @@ public void morphAirFlow(AirFlowParticleAccess particleAccess, RandomSource rand @Override public void affectEntity(Entity entity, Level level) { if (entity instanceof LivingEntity livingEntity) { - livingEntity.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 10, 0, true, true)); + RadiationCapability.applyContagion(livingEntity, FAN_ENRICHING_DOSE, 10); + livingEntity.hurt(CNDamageSources.fanRadiation(level), 1); + } + } + } + + public static class SnowPowderType implements FanProcessingType { + private static final SnowPowderWrapper SNOW_POWDER_WRAPPER = new SnowPowderWrapper(); + + @Override + public boolean isValidAt(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return CNTags.CNBlockTags.FAN_PROCESSING_CATALYSTS_SNOW_POWDER.matches(state); + } + + @Override + public int getPriority() { + return 301; + } + + @Override + public boolean canProcess(ItemStack stack, Level level) { + SNOW_POWDER_WRAPPER.setItem(0, stack); + Optional recipe = CNRecipeTypes.SNOW_POWDER.find(SNOW_POWDER_WRAPPER, level); + return recipe.isPresent(); + } + + @Nullable + @Override + public List process(ItemStack stack, Level level) { + SNOW_POWDER_WRAPPER.setItem(0, stack); + Optional recipe = CNRecipeTypes.SNOW_POWDER.find(SNOW_POWDER_WRAPPER, level); + return recipe.map(snowPowderRecipe -> RecipeApplier.applyRecipeOn(level, stack, snowPowderRecipe, true)).orElse(null); + } + + @Override + public void spawnProcessingParticles(Level level, Vec3 pos) { + if (level.random.nextInt(8) != 0) return; + pos = pos.add(VecHelper.offsetRandomly(Vec3.ZERO, level.random, 1) + .multiply(1,0.5f,1) + .normalize() + .scale(0.15f) + ); + level.addParticle(ParticleTypes.SNOWFLAKE, pos.x, pos.y + .45f, pos.z, 0.0, 0.0, 0.0); + if (level.random.nextInt(2) != 0) level.addParticle(ParticleTypes.SNEEZE, pos.x, pos.y + .25f, pos.z, 0.0, 0.0, 0.0); + } + + @Override + public void morphAirFlow(AirFlowParticleAccess particleAccess, RandomSource random) { + particleAccess.setColor(Color.mixColors(0x0, 0x49FFFB, random.nextFloat())); + particleAccess.setAlpha(1f); + if (random.nextFloat() < 1 / 128f) particleAccess.spawnExtraParticle(ParticleTypes.SNOWFLAKE, .125f); + if (random.nextFloat() < 1 / 32f) particleAccess.spawnExtraParticle(ParticleTypes.SNEEZE, .125f); + } + + @Override + public void affectEntity(Entity entity, Level level) { + if (entity instanceof LivingEntity livingEntity) { + livingEntity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 10, 0, true, true)); } } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java new file mode 100644 index 000000000..195ec73a1 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/kinetics/fan/processing/SnowPowderRecipe.java @@ -0,0 +1,39 @@ +package net.nuclearteam.createnuclear.content.kinetics.fan.processing; + +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeParams; +import net.minecraft.world.level.Level; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import net.nuclearteam.createnuclear.CNRecipeTypes; +import net.nuclearteam.createnuclear.content.kinetics.fan.processing.SnowPowderRecipe.SnowPowderWrapper; + +public class SnowPowderRecipe extends ProcessingRecipe { + public SnowPowderRecipe(ProcessingRecipeParams params) { + super(CNRecipeTypes.SNOW_POWDER, params); + } + + @Override + protected int getMaxInputCount() { + return 1; + } + + @Override + protected int getMaxOutputCount() { + return 12; + } + + @Override + public boolean matches(SnowPowderWrapper inv, Level worldIn) { + if (inv.isEmpty()) + return false; + return ingredients.get(0) + .test(inv.getItem(0)); + } + + public static class SnowPowderWrapper extends RecipeWrapper { + public SnowPowderWrapper() { + super(new ItemStackHandler(1)); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/logistics/BigFluidStack.java b/src/main/java/net/nuclearteam/createnuclear/content/logistics/BigFluidStack.java new file mode 100644 index 000000000..080af8299 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/logistics/BigFluidStack.java @@ -0,0 +1,79 @@ +package net.nuclearteam.createnuclear.content.logistics; + +import net.nuclearteam.createnuclear.api.ReactorFluidTypesValue; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; + +import javax.annotation.Nullable; +import java.util.Objects; + +public class BigFluidStack { + public static final int INF = 1_000_000_000; + + public FluidStack stack; + public int amount; + + public BigFluidStack(FluidStack stack) { + this(stack, 1); + } + + public BigFluidStack(FluidStack stack, int amount) { + this.stack = stack; + this.amount = amount; + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.put("Fluid", stack.writeToNBT(new CompoundTag())); + tag.putInt("Amount", amount); + + return tag; + } + + public static BigFluidStack read(CompoundTag tag) { + return new BigFluidStack(FluidStack.loadFluidStackFromNBT(tag.getCompound("Fluid")), tag.getInt("Amount")); + } + + public void send(FriendlyByteBuf buffer) { + buffer.writeFluidStack(stack); + buffer.writeVarInt(amount); + } + + public static BigFluidStack receive(FriendlyByteBuf buffer) { + return new BigFluidStack(buffer.readFluidStack(), buffer.readVarInt()); + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) + return true; + if (obj instanceof BigFluidStack other) + return Objects.equals(stack, other.stack) && amount == other.amount; + return false; + } + + @Override + public int hashCode() { + return (nullHash(stack) * 31) ^ Integer.hashCode(amount); + } + + int nullHash(Object o) { + return o == null ? 0 : o.hashCode(); + } + + @Override + public String toString() { + return "(" + stack.getDisplayName() + .getString() + " x" + amount + ")"; + } + + public ReactorFluidType getFluidtype(@Nullable Level level) { + if (level == null) { + return ReactorFluidTypesValue.getReactorFluidType(this.stack.getFluid()); + } + return ReactorFluidType.resolveReactorFluidType(this.stack.getFluid(), level); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java index e0dd7b60a..aa5a5008c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java @@ -12,32 +12,76 @@ public class CNMultiblock { public static final MultiBlockManagerBeta REGISTRATE_MULTIBLOCK = new MultiBlockManagerBeta<>(); - public static final String AAAAA = "AAAAA"; - public static final String AABAA = "AABAA"; - public static final String ADADA = "ADADA"; - public static final String BACAB = "BACAB"; - public static final String AAIAA = "AAIAA"; - public static final String AAAA = "AA*AA"; - public static final String AAOAA = "AAOAA"; + + private static final Predicate blockInWorldAPredicate = state -> + stateIs(CNBlocks.REACTOR_CASING.get()).test(state) + || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ROD_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_FLUID_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ALARM.get()).test(state) + ; static { - REGISTRATE_MULTIBLOCK.register("createnuclear:reactor", - TypeMultiblock.REACTOR, + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor5x5", + TypeMultiblock.REACTOR_T1, SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', stateIs(CNBlocks.REACTOR_CASING.get())) + .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OA*AO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OABAO", "ADDDA", "BDCDB", "ADDDA", "OABAO") + .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") + .where('A', blockInWorldAPredicate) .where('B', stateIs(CNBlocks.REACTOR_FRAME.get())) .where('C', stateIs(CNBlocks.REACTOR_CORE.get())) .where('D', stateIs(CNBlocks.REACTOR_COOLER.get())) .where('*', stateIs(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', stateIs(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', stateIs(CNBlocks.REACTOR_INPUT.get())) + .where('O', stateIs(CNBlocks.REACTOR_CASING.get())) + .build() + ); + + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor7x7", + TypeMultiblock.REACTOR_T2, + SimpleMultiBlockAislePatternBuilder.start() + .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OAB*BAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OABABAO", "ADDDDDA", "BDCDCDB", "ADDDDDA", "BDCDCDB", "ADDDDDA", "OABABAO") + .aisle("OOOOOOO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OAAAAAO", "OOOOOOO") + .where('A', blockInWorldAPredicate) + .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) + .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) + .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) + .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) + .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) + .build() + ); + + REGISTRATE_MULTIBLOCK.register("createnuclear:reactor9x9", + TypeMultiblock.REACTOR_T3, + SimpleMultiBlockAislePatternBuilder.start() + .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAA*AABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OBAABAABO", "BDDDDDDDB", "ADCDCDCDA", "ADDDDDDDA", "BDCDCDCDB", "ADDDDDDDA", "ADCDCDCDA", "BDDDDDDDB", "OBAABAABO") + .aisle("OOOOOOOOO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OAAAAAAAO", "OOOOOOOOO") + .where('A', blockInWorldAPredicate) + .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) + .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) + .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) + .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) + .where('O', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) .build() ); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java index bf56b3f1f..c0c393274 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java @@ -1,15 +1,22 @@ package net.nuclearteam.createnuclear.content.multiblock; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.lang.Lang; import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.ItemRodTypesValue; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; +import net.nuclearteam.createnuclear.infrastructure.config.CReactorHeat; public interface IHeat extends IWrenchable { enum HeatLevel { @@ -53,21 +60,38 @@ public int getHeatValue() { }; } - public static HeatLevel of(int heat) { + public static HeatLevel of(int heat, int reactorSize) { if (heat < 0) return NONE; heat = Math.abs(heat); - if (heat > 0 && heat < 500) return SAFETY; - if (heat >= 501 && heat <= 800) return CAUTION; - if (heat >= 801 && heat <= 1000) return WARNING; - if (heat >= 1001) return DANGER; + CReactorHeat config = CNConfigs.server().reactorHeat; + int danger = 1000; + + switch (reactorSize) { + case 5 -> danger = config.size5Danger.get(); + case 7 -> danger = config.size7Danger.get(); + case 9 -> danger = config.size9Danger.get(); + default -> danger = config.size5Danger.get(); + } + + int caution = (int) (danger * 0.75); + int warning = (int) (danger * 0.90); + + if (heat > 0 && heat < caution) return SAFETY; + if (heat >= caution && heat < warning) return CAUTION; + if (heat >= warning && heat <= danger) return WARNING; + if (heat > danger) return DANGER; return NONE; } - public static LangBuilder getFormattedHeatText(int heat) { - HeatLevel heatLevel = of(heat); + public static boolean isNotDanger(int heat, int reactorSize) { + return of(heat, reactorSize) != DANGER; + } + + public static LangBuilder getFormattedHeatText(int heat, int reactorSize) { + HeatLevel heatLevel = of(heat, reactorSize); LangBuilder builder = CreateLang.builder(CreateNuclear.MOD_ID).text(TooltipHelper.makeProgressBar(5, heatLevel.ordinal()+1)); builder.translate("tooltip.heatLevel." + Lang.asId(heatLevel.name())) @@ -85,28 +109,24 @@ public static LangBuilder getFormattedHeatText(int heat) { return builder; } - public static LangBuilder getFormattedItemText(ItemStack itemRod, Boolean IsEmpty) { + public static LangBuilder getFormattedItemText(ItemStack itemRod, Boolean isEmpty, Level level) { LangBuilder builder = Lang.builder(CreateNuclear.MOD_ID); - String tooltip = "unknown"; - - if (itemRod.is(CNItemTags.FUEL.tag)) { - tooltip = "uranium"; - } - - if (itemRod.is(CNItemTags.COOLER.tag)) { - tooltip = "graphene"; - } + String tooltip = TypeRodPredicate.tooltipKey(itemRod, level); builder.translate("tooltip.item." + tooltip + ".rod") - // when it's empty, we show the number minus one to display zero because we fake the item count as 1 - .add(CreateNuclearLang.number(Math.abs((IsEmpty ? itemRod.getCount() - 1 : itemRod.getCount())))) - .style(ChatFormatting.BLUE) + // when it's empty, we show the number minus one to display zero because we fake the item count as 1 + .add(CreateNuclearLang.number(Math.abs((isEmpty ? itemRod.getCount() - 1 : itemRod.getCount())))) + .style(ChatFormatting.BLUE) ; return builder; } + public static LangBuilder getFormattedItemText(BigItemStack itemRod, Boolean isEmpty, Level level) { + return getFormattedItemText(new ItemStack(itemRod.stack.getItem(), itemRod.count), isEmpty, level); + } + public static LangBuilder getName(String name) { LangBuilder builder = CreateNuclearLang.builder(CreateNuclear.MOD_ID); builder.translate("gui." + name + ".info_header.title"); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java new file mode 100644 index 000000000..851292543 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java @@ -0,0 +1,67 @@ +package net.nuclearteam.createnuclear.content.multiblock; + +import net.minecraft.world.entity.LivingEntity; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.BiConsumer; + +public class MultiblockHelpers { + private static final ReactorPattern pattern = new ReactorPattern(); + + /** + * Utility helpers for handling multiblock placement and removal events. + * These helpers locate the controller for a given part position and + * invoke provided callbacks to register or remove parts. + */ + public static void handleOnPlace(BlockPos pos, Level level, BiConsumer register) { + BlockPos controllerPos = pattern.findControllerPos(pos, level, true); + if (controllerPos != null) { + ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); + if (controllerBlockEntity != null) { + register.accept(controllerBlockEntity, pos); + } + } + } + + public static void handleRemoval(BlockPos pos, Level level, BiConsumer remover) { + BlockPos controllerPos = pattern.findControllerPos(pos, level, false); + if (controllerPos != null) { + ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); + if (controllerBlockEntity != null) { + remover.accept(controllerBlockEntity, pos); + } + } + } + + public static ReactorControllerBlockEntity getControllerForPart(Level level, BlockPos pos) { + /** + * Returns the controller entity for the given part position, or null + * if no valid controller is found. + */ + BlockPos controllerPos = pattern.findControllerPos(pos, level); + if (controllerPos != null) { + return (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); + } + + return null; + } + + public static void handleAdvancedPlacedBy(BlockPos pos, Level level, @Nullable LivingEntity entity) { + if (entity == null) return; + + ReactorControllerBlockEntity controller = getControllerForPart(level, pos); + + if (controller != null) { + CNAdvancementBehaviour.setPlacedBy(level, controller.getBlockPos(), entity); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java new file mode 100644 index 000000000..a591c5fb9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java @@ -0,0 +1,199 @@ +package net.nuclearteam.createnuclear.content.multiblock; + +import net.createmod.catnip.lang.LangBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundSource; +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.level.levelgen.structure.BoundingBox; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CNSoundEvents; +import net.nuclearteam.createnuclear.api.multiblock.BlockPattern; +import net.nuclearteam.createnuclear.api.multiblock.TypeMultiblock; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +import java.util.ArrayList; +import java.util.List; + +public final class ReactorAssembler { + + public static final int configRadius = CNConfigs.server().notify.warningDistance.get(); + public static final boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + + private ReactorAssembler() {} + + public static void assemble(BlockPos pos, Level level) { + if (level.isClientSide) return; + + ReactorControllerBlockEntity entity = getBlockEntity(level, pos); + if (entity == null) return; + + BlockPattern result = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, pos, entity); + if (result == null) return; + + // Captured before setAssembled(true) below: assemble() is also reached from + // ReactorPattern.findControllerPos on an already-assembled reactor, and only the + // actual not-assembled -> assembled transition should notify and play the cue. + boolean wasAssembled = entity.isAssembled(); + + sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.assembled"), !wasAssembled); + + if (!wasAssembled) { + // Server-side (null player) so the one-shot broadcasts to nearby clients. + level.playSound(null, pos, CNSoundEvents.MOTOR_ASSEMBLE.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); + } + + switch (result.data()) { + case REACTOR_T1 -> entity.getAdvancement().awardPlayer(CNAdvancement.T1_REACTOR); + case REACTOR_T2 -> entity.getAdvancement().awardPlayer(CNAdvancement.T2_REACTOR); + case REACTOR_T3 -> entity.getAdvancement().awardPlayer(CNAdvancement.T3_REACTOR); + } + + entity.setMultiblockSize(result.data().getSize()); + entity.setAssembled(true); + entity.setMultiblockStructure(ReactorAssembler.getStructureBound(pos, entity.getMultiblockSize(), entity.getMultiblockFacing())); + + findAndRegisterSpecialBlocks(entity.getMultiblockPos(), entity, level); + } + + public static void disassemble(BlockPos pos, Level level) { + if (level.isClientSide) return; + + ReactorControllerBlockEntity entity = getBlockEntity(level, pos); + if (entity == null || !entity.isAssembled()) return; + + BlockPattern result = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, pos, entity); + if (result != null) return; + + sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.disassembled"), true); + + // Both early returns above already guarantee this is a real assembled -> broken + // transition, so no extra guard is needed here. + level.playSound(null, pos, CNSoundEvents.MOTOR_DISASSEMBLE.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); + + entity.setAssembled(false); + entity.removeIOAll(); + } + + public static void findAndRegisterSpecialBlocks(BoundingBox reactorPos, ReactorControllerBlockEntity entity, Level level) { + int xMin = reactorPos.minX(), xMax = reactorPos.maxX(); + int yMin = reactorPos.minY(), yMax = reactorPos.maxY(); + int zMin = reactorPos.minZ(), zMax = reactorPos.maxZ(); + + final Block reactorOutputBlock = CNBlocks.REACTOR_OUTPUT.get(); + final Block reactorRodInputBlock = CNBlocks.REACTOR_ROD_INPUT.get(); + final Block reactorInputFluidBlock = CNBlocks.REACTOR_FLUID_INPUT.get(); + final Block reactorAlarmBlock = CNBlocks.REACTOR_ALARM.get(); + final Block reactorFrameBlock = CNBlocks.REACTOR_FRAME.get(); + + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(); + + int frameMinY = Integer.MAX_VALUE; + int frameMaxY = Integer.MIN_VALUE; + + // Collected here and assigned their capacity after the scan: the reactor-size capacity is a + // single TOTAL shared across every fluid input, so we split it once we know how many there are. + List fluidInputs = new ArrayList<>(); + + for (int y = yMin; y <= yMax; y++) { + boolean isYBoundary = (y == yMin || y == yMax); + for (int x = xMin; x <= xMax; x++) { + boolean isXBoundary = (x == xMin || x == xMax); + for (int z = zMin; z <= zMax; z++) { + boolean isZBoundary = (z == zMin || z == zMax); + + if (!(isYBoundary || isXBoundary || isZBoundary)) continue; + + mutablePos.set(x, y, z); + BlockState blockState = level.getBlockState(mutablePos); + + if (blockState.is(reactorOutputBlock)) { + entity.addOutput(mutablePos.immutable()); + } else if (blockState.is(reactorRodInputBlock)) { + entity.addInput(mutablePos.immutable()); + } else if (blockState.is(reactorInputFluidBlock)) { + entity.addInputFluid(mutablePos.immutable()); + if (level.getBlockEntity(mutablePos) instanceof ReactorFluidInputEntity fluidInput) { + fluidInputs.add(fluidInput); + } + } else if (blockState.is(reactorAlarmBlock)) { + entity.addAlarm(mutablePos.immutable()); + } else if (blockState.is(reactorFrameBlock)) { + if (level.getBlockEntity(mutablePos) instanceof ReactorFrameEntity frame) { + frame.setController(entity.getBlockPos()); + } + frameMinY = Math.min(frameMinY, y); + frameMaxY = Math.max(frameMaxY, y); + } + } + } + } + + if (frameMinY != Integer.MAX_VALUE) { + entity.getFrameDisplayManager().setFrameColumn(frameMinY, frameMaxY, entity::notifyUpdate); + } + + distributeFluidInputCapacity(fluidInputs, entity.getMultiblockSize()); + } + + /** + * Splits the reactor-size total fluid capacity evenly across all fluid inputs so the combined + * max capacity always equals the configured value, regardless of how many inputs were placed. + * The integer remainder is spread one unit at a time over the first inputs so the sum stays exact. + */ + private static void distributeFluidInputCapacity(List fluidInputs, int reactorSize) { + int count = fluidInputs.size(); + if (count == 0) return; + + int total = ReactorFluidInputEntity.getCapacityForReactorSize(reactorSize); + int base = total / count; + int remainder = total % count; + + for (int i = 0; i < count; i++) { + fluidInputs.get(i).applyCapacity(base + (i < remainder ? 1 : 0)); + } + } + + private static ReactorControllerBlockEntity getBlockEntity(Level level, BlockPos pos) { + if (level.getBlockEntity(pos) instanceof ReactorControllerBlockEntity entity) { + return entity; + } + return null; + } + + private static void sendMessageToPlayer(Level level, BlockPos pos, LangBuilder component, boolean condition) { + if (!condition) return; + + NotifyUtil.sendActionBar(level, pos, + component, + ChatFormatting.GOLD, configRadius, configWarnAll + ); + } + + public static BoundingBox getStructureBound(BlockPos center, int size, Direction facing) { + int radius = (size - 1) / 2; + int height = radius + 1; + int depth = size - 1; + Direction into = facing.getOpposite(); + + int axisX = into.getStepX() * depth; + int axisZ = into.getStepZ() * depth; + + int minX = center.getX() + Math.min(0, axisX) - (axisX == 0 ? radius : 0); + int maxX = center.getX() + Math.max(0, axisX) + (axisX == 0 ? radius : 0); + int minZ = center.getZ() + Math.min(0, axisZ) - (axisZ == 0 ? radius : 0); + int maxZ = center.getZ() + Math.max(0, axisZ) + (axisZ == 0 ? radius : 0); + + return new BoundingBox(minX, center.getY() - height, minZ, + maxX, center.getY() + height, maxZ); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarm.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarm.java new file mode 100644 index 000000000..a8d9eed86 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarm.java @@ -0,0 +1,84 @@ +package net.nuclearteam.createnuclear.content.multiblock.alarm; + +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.nuclearteam.createnuclear.CNBlockEntityTypes; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +import javax.annotation.Nullable; + +public class ReactorAlarm extends Block implements IBE { + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + protected ReactorPattern pattern = new ReactorPattern(); + + public ReactorAlarm(Properties props) { + super(props); + this.registerDefaultState(this.defaultBlockState().setValue(POWERED, false)); + } + + // Registers this alarm with the multiblock controller when placed + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, level, pos, oldState, isMoving); + MultiblockHelpers.handleOnPlace(pos, level, ReactorControllerBlockEntity::addAlarm); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); + } + + // Unregisters this alarm from the multiblock controller on removal (piston, explosion, etc.) + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + MultiblockHelpers.handleRemoval(pos, level, ReactorControllerBlockEntity::removeAlarm); + super.onRemove(state, level, pos, newState, isMoving); + } + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(POWERED, ctx.getLevel().hasNeighborSignal(ctx.getClickedPos())); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide) return; + boolean poweredNow = level.hasNeighborSignal(pos); + if (state.getValue(POWERED) != poweredNow) { + level.setBlock(pos, state.setValue(POWERED, poweredNow), 3); + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(POWERED); + } + + @Override + public Class getBlockEntityClass() { + return ReactorAlarmEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return CNBlockEntityTypes.REACTOR_ALARM.get(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmEntity.java new file mode 100644 index 000000000..4e63a7554 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmEntity.java @@ -0,0 +1,101 @@ +package net.nuclearteam.createnuclear.content.multiblock.alarm; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.CNSoundEvents; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +import java.util.List; + +public class ReactorAlarmEntity extends SmartBlockEntity { + + public ReactorControllerBlockEntity controller = null; + private CNAdvancementBehaviour advancement; + private boolean advancementAwarded = false; // Prevents repeatedly awarding the advancement on every tick + + @OnlyIn(Dist.CLIENT) + protected ReactorAlarmSoundInstance soundInstance; + + public ReactorAlarmEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void tick() { + super.tick(); + if (level == null || !(getBlockState().getBlock() instanceof ReactorAlarm)) return; + + if (level.isClientSide) { + tickAudio(); // DistExecutor is unnecessary here; the level-side check is enough and avoids thread overhead + } else { + tickServer(); + } + } + + @OnlyIn(Dist.CLIENT) + protected void tickAudio() { + BlockState state = getBlockState(); + boolean powered = state.hasProperty(ReactorAlarm.POWERED) && state.getValue(ReactorAlarm.POWERED); + + if (!powered) { + stopSound(); + return; + } + + if (soundInstance == null || soundInstance.isStopped()) { + Minecraft minecraft = Minecraft.getInstance(); + try { + soundInstance = new ReactorAlarmSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_ALARM_LOOP.getMainEvent()); + minecraft.getSoundManager().play(soundInstance); + } catch (Exception e) { + CreateNuclear.LOGGER.warn("Failed to start alarm sound: " + e.getMessage()); + } + } + } + + @OnlyIn(Dist.CLIENT) + private void stopSound() { + if (soundInstance != null) { + try { + soundInstance.fadeOut(); + } catch (Exception e) { + CreateNuclear.LOGGER.warn("Error while stopping the sound: " + e.getMessage()); + } + soundInstance = null; + } + } + + private void tickServer() { + BlockState state = getBlockState(); + if (!(state.getBlock() instanceof ReactorAlarm)) return; + + boolean powered = state.getValue(ReactorAlarm.POWERED); + + if (powered) { + if (!advancementAwarded) { // Award it only once, on the rising edge + this.advancement.awardPlayer(CNAdvancement.SILENCE_THE_CORE); + advancementAwarded = true; + } + } else { + advancementAwarded = false; // Reset when the alarm turns off + } + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(advancement = new CNAdvancementBehaviour(this, CNAdvancement.SILENCE_THE_CORE)); + } + + public void setController(ReactorControllerBlockEntity controller) { + this.controller = controller; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmSoundInstance.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmSoundInstance.java new file mode 100644 index 000000000..04793cd64 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmSoundInstance.java @@ -0,0 +1,50 @@ +package net.nuclearteam.createnuclear.content.multiblock.alarm; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class ReactorAlarmSoundInstance extends AbstractTickableSoundInstance { + private final BlockPos pos; + private final Level level; + + public ReactorAlarmSoundInstance(Level level, BlockPos pos, SoundEvent sound) { + super(sound, SoundSource.BLOCKS, level != null ? level.random : null); + this.level = level; + this.pos = pos; + if (pos != null) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + this.looping = true; + this.delay = 0; + this.volume = 10F; + } + + @Override + public void tick() { + try { + if (level == null || pos == null) { + stop(); + return; + } + + BlockState state = level.getBlockState(pos); + if (!(state.getBlock() instanceof ReactorAlarm)) { + stop(); + } + } catch (Exception e) { + stop(); + CreateNuclear.LOGGER.warn(e.getMessage()); + } + } + + public void fadeOut() { + stop(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java index b0069fddf..c27889d3a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItem.java @@ -1,8 +1,11 @@ package net.nuclearteam.createnuclear.content.multiblock.bluePrintItem; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -13,6 +16,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; 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.level.Level; import net.minecraftforge.items.ItemStackHandler; @@ -21,6 +25,7 @@ import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -30,6 +35,18 @@ public ReactorBluePrintItem(Properties properties) { super(properties); } + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + + tooltip.add(Component.translatable("item.createnuclear.reactor_blueprint.tooltip") + .withStyle(ChatFormatting.GRAY)); + + // Adjust the tooltip text to hint at the available action + tooltip.add(Component.translatable("item.createnuclear.reactor_blueprint.tooltip_hint") + .withStyle(ChatFormatting.DARK_GRAY)); + } + @Override public Component getDisplayName() { return Component.translatable("reactor.item.gui.name"); @@ -52,14 +69,26 @@ public InteractionResult useOn(UseOnContext context) { public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { ItemStack heldItem = player.getItemInHand(hand); + // Plain right-click -> Opens the Blueprint screen if (!player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { if (!world.isClientSide && player instanceof ServerPlayer) NetworkHooks.openScreen((ServerPlayer) player, this, buf -> buf.writeItem(heldItem)); return InteractionResultHolder.success(heldItem); } + // Shift + right-click -> Sends a clickable link in chat! else if (player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { - if (!world.isClientSide && player instanceof ServerPlayer) { - NetworkHooks.openScreen((ServerPlayer) player, this, buf -> buf.writeItem(heldItem)); + if (!world.isClientSide) { + MutableComponent message = Component.translatable("item.createnuclear.reactor_blueprint.chat_info") + .withStyle(ChatFormatting.GREEN) + .append(" ") + .append(Component.translatable("item.createnuclear.reactor_blueprint.wiki_link") + .withStyle(style -> style + .withColor(ChatFormatting.AQUA) + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://wiki.createnuclear.net/")) + )); + + player.sendSystemMessage(message); } return InteractionResultHolder.success(heldItem); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java index f8657d55e..128045c99 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemPacket.java @@ -11,22 +11,20 @@ public class ReactorBluePrintItemPacket extends SimplePacketBase { private final CompoundTag tag; private final float heat; - private final int graphiteTime; - private final int uraniumTime; - private final int countGraphiteRod; - private final int countUraniumRod; - private double progress; + private final int coolerTime; + private final int fuelTime; + private final int countCoolerRod; + private final int countFuelRod; + private final double progress; - private static double totalInit; - - public ReactorBluePrintItemPacket(CompoundTag tag, float heat, int graphiteTime, int uraniumTime, int countGraphiteRod, int countUraniumRod) { + public ReactorBluePrintItemPacket(CompoundTag tag, float heat, int coolerTime, int fuelTime, int countCoolerRod, int countFuelRod) { this.tag = tag; this.heat = heat; - this.graphiteTime = graphiteTime; - this.uraniumTime = uraniumTime; - this.countGraphiteRod = countGraphiteRod; - this.countUraniumRod = countUraniumRod; - this.progress = calculatePostgres(graphiteTime, countGraphiteRod, uraniumTime, countUraniumRod); + this.coolerTime = coolerTime; + this.fuelTime = fuelTime; + this.countCoolerRod = countCoolerRod; + this.countFuelRod = countFuelRod; + this.progress = calculatePostgres(coolerTime, countCoolerRod, fuelTime, countFuelRod); } public ReactorBluePrintItemPacket(CompoundTag tag) { @@ -34,17 +32,16 @@ public ReactorBluePrintItemPacket(CompoundTag tag) { } public ReactorBluePrintItemPacket(float heat) { - this(new CompoundTag(), heat, 3600,5000, 0, 0); + this(new CompoundTag(), heat, 3600, 5000, 0, 0); } - public ReactorBluePrintItemPacket(int graphiteTime, int uraniumTime, int countGraphiteRod, int countUraniumRod) { - this(new CompoundTag(), 0f, graphiteTime, uraniumTime, countGraphiteRod, countUraniumRod); + public ReactorBluePrintItemPacket(int coolerTime, int fuelTime, int countCoolerRod, int countFuelRod) { + this(new CompoundTag(), 0f, coolerTime, fuelTime, countCoolerRod, countFuelRod); } public ReactorBluePrintItemPacket(FriendlyByteBuf buf) { this(buf.readNbt(), buf.readFloat(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt()); - this.progress = buf.readDouble(); } @@ -52,13 +49,10 @@ public ReactorBluePrintItemPacket(FriendlyByteBuf buf) { public void write(FriendlyByteBuf buffer) { buffer.writeNbt(tag); buffer.writeFloat(heat); - buffer.writeInt(graphiteTime); - buffer.writeInt(uraniumTime); - buffer.writeInt(countGraphiteRod); - buffer.writeInt(countUraniumRod); - buffer.writeDouble(progress); - - totalInit = calculateTotalInit(countUraniumRod, countGraphiteRod); + buffer.writeInt(coolerTime); + buffer.writeInt(fuelTime); + buffer.writeInt(countCoolerRod); + buffer.writeInt(countFuelRod); } @Override @@ -66,10 +60,10 @@ public boolean handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); if (player == null || !(player.containerMenu instanceof ReactorBluePrintMenu c)) return; - c.countUraniumRod = this.countUraniumRod; - c.countGraphiteRod = this.countGraphiteRod; - c.graphiteTime = this.graphiteTime; - c.uraniumTime = this.uraniumTime; + c.countFuelRod = this.countFuelRod; + c.countCooledRod = this.countCoolerRod; + c.fuelTime = this.fuelTime; + c.coolerTime = this.coolerTime; c.progress = this.progress; c.heat = this.heat; c.sendUpdate = true; @@ -77,16 +71,19 @@ public boolean handle(NetworkEvent.Context context) { return true; } - public static double calculatePostgres(int a, int a_exp, int b, int b_exp) { - double a2 = Math.pow(a, a_exp); - double b2 = Math.pow(b, b_exp); - double total = a2 + b2; + public static double calculatePostgres(int coolerTime, int countCoolerRod, int fuelTime, int countFuelRod) { + double coolerTotal = Math.pow(coolerTime, countCoolerRod); + double fuelTotal = Math.pow(fuelTime, countFuelRod); + double total = coolerTotal + fuelTotal; - if (Double.isNaN(totalInit)) return total/calculateTotalInit(a, b); - else return total/totalInit; + double totalInit = calculateTotalInit(countCoolerRod, countFuelRod); + if (totalInit == 0 || Double.isNaN(totalInit)) return 0; + return total / totalInit; } - public static double calculateTotalInit(int a, int b) { - return Math.pow(3600, a) + Math.pow(5000, b); + public static double calculateTotalInit(int countCoolerRod, int countFuelRod) { + // We assume 3600 and 5000 as base fallback times for initialization if needed. + // It should ideally use the actual base times from config, but this works for now. + return Math.pow(3600, countCoolerRod) + Math.pow(5000, countFuelRod); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java index abd2a021b..7bd9d5582 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintItemScreen.java @@ -39,7 +39,7 @@ protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, BG.render(guiGraphics, x+23, y-19); renderPlayerInventory(guiGraphics, x+23, y+175); - guiGraphics.drawString(font, title, x+26, y-12, 0x592424, false); //ici pour le titre + guiGraphics.drawString(font, title, x+26, y-12, 0x592424, false); // renders the screen title } @@ -50,23 +50,19 @@ protected void containerTick() { menu.player.closeContainer(); } - float coef = 0.1F; - CompoundTag tag = menu.contentHolder.getOrCreateTag(); - - sendValueUpdate(tag, coef, - tag.getInt("graphiteTime"), - tag.getInt("uraniumTime"), - tag.getInt("countUraniumRod"), - tag.getInt("countGraphiteRod")+3 - ); - - + if (tag.contains("pattern")) { + sendValueUpdate(tag, tag.getFloat("heat"), + tag.getInt("coolerTime"), + tag.getInt("fuelTime"), + tag.getInt("countCoolerRod"), + tag.getInt("countFuelRod") + ); + } } - private static void sendValueUpdate(CompoundTag tag, float heat, int graphiteTime, int uraniumTime, int countGraphiteRod, int countUraniumRod) { - CNPackets.getChannel() - .sendToServer(new ReactorBluePrintItemPacket(tag, heat, graphiteTime, uraniumTime, countGraphiteRod, countGraphiteRod)); + private static void sendValueUpdate(CompoundTag tag, float heat, int coolerTime, int fuelTime, int countCoolerRod, int countFuelRod) { + CNPackets.getChannel().sendToServer(new ReactorBluePrintItemPacket(tag, heat, coolerTime, fuelTime, countCoolerRod, countFuelRod)); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java index a6406ae2f..36d8d66f6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/bluePrintItem/ReactorBluePrintMenu.java @@ -11,20 +11,23 @@ import net.minecraft.world.item.Items; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.CNMenus; -import net.nuclearteam.createnuclear.CNTags; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; import static net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem.getItemStorage; public class ReactorBluePrintMenu extends GhostItemMenu { - public float heat = 0F; - public int graphiteTime = 5000; - public int uraniumTime = 3600; - public int countGraphiteRod = 0; - public int countUraniumRod = 0; + public int countFuelRod = 0; + public int countCooledRod = 0; + public int fuelTime = 0; + public int coolerTime = 0; public double progress = 0; - + public float heat = 0; + public double totalInit = 0; public boolean sendUpdate = false; public ReactorBluePrintMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { @@ -57,16 +60,17 @@ protected void initAndReadInventory(ItemStack contentHolder) { } } - contentHolder.getOrCreateTag().putInt("uraniumTime", 3600); - contentHolder.getOrCreateTag().putInt("graphiteTime", 5000); - contentHolder.getOrCreateTag().putInt("countGraphiteRod", 0); - contentHolder.getOrCreateTag().putInt("countUraniumRod", 0); + contentHolder.getOrCreateTag().putInt("fuelTime", 0); + contentHolder.getOrCreateTag().putInt("coolerTime", 0); + contentHolder.getOrCreateTag().putInt("countCoolerRod", 0); + contentHolder.getOrCreateTag().putInt("countFuelRod", 0); + contentHolder.getOrCreateTag().putInt("totalHeatRatio", 0); ghostInventory.deserializeNBT(tag.getCompound("pattern")); } @Override - protected net.minecraftforge.items.ItemStackHandler createGhostInventory() { + protected ItemStackHandler createGhostInventory() { return getItemStorage(contentHolder); } @@ -100,31 +104,70 @@ private void addPatternSlots() { }; for (int[] pos : positions) {// up and down not middle - this.addSlot(new net.minecraftforge.items.SlotItemHandler(ghostInventory,i, startWidth + incr * pos[0], startHeight + incr * pos[1])); + this.addSlot(new SlotItemHandler(ghostInventory,i, startWidth + incr * pos[0], startHeight + incr * pos[1])); i++; } } @Override protected void saveData(ItemStack contentHolder) { + countFuelRod = 0; + countCooledRod = 0; + int totalRatio = 0; + int totalFuelTime = 0; + int totalCoolerTime = 0; + for (int i = 0; i < ghostInventory.getSlots(); i++) { - if (ghostInventory.getStackInSlot(i).isEmpty() || ghostInventory.getStackInSlot(i) == null) ghostInventory.setStackInSlot(i, ItemStack.EMPTY); - if (!(ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.FUEL.tag) || ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.COOLER.tag))&& !ghostInventory.getStackInSlot(i).isEmpty()) ghostInventory.setStackInSlot(i, ItemStack.EMPTY); - if (ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.COOLER.tag)) countGraphiteRod += 1; - if (ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.FUEL.tag)) countUraniumRod += 1; + ItemStack stack = ghostInventory.getStackInSlot(i); + if (stack == null || stack.isEmpty()) { + ghostInventory.setStackInSlot(i, ItemStack.EMPTY); + continue; + } + + RodType typeRod = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); + + boolean isFuel = typeRod.type() == TypeRod.FUEL; + boolean isCooler = typeRod.type() == TypeRod.COOLER; + + if (isCooler) { + countCooledRod++; + totalCoolerTime += typeRod.rodTimer().get(); + } + if (isFuel) { + countFuelRod++; + totalFuelTime += typeRod.rodTimer().get(); + } + + if (isCooler || isFuel) { + totalRatio += typeRod.ratio().get(); + } } contentHolder.getOrCreateTag().put("pattern", ghostInventory.serializeNBT()); - contentHolder.getOrCreateTag().putInt("countGraphiteRod", countGraphiteRod); - contentHolder.getOrCreateTag().putInt("countUraniumRod", countUraniumRod); + contentHolder.getOrCreateTag().putInt("countCoolerRod", countCooledRod); + contentHolder.getOrCreateTag().putInt("countFuelRod", countFuelRod); + contentHolder.getOrCreateTag().putInt("totalRatio", totalRatio); + contentHolder.getOrCreateTag().putInt("fuelTime", countFuelRod > 0 ? totalFuelTime / countFuelRod : 0); + contentHolder.getOrCreateTag().putInt("coolerTime", countCooledRod > 0 ? totalCoolerTime / countCooledRod : 0); for (int i = 0; i < ghostInventory.getSlots(); i++) { - if (ghostInventory.getStackInSlot(i).isEmpty() || ghostInventory.getStackInSlot(i) == null) ghostInventory.setStackInSlot(i, new ItemStack(Items.GLASS_PANE)); - if (!(ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.FUEL.tag) || ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.COOLER.tag))&& !ghostInventory.getStackInSlot(i).isEmpty()) ghostInventory.setStackInSlot(i, new ItemStack(Items.GLASS_PANE)); + ItemStack stack = ghostInventory.getStackInSlot(i); + if (stack == null || stack.isEmpty()) { + ghostInventory.setStackInSlot(i, new ItemStack(Items.GLASS_PANE)); + continue; + } + + RodType typeRod = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); + + boolean isFuel = typeRod.type() == TypeRod.FUEL; + boolean isCooler = typeRod.type() == TypeRod.COOLER; + + if (!(isFuel || isCooler)) { + ghostInventory.setStackInSlot(i, new ItemStack(Items.GLASS_PANE)); + } } contentHolder.getOrCreateTag().put("patternAll", ghostInventory.serializeNBT()); - } protected int getPlayerInventoryXOffset() { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java index cbdee8616..048aa90be 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasing.java @@ -4,11 +4,11 @@ import com.simibubi.create.foundation.block.IBE; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; import net.minecraft.network.chat.Component; import net.minecraft.util.StringRepresentable; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; @@ -20,20 +20,21 @@ import net.minecraft.world.level.block.state.BlockState; import net.nuclearteam.createnuclear.CNBlockEntityTypes; import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInput; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInput; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @SuppressWarnings({"deprecation", "unused"}) public class ReactorCasing extends Block implements IWrenchable, IBE { private final TypeBlock typeBlock; + protected ReactorPattern pattern = new ReactorPattern(); public ReactorCasing(Properties properties, TypeBlock tBlock) { super(properties); @@ -44,22 +45,20 @@ public ReactorCasing(Properties properties, TypeBlock tBlock) { @Override // Called when the block is placed on the world public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); + // change nearby chunks' biomes to the mod biome (radius in blocks) + pattern.findController(pos, level, true); } - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { super.onRemove(state, level, pos, newState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, false); + pattern.findController(pos, level, false); } @Override @@ -69,34 +68,12 @@ public InteractionResult onWrenched(BlockState state, UseOnContext context) { Player player = context.getPlayer(); if (player.getItemInHand(InteractionHand.OFF_HAND).is(Blocks.HOPPER.asItem())) { - level.setBlock(pos, CNBlocks.REACTOR_INPUT.getDefaultState().setValue(ReactorInput.FACING, context.getClickedFace()), 2); + level.setBlock(pos, CNBlocks.REACTOR_ROD_INPUT.getDefaultState().setValue(ReactorRodInput.FACING, context.getClickedFace()), 2); player.sendSystemMessage(Component.translatable("reactor.update.casing.input")); } return InteractionResult.SUCCESS; } - // En attendant le controller pour verifier le pattern - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } - } - } - return null; - } - @Override public Class getBlockEntityClass() { return ReactorCasingEntity.class; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasingEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasingEntity.java index bd9dc73c9..10eed24d2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasingEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/casing/ReactorCasingEntity.java @@ -10,23 +10,11 @@ public class ReactorCasingEntity extends SmartBlockEntity { - protected BlockPos controller; - public ReactorCasingEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - setController(pos); } @Override public void addBehaviours(List behaviours) { } - - public void setController(BlockPos pos) { - controller = new BlockPos(pos.getX()+4, pos.getY(), pos.getZ()+4); - } - - public BlockPos getController() { - return controller; - } - } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/EventTriggerPacket.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/EventTriggerPacket.java deleted file mode 100644 index 77cb368c8..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/EventTriggerPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.controller; - -import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.nuclearteam.createnuclear.foundation.events.overlay.EventTextOverlay; - -/** - * Packet sent from server to client to trigger a localized event overlay. - */ -public class EventTriggerPacket extends SimplePacketBase { - // Duration in ticks for which the overlay should be displayed - private final int duration; - - public EventTriggerPacket(int duration) { - this.duration = duration; - } - - // Decoder constructor - public EventTriggerPacket(FriendlyByteBuf buffer) { - this(buffer.readInt()); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(duration); - } - - @Override - public boolean handle(NetworkEvent.Context context) { - context.enqueueWork(() -> EventTextOverlay.triggerEvent(duration)); - return true; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java index e9fd5cc1b..5dc6423d8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java @@ -6,11 +6,16 @@ import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -20,31 +25,39 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; -import net.nuclearteam.createnuclear.CNBlockEntityTypes; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.content.multiblock.CNMultiblock; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; +import net.nuclearteam.createnuclear.*; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.block.HorizontalDirectionalReactorBlock; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @SuppressWarnings("deprecation") public class ReactorControllerBlock extends HorizontalDirectionalReactorBlock implements IWrenchable, IBE { public static final BooleanProperty ASSEMBLED = BooleanProperty.create("assembled"); + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); public ReactorControllerBlock(Properties properties) { super(properties); + this.registerDefaultState(this.stateDefinition.any() + .setValue(FACING, Direction.NORTH) + .setValue(ASSEMBLED, false) + .setValue(ACTIVE, false) // Inactive by default + ); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING).add(ASSEMBLED); + builder.add(FACING).add(ASSEMBLED).add(ACTIVE); super.createBlockStateDefinition(builder); } @@ -52,12 +65,21 @@ protected void createBlockStateDefinition(StateDefinition.Builder be.created = false); + if (worldIn.isClientSide) + return; + // A direct neighbor of the controller has changed. Do NOT blindly disassemble: + // only do so if the structure is actually broken. Otherwise, placing/replacing a + // block adjacent to the controller (frame above/below, input/alarm on the sides, + // cooler behind) would invalidate the assembly that was just validated. + // disassemble() checks findStructure and does nothing if the structure is complete. + if (state.getValue(ASSEMBLED)) + ReactorAssembler.disassemble(pos, worldIn); } @Override @@ -69,35 +91,47 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play if (!(blockEntity instanceof ReactorControllerBlockEntity controllerBlockEntity)) return InteractionResult.PASS; ItemStack heldItem = player.getItemInHand(handIn); + if (heldItem.is(Items.DEBUG_STICK)) { + withBlockEntityDo(worldIn, pos, be -> be.logReactorConnections(player)); + } if (!state.getValue(ASSEMBLED)) { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.none").withStyle(ChatFormatting.RED)); } else { - if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && controllerBlockEntity.inventory.getItem(0).isEmpty()){ + if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && controllerBlockEntity.getInventoryObject().getItem(0).isEmpty() && heldItem.getTag() != null){ withBlockEntityDo(worldIn, pos, be -> { - be.inventory.setStackInSlot(0, heldItem); - be.configuredPattern = heldItem; + be.getInventoryObject().setStackInSlot(0, heldItem); + be.setConfiguredPattern(heldItem); player.setItemInHand(handIn, ItemStack.EMPTY); }); + // Inserting the blueprint is what starts energy production: this is the activation + // cue, not the multiblock assembly one (that lives in ReactorAssembler). + // One-shot played server-side (null player) so it broadcasts to nearby clients. + worldIn.playSound(null, pos, CNSoundEvents.REACTOR_ACTIVATION.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); return InteractionResult.SUCCESS; } - else if (heldItem.isEmpty() && !controllerBlockEntity.inventory.getItem(0).isEmpty()) { + else if (heldItem.isEmpty() && !controllerBlockEntity.getInventoryObject().getItem(0).isEmpty()) { withBlockEntityDo(worldIn, pos, be -> { - player.setItemInHand(handIn, be.inventory.getItem(0)); - be.inventory.setStackInSlot(0, ItemStack.EMPTY); - be.configuredPattern = ItemStack.EMPTY; - be.total = 0.0; - be.rotate(be.getBlockState(), new BlockPos(be.getBlockPos().getX(), be.getBlockPos().getY() + (-3), be.getBlockPos().getZ()), be.getLevel(), 0); + if (IHeat.HeatLevel.of(be.getInventoryObject().getItem(0).getOrCreateTag().getInt("heat"), be.getMultiblockSize()) == IHeat.HeatLevel.DANGER) { + be.getAdvancement().setPlayer(player.getUUID()); + be.getAdvancement().awardPlayer(CNAdvancement.NO_TIME_TO_DIE); + } + player.setItemInHand(handIn, be.getInventoryObject().getItem(0)); + be.getInventoryObject().setStackInSlot(0, ItemStack.EMPTY); + be.setConfiguredPattern(ItemStack.EMPTY); + //be.clearTimers(); // uncomment if the timer should reset when the reactor stops + be.getOutputManager().rotateOutputs(be.getLevel(), be.getAssembled(), 0); be.notifyUpdate(); }); + // Blueprint removed: the multiblock stays assembled, it just stops producing. + worldIn.playSound(null, pos, CNSoundEvents.REACTOR_SHUT_OFF.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); state.setValue(ASSEMBLED, false); return InteractionResult.SUCCESS; } - else if (!heldItem.isEmpty() && !controllerBlockEntity.inventory.getItem(0).isEmpty()) { + else if (!heldItem.isEmpty() && !controllerBlockEntity.getInventoryObject().getItem(0).isEmpty()) { return InteractionResult.PASS; } } @@ -109,90 +143,42 @@ public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState n if (!state.hasBlockEntity() || state.getBlock() == newState.getBlock()) return; - withBlockEntityDo(worldIn, pos, be -> ItemHelper.dropContents(worldIn, pos, be.inventory)); + withBlockEntityDo(worldIn, pos, be -> ItemHelper.dropContents(worldIn, pos, be.getInventoryObject())); worldIn.removeBlockEntity(pos); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - - controller.Rotate(state, pos.below(3), worldIn, 0); - List players = worldIn.players(); - for (Player p : players) { - p.sendSystemMessage(Component.translatable("reactor.info.assembled.destroyer")); + if (worldIn instanceof ServerLevel serverLevel) { + PersistentFluidLocks.get(serverLevel).clearLock(pos); } + + if (!state.getValue(ASSEMBLED)) + return; + + int configRadius = CNConfigs.server().notify.warningDistance.get(); + boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + NotifyUtil.sendActionBar(worldIn, pos, + CreateNuclearLang.translate("notification.reactor.disassembled"), + ChatFormatting.GOLD, configRadius, configWarnAll + ); } @Override - public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { - super.onPlace(state, level, pos, oldState, movedByPiston); + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); if (state.getValue(ASSEMBLED)) return; - List players = level.players(); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - controller.Verify(state, pos, level, players, true); + ReactorAssembler.assemble(pos, level); } @Override public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { super.playerDestroy(level, player, pos, state, blockEntity, tool); - ReactorControllerBlock controller = (ReactorControllerBlock) state.getBlock(); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos); - if (!entity.created) - return; - controller.Rotate(state, pos.below(3), level, 0); - List players = level.players(); - for (Player p : players) { + if (!(blockEntity instanceof ReactorControllerBlockEntity entity)) return; + if (!entity.isAssembled()) return; + for (Player p : level.players()) { p.sendSystemMessage(Component.translatable("reactor.info.assembled.creator")); } - } - - // this is the Function that verifies if the pattern is correct (as a test, we added the energy output) - public void Verify(BlockState state, BlockPos pos, Level level, List players, boolean create){ - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(pos).getBlock(); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos); - var result = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, pos); // control the pattern - if (result != null) { // the pattern is correct - - for (Player player : players) { - if (create && !entity.created) { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.creator")); - level.setBlockAndUpdate(pos, state.setValue(ASSEMBLED, true)); - entity.created = true; - entity.destroyed = false; - } - } - return; - } - - // the pattern is incorrect - for (Player player : players) { - if (!create && !entity.destroyed) - { - player.sendSystemMessage(Component.translatable("reactor.info.assembled.destroyer")); - level.setBlockAndUpdate(pos, state.setValue(ASSEMBLED, false)); - entity.created = false; - entity.destroyed = true; - Rotate(state, pos.below(3), level, 0); - } - } - } - public void Rotate(BlockState state, BlockPos pos, Level level, int rotation) { - if (level.getBlockState(pos).is(CNBlocks.REACTOR_OUTPUT.get())) { - ReactorOutput block = (ReactorOutput) level.getBlockState(pos).getBlock(); - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - - if (state.getValue(ASSEMBLED) && rotation != 0) { // Starting the energy - entity.speed = rotation; - entity.setSpeed(Math.abs(entity.speed)); - } else { // stopping the energy - - entity.setSpeed(0); - entity.speed = 0; - } - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - - entity.setSpeed(rotation); - } +// entity.removeIOAll(); } @Override @@ -204,5 +190,4 @@ public Class getBlockEntityClass() { public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_CONTROLLER.get(); } - } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java index e595c8f2e..1727f1671 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlockEntity.java @@ -3,484 +3,535 @@ import com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.IInteractionChecker; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; +import net.minecraft.client.Minecraft; +import net.minecraft.core.*; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Explosion; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.nuclearteam.createnuclear.*; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.IItemHandler; + +import net.nuclearteam.createnuclear.CNSoundEvents; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.multiblock.IMultiblockController; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorGoggleTooltipRenderer; +import net.nuclearteam.createnuclear.content.multiblock.controller.service.*; +import net.nuclearteam.createnuclear.content.multiblock.controller.snapshot.ReactorInputSnapshot; +import net.nuclearteam.createnuclear.content.multiblock.controller.snapshot.ReactorInputSnapshotBuilder; import net.nuclearteam.createnuclear.content.multiblock.IHeat; -import net.nuclearteam.createnuclear.content.multiblock.input.ReactorInputEntity; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; +import net.nuclearteam.createnuclear.content.multiblock.controller.consumable.ConsumptionCycleManager; +import java.util.ArrayList; import java.util.List; -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; + import static net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock.ASSEMBLED; -@SuppressWarnings({"unused"}) -public class ReactorControllerBlockEntity extends SmartBlockEntity implements IInteractionChecker, IHaveGoggleInformation { - public boolean destroyed = false; - public boolean created = false; - public boolean test = true; - public int speed = 16; // This is the result speed of the reactor, change this to change the total capacity - - public boolean sendUpdate; - - public ReactorControllerBlock controller; - - public ReactorControllerInventory inventory; - - //public LinkedHashSet> attachedInventory; - - //private boolean powered; - public State powered = State.OFF; - public float reactorPower; - public float lastReactorPower; - int overFlowHeatTimer = 0; - int overFlowLimiter = 30; - double overHeat = 0; - public int baseUraniumHeat = 25; - public int baseGraphiteHeat = -10; - public int proximityUraniumHeat = 5; - public int proximityGraphiteHeat = -5; - public int maxUraniumPerGraphite = 3; - public int graphiteTimer = 3600; - public int uraniumTimer = 3600; - public int countUraniumRod; - public int countGraphiteRod; - public int heat; - public double total; - public CompoundTag screen_pattern = new CompoundTag(); - public ItemStack configuredPattern; - - private ItemStack fuelItem; - private ItemStack coolerItem; - - private final int[][] formattedPattern = new int[][]{ - {99,99,99,0,1,2,99,99,99}, - {99,99,3,4,5,6,7,99,99}, - {99,8,9,10,11,12,13,14,99}, - {15,16,17,18,19,20,21,22,23}, - {24,25,26,27,28,29,30,31,32}, - {33,34,35,36,37,38,39,40,41}, - {99,42,43,44,45,46,47,48,99}, - {99,99,49,50,51,52,53,99,99}, - {99,99,99,54,55,56,99,99,99} - }; - private final int[][] offsets = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; +@SuppressWarnings({ "unused" }) +public class ReactorControllerBlockEntity extends SmartBlockEntity + implements IInteractionChecker, IHaveGoggleInformation, IMultiblockController { + /** + * The assembled state is stored in the block state + * (`ReactorControllerBlock.ASSEMBLED`). + * Use the helper accessors below to query or toggle it to keep + * entity/blockstate consistent. + */ + private final ReactorPattern pattern = new ReactorPattern(); + private final ReactorControllerInventory inventory; + private int countFuelRod; + private int countCoolerRod; + private HeatBalance heatBalance; + private int heat; + private int lastAppliedOutputHeat; + private boolean isExploding = false; + + /** Client-only looping "running" sound instance; never accessed server-side. */ + @OnlyIn(Dist.CLIENT) + private ReactorRunningSoundInstance runningSound; + + private final ConsumptionCycleManager cycleManager = new ConsumptionCycleManager(); + private double liquidLife; + private ItemStack configuredPattern; + + private List bigFluidStack; + + private int reactorSize = 0; + private Direction reactorFacing = null; + // les pos sont [xMin, xMax, yMin, yMax, zMin, zMax] + private BoundingBox reactorPos; + + + private boolean needsToResolveEntities = false; + private double fluidBuffer = 0.0; + + private CNAdvancementBehaviour advancement; + + private final ReactorInputManagerI inputManager; + private final ReactorOutputManagerI outputManager; + private final ReactorInputFluidManagerI inputFluidManager; + private final ReactorAlarmManagerI alarmManager; + private final ReactorFrameDisplayManagerI frameDisplayManager; + + private ReactorDisplayState displayState = ReactorDisplayState.EMPTY; + + // services (dependencies) - abstracted behind interfaces to follow DIP + private final IHeatService heatService; + private final IPersistenceService persistenceService; + private final IExplosionService meltdownExecutor; + private final IReactorHeatUpdateCoordinator heatCoordinator; + private final IFluidConsumptionRateCalculator fluidRateCalculator; + /** Counts down to the next explosion once in danger; keeps the original 1-tick lag against the heat recalculated later this tick. */ + private final IReactorMeltdownMonitor meltdownMonitor; + /** Drives the alarm blocks based on the danger flag; built in {@link #addBehaviours} since it depends on {@link #advancement}. */ + private IReactorAlarmCoordinator alarmCoordinator; + + // service fields are injected; implementations live in separate classes + + // --- Accessors used by external services (persistence) --- + public ReactorControllerInventory getInventoryObject() { + return this.inventory; + } + + public void deserializeInventory(CompoundTag tag) { + this.inventory.deserializeNBT(tag); + } + + public CompoundTag serializeInventory() { + return this.inventory.serializeNBT(); + } + + public ItemStack getConfiguredPattern() { + return this.configuredPattern; + } + + public void setConfiguredPattern(ItemStack stack) { + this.configuredPattern = stack; + } + + public CompoundTag getConfiguredPatternTag() { + return this.configuredPattern.getTag(); + } + + /** @return the first loaded fluid, or {@code null} if no fluid is present. */ + private BigFluidStack currentFluidStack() { + return bigFluidStack.isEmpty() ? null : bigFluidStack.get(0); + } + + public List getBigFluidStack() { + return this.bigFluidStack; + } + + public void setBigFluidStack(List b) { + this.bigFluidStack = b; + } + + public int getMultiblockSize() { + return this.reactorSize; + } + + public void setMultiblockSize(int s) { + this.reactorSize = s; + } + + @Override + public Direction getMultiblockFacing() { + return this.reactorFacing; + } + + @Override + public void setMultiblockFacing(Direction f) { + this.reactorFacing = f; + } + + public CNAdvancementBehaviour getAdvancement() { + return this.advancement; + } + /** Main constructor allowing dependency injection for testability and DIP compliance. */ + public BoundingBox getMultiblockPos() { + return this.reactorPos; + } + public void setMultiblockStructure(BoundingBox p) { + this.reactorPos = p; + } + public void clearTimers() { + this.cycleManager.clear(); + } + + public ReactorFrameDisplayManagerI getFrameDisplayManager() { + return this.frameDisplayManager; + } + + public ReactorInputFluidManagerI getInputFluidManager() { + return this.inputFluidManager; + } + + public ReactorOutputManagerI getOutputManager() { + return this.outputManager; + } + + public void setDisplayState(ReactorDisplayState state) { + this.displayState = state; + } + + public ReactorDisplayState getDisplayState() { + return this.displayState; + } + + private List allManagers() { + return List.of(inputManager, inputFluidManager, outputManager, alarmManager); + } + + /** + * Main constructor allowing dependency injection for testability and DIP + * compliance. + */ public ReactorControllerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - inventory = new ReactorControllerInventory(this); - configuredPattern = ItemStack.EMPTY; - //attachedInventory = new LinkedHashSet<>(); + this.inventory = new ReactorControllerInventory(this); + this.configuredPattern = ItemStack.EMPTY; + this.heatBalance = new HeatBalance(0, 0); + + this.inputManager = new ReactorInputManager(); + this.outputManager = new ReactorOutputManager(); + this.inputFluidManager = new ReactorInputFluidManager(); + this.alarmManager = new ReactorAlarmManager(); + this.frameDisplayManager = new ReactorFrameDisplayManager(); + + this.bigFluidStack = new ArrayList<>(); + + this.heatService = new DefaultHeatService(new HeatManager()); + this.persistenceService = new DefaultPersistenceService(); + this.meltdownExecutor = new ReactorMeltdownExecutor(); + this.heatCoordinator = new ReactorHeatUpdateCoordinator(this.heatService); + this.fluidRateCalculator = new FluidConsumptionRateCalculator(this.heatService); + this.meltdownMonitor = new ReactorMeltdownMonitor(); } @Override public void addBehaviours(List behaviours) { - + behaviours.add(advancement = new CNAdvancementBehaviour(this, CNAdvancement.T1_REACTOR, CNAdvancement.T2_REACTOR, CNAdvancement.T3_REACTOR, CNAdvancement.NO_TIME_TO_DIE, CNAdvancement.SILENCE_THE_CORE)); + this.alarmCoordinator = new ReactorAlarmCoordinator(advancement); } - public boolean getAssembled() { // permet de savoir si le réacteur est formé ou pas. + public boolean getAssembled() { // returns whether the reactor structure is currently assembled BlockState state = getBlockState(); return state.getValue(ASSEMBLED); } @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - if(!configuredPattern.getOrCreateTag().isEmpty()) { - CreateLang.translate("gui.gauge.info_header") - .style(ChatFormatting.GRAY) - .forGoggles(tooltip); - IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); - - IHeat.HeatLevel.getFormattedHeatText(configuredPattern.getOrCreateTag().getInt("heat")).forGoggles(tooltip); - - if (fuelItem.isEmpty()) { - // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.URANIUM_ROD.asItem(), 1), true).forGoggles(tooltip); - } else { - IHeat.HeatLevel.getFormattedItemText(fuelItem, false).forGoggles(tooltip); - } + CompoundTag patternTag = this.getConfiguredPatternTag(); - if (fuelItem.isEmpty()) { - // if rod empty we initialize it at 1 (and display it as 0) to avoid having air item displayed instead of the rod - IHeat.HeatLevel.getFormattedItemText(new ItemStack(CNItems.GRAPHITE_ROD.asItem(), 1), true).forGoggles(tooltip); - } else { - IHeat.HeatLevel.getFormattedItemText(coolerItem, false).forGoggles(tooltip); - } + if (patternTag == null || patternTag.isEmpty()) { + return false; } + ReactorGoggleTooltipRenderer.render(tooltip, displayState, patternTag.getInt("heat"), isPlayerSneaking, reactorSize); + return true; } - - //(Si les methode read et write ne sont pas implémenté alors lorsque l'on relance le monde minecraft les items dans le composant auront disparu !) + // (If read/write are not implemented, the items stored in this block entity's + // inventory will be lost when the world is reloaded!) @Override - protected void read(CompoundTag compound, boolean clientPacket) { //Permet de stocker les item 1/2 - if (!clientPacket) { - inventory.deserializeNBT(compound.getCompound("pattern")); - } - configuredPattern = ItemStack.of(compound.getCompound("items")); - if (ItemStack.of(compound.getCompound("cooler")) != null || ItemStack.of(compound.getCompound("fuel")) != null) { - coolerItem = ItemStack.of(compound.getCompound("cooler")); - fuelItem = ItemStack.of(compound.getCompound("fuel")); - + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); // Always call first to restore the base coordinates + // delegate managers and persistence + this.inputManager.read(compound); + this.outputManager.read(compound); + this.inputFluidManager.read(compound); + this.alarmManager.read(compound); + this.frameDisplayManager.read(compound); + + this.persistenceService.readBasicState(this, compound, clientPacket); + this.needsToResolveEntities = true; + + this.cycleManager.clear(); + if (compound.contains("cycleManager")) { + this.cycleManager.deserializeNBT(compound.getCompound("cycleManager")); } - /* - countGraphiteRod = compound.getInt("countGraphiteRod"); - countUraniumRod = compound.getInt("countUraniumRod"); - graphiteTimer = compound.getInt("graphiteTimer"); - uraniumTimer = compound.getInt("uraniumTimer"); - heat = compound.getInt("heat"); -*/ - total = compound.getDouble("total"); - super.read(compound, clientPacket); } @Override - protected void write(CompoundTag compound, boolean clientPacket) { //Permet de stocker les item 2/2 - if (!clientPacket) { - compound.put("pattern", inventory.serializeNBT()); - //compound.putBoolean("powered", isPowered()); - } - compound.put("items", configuredPattern.serializeNBT()); + protected void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + this.inputManager.write(compound); + this.outputManager.write(compound); + this.inputFluidManager.write(compound); + this.alarmManager.write(compound); + this.frameDisplayManager.write(compound); + + this.persistenceService.writeBasicState(this, compound, clientPacket); - if (coolerItem != null || fuelItem != null) { - compound.put("cooler", coolerItem.serializeNBT()); - compound.put("fuel", fuelItem.serializeNBT()); + compound.put("cycleManager", cycleManager.serializeNBT()); + } + + public boolean isAssembled() { + if (level == null) + return false; + try { + return level.getBlockState(worldPosition).getValue(ASSEMBLED); + } catch (Exception e) { + return false; } - /*compound.putInt("countGraphiteRod", countGraphiteRod); - compound.putInt("countUraniumRod", countUraniumRod); - compound.putInt("graphiteTimer", graphiteTimer); - compound.putInt("uraniumTimer", uraniumTimer); - compound.putInt("heat", heat); - compound.putString("state", powered.name()); - compound.put("screen_pattern", screen_pattern); -*/ - compound.putDouble("total", calculateProgress()); - super.write(compound, clientPacket); } - public enum State { - ON, OFF + public void setAssembled(boolean assembled) { + if (level == null) + return; + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(ASSEMBLED, assembled)); + this.setChanged(); } - private void explodeReactorCore(Level level, BlockPos pos) { - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - BlockPos currentPos = pos.offset(x, y, z); - //le problème viens de la il ne rentre pas dans le if - if (level.getBlockState(currentPos).is(CNBlocks.REACTOR_CORE.get())) { - // Create and execute the explosion - Explosion explosion = new Explosion(level, null, currentPos.getX(), currentPos.getY(), currentPos.getZ(), 4.0F, false, Explosion.BlockInteraction.DESTROY); - explosion.explode(); - explosion.finalizeExplosion(true); - } - } - } + public void logReactorConnections(Player player) { + ReactorDebugDiagnostics.sendReactorConnectionsTo(player, level, inputManager, inputFluidManager, outputManager, alarmManager); + } + + private void updateReactorStateVisibility() { + if (level == null || level.isClientSide) return; + + BlockState state = getBlockState(); + if (!(state.getBlock() instanceof ReactorControllerBlock)) return; + + boolean currentActive = state.getValue(ReactorControllerBlock.ACTIVE); + + // The reactor is "ACTIVE" (ON) only if it is assembled AND has the resources required to run + boolean targetActive = isAssembled() && heatCoordinator.canRun(getConfiguredPattern(), getDisplayState(), getInputFluidManager(), level, getAssembled()); + + if (currentActive != targetActive) { + level.setBlock(worldPosition, state.setValue(ReactorControllerBlock.ACTIVE, targetActive), 3); } } @Override public void tick() { super.tick(); - if (level.isClientSide) + if (level.isClientSide) { + tickRunningSound(); + return; + } + if (isExploding) return; + // Heat value written by the previous tick's handleAssembledState(); this tick's recalculated + // heat is not visible here yet, so the alarm/meltdown danger flag is intentionally 1 tick behind. + int currentHeat = (int) configuredPattern.getOrCreateTag().getDouble("heat"); + boolean isDanger = alarmCoordinator.computeDanger(currentHeat, this.getMultiblockSize()); + + alarmCoordinator.update(level, alarmManager, isDanger); + + IReactorMeltdownMonitor.MeltdownState meltdownState = meltdownMonitor.tick(level, getBlockPos(), isDanger); + + if (meltdownState == IReactorMeltdownMonitor.MeltdownState.EXPLODE) { + if (level instanceof ServerLevel serverLevel) { + this.meltdownExecutor.triggerExplosion(serverLevel, getBlockPos(), reactorSize, countFuelRod); - if (isEmptyConfiguredPattern()) { - - BlockEntity blockEntity = level.getBlockEntity(getBlockPosForReactor('I')); - - - - if (blockEntity instanceof ReactorInputEntity be) { - CompoundTag tag = be.serializeNBT(); - ListTag inventoryTag = tag.getCompound("Inventory").getList("Items", Tag.TAG_COMPOUND); - fuelItem = ItemStack.of(inventoryTag.getCompound(0)); - coolerItem = ItemStack.of(inventoryTag.getCompound(1)); - if (fuelItem.getCount() > 0 && coolerItem.getCount() > 0) { - configuredPattern.getOrCreateTag().putDouble("heat", calculateHeat(tag)); - if (updateTimers()) { - be.inventory.extractItem(0, 1, false); - be.inventory.extractItem(1, 1, false); - total = calculateProgress(); - int heat = (int) configuredPattern.getOrCreateTag().getDouble("heat"); - - if (IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.SAFETY || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.CAUTION || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.WARNING) { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), heat/4); - } else { - // Send a packet to all clients around this block within 16 blocks - EventTriggerPacket packet = new EventTriggerPacket(600); // display for 100 ticks - CreateNuclear.LOGGER.warn("hum EventTriggerBlock ? {}", packet); - CNPackets.sendToNear(level, getBlockPos(), 32, packet); - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0); - } - return; - } - } else { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0); - } - - /*if (fuelItem.getCount() > 0 && coolerItem.getCount() > 0) { - configuredPattern.getOrCreateTag().putDouble("heat", calculateHeat(tag)); - if (updateTimers()) { - TransferUtil.extract(be.inventory, ItemVariant.of(fuelItem), 1); - TransferUtil.extract(be.inventory, ItemVariant.of(coolerItem), 1); - total = calculateProgress(); - int heat = (int) configuredPattern.getOrCreateTag().getDouble("heat"); - - if (IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.SAFETY || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.CAUTION || IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.WARNING) { - //j'ai divisé la chaleur par 4, car maintenant on a mis la chaleur sur 1000 et non plus sur 200 en ayant rajouté 1/5 de bonus - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), heat/4); - } else { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0); - } - return; - } - } else { - this.rotate(getBlockState(), new BlockPos(getBlockPos().getX(), getBlockPos().getY() + FindController('O').getY(), getBlockPos().getZ()), getLevel(), 0); - } - */ - - this.notifyUpdate(); } + isExploding = true; + return; } - } - private boolean isEmptyConfiguredPattern() { - return !configuredPattern.isEmpty() || !configuredPattern.getOrCreateTag().isEmpty(); - } + if (!isEmptyConfiguredPattern()) { + int heat = (int) this.getConfiguredPatternTag().getDouble("heat"); + countCoolerRod = this.getConfiguredPatternTag().getInt("countCoolerRod"); + countFuelRod = this.getConfiguredPatternTag().getInt("countFuelRod"); + heatBalance = heatCoordinator.calculateHeatBalance(configuredPattern, displayState, level); + } + resolveEntitiesIfNeeded(); - private boolean updateTimers() { + ReactorInputSnapshot snapshot = ReactorInputSnapshotBuilder.build(level, inputManager, inputFluidManager); + this.displayState = new ReactorDisplayState(snapshot.items(), snapshot.fluids(), snapshot.maxFluidCapacity()); + this.bigFluidStack = snapshot.fluids(); - total -= 1; - return total <= 0;//(total/constTotal) <= 0; + updateReactorStateVisibility(); + handleAssembledState(); } - private double calculateProgress() { - countGraphiteRod = configuredPattern.getOrCreateTag().getInt("countGraphiteRod"); - countUraniumRod = configuredPattern.getOrCreateTag().getInt("countUraniumRod"); - // graphiteTimer = configuredPattern.getOrCreateTag().getInt("graphiteTime"); - // uraniumTimer = configuredPattern.getOrCreateTag().getInt("uraniumTime"); + /** + * Client-side: keep the looping "running" sound alive while the reactor is producing energy. + * Driven by the {@code ACTIVE} blockstate property, which the server recomputes every tick in + * {@link #updateReactorStateVisibility()} and vanilla syncs to the client automatically. + */ + @OnlyIn(Dist.CLIENT) + private void tickRunningSound() { + BlockState state = getBlockState(); + boolean active = state.hasProperty(ReactorControllerBlock.ACTIVE) + && state.getValue(ReactorControllerBlock.ACTIVE); - double totalGraphiteRodLife = (double) graphiteTimer / countGraphiteRod; - double totalUraniumRodLife = (double) uraniumTimer / countUraniumRod; + if (!active) { + if (runningSound != null) { + runningSound.stopSound(); + runningSound = null; + } + return; + } - return totalGraphiteRodLife + totalUraniumRodLife; + if (runningSound == null || runningSound.isStopped()) { + runningSound = new ReactorRunningSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_RUNNING.getMainEvent()); + Minecraft.getInstance().getSoundManager().play(runningSound); + } } - private double calculateHeat(CompoundTag tag) { - countGraphiteRod = configuredPattern.getOrCreateTag().getInt("countGraphiteRod"); - countUraniumRod = configuredPattern.getOrCreateTag().getInt("countUraniumRod"); - heat = 0; + // --- extracted sub-steps to keep single responsibility per method --- + private void resolveEntitiesIfNeeded() { + if (!needsToResolveEntities) + return; + List handlers = inputManager.getItemHandlers(level); + CreateNuclear.LOGGER.warn("Resolving inputs after load, handlers found: {}", handlers.size()); + needsToResolveEntities = false; + this.setChanged(); + } - // if more than maxUraniumPerGraphite of the rods are uranium, the reactor will overheat - if (countUraniumRod > countGraphiteRod * maxUraniumPerGraphite) { - overFlowHeatTimer++; - if (overFlowHeatTimer >= overFlowLimiter) { - overHeat+=1; - overFlowHeatTimer= 0; - if (overFlowLimiter > 2) { - overFlowLimiter -= 1; - } - } - } else { - overFlowHeatTimer = 0; - overFlowLimiter = 30; - if (overHeat > 0) { - overHeat -= 2; - } else { - overHeat = 0; + /** + * Tick logic applied while the reactor is assembled: if it doesn't have + * enough fuel ({@link IReactorHeatUpdateCoordinator#canRun}), only the + * displayed heat is updated (and outputs stopped); otherwise the actual + * heat is calculated, fluid consumed, the item consumption cycle advanced, + * and outputs rotated according to the heat. + */ + private void handleAssembledState() { + if (!heatCoordinator.canRun(configuredPattern, displayState, inputFluidManager, level, isAssembled())) { + heatCoordinator.updateHeatOnly(configuredPattern, displayState, currentFluidStack(), heatBalance, heat, inventory, level, isAssembled()); + if (!outputManager.getBlocksPosition(getLevel()).isEmpty()) { + outputManager.rotateOutputs(getLevel(), getAssembled(), 0); } + + setChanged(); + notifyUpdate(); + return; } - // the offsets for the four directions (down, up, right, left) is int[][] offsets = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; (defined at the top of the class) - String currentRod = ""; - ListTag list = inventory.getStackInSlot(0).getOrCreateTag().getCompound("pattern").getList("Items", Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - if (ItemStack.of(list.getCompound(i)).is(CNTags.CNItemTags.FUEL.tag)) { - heat += baseUraniumHeat; - currentRod = "u"; - } else if (ItemStack.of(list.getCompound(i)).is(CNTags.CNItemTags.COOLER.tag)) { - heat += baseGraphiteHeat; - currentRod = "g"; - } - for (int j = 0; j < formattedPattern.length; j++) { - for (int k = 0; k < formattedPattern[j].length; k++) { - // Skip if the current pattern value is 99 - if (formattedPattern[j][k] == 99) continue; - - // Check if the current slot matches the pattern - if (list.getCompound(i).getInt("Slot") != formattedPattern[j][k]) continue; - - // For each neighbor (up, down, right, left) - for (int[] offset : offsets) { - int nj = j + offset[0]; - int nk = k + offset[1]; - - // Check if the indices are within the array boundaries - if (nj < 0 || nj >= formattedPattern.length || nk < 0 || nk >= formattedPattern[j].length) - continue; - - int neighborSlot = formattedPattern[nj][nk]; - - // Loop through the list to find the neighbor slot - for (int l = 0; l < list.size(); l++) { - if (list.getCompound(l).getInt("Slot") == neighborSlot) { - // If the currentRod equals "u", apply the corresponding heat - if (currentRod.equals("u")) { - ItemStack stack = ItemStack.of(list.getCompound(i)); - if (stack.is(CNTags.CNItemTags.FUEL.tag)) { - heat += proximityUraniumHeat; - } else if (stack.is(CNTags.CNItemTags.COOLER.tag)) { - heat += proximityGraphiteHeat; - } - } - } - } - } - } + + setChanged(); + notifyUpdate(); + + BigFluidStack fluidStack = currentFluidStack(); + heat = heatCoordinator.calculateAndWriteHeat(configuredPattern, fluidStack, heatBalance, heat, inventory, level, displayState); + fluidBuffer = fluidRateCalculator.tick(fluidStack, reactorSize, level, inputFluidManager, fluidBuffer); + cycleManager.update(configuredPattern, level, inputManager, level.getGameTime() % 20 == 0); + + if (IHeat.HeatLevel.isNotDanger(heat, getMultiblockSize()) && !outputManager.getBlocksPosition(level).isEmpty()) { + if (Math.abs(heat - lastAppliedOutputHeat) >= ReactorOutputManager.RPM_DIVIDER / 2) { + lastAppliedOutputHeat = heat; } + outputManager.rotateOutputs(getLevel(), getAssembled(), lastAppliedOutputHeat); } - return heat + overHeat; } - private BlockPos getBlockPosForReactor(char character) { - BlockPos pos = FindController(character); - BlockPos posController = getBlockPos(); - BlockPos posInput = new BlockPos(posController.getX(), posController.getY(), posController.getZ()); + private boolean isEmptyConfiguredPattern() { + return configuredPattern.isEmpty() || this.getConfiguredPatternTag().isEmpty(); + } - int[][] directions = { - {0,0, pos.getX()}, // NORTH - {0,0, -pos.getX()}, // SOUTH - {-pos.getX(),0,0}, // EAST - {pos.getX(),0,0} // WEST - }; + public void addInput(BlockPos inputPos) { + this.inputManager.addBlock(inputPos); + this.setChanged(); + } + public void removeInput(BlockPos inputPos) { + this.inputManager.removeBlock(inputPos); + this.setChanged(); + } - for (int[] direction : directions) { - BlockPos newPos = posController.offset(direction[0], direction[1], direction[2]); - if (level.getBlockState(newPos).is(CNBlocks.REACTOR_INPUT.get())) { - posInput = newPos; - break; - } - } + public void addOutput(BlockPos outputPos) { + this.outputManager.addBlock(outputPos); + this.setChanged(); + } - return posInput; - } - - private CompoundTag convertePattern(CompoundTag compoundTag) { - ListTag pattern = compoundTag.getList("Items", Tag.TAG_COMPOUND); - - int[][] list = new int[][]{ - {99,99,99,0,1,2,99,99,99}, - {99,99,3,4,5,6,7,99,99}, - {99,8,9,10,11,12,13,14,99}, - {15,16,17,18,19,20,21,22,23}, - {24,25,26,27,28,29,30,31,32}, - {33,34,35,36,37,38,39,40,41}, - {99,42,43,44,45,46,47,48,99}, - {99,99,49,50,51,52,53,99,99}, - {99,99,99,54,55,56,99,99,99} - }; - - - return null; - } - - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_INPUT.get())) - .getDistanceController(character); - } - - public void rotate(BlockState state, BlockPos pos, Level level, int rotation) { - if (level.getBlockState(pos).is(CNBlocks.REACTOR_OUTPUT.get()) && rotation > 0) { - if (level.getBlockState(pos).getBlock() instanceof ReactorOutput block) { - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - if (state.getValue(ASSEMBLED)) { // Starting the energy - entity.speed = rotation; - entity.heat = rotation; - } else { // stopping the energy - entity.speed = 0; - entity.heat = 0; - } - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - entity.setSpeed(rotation); + public void removeOutput(BlockPos outputPos) { + this.outputManager.removeBlock(outputPos); + this.setChanged(); + } - } - } - else { - if (level.getBlockState(pos).getBlock() instanceof ReactorOutput block) { - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - entity.setSpeed(0); - entity.heat = 0; - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - } + public void addInputFluid(BlockPos outputPos) { + this.inputFluidManager.addBlock(outputPos); + this.setChanged(); + } + + public void removeInputFluid(BlockPos outputPos) { + this.inputFluidManager.removeBlock(outputPos); + this.setChanged(); + // Breaking a fluid input discards its tank contents along with the block entity. + // Re-evaluate the fluid lock so a different fluid can be accepted once no remaining + // input still holds liquid — otherwise the controller stays locked to the old fluid. + clearLockIfAllInputsEmpty(); + } + + public void addAlarm(BlockPos alarmPos) { + this.alarmManager.addBlock(alarmPos); + this.setChanged(); + } + + public void removeAlarm(BlockPos alarmPos) { + this.alarmManager.removeBlock(alarmPos); + this.setChanged(); + } + + public void removeIOAll() { + allManagers().forEach(m -> m.clearInvalid(level)); + this.setChanged(); + } + + /** Try to lock this controller to the given Fluid. Returns true if allowed. */ + public boolean tryLockFluid(Fluid fluid) { + // Fluid locks are server-authoritative and persisted per-level via PersistentFluidLocks. + // On the client there is no lock to enforce, so stay permissive. + if (level instanceof ServerLevel serverLevel) { + return PersistentFluidLocks.get(serverLevel).tryLock(getBlockPos(), fluid); } + return true; } - public InteractionResult onClick(Player player, InteractionHand hand) { - ItemStack heldItem = player.getItemInHand(hand); - if (heldItem.is(CNItems.REACTOR_BLUEPRINT.get()) && !heldItem.isEmpty()) { - if (configuredPattern.isEmpty()) { - inventory.setStackInSlot(0, heldItem); - configuredPattern = heldItem; - //player.setItemInHand(hand, ItemStack.EMPTY); - } - notifyUpdate(); - return InteractionResult.SUCCESS; + /** Returns whether the given FluidStack is acceptable for this controller. */ + public boolean canAcceptFluid(FluidStack stack) { + if (stack == null || stack.isEmpty()) + return true; + if (level instanceof ServerLevel serverLevel) { + return PersistentFluidLocks.get(serverLevel).canAccept(getBlockPos(), stack.getFluid()); } - else if (heldItem.isEmpty()) { - if (configuredPattern.isEmpty()) { - if (!level.isClientSide) { - if (player.addItem(configuredPattern)){ - configuredPattern = ItemStack.EMPTY; - } - else { - player.setItemInHand(hand, configuredPattern); - inventory.setStackInSlot(0, ItemStack.EMPTY); - } - notifyUpdate(); - return InteractionResult.CONSUME; - //return InteractionResult.FAIL; - } - else return InteractionResult.SUCCESS; - } + return true; + } + + /** Force-clear the lock on this controller. */ + public void clearLock() { + if (level instanceof ServerLevel serverLevel) { + PersistentFluidLocks.get(serverLevel).clearLock(getBlockPos()); + setChanged(); + sendData(); } - return InteractionResult.PASS; + } + + public void clearLockIfAllInputsEmpty() { + if (level == null || level.isClientSide) + return; + + boolean anyNonEmpty = getInputFluidManager().getFuildHandlers(level).stream() + .anyMatch(handler -> { + for (int t = 0; t < handler.getTanks(); t++) + if (!handler.getFluidInTank(t).isEmpty()) + return true; + return false; + }); + + if (!anyNonEmpty) + clearLock(); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java index 6fc5b3006..8a2fafdee 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerGenerator.java @@ -8,6 +8,7 @@ import net.minecraftforge.client.model.generators.ModelFile; public class ReactorControllerGenerator extends SpecialBlockStateGen { + @Override protected int getXRotation(BlockState state) { return 0; @@ -15,11 +16,52 @@ protected int getXRotation(BlockState state) { @Override protected int getYRotation(BlockState state) { + if (state == null || !state.hasProperty(ReactorControllerBlock.FACING)) { + return 0; + } return horizontalAngle(state.getValue(ReactorControllerBlock.FACING)); } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - return prov.models().getExistingFile(prov.modLoc("block/reactor/controller/block")); + final String controllerPath = "block/reactor/controller/controller_panel_"; + + // Safety fallback if the state is invalid at the start of Minecraft's block scan + if (!state.hasProperty(ReactorControllerBlock.ASSEMBLED) || !state.hasProperty(ReactorControllerBlock.ACTIVE)) { + return prov.models() + .withExistingParent("block/reactor/controller/" + ControllerVisualState.OFF.getSuffix(), prov.modLoc("block/reactor/controller/block")) + .texture("1", prov.modLoc(controllerPath + ControllerVisualState.OFF.getSuffix())) + .texture("particle", prov.modLoc(controllerPath + ControllerVisualState.OFF.getSuffix())); + } + + boolean isAssembled = state.getValue(ReactorControllerBlock.ASSEMBLED); + boolean isActive = state.getValue(ReactorControllerBlock.ACTIVE); + + ControllerVisualState controllerState = ControllerVisualState.OFF; + if (isAssembled) { + controllerState = isActive ? ControllerVisualState.ON : ControllerVisualState.STANDBY; + } + + return prov.models() + .withExistingParent("block/reactor/controller/" + controllerState.getSuffix(), prov.modLoc("block/reactor/controller/block")) + .texture("1", prov.modLoc(controllerPath + controllerState.getSuffix())) + .texture("particle", prov.modLoc(controllerPath + controllerState.getSuffix())); + } + + enum ControllerVisualState { + OFF("off"), + ON("on"), + STANDBY("standby") + ; + + private final String suffix; + + ControllerVisualState(String suffix) { + this.suffix = suffix; + } + + public String getSuffix() { + return this.suffix; + } } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerInventory.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerInventory.java index 1bd1bd5a9..f269ab198 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerInventory.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerInventory.java @@ -14,7 +14,6 @@ public ReactorControllerInventory(ReactorControllerBlockEntity be) { this.be = be; } - @Override public ItemStack removeItemNoUpdate(int index) { be.setChanged(); @@ -23,9 +22,6 @@ public ItemStack removeItemNoUpdate(int index) { @Override public boolean isItemValid(int slot, ItemStack resource) { - return switch (slot) { - case 0 -> CNItems.REACTOR_BLUEPRINT.get() == resource.getItem(); - default -> !super.isItemValid(slot, resource); - }; + return slot == 0 && resource.is(CNItems.REACTOR_BLUEPRINT.get()); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java new file mode 100644 index 000000000..e1e7b744d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorDebugDiagnostics.java @@ -0,0 +1,57 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.Collection; + +public class ReactorDebugDiagnostics { + private static final String TITLE = "reactor.debug.title"; + private static final String SUMMARY = "reactor.debug.summary"; + private static final String REGISTERED_POSITION = "reactor.debug.registered_position"; + private static final String VALID_POSITION = "reactor.debug.valid_position"; + + private static final String INPUT = "reactor.debug.label.input"; + private static final String INPUT_FLUID = "reactor.debug.label.fluid_input"; + private static final String OUTPUT = "reactor.debug.label.output"; + private static final String ALARM = "reactor.debug.label.alarm"; + + private ReactorDebugDiagnostics() {} + + public static void sendReactorConnectionsTo(Player player, Level level, + ReactorInputManagerI inputManager, ReactorInputFluidManagerI inputFluidManager, + ReactorOutputManagerI outputManager, + ReactorAlarmManagerI alarmManager + ) { + player.sendSystemMessage(CreateNuclearLang.translate(TITLE).style(ChatFormatting.GOLD).component()); + + sendManagerSummary(player, CreateNuclearLang.translate(INPUT).component(), + inputManager.size(), inputManager.getBlocksPosition(), inputManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(INPUT_FLUID).component(), + inputFluidManager.size(), inputFluidManager.getBlocksPosition(), inputFluidManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(OUTPUT).component(), + outputManager.size(), outputManager.getBlocksPosition(), outputManager.getBlocksPosition(level)); + + sendManagerSummary(player, CreateNuclearLang.translate(ALARM).component(), + alarmManager.size(), alarmManager.getBlocksPosition(), alarmManager.getBlocksPosition(level)); + } + + private static void sendManagerSummary(Player player, Component label, int registeredCount, + Collection registered, Collection valid) { + player.sendSystemMessage(CreateNuclearLang.translate(SUMMARY, label, registeredCount, valid.size()).style(ChatFormatting.YELLOW).component()); + + for (BlockPos pos : registered) { + player.sendSystemMessage(CreateNuclearLang.translate(REGISTERED_POSITION, pos.toShortString()).component()); + } + for (BlockPos pos : valid) { + player.sendSystemMessage(CreateNuclearLang.translate(VALID_POSITION, pos.toShortString()).component()); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java new file mode 100644 index 000000000..52f39cb0c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorRunningSoundInstance.java @@ -0,0 +1,61 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.CreateNuclear; + +/** + * Client-side looping sound played while a reactor is actively producing energy. + *

+ * Mirrors {@code ReactorAlarmSoundInstance}: the instance stops itself once the block at + * {@code pos} is no longer a running reactor controller (the {@code ACTIVE} blockstate property + * is synced from the server), so it survives the controller block being broken or the reactor + * shutting down even if the owning block entity's tick stops driving it. + */ +public class ReactorRunningSoundInstance extends AbstractTickableSoundInstance { + private final BlockPos pos; + private final Level level; + + public ReactorRunningSoundInstance(Level level, BlockPos pos, SoundEvent sound) { + super(sound, SoundSource.BLOCKS, level != null ? level.random : null); + this.level = level; + this.pos = pos; + if (pos != null) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + this.looping = true; + this.delay = 0; + this.volume = 1.0F; + } + + @Override + public void tick() { + try { + if (level == null || pos == null) { + stop(); + return; + } + + BlockState state = level.getBlockState(pos); + if (!(state.getBlock() instanceof ReactorControllerBlock) + || !state.hasProperty(ReactorControllerBlock.ACTIVE) + || !state.getValue(ReactorControllerBlock.ACTIVE)) { + stop(); + } + } catch (Exception e) { + stop(); + CreateNuclear.LOGGER.warn(e.getMessage()); + } + } + + /** Public entry point so the owning block entity can stop the loop ({@link #stop()} is protected). */ + public void stopSound() { + stop(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java new file mode 100644 index 000000000..f668341ab --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumableTimer.java @@ -0,0 +1,62 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; + +public class ConsumableTimer { + private final IConsumable consumable; + private int remainingTicks; + private int maxTicks; + private int countInPattern; + + public ConsumableTimer(IConsumable consumable, int maxTicks, int count) { + this.consumable = consumable; + this.maxTicks = maxTicks; + this.remainingTicks = maxTicks; + this.countInPattern = count; + } + + public boolean tick() { + if (remainingTicks > 0) + remainingTicks--; + return remainingTicks <= 0; + } + + public void reset(int newMaxTicks, int newCount) { + this.maxTicks = newMaxTicks; + this.remainingTicks = newMaxTicks; + this.countInPattern = newCount; + } + + public IConsumable getConsumable() { + return consumable; + } + + public String getId() { + return consumable.getId(); + } + + public int getCountInPattern() { + return countInPattern; + } + + public int getMaxTicks() { + return maxTicks; + } + + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.put("consumable", consumable.serializeNBT()); + tag.putInt("remainingTicks", remainingTicks); + tag.putInt("maxTicks", maxTicks); + tag.putInt("countInPattern", countInPattern); + return tag; + } + + public static ConsumableTimer deserializeNBT(CompoundTag tag) { + IConsumable consumable = IConsumable.deserializeNBT(tag.getCompound("consumable")); + ConsumableTimer t = new ConsumableTimer( + consumable, tag.getInt("maxTicks"), tag.getInt("countInPattern")); + t.remainingTicks = tag.getInt("remainingTicks"); + return t; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java new file mode 100644 index 000000000..7a93ea7ef --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java @@ -0,0 +1,161 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +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.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +import java.util.*; + +public class ConsumptionCycleManager { + + private final List timers = new ArrayList<>(); + private Map patternSnapshot = new HashMap<>(); + + public void startCycle(ItemStack pattern, Level level) { + timers.clear(); + buildTimers(pattern, level); + takeSnapshot(pattern, level); + } + + public void resetCycle(ItemStack pattern, Level level, ReactorInputManagerI manager) { + Map counts = PatternReader.readItemCounts(pattern); + List updated = new ArrayList<>(); + + for (Map.Entry entry : counts.entrySet()) { + RodType rodType = RodType.resolveRodType(entry.getKey(), level); + if (!rodType.isNotEmptyItem()) + continue; + + String id = ForgeRegistries.ITEMS.getKey(entry.getKey()).getPath(); + int count = entry.getValue(); + int ticks = new ItemConsumable(id, rodType).computeTimer(count); + + timers.stream() + .filter(t -> t.getId().equals(id)) + .findFirst() + .ifPresentOrElse( + existing -> { + existing.reset(ticks, count); + updated.add(existing); + }, + () -> updated.add(new ConsumableTimer( + new ItemConsumable(id, rodType), ticks, count))); + } + + timers.clear(); + timers.addAll(updated); + takeSnapshot(pattern, level); + } + + public boolean tick(ReactorInputManagerI manager, Level level) { + boolean consumed = false; + Iterator it = timers.iterator(); + + while (it.hasNext()) { + ConsumableTimer timer = it.next(); + if (timer.tick()) { + timer.getConsumable().consume(manager, level); + consumed = true; + + if (timer.getCountInPattern() > 1) { + timer.reset(timer.getMaxTicks(), timer.getCountInPattern()); + } else { + it.remove(); + } + } + } + return consumed; + } + + public boolean hasPatternChanged(ItemStack pattern, Level level) { + Map current = readItemIds(pattern, level); + if (current.size() != patternSnapshot.size()) + return true; + for (Map.Entry e : current.entrySet()) + if (!e.getValue().equals(patternSnapshot.get(e.getKey()))) + return true; + return false; + } + + public boolean isEmpty() { + return timers.isEmpty(); + } + + public void clear() { + timers.clear(); + patternSnapshot.clear(); + } + + public CompoundTag serializeNBT() { + ListTag list = new ListTag(); + timers.forEach(t -> list.add(t.serializeNBT())); + CompoundTag tag = new CompoundTag(); + tag.put("timers", list); + CompoundTag snap = new CompoundTag(); + patternSnapshot.forEach(snap::putInt); + tag.put("snapshot", snap); + return tag; + } + + public void deserializeNBT(CompoundTag tag) { + timers.clear(); + tag.getList("timers", Tag.TAG_COMPOUND) + .forEach(t -> timers.add(ConsumableTimer.deserializeNBT((CompoundTag) t))); + CompoundTag snap = tag.getCompound("snapshot"); + snap.getAllKeys().forEach(k -> patternSnapshot.put(k, snap.getInt(k))); + } + + private void buildTimers(ItemStack pattern, Level level) { + PatternReader.readItemCounts(pattern).forEach((item, count) -> { + RodType rodType = RodType.resolveRodType(item, level); + if (!rodType.isNotEmptyItem()) + return; + String id = ForgeRegistries.ITEMS.getKey(item).getPath(); + int ticks = new ItemConsumable(id, rodType).computeTimer(count); + timers.add(new ConsumableTimer(new ItemConsumable(id, rodType), ticks, count)); + }); + } + + private void takeSnapshot(ItemStack pattern, Level level) { + patternSnapshot = readItemIds(pattern, level); + } + + private Map readItemIds(ItemStack pattern, Level level) { + Map result = new HashMap<>(); + PatternReader.readItemCounts(pattern).forEach((item, count) -> { + RodType rt = RodType.resolveRodType(item, level); + if (rt.isNotEmptyItem()) + result.put(ForgeRegistries.ITEMS.getKey(item).getPath(), count); + }); + return result; + } + + /** + * Advances the consumption cycle by one tick: starts a cycle if none is + * running and the pattern isn't empty, resets it if the pattern changed + * (only checked when {@code checkPatternChange} is true), then ticks the + * current cycle. + * + * @param checkPatternChange if {@code false}, the pattern change isn't + * checked this tick (used to throttle the check's frequency) + */ + public void update(ItemStack pattern, Level level, ReactorInputManagerI inputManager, boolean checkPatternChange) { + boolean emptyPattern = pattern.isEmpty() || pattern.getOrCreateTag().isEmpty(); + if (isEmpty() && !emptyPattern) { + startCycle(pattern, level); + } + + if (!isEmpty()) { + if (checkPatternChange && hasPatternChanged(pattern, level)) { + resetCycle(pattern, level, inputManager); + } + tick(inputManager, level); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java new file mode 100644 index 000000000..be34dc997 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/FluidConsumable.java @@ -0,0 +1,49 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public class FluidConsumable implements IConsumable { + private final String fluidName; + private final int mbPerCycle; + private final int baseTicks; + + public FluidConsumable(String fluidName, int mbPerCycle, int baseTicks) { + this.fluidName = fluidName; + this.mbPerCycle = mbPerCycle; + this.baseTicks = baseTicks; + } + + @Override + public String getId() { + return fluidName; + } + + @Override + public int computeTimer(int count) { + return Math.max(1, baseTicks); + } + + @Override + public boolean consume(ReactorInputManagerI manager, Level level) { + return false; + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putString("type", "fluid"); + tag.putString("fluidName", fluidName); + tag.putInt("mbPerCycle", mbPerCycle); + tag.putInt("baseTicks", baseTicks); + return tag; + } + + public static FluidConsumable deserializeNBT(CompoundTag tag) { + return new FluidConsumable( + tag.getString("fluidName"), + tag.getInt("mbPerCycle"), + tag.getInt("baseTicks")); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java new file mode 100644 index 000000000..21d0ee52c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/IConsumable.java @@ -0,0 +1,24 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public interface IConsumable { + String getId(); + + int computeTimer(int countInPattern); + + boolean consume(ReactorInputManagerI manager, Level level); + + CompoundTag serializeNBT(); + + static IConsumable deserializeNBT(CompoundTag tag) { + return switch (tag.getString("type")) { + case "item" -> ItemConsumable.deserializeNBT(tag); + case "fluid" -> FluidConsumable.deserializeNBT(tag); + default -> throw new IllegalArgumentException( + "Unknown consumable type: " + tag.getString("type")); + }; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java new file mode 100644 index 000000000..556b554f7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; + +public class ItemConsumable implements IConsumable { + private final String itemName; + private final RodType rodType; + + public ItemConsumable(String itemName, RodType rodType) { + this.itemName = itemName; + this.rodType = rodType; + } + + @Override + public String getId() { + return itemName; + } + + @Override + public int computeTimer(int count) { + int base = Math.max(1, rodType.rodTimer().get()); + return Math.max(1, (int) (base / Math.max(1, count))); + } + + @Override + public boolean consume(ReactorInputManagerI manager, Level level) { + return manager.extractItemByName(level, itemName); + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putString("type", "item"); + tag.putString("itemName", itemName); + return tag; + } + + public static ItemConsumable deserializeNBT(CompoundTag tag) { + String itemName = tag.getString("itemName"); + return new ItemConsumable(itemName, null); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java new file mode 100644 index 000000000..a5d6de307 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/PatternReader.java @@ -0,0 +1,39 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.consumable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.items.ItemStackHandler; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public final class PatternReader { + + private PatternReader() { + } + + public static Map readItemCounts(ItemStack configuredPattern) { + CompoundTag tag = configuredPattern.getTag(); + if (tag == null || tag.isEmpty()) + return Collections.emptyMap(); + + ItemStackHandler handler = new ItemStackHandler(57); + if (tag.contains("patternAll")) + handler.deserializeNBT(tag.getCompound("patternAll")); + else if (tag.contains("pattern")) + handler.deserializeNBT(tag.getCompound("pattern")); + else + return Collections.emptyMap(); + + Map counts = new HashMap<>(); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); + if (!stack.isEmpty() && !stack.is(Items.GLASS_PANE)) + counts.merge(stack.getItem(), 1, Integer::sum); + } + return counts; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java new file mode 100644 index 000000000..d0755ecc5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorDisplayState.java @@ -0,0 +1,134 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.display; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Immutable snapshot of the data the reactor controller exposes for client-side + * display (e.g. the Goggles tooltip rendered by {@link ReactorGoggleTooltipRenderer}). + *

+ * Instances are produced server-side once per tick from the live input inventories + * and tanks, then synced to the client through the block entity's {@code clientPacket} + * NBT via {@link #serializeNBT()} / {@link #deserializeNBT(CompoundTag)}. This data is + * transient sync data only: it is not part of the persisted save NBT, so its layout + * can evolve freely without migration concerns. + *

+ * Usage: + *

{@code
+ * // Server side, e.g. in tick():
+ * this.displayState = new ReactorDisplayState(items, fluids, maxFluidCapacity);
+ *
+ * // Writing the client packet:
+ * compound.put("displayState", displayState.serializeNBT());
+ *
+ * // Reading the client packet:
+ * displayState = compound.contains("displayState")
+ *         ? ReactorDisplayState.deserializeNBT(compound.getCompound("displayState"))
+ *         : ReactorDisplayState.EMPTY;
+ * }
+ * + * @param items item rods currently loaded, mapped to their stacked count + * @param fluids fluids currently loaded in the input tanks + * @param maxFluidCapacity combined capacity (in millibuckets) of all input fluid tanks + */ +public record ReactorDisplayState(Map items, List fluids, long maxFluidCapacity) { + static final String COMPONENT_ITEM = "Item"; + static final String COMPONENT_COUNT = "Count"; + static final String COMPONENT_CLIENT_DISPLAY_ITEMS = "clientDisplayItems"; + static final String COMPONENT_CLIENT_DISPLAY_FLUIDS = "clientDisplayFluids"; + static final String COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY = "clientMaxFluidCapacity"; + + /** + * Shared empty instance, used before the first tick has populated any display + * data and as the fallback when the client packet doesn't carry a display state. + */ + public static final ReactorDisplayState EMPTY = new ReactorDisplayState(Map.of(), List.of(), 0); + + /** + * Defensively copies the given collections so the record stays immutable + * regardless of how the caller's collections are mutated afterwards. + */ + public ReactorDisplayState { + items = Map.copyOf(items); + fluids = List.copyOf(fluids); + } + + /** + * Serializes this state into NBT for inclusion in the block entity's + * {@code clientPacket} data. Pair with {@link #deserializeNBT(CompoundTag)} + * to restore an equivalent instance on the client. + * + * @return a new {@link CompoundTag} containing the serialized item map, + * fluid list and max fluid capacity + */ + public CompoundTag serializeNBT() { + CompoundTag compound = new CompoundTag(); + + ListTag displayItemsTag = new ListTag(); + for (Entry entry : items().entrySet()) { + CompoundTag tag = new CompoundTag(); + tag.putString(COMPONENT_ITEM, ForgeRegistries.ITEMS.getKey(entry.getKey()).toString()); + tag.putInt(COMPONENT_COUNT, entry.getValue()); + displayItemsTag.add(tag); + } + compound.put(COMPONENT_CLIENT_DISPLAY_ITEMS, displayItemsTag); + + ListTag displayFluidsTag = new ListTag(); + for (BigFluidStack stack : fluids()) { + displayFluidsTag.add(stack.write()); + } + compound.put(COMPONENT_CLIENT_DISPLAY_FLUIDS, displayFluidsTag); + + compound.putLong(COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY, maxFluidCapacity()); + + return compound; + } + + /** + * Reconstructs a {@link ReactorDisplayState} from NBT previously produced by + * {@link #serializeNBT()}. Acts as a static factory since records cannot be + * mutated in place. + *

+ * Missing keys are treated as empty/zero, so a compound that contains none of + * the expected entries yields an instance equivalent to {@link #EMPTY}. + * + * @param compound the {@code displayState} compound from the client packet + * @return a new immutable {@link ReactorDisplayState} built from the given NBT + */ + public static ReactorDisplayState deserializeNBT(CompoundTag compound) { + Map items = new HashMap<>(); + if (compound.contains(COMPONENT_CLIENT_DISPLAY_ITEMS)) { + ListTag list = compound.getList(COMPONENT_CLIENT_DISPLAY_ITEMS, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.getCompound(i); + Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(tag.getString(COMPONENT_ITEM))); + if (item != null) { + items.put(item, tag.getInt(COMPONENT_COUNT)); + } + } + } + + List fluids = new ArrayList<>(); + if (compound.contains(COMPONENT_CLIENT_DISPLAY_FLUIDS)) { + ListTag list = compound.getList(COMPONENT_CLIENT_DISPLAY_FLUIDS, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + fluids.add(BigFluidStack.read(list.getCompound(i))); + } + } + + long maxFluidCapacity = compound.getLong(COMPONENT_CLIENT_MAX_FLUIDS_CAPACITY); + + return new ReactorDisplayState(items, fluids, maxFluidCapacity); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java new file mode 100644 index 000000000..20bca73b4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/display/ReactorGoggleTooltipRenderer.java @@ -0,0 +1,142 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.display; + +import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.List; +import java.util.Map; + +/** + * Builds the Goggles tooltip shown when looking at an assembled reactor controller. + *

+ * This is a stateless presentation helper: it only reads from a + * {@link ReactorDisplayState} snapshot (plus the current heat level) and appends the + * resulting lines to the tooltip. It performs no NBT access, inventory lookups or + * other block-entity-specific logic, keeping the rendering separate from the block + * entity's data/state management. + *

+ * Typical usage from {@code ReactorControllerBlockEntity#addToGoggleTooltip}: + *

{@code
+ * @Override
+ * public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) {
+ *     CompoundTag patternTag = this.getConfiguredPatternTag();
+ *     if (patternTag == null || patternTag.isEmpty()) {
+ *         return false;
+ *     }
+ *     ReactorGoggleTooltipRenderer.render(tooltip, displayState, patternTag.getInt("heat"), isPlayerSneaking);
+ *     return true;
+ * }
+ * }
+ */ +public final class ReactorGoggleTooltipRenderer { + private ReactorGoggleTooltipRenderer() {} + + /** + * Appends the reactor controller's Goggles tooltip lines to {@code tooltip}. + *

+ * Renders, in order: the gauge info header, the reactor heat level, the loaded + * item rods (or a placeholder if none), and the loaded fluids with their fill + * ratio as a progress bar (or a placeholder if none). + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot (items, fluids, max fluid capacity) + * @param heat the reactor's current heat value, used to render the heat tooltip line + * @param isPlayerSneaking whether the viewing player is sneaking (currently unused, + * kept for signature parity with other goggle tooltip providers) + */ + public static void render(List tooltip, ReactorDisplayState state, int heat, boolean isPlayerSneaking, int reactorSize) { + renderHeaderAndHeat(tooltip, heat, reactorSize); + renderItemRods(tooltip, state); + renderFluidTanks(tooltip, state); + } + + /** + * Appends the gauge info header and the reactor's current heat level line. + * + * @param tooltip the tooltip line list to append to + * @param heat the reactor's current heat value + */ + private static void renderHeaderAndHeat(List tooltip, int heat, int reactorSize) { + CreateLang.translate("gui.gauge.info_header") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); + + IHeat.HeatLevel.getFormattedHeatText(heat, reactorSize).forGoggles(tooltip); + } + + /** + * Appends one line per loaded item rod with its stacked count, or a placeholder + * line showing a count of 0 if no rods are loaded. + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot + */ + private static void renderItemRods(List tooltip, ReactorDisplayState state) { + if (state.items().isEmpty()) { + CreateNuclearLang.builder() + .add(Component.translatable("createnuclear.tooltip.item.empty.rod").withStyle(ChatFormatting.GRAY)) + .add(CreateNuclearLang.number(0).style(ChatFormatting.GOLD)) + .forGoggles(tooltip); + } else { + for (Map.Entry entry : state.items().entrySet()) { + ItemStack stack = new ItemStack(entry.getKey()); + int count = entry.getValue(); + CreateNuclearLang.itemName(stack) + .style(ChatFormatting.GRAY) + .text(": ") + .add(CreateNuclearLang.number(count).style(ChatFormatting.GOLD)) + .forGoggles(tooltip); + } + } + } + + /** + * Appends one line per loaded fluid with a fill-ratio progress bar relative to + * {@link ReactorDisplayState#maxFluidCapacity()}, or a "no fluid" placeholder + * with an empty progress bar if no fluids are loaded. + * + * @param tooltip the tooltip line list to append to + * @param state the current display snapshot + */ + private static void renderFluidTanks(List tooltip, ReactorDisplayState state) { + if (state.fluids().isEmpty()) { + CreateNuclearLang.translate("tooltip.fluid.none") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + CreateNuclearLang.builder() + .text(TooltipHelper.makeProgressBar(5, 0)) + .style(ChatFormatting.BLUE) + .space() + .text("0%") + .forGoggles(tooltip); + } else { + long maxCapacity = state.maxFluidCapacity(); + for (BigFluidStack stack : state.fluids()) { + float fillRatio = maxCapacity > 0 ? (float) stack.amount / maxCapacity : 0; + if (fillRatio >= 0.99f) + fillRatio = 1.0f; + int filledBars = Math.round(fillRatio * 5); + + CreateNuclearLang.translate("tooltip.fluid", stack.stack.getDisplayName()) + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + + CreateNuclearLang.builder() + .text(TooltipHelper.makeProgressBar(5, filledBars)) + .style(ChatFormatting.BLUE) + .space() + .text(Math.round(fillRatio * 100) + "%") + .forGoggles(tooltip); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/AbstractReactorIOManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/AbstractReactorIOManager.java new file mode 100644 index 000000000..b1333cb1a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/AbstractReactorIOManager.java @@ -0,0 +1,89 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +/** + * Abstract base providing common implementation for managing + * positions used by IO managers (inputs / outputs). + * + * This class holds a collection of `BlockPos` instances and exposes + * basic operations (add, remove, contains, iteration via `resolveBlock`). + * Serialization (`read`/`write`) and validation (`clearInvalid`) are + * left abstract for concrete implementations to provide. + */ +public abstract class AbstractReactorIOManager implements ReactorIOManager { + /** List of `BlockPos` instances tracked by this manager. */ + protected final List positions = new ArrayList<>(); + + /** + * Adds `pos` if non-null and not already present; returns true when added. + */ + @Override + public void addBlock(BlockPos pos) { + if (pos == null) return; + if (!contains(pos)) { + positions.add(pos); + } + } + + /** + * Removes `pos` if present. + */ + @Override + public void removeBlock(BlockPos pos) { + positions.remove(pos); + } + + /** Tests whether `pos` is present. */ + @Override + public boolean contains(BlockPos pos) { + return positions.contains(pos); + } + + /** Returns the current number of tracked positions. */ + @Override + public int size() { + return positions.size(); + } + + /** Returns an immutable copy of the tracked positions. */ + @Override + public List getBlocksPosition() { + return List.copyOf(positions); + } + + /** + * Resolves each position with `resolver` and returns a list of non-null results. + * Useful to convert positions to block entities or handlers. + */ + @Override + public List resolveBlock(Level level, Function resolver) { + List result = new ArrayList<>(); + for (BlockPos p: new ArrayList<>(positions)) { + T r = resolver.apply(p); + if (r != null) result.add(r); + } + return result; + } + + /** Serialization: implementation provided by subclasses. */ + @Override + public abstract void read(CompoundTag compound); + + /** Deserialization: implementation provided by subclasses. */ + @Override + public abstract void write(CompoundTag compound); + + /** + * Removes invalid positions (e.g. unloaded chunk, missing block entity). + * Subclasses must implement manager-specific validation logic. + */ + @Override + public abstract void clearInvalid(Level level); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManager.java new file mode 100644 index 000000000..7176af62b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManager.java @@ -0,0 +1,71 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarmEntity; + +import java.util.ArrayList; +import java.util.List; + +public class ReactorAlarmManager extends AbstractReactorIOManager implements ReactorAlarmManagerI { + private static final String NBT_KEY = "ReactorAlarms"; + + @Override + public void write(CompoundTag compound) { + ListTag list = new ListTag(); + for (BlockPos pos : positions) { + CompoundTag tag = new CompoundTag(); + tag.putInt("x", pos.getX()); + tag.putInt("y", pos.getY()); + tag.putInt("z", pos.getZ()); + list.add(tag); + } + compound.put(NBT_KEY, list); + } + + @Override + public void read(CompoundTag compound) { + positions.clear(); + if (!compound.contains(NBT_KEY)) return; + ListTag list = compound.getList(NBT_KEY, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); ++i) { + CompoundTag tag = list.getCompound(i); + positions.add(new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"))); + } + } + + @Override + public void clearInvalid(Level level) { + if (level == null) return; + List toRemove = new ArrayList<>(); + + for (BlockPos p : positions) { + if (!level.isLoaded(p)) continue; // Don't remove the position if the chunk is merely unloaded + + BlockEntity be = level.getBlockEntity(p); + // Mark for removal if the block no longer exists or is no longer an alarm + if (be == null || !(be instanceof ReactorAlarmEntity)) { + toRemove.add(p); + } + } + positions.removeAll(toRemove); + } + + @Override + public List getBlocksPosition(Level level) { + if (level == null) return List.of(); + + List validPositions = new ArrayList<>(); + for (BlockPos p : this.positions) { + // Check that the block entity is loaded and of the expected type + if (level.isLoaded(p) && level.getBlockEntity(p) instanceof ReactorAlarmEntity) { + validPositions.add(p); + } + } + return List.copyOf(validPositions); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManagerI.java new file mode 100644 index 000000000..cdd538cd4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManagerI.java @@ -0,0 +1,12 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import java.util.List; + +public interface ReactorAlarmManagerI extends ReactorIOManager { + /** + * Returns an immutable copy of the currently valid alarm positions in the given level. + */ + List getBlocksPosition(Level level); +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java new file mode 100644 index 000000000..cc9f239b7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManager.java @@ -0,0 +1,135 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.Nullable; + +public class ReactorFrameDisplayManager implements ReactorFrameDisplayManagerI { + public static final String COMPONENT_FRAME_COLUMN_MIN_Y = "frameColumnMinY"; + public static final String COMPONENT_FRAME_COLUMN_MAX_Y = "frameColumnMaxY"; + + // Vertical span (block Y) of the reactor frame columns, used to map the + // fluid fill ratio onto the liquid actually drawn in the frame windows. + private int frameColumnMinY = Integer.MAX_VALUE; + private int frameColumnMaxY = Integer.MIN_VALUE; + + // Per-tick cache for the fluid drawn in the frame windows. Recomputed from the + // live (synced) input tanks so the displayed fluid and its fill ratio always + // come from the same source and stay consistent for every fluid type. + private long frameFluidCacheTick = -1; + private float frameFluidFillRatioCache = 0f; + + private FluidStack frameFluidCache = FluidStack.EMPTY; + + /** + * Returns the fluid currently held by the reactor, used by the frame + * renderer to draw the matching liquid in the window. On the client this + * reads the synced ; on the server it reads the + * aggregated . Returns {@link FluidStack#EMPTY} when + * the reactor holds no fluid. + *

+ * Recomputes, at most once per game tick, the fluid shown in the frame + * windows and how full the input is. Both values are read from the same live + * input tanks (whose contents are synced to the client), so they always agree + * regardless of the fluid type. + */ + private void refreshFrameFluidCache(@Nullable Level level, ReactorInputFluidManagerI handlers) { + if (level == null) return; + long now = level.getGameTime(); + + if (now == frameFluidCacheTick) return; + frameFluidCacheTick = now; + + long amount = 0, capacity = 0; + FluidStack fluid = FluidStack.EMPTY; + + for (IFluidHandler handler : handlers.getFuildHandlers(level)) { + int tanks = handler.getTanks(); + for (int t = 0; t < tanks; t++) { + FluidStack stack = handler.getFluidInTank(t); + capacity += handler.getTankCapacity(t); + amount += stack.getAmount(); + + if (fluid.isEmpty() && !stack.isEmpty()) fluid = stack.copy(); + } + } + + frameFluidCache = fluid; + frameFluidFillRatioCache = capacity > 0 ? Math.min(1f, (float) amount / (float) capacity) : 0f; + } + + /** + * The fluid currently shown in the reactor frame windows (may be empty). + */ + @Override + public FluidStack getDisplayedFluid(Level level, ReactorInputFluidManagerI handlers) { + refreshFrameFluidCache(level, handlers); + + return frameFluidCache; + } + + /** + * How full the reactor's fluid input is, in the range {@code [0, 1]}, used by + * the frame renderer to size the visible liquid column. + */ + @Override + public float getDisplayedFluidFillRatio(Level level, ReactorInputFluidManagerI handlers) { + refreshFrameFluidCache(level, handlers); + + return frameFluidFillRatioCache; + } + + /** + * Records the lowest and highest frame block-Y of the assembled reactor. + */ + @Override + public void setFrameColumn(int minY, int maxY, Runnable onChange) { + if (this.frameColumnMinY == minY && this.frameColumnMaxY == maxY) return; + this.frameColumnMinY = minY; + this.frameColumnMaxY = maxY; + onChange.run(); + } + + /** + * @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. + */ + @Override + public int getFrameColumnMinY() { + return frameColumnMinY; + } + + /** + * @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. + */ + @Override + public int getFrameColumnMaxY() { + return frameColumnMaxY; + } + + @Override + public boolean hasFrameColumn() { + return frameColumnMinY != Integer.MAX_VALUE && frameColumnMaxY != Integer.MIN_VALUE + && frameColumnMaxY >= frameColumnMinY; + } + + @Override + public void read(CompoundTag compound) { + if (compound.contains(COMPONENT_FRAME_COLUMN_MIN_Y)) { + frameColumnMinY = compound.getInt(COMPONENT_FRAME_COLUMN_MIN_Y); + } + + if (compound.contains(COMPONENT_FRAME_COLUMN_MAX_Y)) { + frameColumnMaxY = compound.getInt(COMPONENT_FRAME_COLUMN_MAX_Y); + } + } + + @Override + public void write(CompoundTag compound) { + if (hasFrameColumn()) { + compound.putInt(COMPONENT_FRAME_COLUMN_MIN_Y, frameColumnMinY); + compound.putInt(COMPONENT_FRAME_COLUMN_MAX_Y, frameColumnMaxY); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java new file mode 100644 index 000000000..7203591b9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorFrameDisplayManagerI.java @@ -0,0 +1,47 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; + +/** + * Manages the display state of the reactor frame windows: the fluid shown, + * its fill ratio, and the vertical column bounds of the assembled frame. + */ +public interface ReactorFrameDisplayManagerI { + /** + * Returns the fluid currently shown in the reactor frame windows (may be + * empty). Recomputes the underlying cache at most once per game tick from + * the given fluid handlers. + */ + FluidStack getDisplayedFluid(Level level, ReactorInputFluidManagerI handlers); + + /** + * Returns how full the reactor's fluid input is, in the range {@code [0, 1]}. + * Recomputes the underlying cache at most once per game tick from the + * given fluid handlers. + */ + float getDisplayedFluidFillRatio(Level level, ReactorInputFluidManagerI handlers); + + /** + * Records the lowest and highest frame block-Y of the assembled reactor. + * If the values changed, {@code onChange} is invoked (e.g. to trigger a + * client sync via {@code notifyUpdate()}). + */ + void setFrameColumn(int minY, int maxY, Runnable onChange); + + /** @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. */ + int getFrameColumnMinY(); + + /** @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. */ + int getFrameColumnMaxY(); + + /** @return true if both frame column bounds are known and consistent. */ + boolean hasFrameColumn(); + + /** Reads state from an NBT tag (deserialization). */ + void read(CompoundTag compound); + + /** Writes state to an NBT tag (serialization). */ + void write(CompoundTag compound); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorIOManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorIOManager.java new file mode 100644 index 000000000..e51f8a9f4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorIOManager.java @@ -0,0 +1,49 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; + +import java.util.List; +import java.util.function.Function; + +/** + * Generic manager interface for reactor IO positions (inputs or outputs). + * Defines expected operations to manage a collection of `BlockPos` instances: + * serialization, validation, and resolution into concrete objects via a `resolver`. + */ +public interface ReactorIOManager { + /** Returns true when the position is known. */ + boolean contains(BlockPos pos); + + /** Current number of tracked positions. */ + int size(); + + /** Reads state from an NBT tag (deserialization). */ + void read(CompoundTag compound); + + /** Writes state to an NBT tag (serialization). */ + void write(CompoundTag compound); + + /** + * Adds a position; returns true if added. + */ + void addBlock(BlockPos pos); + + /** + * Removes a position; returns true if it was present and removed. + */ + void removeBlock(BlockPos pos); + + /** Returns an immutable copy of tracked positions. */ + List getBlocksPosition(); + + /** Removes invalid positions for the provided `level` (e.g. missing block entity). */ + void clearInvalid(Level level); + + /** + * Resolves each `BlockPos` into an instance using `resolver` and returns + * the list of non-null results. + */ + List resolveBlock(Level level, Function resolver); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java new file mode 100644 index 000000000..62b3836d4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java @@ -0,0 +1,167 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; + +import java.util.ArrayList; +import java.util.List; + +public class ReactorInputFluidManager extends AbstractReactorIOManager implements ReactorInputFluidManagerI { + private static final String NBT_KEY = "ReactorInputFluid"; + + /** + * Manager that tracks fluid input blocks for a reactor. + * Responsible for serializing tracked positions, validating + * handlers, reporting aggregated inventory and extracting fluids. + */ + + @Override + /** + * Read tracked positions from NBT data. + * Existing positions are cleared before reading. + */ + public void read(CompoundTag compound) { + positions.clear(); + if (!compound.contains(NBT_KEY)) return; + ListTag list = compound.getList(NBT_KEY, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); ++i) { + CompoundTag tag = list.getCompound(i); + positions.add(new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"))); + } + } + + @Override + /** + * Write tracked positions to the provided NBT compound. + */ + public void write(CompoundTag compound) { + ListTag list = new ListTag(); + for (BlockPos pos : positions) { + CompoundTag tag = new CompoundTag(); + tag.putInt("x", pos.getX()); + tag.putInt("y", pos.getY()); + tag.putInt("z", pos.getZ()); + list.add(tag); + } + compound.put(NBT_KEY, list); + } + + @Override + /** + * Remove any tracked positions that are no longer valid in the given level. + */ + public void clearInvalid(Level level) { + List toRemove = new ArrayList<>(); + for (BlockPos p: positions) { + if (level == null || !level.isLoaded(p)) { + toRemove.add(p); + continue; + } + + BlockEntity be = level.getBlockEntity(p); + if (be == null) { + toRemove.add(p); + continue; + } + + LazyOptional cap = be.getCapability(ForgeCapabilities.FLUID_HANDLER); + if (cap == null || !cap.isPresent()) toRemove.add(p); + } + + positions.removeAll(toRemove); + } + + @Override + /** + * Return an immutable list of tracked block positions that correspond + * to fluid input entities in the given level. + */ + public List getBlocksPosition(Level level) { + List positions = new ArrayList<>(); + + for (BlockPos p : this.getBlocksPosition()) { + if (level.getBlockEntity(p) instanceof ReactorFluidInputEntity) positions.add(p); + } + return List.copyOf(positions); + } + + @Override + /** + * Collect and return fluid handler capabilities for all tracked positions. + */ + public List getFuildHandlers(Level level) { + List handlers = new ArrayList<>(); + for (BlockPos p : new ArrayList<>(positions)) { + if (level == null || !level.isLoaded(p)) continue; + BlockEntity be = level.getBlockEntity(p); + if (be == null) continue; + LazyOptional cap = be.getCapability(ForgeCapabilities.FLUID_HANDLER); + cap.ifPresent(handlers::add); + } + + return handlers; + } + + @Override + /** + * Build and return a virtual aggregated inventory of all input fluids. + */ + public VirtualReactorInputFluid getInventory(Level level) { + VirtualReactorInputFluid virtualReactorInputFluid = new VirtualReactorInputFluid(); + List handlers = this.getFuildHandlers(level); + if (handlers.isEmpty()) return virtualReactorInputFluid; + + for (IFluidHandler h : handlers) { + virtualReactorInputFluid.addFluid(h.getFluidInTank(0)); + } + + return virtualReactorInputFluid; + } + + /** + * Extracts up to {@code fluidNeeded} units of fluid, spread across the tracked handlers. + *

+ * The requested amount is a TOTAL across every input, not a per-input quota: each handler + * only ever drains what is still missing, so a request of 10 units against two inputs + * holding 10 each removes 10 in total, not 20. + * + * @return {@code true} if at least one unit was actually drained. A partial extraction still + * returns {@code true}: the reactor consumes whatever coolant it can reach rather + * than refusing to run. + */ + @Override + public boolean extractFluids(Level level, int fluidNeeded) { + if (level == null || fluidNeeded <= 0) return false; + List handlers = getFuildHandlers(level); + if (handlers.isEmpty()) return false; + + int remaining = fluidNeeded; + + for (IFluidHandler handler : handlers) { + if (remaining <= 0) break; + + FluidStack stack = handler.getFluidInTank(0); + if (stack.isEmpty()) continue; + + int toExtract = Math.min(remaining, stack.getAmount()); + if (toExtract <= 0) continue; + + // Subtract what was actually drained, not what was asked for: a handler is free to + // hand back less than requested. + remaining -= handler.drain(toExtract, FluidAction.EXECUTE).getAmount(); + } + + return remaining < fluidNeeded; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManagerI.java new file mode 100644 index 000000000..e809ae2df --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManagerI.java @@ -0,0 +1,38 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; + +import java.util.List; + +/** + * Interface for managing reactor input fluids. + * Implementations track input fluid sources and provide + * accessors and extraction methods for reactor consumption. + */ +public interface ReactorInputFluidManagerI extends ReactorIOManager { + /** Returns an immutable copy of tracked positions. */ + List getBlocksPosition(Level level); + + /** + * Returns a list of fluid handler capabilities for the tracked positions. + * @param level the current world level + */ + List getFuildHandlers(Level level); + + /** + * Returns a virtual aggregated inventory representing all tracked input fluids. + * @param level the current world level + */ + VirtualReactorInputFluid getInventory(Level level); + + /** + * Attempt to extract the requested amount of fluid from tracked sources. + * @param level current world level + * @param fluidNeeded amount of fluid required + * @return true if the requested amount was successfully extracted + */ + boolean extractFluids(Level level, int fluidNeeded); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java new file mode 100644 index 000000000..01a18c184 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManager.java @@ -0,0 +1,195 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * Manager for reactor input positions (`ReactorInput`). + * + * Serializes positions as x/y/z triplets and provides utilities to + * obtain valid `IItemHandler` instances present at those positions. + */ +public class ReactorInputManager extends AbstractReactorIOManager implements ReactorInputManagerI { + private static final String NBT_KEY = "ReactorInput"; + + @Override + public void write(CompoundTag compound) { + ListTag list = new ListTag(); + for (BlockPos pos : positions) { + CompoundTag tag = new CompoundTag(); + tag.putInt("x", pos.getX()); + tag.putInt("y", pos.getY()); + tag.putInt("z", pos.getZ()); + list.add(tag); + } + compound.put(NBT_KEY, list); + } + + @Override + public void read(CompoundTag compound) { + positions.clear(); + if (!compound.contains(NBT_KEY)) return; + ListTag list = compound.getList(NBT_KEY, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); ++i) { + CompoundTag tag = list.getCompound(i); + positions.add(new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"))); + } + } + + /** + * Retrieves all `IItemHandler` instances located at the input positions. + * Returns an empty list when no handlers are found. + */ + @Override + public List getItemHandlers(Level level) { + List handlers = new ArrayList<>(); + for (BlockPos p: new ArrayList<>(positions)) { + if (level == null || !level.isLoaded(p)) continue; + BlockEntity be = level.getBlockEntity(p); + if (be == null) continue; + LazyOptional cap = be.getCapability(ForgeCapabilities.ITEM_HANDLER); + cap.ifPresent(handlers::add); + } + + return handlers; + } + + @Override + public VirtualReactorInputsItem getInventory(Level level) { + List handlers = this.getItemHandlers(level); + if (handlers.isEmpty()) return new VirtualReactorInputsItem(); + + int totalFuel = 0; + int totalCooler = 0; + for (IItemHandler h : handlers) { + int slots = h.getSlots(); + for (int s = 0; s < slots; s++) { + ItemStack st = h.getStackInSlot(s); + + if (TypeRodPredicate.isFuel(st, level)) totalFuel += st.getCount(); + else if (TypeRodPredicate.isCooled(st, level)) totalCooler += st.getCount(); + } + } + + return new VirtualReactorInputsItem(totalFuel, totalCooler); + } + + @Override + public boolean extractItems(Level level, int fuelNeeded, int coolerNeeded) { + if (level == null) return false; + List handlers = getItemHandlers(level); + if (handlers.isEmpty()) return false; + + int fuelRemaining = fuelNeeded; + int coolerRemaining = coolerNeeded; + + for (IItemHandler handler : handlers) { + int slots = handler.getSlots(); + for (int s = 0; s < slots && (fuelRemaining > 0 || coolerRemaining > 0); s++) { + ItemStack stack = handler.getStackInSlot(s); + if (stack.isEmpty()) continue; + + + if (fuelRemaining > 0 && TypeRodPredicate.isFuel(stack, level)) { + int toExtract = Math.min(fuelRemaining, stack.getCount()); + handler.extractItem(s, toExtract, false); + fuelRemaining -= toExtract; + } else if (coolerRemaining > 0 && TypeRodPredicate.isCooled(stack, level)) { + int toExtract = Math.min(coolerRemaining, stack.getCount()); + handler.extractItem(s, toExtract, false); + coolerRemaining -= toExtract; + } + } + if (fuelRemaining <= 0 && coolerRemaining <= 0) break; + } + + return fuelRemaining <= 0 && coolerRemaining <= 0; + } + + public boolean extractItemByName(Level level, String itemName) { + if (level == null || itemName == null) return false; + + List handlers = getItemHandlers(level); + if (handlers.isEmpty()) return false; + + for (IItemHandler handler : handlers) { + int slots = handler.getSlots(); + for (int s = 0; s < slots; s++) { + ItemStack stack = handler.getStackInSlot(s); + if (stack.isEmpty()) continue; + + // Resolve the item's registry name (e.g. "uranium_rod") + String registryPath = ForgeRegistries.ITEMS.getKey(stack.getItem()).getPath(); + + // Lenient comparison: ignores case and underscores (_) + if (isMatching(registryPath, itemName)) { + // Attempt to extract 1 unit + ItemStack extracted = handler.extractItem(s, 1, false); + + // If extraction succeeded, stop here and return true + if (!extracted.isEmpty()) { + return true; + } + } + } + } + + return false; // The requested item was not found + } + + /** + * Helper to compare names like "GraphiteRod" against "graphite_rod" + * (case-insensitive, underscore-insensitive). + */ + private boolean isMatching(String registryPath, String configName) { + String cleanPath = registryPath.replace("_", "").toLowerCase(); + String cleanConfig = configName.replace("_", "").toLowerCase(); + return cleanPath.equals(cleanConfig); + } + + /** + * Cleans up invalid positions (unloaded chunk, missing block entity, + * or not a `Container`). + */ + @Override + public void clearInvalid(Level level) { + List toRemove = new ArrayList<>(); + for (BlockPos p: positions) { + if (level == null || !level.isLoaded(p)) { + toRemove.add(p); + continue; + } + + BlockEntity be = level.getBlockEntity(p); + if (be == null || !(be instanceof Container)) toRemove.add(p); + } + + positions.removeAll(toRemove); + } + + @Override + public List getBlocksPosition(Level level) { + List positions = new ArrayList<>(); + + for (BlockPos p : this.getBlocksPosition()) { + if (level.getBlockEntity(p) instanceof ReactorRodInputEntity) positions.add(p); + } + return List.copyOf(positions); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManagerI.java new file mode 100644 index 000000000..08e81a86a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputManagerI.java @@ -0,0 +1,28 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraftforge.items.IItemHandler; +import net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem; + +import java.util.List; + +/** + * Interface exposing operations specific to reactor inputs. + * Currently, provides access to `IItemHandler` instances at resolved input positions. + */ +public interface ReactorInputManagerI extends ReactorIOManager { + /** + * Retrieves valid item handlers for the given `level`. + * May return an empty list if no valid positions exist. + */ + List getItemHandlers(Level level); + + /** Returns an immutable copy of tracked positions. */ + List getBlocksPosition(Level level); + + VirtualReactorInputsItem getInventory(Level level); + + boolean extractItems(Level level, int fuelNeeded, int coolerNeeded); + boolean extractItemByName(Level level, String itemName); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java new file mode 100644 index 000000000..cb6616a54 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManager.java @@ -0,0 +1,114 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; +import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * Manager for a reactor's outputs (`ReactorOutput`). + * Handles serialization of output positions. + */ +public class ReactorOutputManager extends AbstractReactorIOManager implements ReactorOutputManagerI { + private static final String NBT_KEY = "ReactorOutputs"; + public static final int RPM_DIVIDER = 32; + + @Override + public void write(CompoundTag compound) { + ListTag list = new ListTag(); + for (BlockPos p : positions) { + CompoundTag t = new CompoundTag(); + t.putLong("p", p.asLong()); + list.add(t); + } + compound.put(NBT_KEY, list); + } + + @Override + public void read(CompoundTag compound) { + positions.clear(); + if (!compound.contains(NBT_KEY)) return; + ListTag list = compound.getList(NBT_KEY, 10); + for (int i = 0; i < list.size(); i++) { + BlockPos p = BlockPos.of(list.getCompound(i).getLong("p")); + positions.add(p); + } + } + + /** + * {@inheritDoc} + * A tracked position is dropped if its chunk isn't loaded or the block + * entity at that position is no longer a {@link ReactorOutputEntity}. + */ + @Override + public void clearInvalid(Level level) { + List toRemove = new ArrayList<>(); + for (BlockPos p : positions) { + if (level == null || !level.isLoaded(p)) { + toRemove.add(p); + continue; + } + BlockEntity be = level.getBlockEntity(p); + if (!(be instanceof ReactorOutputEntity)) toRemove.add(p); + } + positions.removeAll(toRemove); + } + + /** + * {@inheritDoc} + * Filters the tracked positions down to those currently backed by a + * loaded {@link ReactorOutputEntity}. + */ + @Override + public List getBlocksPosition(Level level) { + List positions = new ArrayList<>(); + + for (BlockPos p : this.getBlocksPosition()) { + if (level.getBlockEntity(p) instanceof ReactorOutputEntity) positions.add(p); + } + return List.copyOf(positions); + } + + /** + * {@inheritDoc} + * The total rotation (in RPM, divided down by {@link #RPM_DIVIDER}) is + * split as evenly as possible across the tracked outputs, with the + * remainder distributed to the first outputs. Each output is set to its + * share of the rotation speed if the reactor is assembled, otherwise + * stopped. + */ + @Override + public void rotateOutputs(Level level, boolean assembled, int rotation) { + if (positions.isEmpty()) return; + + int totalRpm = rotation / RPM_DIVIDER; + int size = positions.size(); + int remainingRotation = totalRpm % size; + + for (int i = 0; i < size; i++) { + int dividedRotation = (totalRpm / size) + (i < remainingRotation ? 1 : 0); + BlockPos pos = positions.get(i); + + if (!(level.getBlockState(pos).getBlock() instanceof ReactorOutput block)) continue; + ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); + if (entity == null) continue; + + if (dividedRotation > 0) { + entity.speed = assembled ? dividedRotation : 0; + entity.updateSpeed = true; + entity.setSpeedAndUpdate(dividedRotation); + entity.updateGeneratedRotation(); + } else { + entity.setSpeedAndUpdate(0); + entity.updateSpeed = true; + entity.updateGeneratedRotation(); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java new file mode 100644 index 000000000..ddc8b4b58 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorOutputManagerI.java @@ -0,0 +1,20 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.manager; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +import java.util.List; + +/** + * Interface exposing operations specific to reactor outputs. + */ +public interface ReactorOutputManagerI extends ReactorIOManager { + /** Returns an immutable copy of tracked positions. */ + List getBlocksPosition(Level level); + + /** + * Distributes the total rotation across the tracked outputs and applies + * the corresponding speed/stop to each {@code ReactorOutputEntity}. + */ + void rotateOutputs(Level level, boolean assembled, int rotation); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java new file mode 100644 index 000000000..949962c1b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultHeatService.java @@ -0,0 +1,26 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; + +public class DefaultHeatService implements IHeatService { + private final HeatManager impl; + + public DefaultHeatService(HeatManager impl) { + this.impl = impl; + } + + @Override + public int getLiquidTimer() { + return impl.getLiquidTimer(); + } + + @Override + public double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + return impl.calculateHeat(bigFluidStack, heatBalance, previousHeat, inventory, level, displayState); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java new file mode 100644 index 000000000..0e0ddd074 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/DefaultPersistenceService.java @@ -0,0 +1,50 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +public class DefaultPersistenceService implements IPersistenceService { + @Override + public void readBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, boolean clientPacket) { + owner.setMultiblockSize(compound.getInt("reactorSize")); + owner.setMultiblockFacing(Direction.byName(compound.getString("reactorFacing"))); + + owner.setMultiblockStructure(compound.contains("reactorPose") + ? BoundingBox.CODEC.parse(NbtOps.INSTANCE, compound.get("reactorPose")).result().orElse(null) + : null + ); + + if (!clientPacket) { + owner.deserializeInventory(compound.getCompound("pattern")); + } else { + owner.setDisplayState(compound.contains("displayState") + ? ReactorDisplayState.deserializeNBT(compound.getCompound("displayState")) + : ReactorDisplayState.EMPTY + ); + } + owner.setConfiguredPattern(ItemStack.of(compound.getCompound("items"))); + + } + + @Override + public void writeBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, boolean clientPacket) { + compound.putInt("reactorSize", owner.getMultiblockSize()); + compound.putString("reactorFacing", owner.getMultiblockFacing() != null ? owner.getMultiblockFacing().getSerializedName() : ""); + if (owner.getMultiblockPos() != null) { + compound.put("reactorPose", BoundingBox.CODEC.encodeStart(NbtOps.INSTANCE, owner.getMultiblockPos()).getOrThrow(false, IllegalStateException::new)); + } + + if (!clientPacket) { + compound.put("pattern", owner.serializeInventory()); + } else { + compound.put("displayState", owner.getDisplayState().serializeNBT()); + } + compound.put("items", owner.getConfiguredPattern().serializeNBT()); + + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java new file mode 100644 index 000000000..57c48cfa1 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/FluidConsumptionRateCalculator.java @@ -0,0 +1,52 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; + +/** + * Default implementation of {@link IFluidConsumptionRateCalculator}. + * The rate per cycle depends on the fluid's efficiency and the liquid timer + * exposed by {@link IHeatService}, which itself depends on the reactor size. + */ +public class FluidConsumptionRateCalculator implements IFluidConsumptionRateCalculator { + private final IHeatService heatService; + + public FluidConsumptionRateCalculator(IHeatService heatService) { + this.heatService = heatService; + } + + /** + * {@inheritDoc} + * Does nothing if the fluid stack is {@code null} or holds a negligible + * amount (≤ 1). + */ + @Override + public double tick(BigFluidStack fluidStack, int reactorSize, Level level, + ReactorInputFluidManagerI inputFluidManager, double fluidBuffer) { + if (fluidStack == null || fluidStack.amount <= 1) { + return fluidBuffer; + } + + double amountPerCycle = fluidStack.getFluidtype(level).efficiency(); + switch (reactorSize) { + case 5 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 40; + case 7 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 147; + case 9 -> amountPerCycle /= (double) heatService.getLiquidTimer() / 360; + } + + fluidBuffer += amountPerCycle; + + if (fluidBuffer >= 1.0) { + int toExtract = (int) Math.floor(fluidBuffer); + // Known limitation in ReactorInputFluidManager#extractFluids: fluidNeeded is not + // decremented across multiple tracked input handlers, so each handler may drain up + // to toExtract independently (possible over-extraction with several inputs). + // Intentionally left untouched here; out of scope for this calculator. + if (inputFluidManager.extractFluids(level, toExtract)) { + fluidBuffer -= toExtract; + } + } + return fluidBuffer; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java new file mode 100644 index 000000000..13fa18822 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IExplosionService.java @@ -0,0 +1,17 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +public interface IExplosionService { + void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod, + int notifyRadius, boolean notifyWarnAll); + + default void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod) { + triggerExplosion(level, controllerPos, reactorSize, + countFuelRod, CNConfigs.server().notify.warningDistance.get(), + CNConfigs.server().notify.warnAllPlayers.get() + ); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java new file mode 100644 index 000000000..9a9830f58 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IFluidConsumptionRateCalculator.java @@ -0,0 +1,25 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; + +/** + * Computes how much fluid should be consumed per tick and triggers extraction + * once the accumulated amount reaches a whole unit. + */ +public interface IFluidConsumptionRateCalculator { + + /** + * Advances the consumption calculation by one tick. + * + * @param fluidStack fluid currently loaded, or {@code null} if none + * @param reactorSize reactor size, used to determine the consumption rate + * @param level current level, used to resolve the fluid type + * @param inputFluidManager input manager responsible for extracting the consumed fluid + * @param fluidBuffer fractional remainder accumulated since the previous tick + * @return the new fractional remainder to carry over to the next tick + */ + double tick(BigFluidStack fluidStack, int reactorSize, Level level, + ReactorInputFluidManagerI inputFluidManager, double fluidBuffer); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java new file mode 100644 index 000000000..ed396bdea --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IHeatService.java @@ -0,0 +1,13 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +public interface IHeatService { + int getLiquidTimer(); + + double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java new file mode 100644 index 000000000..98fe4c129 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IPersistenceService.java @@ -0,0 +1,9 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.nbt.CompoundTag; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +public interface IPersistenceService { + void readBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, boolean clientPacket); + void writeBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, boolean clientPacket); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java new file mode 100644 index 000000000..f83fe1237 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorAlarmCoordinator.java @@ -0,0 +1,29 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorAlarmManagerI; + +/** + * Classifies the reactor's heat into a danger flag and drives the + * {@link net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm} blocks + * registered in a {@link ReactorAlarmManagerI} accordingly. + */ +public interface IReactorAlarmCoordinator { + + /** + * @param heat the heat value to classify + * @param multiblockSize the reactor's multiblock size, used to resolve the danger threshold + * @return {@code true} if {@code heat} falls in the DANGER heat-level range + */ + boolean computeDanger(int heat, int multiblockSize); + + /** + * Powers on/off every alarm block known to {@code alarmManager} to match {@code isDanger}, + * and awards the SILENCE_THE_CORE advancement on the rising edge (alarm turning on). + * + * @param level the reactor's level + * @param alarmManager the manager holding the alarm block positions + * @param isDanger whether the alarms should be powered on + */ + void update(Level level, ReactorAlarmManagerI alarmManager, boolean isDanger); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java new file mode 100644 index 000000000..a385c99db --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java @@ -0,0 +1,82 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +/** + * Centralizes the reactor's heat calculation logic and the decision of + * whether it has enough fuel to run. + *

+ * The {@link HeatBalance} consumed by {@link #updateHeatOnly} and + * {@link #calculateAndWriteHeat} is produced upstream by + * {@link #calculateHeatBalance}; callers resolve it once per tick and pass + * the result into both methods below. + */ +public interface IReactorHeatUpdateCoordinator { + + /** + * Computes the pattern's fuel/cooler heat balance (see {@link HeatBalance}), + * used to determine whether the reactor is within the wiki-reference 6:1 + * fuel:cooler equilibrium. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param level the level the reactor is in, used to resolve rod types + * @return the resolved heat balance for the pattern + */ + HeatBalance calculateHeatBalance(ItemStack configuredPattern, ReactorDisplayState displayState, Level level); + + /** + * Determines whether the reactor has enough fuel (FUEL-type rods) to start, + * on top of being assembled and having a fluid input. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param inputFluidManager the reactor's fluid input manager, used to check that at least one input exists + * @param level the level the reactor is in, used to resolve rod types + * @param assembled whether the multiblock is currently assembled + * @return {@code true} if every fuel rod required by the pattern is + * available and at least one fuel rod is required + */ + boolean canRun(ItemStack configuredPattern, ReactorDisplayState displayState, + ReactorInputFluidManagerI inputFluidManager, Level level, boolean assembled); + + /** + * Updates the heat without running the reactor (case where it isn't ready). + * Heat is only calculated if the full pattern (every required item, not + * just fuel) is available; otherwise it drops back to zero. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @param fluidStack the reactor's current coolant fluid stack, may be {@code null} + * @param heatBalance the pattern's fuel/cooler heat balance for this tick + * @param previousHeat the heat value calculated on the previous tick + * @param inventory the reactor controller's inventory, used to read the configured pattern items + * @param level the level the reactor is in + * @param assembled whether the multiblock is currently assembled + * @return the calculated heat, also written to the configured pattern's tag + */ + int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displayState, BigFluidStack fluidStack, + HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, boolean assembled); + + /** + * Calculates the reactor's heat during normal operation and writes it to + * the configured pattern's tag. + * + * @param configuredPattern the blueprint's configured pattern (required items) + * @param fluidStack the reactor's current coolant fluid stack, may be {@code null} + * @param heatBalance the pattern's fuel/cooler heat balance for this tick + * @param previousHeat the heat value calculated on the previous tick + * @param inventory the reactor controller's inventory, used to read the configured pattern items + * @param level the level the reactor is in + * @param displayState snapshot of items/fluids currently available to the reactor, may be {@code null} + * @return the calculated heat + */ + int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, HeatBalance heatBalance, int previousHeat, + ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java new file mode 100644 index 000000000..a326391f3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorMeltdownMonitor.java @@ -0,0 +1,31 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +/** + * Tracks the reactor's meltdown countdown and the player notifications tied to it. + * Consumes the danger flag computed by {@link IReactorAlarmCoordinator#computeDanger} + * instead of recomputing it, so the heat-level classification stays in a single place. + */ +public interface IReactorMeltdownMonitor { + + /** + * Outcome of a single countdown tick. + * {@code NONE} - not in danger, countdown reset to zero. + * {@code CRITICAL} - in danger, countdown running, explosion threshold not reached yet. + * {@code EXPLODE} - countdown threshold reached, the caller must trigger the explosion now. + */ + enum MeltdownState { NONE, CRITICAL, EXPLODE } + + /** + * Advances the countdown by one tick and sends the matching player notifications + * (stabilized / overheating / meltdown flash / critical failure). + * + * @param level the reactor's level, used for notifications and game time + * @param pos the controller's position, used as the notification origin + * @param isDanger whether the reactor is currently at heat level DANGER + * @return the resulting {@link MeltdownState} for this tick + */ + MeltdownState tick (Level level, BlockPos pos, boolean isDanger); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java new file mode 100644 index 000000000..4b365438b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorAlarmCoordinator.java @@ -0,0 +1,44 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorAlarmManagerI; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +/** + * Default {@link IReactorAlarmCoordinator}. Extracted from + * {@code ReactorControllerBlockEntity.activateAlarms(boolean)}: the alarm wiring and + * advancement award are unchanged from the original implementation. + */ +public class ReactorAlarmCoordinator implements IReactorAlarmCoordinator { + private final CNAdvancementBehaviour advancement; + + public ReactorAlarmCoordinator(CNAdvancementBehaviour advancement) { + this.advancement = advancement; + } + + @Override + public boolean computeDanger(int heat, int multiblockSize) { + return IHeat.HeatLevel.of(heat, multiblockSize) == IHeat.HeatLevel.DANGER; + } + + @Override + public void update(Level level, ReactorAlarmManagerI alarmManager, boolean isDanger) { + if (alarmManager == null) return; + + for (BlockPos pos : alarmManager.getBlocksPosition(level)) { + if (!level.isLoaded(pos)) continue; + + BlockState state = level.getBlockState(pos); + + if (state.getBlock() instanceof ReactorAlarm && state.getValue(ReactorAlarm.POWERED) != isDanger) { + level.setBlock(pos, state.setValue(ReactorAlarm.POWERED, isDanger), 3); + if (isDanger) advancement.awardPlayer(CNAdvancement.SILENCE_THE_CORE); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java new file mode 100644 index 000000000..ed5072d65 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java @@ -0,0 +1,131 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.consumable.PatternReader; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatBalance; + +import java.util.Collections; +import java.util.Map; + +/** + * Default implementation of {@link IReactorHeatUpdateCoordinator}. + * Delegates raw heat calculation to {@link IHeatService} and only adds the + * pattern-availability logic (fuel-only vs. full pattern). + */ +public class ReactorHeatUpdateCoordinator implements IReactorHeatUpdateCoordinator { + private final IHeatService heatService; + + public ReactorHeatUpdateCoordinator(IHeatService heatService) { + this.heatService = heatService; + } + + @Override + public HeatBalance calculateHeatBalance(ItemStack configuredPattern, ReactorDisplayState displayState, Level level) { + Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map currentItems = displayState != null && displayState.items() != null + ? displayState.items() : Collections.emptyMap(); + + int heatPoints = 0; + int coolingPoints = 0; + + for (Map.Entry entry : patternCounts.entrySet()) { + Item item = entry.getKey(); + int requiredCount = entry.getValue(); + int availableCount = currentItems.getOrDefault(item, 0); + int countToUse = Math.min(requiredCount, availableCount); + if (countToUse <= 0) continue; + + RodType rodType = RodType.resolveRodType(item, level); + if (rodType == null || !rodType.isNotEmptyItem()) continue; + + int weighted = rodType.ratio().get() * countToUse; + if (rodType.type() == RodType.TypeRod.FUEL) heatPoints += weighted; + else if (rodType.type() == RodType.TypeRod.COOLER) coolingPoints += weighted; + } + + return new HeatBalance(heatPoints, coolingPoints); + } + + /** Predicate applied to each pattern entry when checking availability. */ + @FunctionalInterface + private interface PatternEntryCheck { + boolean test(Item item, int requiredCount, int availableCount); + } + + /** + * Iterates over the items required by the configured pattern and applies + * {@code check} to each entry, stopping as soon as one entry fails. + * + * @return {@code true} if {@code check} succeeded for every pattern entry + */ + private static boolean checkPatternAvailability(ItemStack configuredPattern, ReactorDisplayState displayState, + PatternEntryCheck check) { + Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map currentItems = displayState != null && displayState.items() != null + ? displayState.items() : Collections.emptyMap(); + + for (Map.Entry entry : patternCounts.entrySet()) { + Item item = entry.getKey(); + int requiredCount = entry.getValue(); + int availableCount = currentItems.getOrDefault(item, 0); + if (!check.test(item, requiredCount, availableCount)) { + return false; + } + } + return true; + } + + @Override + public boolean canRun(ItemStack configuredPattern, ReactorDisplayState displayState, + ReactorInputFluidManagerI inputFluidManager, Level level, boolean assembled) { + if (configuredPattern.isEmpty() || configuredPattern.getOrCreateTag().isEmpty() + || inputFluidManager.size() == 0 || !assembled) { + return false; + } + + boolean[] hasAnyFuel = {false}; + boolean allFuelAvailable = checkPatternAvailability(configuredPattern, displayState, + (item, requiredCount, availableCount) -> { + RodType rodType = RodType.resolveRodType(item, level); + if (rodType.isNotEmptyItem() && rodType.type() == RodType.TypeRod.FUEL) { + hasAnyFuel[0] = true; + return availableCount > 0; + } + return true; // non-fuel entries don't block this gate + } + ); + + return allFuelAvailable && hasAnyFuel[0]; + } + + @Override + public int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displayState, BigFluidStack fluidStack, + HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, boolean assembled) { + int heat = 0; + boolean emptyPattern = configuredPattern.isEmpty() || configuredPattern.getOrCreateTag().isEmpty(); + if (!emptyPattern && assembled) { + boolean allAvailable = checkPatternAvailability(configuredPattern, displayState, + (item, requiredCount, availableCount) -> availableCount >= requiredCount); + if (allAvailable) { + heat = (int) heatService.calculateHeat(fluidStack, heatBalance, previousHeat, inventory, level, displayState); + } + } + configuredPattern.getOrCreateTag().putDouble("heat", heat); + return heat; + } + + @Override + public int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, HeatBalance heatBalance, int previousHeat, + ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + int heat = (int) heatService.calculateHeat(fluidStack, heatBalance, previousHeat, inventory, level, displayState); + configuredPattern.getOrCreateTag().putDouble("heat", heat); + return heat; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java new file mode 100644 index 000000000..c957b42a4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownExecutor.java @@ -0,0 +1,51 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.level.GameRules; +import net.nuclearteam.createnuclear.CNEntityType; +import net.nuclearteam.createnuclear.content.explosion.NuclearExplosionEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.BiomeIrradiationService; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; + +public class ReactorMeltdownExecutor implements IExplosionService { + @Override + public void triggerExplosion(ServerLevel level, BlockPos controllerPos, int reactorSize, int countFuelRod, int notifyRadius, boolean notifyWarnAll) { + BlockPos explosionPos = controllerPos.above(5); + + NotifyUtil.sendTitle(level, controllerPos, + CreateNuclearLang.translate("notification.reactor.destroyed"), + CreateNuclearLang.translate("notification.reactor.meltdown_finished"), + ChatFormatting.DARK_RED, notifyRadius, notifyWarnAll, 10, 60, 20 + ); + + float size = computeExplosionSize(reactorSize, countFuelRod); + + NuclearExplosionEntity explosion = new NuclearExplosionEntity(CNEntityType.NUCLEAR_EXPLOSION.get(), level); + explosion.setPos(explosionPos.getX() + 0.5D, explosionPos.getY() + 10.0D, explosionPos.getZ() - 2.0D); + explosion.setSize(size); + explosion.setNoGriefing(!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)); + level.addFreshEntity(explosion); + + level.destroyBlock(controllerPos, false); + + BiomeIrradiationService.circularArea(level, explosionPos, CNBiomes.Irradiated.PLAIN, (int) (size * 30)); + + } + + private static float computeExplosionSize(int reactorSize, int countFuelRod) { + // Scales with reactor footprint: 5x5 -> 1.0, 7x7 -> 1.4, 9x9 -> 1.8 + float structureFactor = reactorSize / 5f; + + // Square root gives diminishing returns: each extra uranium rod adds less + // to the radius than the previous one. + float fuelImpact = Mth.sqrt(countFuelRod) * .3f; + + // Final size: constant base + (fuel impact scaled by structure factor) + return Mth.clamp(1.5f + (fuelImpact * structureFactor), 1f, 10f); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java new file mode 100644 index 000000000..bc7557001 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorMeltdownMonitor.java @@ -0,0 +1,67 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.service; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +/** + * Default {@link IReactorMeltdownMonitor}. Extracted from + * {@code ReactorControllerBlockEntity.tick()}: the countdown logic and its notifications + * are unchanged from the original implementation, only moved into their own class. + */ +public class ReactorMeltdownMonitor implements IReactorMeltdownMonitor { + /** Ticks of continuous danger before the reactor explodes (15s at 20 TPS). */ + private static final int EXPLOSION_THRESHOLD_TICKS = 300; + /** Last seconds of the countdown during which the flashing "meltdown in" message is shown. */ + private static final int CRITICAL_WINDOW_SECONDS = 10; + + private int explosionCountDown = 0; + + @Override + public MeltdownState tick(Level level, BlockPos pos, boolean isDanger) { + int configRadius = CNConfigs.server().notify.warningDistance.get(); + boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + + if (!isDanger) { + boolean wasCountingDown = explosionCountDown > 0; + explosionCountDown = 0; + if (wasCountingDown) { + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.stabilized"), + ChatFormatting.GREEN, configRadius, configWarnAll); + } + return MeltdownState.NONE; + } + + explosionCountDown++; + int secondsLeft = (EXPLOSION_THRESHOLD_TICKS - explosionCountDown) / 20; + + if (secondsLeft <= CRITICAL_WINDOW_SECONDS && secondsLeft > 0) { + boolean isWhite = (level.getGameTime() / 5) % 2 == 0; + ChatFormatting flashColor = isWhite ? ChatFormatting.WHITE : ChatFormatting.RED; + + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.meltdown_in") + .add(CreateNuclearLang.number(secondsLeft)) + .add(CreateNuclearLang.translate("generic.unit.seconds")), + flashColor, configRadius, configWarnAll); + } else if (secondsLeft > CRITICAL_WINDOW_SECONDS && explosionCountDown % 20 == 0) { + NotifyUtil.sendActionBar(level, pos, + CreateNuclearLang.translate("notification.reactor.overheating"), + ChatFormatting.DARK_RED, configRadius, configWarnAll); + } + + if (explosionCountDown >= EXPLOSION_THRESHOLD_TICKS) { + NotifyUtil.sendTitle(level, pos, + CreateNuclearLang.translate("notification.reactor.critical_failure"), + CreateNuclearLang.translate("notification.reactor.imminent_explosion"), + ChatFormatting.DARK_RED, configRadius, configWarnAll, 0, 40, 10); + return MeltdownState.EXPLODE; + } + + return MeltdownState.CRITICAL; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java new file mode 100644 index 000000000..b9e557567 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshot.java @@ -0,0 +1,32 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.snapshot; + +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +import java.util.List; +import java.util.Map; + +/** + * Snapshot of the reactor's inputs, collected once per tick. + *

+ * {@code items} reflects the items actually present (for tooltip display). + * {@code bigFuelItem}/{@code bigCoolerItem} are derived from + * {@link net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem} and always represent, respectively, + * Uranium Rod / Graphite Rod (generic tag-based count, fixed identity) — + * do not use these fields to infer the actual item type loaded. + *

+ * The elements of {@code fluids} ({@link BigFluidStack}) remain mutable + * (public fields); this snapshot only guarantees immutability of the + * list/map structure, not of their contents. + */ + +public record ReactorInputSnapshot(Map items, List fluids, long maxFluidCapacity) { + public static final ReactorInputSnapshot EMPTY = new ReactorInputSnapshot( + Map.of(), List.of(), 0 + ); + + public ReactorInputSnapshot { + items = Map.copyOf(items); + fluids = List.copyOf(fluids); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java new file mode 100644 index 000000000..b6a0bbb94 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/snapshot/ReactorInputSnapshotBuilder.java @@ -0,0 +1,49 @@ +package net.nuclearteam.createnuclear.content.multiblock.controller.snapshot; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManagerI; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputManagerI; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; +import net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ReactorInputSnapshotBuilder { + private ReactorInputSnapshotBuilder() {} + + public static ReactorInputSnapshot build(Level level, ReactorInputManagerI inputManager, ReactorInputFluidManagerI inputFluidManager) { + // Populate display fields for client sync + Map items = new HashMap<>(); + List itemHandlers = inputManager.getItemHandlers(level); + for (IItemHandler h : itemHandlers) { + for (int s = 0; s < h.getSlots(); s++) { + ItemStack st = h.getStackInSlot(s); + if (!st.isEmpty()) { + items.merge(st.getItem(), st.getCount(), Integer::sum); + } + } + } + + long maxFluidCapacity = 0; + for (IFluidHandler h : inputFluidManager.getFuildHandlers(level)) { + if (h.getTanks() > 0) { + maxFluidCapacity += h.getTankCapacity(0); + } + } + + VirtualReactorInputsItem virtualItems = inputManager.getInventory(level); + VirtualReactorInputFluid virtualFluid = inputFluidManager.getInventory(level); + List fluids = VirtualReactorInputFluid.toBigList(virtualFluid.fluids()); + + + + return new ReactorInputSnapshot(items, fluids, maxFluidCapacity); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java new file mode 100644 index 000000000..3cdb4cca9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java @@ -0,0 +1,42 @@ +package net.nuclearteam.createnuclear.content.multiblock.cooler; + +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +import javax.annotation.Nullable; + +public class ReactorCooler extends Block implements IWrenchable { + public ReactorCooler(Properties properties) { + super(properties); + } + + protected ReactorPattern pattern = new ReactorPattern(); + + @Override // Called when the block is placed on the world + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + pattern.findController(pos, level, true); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + super.onRemove(state, level, pos, newState, movedByPiston); + pattern.findController(pos, level, false); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java index 8b660c4bf..f362012fa 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/core/ReactorCoreEntity.java @@ -1,20 +1,15 @@ package net.nuclearteam.createnuclear.content.multiblock.core; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.IHeat; import net.nuclearteam.createnuclear.content.multiblock.casing.ReactorCasingEntity; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; - -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; @SuppressWarnings({"unused"}) public class ReactorCoreEntity extends ReactorCasingEntity { + private int countdownTicks = 0; + private boolean hasExploded = false; public ReactorCoreEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -24,69 +19,6 @@ public ReactorCoreEntity(BlockEntityType type, BlockPos pos, BlockState state public void tick() { super.tick(); - if (level.isClientSide()) return; - - BlockPos controllerPos = getBlockPosForReactor(); - if (level.getBlockEntity(controllerPos) instanceof ReactorControllerBlockEntity reactorController) { - int heat = (int) reactorController.configuredPattern.getOrCreateTag().getDouble("heat"); - if (IHeat.HeatLevel.of(heat) == IHeat.HeatLevel.DANGER) { - if (countdownTicks >= 600) { // 300 ticks = 15 secondes - explodeReactorCore(level, getBlockPos()); - } else { - countdownTicks++; - } - } else { - countdownTicks = 0; // Reset the countdown if the heat level is not in danger - } - } - } - - private void explodeReactorCore(Level world, BlockPos pos) { - level.explode(null, pos.getX(), pos.getY(), pos.getZ(), 20F, Level.ExplosionInteraction.BLOCK); - } - - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_INPUT.get())) - .getDistanceController(character); - } - - private BlockPos getBlockPosForReactor() { - BlockPos posController = getBlockPos(); - BlockPos posInput = new BlockPos(posController.getX(), posController.getY(), posController.getZ()); - - int[][][] directions = { - {{0, 2, 2}, {0, 1, 2}, {0, 0, 2}, {0, -1, 2}, {0, -2, 2}}, // NORTH - {{0, 2, -2}, {0, 1, -2}, {0, 0, -2}, {0, -1, -2}, {0, -2, -2}}, // SOUTH - - {{2, 2, 0}, {2, 1, 0}, {2, 0, 0}, {2, -1, 0}, {2, -2, 0}}, // EAST - {{-2, 2, 0}, {-2, 1, 0}, {-2, 0, 0}, {-2, -1, 0}, {-2, -2, 0}} // WEST - }; - - - for (int[][] direction : directions) { - for (int[] dir : direction) { - BlockPos newPos = posController.offset(dir[0], dir[1], dir[2]); - if (level.getBlockState(newPos).is(CNBlocks.REACTOR_CONTROLLER.get())) { - posInput = newPos; - break; - } - } - } - - return posInput; + if (level.isClientSide() || hasExploded) return; } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java new file mode 100644 index 000000000..1f9e6a659 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java @@ -0,0 +1,54 @@ +package net.nuclearteam.createnuclear.content.multiblock.fluid; + +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.material.Fluids; +import net.nuclearteam.createnuclear.CNFluids; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; + +import static net.nuclearteam.createnuclear.api.ReactorFluidTypesValue.DEFAULT_REACTOR_FLUID_TYPE; + +public class CNReactorFluidTypes { + /** + * Static registry of reactor fluid types ({@link ReactorFluidType}) for the CreateNuclear mod. + * + *

This class exposes the {@link ResourceKey}s and the {@code bootstrap} + * method invoked by the datapack system to register reactor fluid types used + * by the multiblock (for example, specific fluids with heat/efficiency + * characteristics). The example below shows how to create a + * {@code ReactorFluidType} via its {@code ReactorFluidType.Builder}.

+ * + *

Example — Custom Reactor Fluid:

+ *
{@code
+     * register(ctx, "name", new ReactorFluidType.Builder()
+     *             .maxHeat(int)
+     *             .efficiency(int)
+     *             .fluid(Fluid)
+     *             .build());
+     * }
+ * + * @see net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType + * @see net.nuclearteam.createnuclear.api.CreateNuclearRegistries + */ + public static void bootstrap(BootstapContext ctx) { + register(ctx, "fallback", DEFAULT_REACTOR_FLUID_TYPE); + register(ctx, "water", new ReactorFluidType.Builder() + .fluid(Fluids.WATER) + .maxHeat(2048) + .efficiency(1000) + .build() + ); + register(ctx, "nitrogen", new ReactorFluidType.Builder() + .fluid(CNFluids.LIQUID_NITROGEN.getSource()) + .maxHeat(8196) + .efficiency(100) + .build() + ); + } + + private static void register(BootstapContext ctx, String name, ReactorFluidType type) { + ctx.register(ResourceKey.create(CreateNuclearRegistries.FLUID_TYPE, CreateNuclear.asResource(name)), type); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java index d9c1ad3fa..711f6846a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrame.java @@ -1,10 +1,11 @@ package net.nuclearteam.createnuclear.content.multiblock.frame; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -14,21 +15,22 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; +import net.nuclearteam.createnuclear.CNBlockEntityTypes; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - -public class ReactorFrame extends Block implements IWrenchable { +public class ReactorFrame extends Block implements IWrenchable, IBE { public static final Property PART = EnumProperty.create("part", Part.class); - + protected ReactorPattern pattern = new ReactorPattern(); public ReactorFrame(Properties properties) { super(properties); } @@ -108,32 +110,33 @@ public BlockState mirror(BlockState state, Mirror mirror) { @Override public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); + pattern.findController(pos, level, true); } - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - return controller; - } - } - } + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + super.onRemove(state, level, pos, newState, movedByPiston); + // playerDestroy is NOT called in creative mode, so the structure must also be + // re-evaluated here. Only react to an actual block removal/replacement (different + // block type), not to a simple PART property change (same block, via setBlock). + if (!state.is(newState.getBlock())) { + pattern.findController(pos, level, false); } - return null; } + @Override + public Class getBlockEntityClass() { + return ReactorFrameEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return CNBlockEntityTypes.REACTOR_FRAME.get(); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameEntity.java new file mode 100644 index 000000000..fc4b7d92c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameEntity.java @@ -0,0 +1,79 @@ +package net.nuclearteam.createnuclear.content.multiblock.frame; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Block entity for {@link ReactorFrame}. It only stores a reference to the + * reactor controller that owns this frame so the client-side renderer + * ({@link ReactorFrameRenderer}) can fetch the reactor's current fluid and + * draw it dynamically inside the frame window. + * + *

The controller position is assigned by + * {@link net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler} + * during assembly and persisted/synced through {@link SmartBlockEntity}.

+ */ +public class ReactorFrameEntity extends SmartBlockEntity { + + @Nullable + private BlockPos controller; + + public ReactorFrameEntity(BlockEntityType type, BlockPos pos, BlockState state) { + + super(type, pos, state); + setController(pos); + } + + @Override + public void addBehaviours(List behaviours) { } + + /** Assigns the owning reactor controller and syncs the change to clients. */ + public void setController(@Nullable BlockPos controllerPos) { + if (java.util.Objects.equals(this.controller, controllerPos)) return; + this.controller = controllerPos; + notifyUpdate(); + } + + @Nullable + public BlockPos getController() { + return controller; + } + + /** + * Resolves the controller block entity, returning {@code null} when no + * controller is assigned or the referenced block is no longer a controller. + */ + @Nullable + public ReactorControllerBlockEntity getControllerEntity() { + if (controller == null || level == null) return null; + if (level.getBlockEntity(controller) instanceof ReactorControllerBlockEntity controllerEntity) + return controllerEntity; + return null; + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + if (tag.contains("Controller")) { + this.controller = BlockPos.of(tag.getLong("Controller")); + } else { + this.controller = null; + } + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (controller != null) { + tag.putLong("Controller", controller.asLong()); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java new file mode 100644 index 000000000..3353281f9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java @@ -0,0 +1,74 @@ +package net.nuclearteam.createnuclear.content.multiblock.frame; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; +import net.createmod.catnip.platform.ForgeCatnipServices; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraftforge.fluids.FluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorFrameDisplayManagerI; + +/** + * Renders the reactor fluid dynamically inside the {@link ReactorFrame} window. + * The fluid (texture + tint) is resolved from the owning reactor controller, so + * the visible liquid reflects whichever fluid the reactor actually uses + * (water, liquid nitrogen, ...) instead of a texture baked into the model. + */ +public class ReactorFrameRenderer extends SafeBlockEntityRenderer { + + // Horizontal interior of the window (1..15 px on a 16 px block). + private static final float X_MIN = 1f / 16f; + private static final float X_MAX = 15f / 16f; + private static final float Z_MIN = 1f / 16f; + private static final float Z_MAX = 15f / 16f; + + public ReactorFrameRenderer(BlockEntityRendererProvider.Context context) { } + + @Override + protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + ReactorControllerBlockEntity controller = be.getControllerEntity(); + if (controller == null) return; + + ReactorFrameDisplayManagerI frameDisplay = controller.getFrameDisplayManager(); + + FluidStack fluid = frameDisplay.getDisplayedFluid(controller.getLevel(), controller.getInputFluidManager()); + if (fluid == null || fluid.isEmpty()) return; + + // Local vertical bounds of the liquid volume inside this block, matching + // what used to be baked into each frame part model + // (frame_top / frame_middle / frame_bottom / frame_none). + float boxYMin; + float boxYMax; + switch (be.getBlockState().getValue(ReactorFrame.PART)) { + case START -> { boxYMin = 0f; boxYMax = 9f / 16f; } + case MIDDLE -> { boxYMin = 0f; boxYMax = 1f; } + case END -> { boxYMin = 4f / 16f; boxYMax = 1f; } + default -> { boxYMin = 2.9f / 16f; boxYMax = 9.9f / 16f; } + } + + // Clamp the liquid to the reactor's global fill level so the whole wall + // shares one continuous surface that rises from the bottom as the input + // fills. The level is mapped over the range that liquid actually occupies: + // from the bottom frame's lip (frameMinY + 4/16) to the top frame's cap + // (frameMaxY + 9/16), so even a nearly-empty reactor still shows a sliver. + float yMax = boxYMax; + if (frameDisplay.hasFrameColumn()) { + float ratio = frameDisplay.getDisplayedFluidFillRatio(controller.getLevel(), controller.getInputFluidManager()); + double liquidBottomWorldY = frameDisplay.getFrameColumnMinY() + 4.0 / 16.0; + double liquidTopWorldY = frameDisplay.getFrameColumnMaxY() + 9.0 / 16.0; + double surfaceWorldY = liquidBottomWorldY + ratio * (liquidTopWorldY - liquidBottomWorldY); + double localSurface = surfaceWorldY - be.getBlockPos().getY(); + if (localSurface <= boxYMin) return; // liquid level is below this block + yMax = (float) Math.min(boxYMax, localSurface); + } + + // Last arg (invertGasses) must be false: liquid nitrogen has density 0, so + // it counts as "lighter than air" and would otherwise be flipped 180°, + // hiding the top surface. We always fill bottom-to-top here. + ForgeCatnipServices.FLUID_RENDERER.renderFluidBox(fluid, + X_MIN, boxYMin, Z_MIN, X_MAX, yMax, Z_MAX, + buffer, ms, light, false, false); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorGaugeOverrides.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorGaugeOverrides.java deleted file mode 100644 index de268b3ac..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorGaugeOverrides.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.frame; - -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.RegistrateItemModelProvider; -import net.minecraft.world.item.Item; -import net.minecraftforge.client.model.generators.ItemModelBuilder; - -public class ReactorGaugeOverrides { - public static ItemModelBuilder addOverrideModels(DataGenContext c, RegistrateItemModelProvider p) { - ItemModelBuilder builder = p.generated(c); - /*CreateNuclear.LOGGER.warn(" " + builder.override() - .model(p.getBuilder("block/reactor_main_frame/reactor_gauge_none") - .parent(p.getExistingFile(p.modLoc("block/reactor_main_frame/reactor_gauge_none")))) - .end().toJson());*/ - return builder.override() - .model(p.getBuilder("block/reactor_main_frame/reactor_gauge_none") - .parent(p.getExistingFile(p.modLoc("block/reactor_main_frame/reactor_gauge_none")))) - .end(); - //.predicate(CreateNuclear.asResource("reactor_main_frame"), 0) - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInput.java deleted file mode 100644 index a85dfeedf..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInput.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.foundation.block.IBE; -import com.simibubi.create.foundation.item.ItemHelper; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -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.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.common.property.Properties; -import net.minecraftforge.network.NetworkHooks; -import net.nuclearteam.createnuclear.CNBlockEntityTypes; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.CNShapes; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.foundation.block.HorizontalDirectionalReactorBlock; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.List; - -public class ReactorInput extends HorizontalDirectionalReactorBlock implements IWrenchable, IBE { - - public ReactorInput(Properties properties) { - super(properties); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING); - super.createBlockStateDefinition(builder); - } - - @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - ItemStack itemInHand = player.getItemInHand(handIn); - - if (itemInHand.getItem() instanceof BlockItem) { - return InteractionResult.PASS; - } - - - if (worldIn.isClientSide()) {return InteractionResult.SUCCESS;} - - withBlockEntityDo(worldIn, pos, be -> NetworkHooks.openScreen((ServerPlayer) player, be, be::sendToMenu)); - return InteractionResult.PASS; - } - - @Override - public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { - super.onPlace(state, level, pos, oldState, isMoving); - List players = level.players(); - FindController(pos, level, players, true); - } - - // @Override // ! may be useless - // public void setPlacedBy(Level worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - // super.setPlacedBy(worldIn, pos, state, placer, stack); - // if (worldIn.isClientSide) - // return; - // if (stack == null) - // return; - // withBlockEntityDo(worldIn, pos, be -> { - // CompoundTag orCreateTag = stack.getOrCreateTag(); - // be.readInventory(orCreateTag.getCompound("Inventory")); - // }); - // } - - @Override - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); - } - - @Override - public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { - super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); - - withBlockEntityDo(pLevel, pPos, be -> ItemHelper.dropContents(pLevel, pPos, be.inventory)); - pLevel.removeBlockEntity(pPos); - - List players = pLevel.players(); - FindController(pPos, pLevel, players, false); - } - - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, pos.getY(), z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } - } - return null; - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return this.defaultBlockState() - .setValue(FACING, context.getHorizontalDirection().getOpposite()); - } - @Override - public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return CNShapes.REACTOR_INPUT.get(state.getValue(FACING)); - } - - @Override - public Class getBlockEntityClass() { - return ReactorInputEntity.class; - } - - @Override - public BlockEntityType getBlockEntityType() { - return CNBlockEntityTypes.REACTOR_INPUT.get(); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputEntity.java deleted file mode 100644 index ff5f4f6d5..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputEntity.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - -import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -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.level.Level; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.nuclearteam.createnuclear.CNBlocks; - -import javax.annotation.Nullable; -import java.util.List; - -import static net.nuclearteam.createnuclear.content.multiblock.CNMultiblock.*; - -public class ReactorInputEntity extends SmartBlockEntity implements MenuProvider { - protected BlockPos block; - //protected ReactorControllerBlockEntity controller; - - public ReactorInputInventory inventory; - LazyOptional inventoryProvider; - - - public ReactorInputEntity(BlockEntityType type, BlockPos pos, BlockState state) { - super(type, pos, state); - inventory = new ReactorInputInventory(this); - inventoryProvider = LazyOptional.of(() -> inventory); - - } - - @Override - public void addBehaviours(List behaviours) { } - - @Override - protected void read(CompoundTag tag, boolean clientPacket) { - if (!clientPacket) { - inventory.deserializeNBT(tag.getCompound("Inventory")); - } - super.read(tag, clientPacket); - } - - @Override - protected void write(CompoundTag tag, boolean clientPacket) { - if (!clientPacket) { - tag.put("Inventory", inventory.serializeNBT()); - } - super.write(tag, clientPacket); - } - - public void readInventory(CompoundTag compound) { - inventory.deserializeNBT(compound); - } - - - @Nullable - @Override - public Level getLevel() { - return super.getLevel(); - } - - - private static BlockPos FindController(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAIAA, ADADA, BACAB, ADADA, AAAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AABAA, ADADA, BACAB, ADADA, AABAA) - .aisle(AAAAA, AAAAA, AAAAA, AAAAA, AAOAA) - .where('A', a -> a.getState().is(CNBlocks.REACTOR_CASING.get())) - .where('B', a -> a.getState().is(CNBlocks.REACTOR_FRAME.get())) - .where('C', a -> a.getState().is(CNBlocks.REACTOR_CORE.get())) - .where('D', a -> a.getState().is(CNBlocks.REACTOR_COOLER.get())) - .where('*', a -> a.getState().is(CNBlocks.REACTOR_CONTROLLER.get())) - .where('O', a -> a.getState().is(CNBlocks.REACTOR_OUTPUT.get())) - .where('I', a -> a.getState().is(CNBlocks.REACTOR_INPUT.get())) - .getDistanceController(character); - } - - @Override - public Component getDisplayName() { - return Component.translatable("gui.createnuclear.reactor_input.title"); - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { - return ReactorInputMenu.create(i, inventory, this); - } - - @Override - public void tick() { - super.tick(); - } - - protected boolean isItemHandlerCap(Capability cap) { - return cap == ForgeCapabilities.ITEM_HANDLER; - } - - @Override - public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap)) - return inventoryProvider.cast(); - return super.getCapability(cap, side); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputGenerator.java deleted file mode 100644 index 36f2811c8..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - -import com.simibubi.create.foundation.data.SpecialBlockStateGen; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.RegistrateBlockstateProvider; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.generators.ModelFile; - -public class ReactorInputGenerator extends SpecialBlockStateGen { - @Override - protected int getXRotation(BlockState state) { - return 0; - } - - @Override - protected int getYRotation(BlockState state) { - return horizontalAngle(state.getValue(ReactorInput.FACING)); - } - - @Override - public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - return prov.models().getExistingFile(prov.modLoc("block/reactor/input/block")); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputInventory.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputInventory.java deleted file mode 100644 index 338e65ed0..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputInventory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - - -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.ItemStackHandler; -import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.CNTags; -import org.jetbrains.annotations.NotNull; - -public class ReactorInputInventory extends ItemStackHandler { - private final ReactorInputEntity be; - - public ReactorInputInventory(ReactorInputEntity be) { - super(2); - this.be = be; - } - - @Override - protected void onContentsChanged(int slot) { - super.onContentsChanged(slot); - be.setChanged(); - } - - @Override - public boolean isItemValid(int slot, @NotNull ItemStack stack) { - return switch (slot) { - case 0 -> CNTags.CNItemTags.FUEL.matches(stack); - case 1 -> CNTags.CNItemTags.COOLER.matches(stack); - default -> !super.isItemValid(slot, stack); - }; - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputMenu.java deleted file mode 100644 index 4d900d76e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputMenu.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - -import com.simibubi.create.foundation.gui.menu.MenuBase; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ClickType; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.SlotItemHandler; -import net.nuclearteam.createnuclear.CNMenus; - -public class ReactorInputMenu extends MenuBase { - - - public ReactorInputMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { - super(type, id, inv, extraData); - } - - public ReactorInputMenu(MenuType type, int id, Inventory inv, ReactorInputEntity contentHolder) { - super(type, id, inv, contentHolder); - } - - public static ReactorInputMenu create(int id, Inventory inv, ReactorInputEntity contentHolder) { - return new ReactorInputMenu(CNMenus.SLOT_ITEM_STORAGE.get(), id, inv, contentHolder); - } - - @Override - public ItemStack quickMoveStack(Player player, int index) { - Slot clickedSlot = getSlot(index); - if (!clickedSlot.hasItem()) return ItemStack.EMPTY; - ItemStack stack = clickedSlot.getItem(); - if (index < 2) moveItemStackTo(stack, 2, slots.size(), false); - else moveItemStackTo(stack, 0, 2, false); - return ItemStack.EMPTY; - } - - @Override - protected ReactorInputEntity createOnClient(FriendlyByteBuf extraData) { - ClientLevel world = Minecraft.getInstance().level; - BlockEntity entity = world.getBlockEntity(extraData.readBlockPos()); - if (entity instanceof ReactorInputEntity reactorInputEntity) { - reactorInputEntity.readClient(extraData.readNbt()); - return reactorInputEntity; - } - return null; - } - - @Override - protected void initAndReadInventory(ReactorInputEntity contentHolder) { - - } - - @Override - protected void addSlots() { - - // player Slots - for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) { - this.addSlot(new Slot(player.getInventory(), hotbarSlot, -31 + hotbarSlot * 18, 155)); - } - - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 9; ++col) { - this.addSlot(new Slot(player.getInventory(), col + row * 9 + 9, -31 + col * 18, 97 + row * 18)); - } - } - - Slot slot1 = new SlotItemHandler(contentHolder.inventory, 0, 24, 29); - Slot slot2 = new SlotItemHandler(contentHolder.inventory, 1, 57, 29); - - addSlot(slot1); - addSlot(slot2); - - - } - - @Override - protected void saveData(ReactorInputEntity contentHolder) { - } - - @Override - public void clicked(int slotId, int button, ClickType clickType, Player player) { - if (clickType == ClickType.THROW) { - int[] targetSlotIds = {9, 18, 27, 0, 1, 28, 19, 10, 16, 17, 26, 25, 34, 35, 8, 7}; - for (int id : targetSlotIds) { - if (slotId == id) { - clickType = ClickType.PICKUP; - super.clicked(slotId, button, clickType, player); - } - } - return; - } - super.clicked(slotId, button, clickType, player); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputScreen.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputScreen.java deleted file mode 100644 index 9bd900fcc..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/ReactorInputScreen.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input; - -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.nuclearteam.createnuclear.foundation.gui.CNGuiTextures; - -import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; - -public class ReactorInputScreen extends AbstractSimiContainerScreen { - - protected static final CNGuiTextures background = CNGuiTextures.REACTOR_SLOT_INVENTOR; - - public ReactorInputScreen(ReactorInputMenu container, Inventory inv, Component title) { - super(container, inv, title); - } - - @Override - protected void init() { - setWindowSize(background.width, background.height+ 4 + AllGuiTextures.PLAYER_INVENTORY.getHeight()); - setWindowOffset(0,0); - super.init(); - } - - @Override - protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { - int invX = getLeftOfCentered(PLAYER_INVENTORY.getWidth()); - int invY = topPos + background.height + 4; - renderPlayerInventory(guiGraphics, invX, invY); - - int x = leftPos; - int y = topPos; - - background.render(guiGraphics, x, y); - - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PersistentFluidLocks.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PersistentFluidLocks.java new file mode 100644 index 000000000..22f6f02c4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PersistentFluidLocks.java @@ -0,0 +1,91 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.saveddata.SavedData; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class PersistentFluidLocks extends SavedData { + private final Map locks = new ConcurrentHashMap<>(); + private static final String DATA_NAME = "createnuclear_fluid_locks"; + + /** + * Persistent storage for fluid locks associated with multiblock controllers. + * Locks are persisted to world saved data so controllers keep their preferred + * fluid across server restarts. + */ + + public static PersistentFluidLocks get(ServerLevel level) { + return level.getDataStorage().computeIfAbsent(nbt -> { + PersistentFluidLocks d = new PersistentFluidLocks(); + d.readFrom(nbt); + + return d; + }, PersistentFluidLocks::new, DATA_NAME); + } + + /** + * Attempt to acquire a persistent lock for the specified controller position. + * @param pos controller block position + * @param fluid fluid to lock to; if null the call is a no-op and returns true + * @return true if the lock was acquired or already held for the same fluid + */ + public boolean tryLock(BlockPos pos, Fluid fluid) { + if (fluid == null) return true; + boolean ok = locks.compute(pos, (k,v) -> v == null ? fluid : v) == fluid; + if (ok) setDirty(); + return ok; + } + + /** + * Check whether the given fluid is acceptable for the controller at {@code pos}. + * @param pos controller position + * @param fluid fluid to check + * @return true if no lock is present or the lock matches the provided fluid + */ + public boolean canAccept(BlockPos pos, Fluid fluid) { + if (fluid == null) return true; + Fluid locked = locks.get(pos); + return locked == null || locked == fluid; + } + + /** + * Clear any persistent lock for the specified controller position. + * Marks the saved data as dirty when a lock was removed. + */ + public void clearLock(BlockPos pos) { + if (locks.remove(pos) != null) setDirty(); + } + + public void readFrom(CompoundTag nbt) { + locks.clear(); + ListTag list = nbt.getList("locks", 10); + list.forEach(tag -> { + CompoundTag e = (CompoundTag) tag; + BlockPos pos = new BlockPos(e.getInt("x"), e.getInt("y"), e.getInt("z")); + Fluid f = ForgeRegistries.FLUIDS.getValue(net.minecraft.resources.ResourceLocation.tryParse(e.getString("fluid"))); + if (f != null) locks.put(pos, f); + }); + } + + @Override + public CompoundTag save(CompoundTag nbt) { + ListTag list = new ListTag(); + locks.forEach((pos, fluid) -> { + CompoundTag e = new CompoundTag(); + e.putInt("x", pos.getX()); + e.putInt("y", pos.getY()); + e.putInt("z", pos.getZ()); + e.putString("fluid", ForgeRegistries.FLUIDS.getKey(fluid).toString()); + list.add(e); + }); + nbt.put("locks", list); + return nbt; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java new file mode 100644 index 000000000..bcc02e744 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java @@ -0,0 +1,102 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; +import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; +import com.simibubi.create.content.fluids.transfer.GenericItemFilling; +import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.fluid.FluidHelper.FluidExchange; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class PlayerInteractReactorFluidInput { + public static InteractionResult interact(Level level, BlockPos pos, Player player, InteractionHand hand, ItemStack stack, boolean onClient, BlockHitResult ray) { + FluidExchange exchange = null; + ReactorFluidInputEntity be = (ReactorFluidInputEntity) level.getBlockEntity(pos); + if (be == null) { + return InteractionResult.FAIL; + } + + LazyOptional tank = be.getCapability(ForgeCapabilities.FLUID_HANDLER); + if (!tank.isPresent()) return InteractionResult.PASS; + + IFluidHandler fluidInput = tank.orElse(null); + FluidStack prevFluidInInput = fluidInput.getFluidInTank(0).copy(); + + if (FluidHelper.tryEmptyItemIntoBE(level, player, hand, stack, be)) exchange = FluidExchange.ITEM_TO_TANK; + if (FluidHelper.tryFillItemFromBE(level, player, hand, stack, be)) exchange = FluidExchange.TANK_TO_ITEM; + + if (exchange == null) { + if (GenericItemEmptying.canItemBeEmptied(level, stack) || GenericItemFilling.canItemBeFilled(level, stack)) return InteractionResult.SUCCESS; + return InteractionResult.PASS; + } + + SoundEvent soundEvent = null; + BlockState fluidState = null; + FluidStack fluidInInput = tank.map(fh -> fh.getFluidInTank(0)) + .orElse(FluidStack.EMPTY); + + if (exchange == FluidExchange.ITEM_TO_TANK) { + Fluid fluid = fluidInInput.getFluid(); + fluidState = fluid.defaultFluidState().createLegacyBlock(); + soundEvent = FluidHelper.getEmptySound(fluidInInput); + } + + if (exchange == FluidExchange.TANK_TO_ITEM) { + Fluid fluid = prevFluidInInput.getFluid(); + fluidState = fluid.defaultFluidState().createLegacyBlock(); + soundEvent = FluidHelper.getFillSound(prevFluidInInput); + } + + if (soundEvent != null && !onClient) { + float pitch = Mth + .clamp(1 - (1f * fluidInInput.getAmount() / (FluidTankBlockEntity.getCapacityMultiplier() * 16)), 0, 1); + pitch /= 1.5f; + pitch += .5f; + pitch += (level.random.nextFloat() - .5f) / 4f; + level.playSound(null, pos, soundEvent, SoundSource.BLOCKS, .5f, pitch); + } + + if (!fluidInInput.isFluidStackIdentical(prevFluidInInput)) { + if (fluidState != null && onClient) { + BlockParticleOption blockParticleData = + new BlockParticleOption(ParticleTypes.BLOCK, fluidState); + float flevel = (float) fluidInInput.getAmount() / fluidInput.getTankCapacity(0); + + boolean reversed = fluidInInput.getFluid() + .getFluidType() + .isLighterThanAir(); + if (reversed) + flevel = 1 - flevel; + + Vec3 vec = ray.getLocation(); + vec = new Vec3(vec.x, be.getBlockPos() + .getY() + flevel * (1 - .5f) + .25f, vec.z); + Vec3 motion = player.position() + .subtract(vec) + .scale(1 / 20f); + vec = vec.add(motion); + level.addParticle(blockParticleData, vec.x, vec.y, vec.z, motion.x, motion.y, motion.z); + return InteractionResult.SUCCESS; + } + } + return InteractionResult.SUCCESS; + + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java new file mode 100644 index 000000000..6c406f764 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java @@ -0,0 +1,111 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +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.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +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; +import net.nuclearteam.createnuclear.CNBlockEntityTypes; +import net.nuclearteam.createnuclear.CNShapes; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +public class ReactorFluidInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { + + public ReactorFluidInput(Properties properties) { + super(properties); + } + + @Override + public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean moved) { + super.onPlace(state, world, pos, oldState, moved); + MultiblockHelpers.handleOnPlace(pos, world, ReactorControllerBlockEntity::addInputFluid); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + super.createBlockStateDefinition(builder); + } + + @Override + public InteractionResult onWrenched(BlockState state, UseOnContext context) { + return InteractionResult.SUCCESS; + } + + @Override + public VoxelShape getBlockSupportShape(BlockState pState, BlockGetter pReader, BlockPos pPos) { + return Shapes.block(); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState() + .setValue(FACING, context.getNearestLookingDirection().getOpposite()); + } + + @Override + public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + return CNShapes.REACTOR_FLUID_INPUT.get(state.getValue(FACING)); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult ray) { + ItemStack heldItem = player.getItemInHand(hand); + boolean onClient = world.isClientSide; + + if (heldItem.isEmpty()) + return InteractionResult.PASS; + if (!player.isCreative()) + return InteractionResult.PASS; + + return PlayerInteractReactorFluidInput.interact(world, pos, player, hand, heldItem, onClient, ray); + } + + @Override + public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) { + super.onRemove(state, world, pos, newState, isMoving); + MultiblockHelpers.handleRemoval(pos, world, ReactorControllerBlockEntity::removeInputFluid); + } + + @Override + public Class getBlockEntityClass() { + return ReactorFluidInputEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return CNBlockEntityTypes.REACTOR_FLUID_INPUT.get(); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java new file mode 100644 index 000000000..2e275cbf8 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputEntity.java @@ -0,0 +1,235 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.fluid.SmartFluidTank; +import net.createmod.catnip.animation.LerpedFloat; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class ReactorFluidInputEntity extends SmartBlockEntity implements IHaveGoggleInformation { + + /** Default tank capacity while this input is not attached to any assembled reactor. */ + public static final int DEFAULT_CAPACITY = 16000; + + private final FluidTank internalTank; + private LazyOptional capability; + private LerpedFloat fluidLevel; + + public ReactorFluidInputEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + internalTank = new SmartFluidTank(DEFAULT_CAPACITY, this::onTankContentsChanged); + capability = LazyOptional.of(() -> internalTank); + + refreshCapability(); + } + + /** + * Returns the tank capacity for the given reactor size (tier). + * 5x5 -> tier 1, 7x7 -> tier 2, 9x9 -> tier 3. + */ + public static int getCapacityForReactorSize(int reactorSize) { + return switch (reactorSize) { + case 5 -> 144000; + case 7 -> 448000; + case 9 -> 848000; + default -> DEFAULT_CAPACITY; + }; + } + + /** + * Applies an explicit tank capacity to this input. + *

+ * The per-reactor-size capacity ({@link #getCapacityForReactorSize(int)}) is the TOTAL the + * reactor should hold, split across all fluid inputs by {@code ReactorAssembler}, so the sum + * of every input's capacity stays equal to the configured value no matter how many inputs the + * player places. + */ + public void applyCapacity(int capacity) { + if (internalTank.getCapacity() == capacity) return; + internalTank.setCapacity(capacity); + if (level != null && !level.isClientSide) { + setChanged(); + sendData(); + } + } + + @Override + public void addBehaviours(List behaviours) { + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + CompoundTag tankTag = internalTank.writeToNBT(new CompoundTag()); + tag.put("tank", tankTag); + tag.putInt("capacity", internalTank.getCapacity()); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + if (tag.contains("capacity")) + internalTank.setCapacity(tag.getInt("capacity")); + internalTank.readFromNBT(tag.getCompound("tank")); + + if (tag.contains("ForceFluidLevel") || fluidLevel == null) + fluidLevel = LerpedFloat.linear() + .startWithValue(getFillState()); + } + + public float getFillState() { + return (float) internalTank.getFluidAmount() / internalTank.getCapacity(); + } + + protected void onTankContentsChanged(FluidStack contents) { + // Avoid accessing level during deserialization when the block entity isn't attached yet + if (this.level == null) { + if (fluidLevel == null) + fluidLevel = LerpedFloat.linear() + .startWithValue(getFillState()); + return; + } + + if (!level.isClientSide) { + setChanged(); + sendData(); + } + + if (isVirtual()) { + if (fluidLevel == null) + fluidLevel = LerpedFloat.linear() + .startWithValue(getFillState()); + fluidLevel.chase(getFillState(), .5f, LerpedFloat.Chaser.EXP); + } + + if (!level.isClientSide && internalTank.getFluidAmount() == 0) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); + if (controller != null) controller.clearLockIfAllInputsEmpty(); + } + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + return containedFluidTooltip(tooltip, isPlayerSneaking, + this.getCapability(ForgeCapabilities.FLUID_HANDLER)); + } + + @Override + public void invalidate() { + super.invalidate(); + capability.invalidate(); + } + + @Override + public @NotNull LazyOptional getCapability(Capability cap, Direction side) { + if (!capability.isPresent()) refreshCapability(); + if (cap == ForgeCapabilities.FLUID_HANDLER) { + if (side != null && side != getBlockState().getValue(MultiDirectionalReactorBlock.FACING)) + return LazyOptional.empty(); + return capability.cast(); + } + + return super.getCapability(cap, side); + } + + private void refreshCapability() { + LazyOptional oldCap = capability; + capability = LazyOptional.of(FilteredFluidHandler::new); + oldCap.invalidate(); + } + + private class FilteredFluidHandler implements IFluidHandler { + private final IFluidHandler delegate = internalTank; + + @Override + public int getTanks() { + return delegate.getTanks(); + } + + @Override + public @NotNull FluidStack getFluidInTank(int tank) { + return delegate.getFluidInTank(tank); + } + + @Override + public int getTankCapacity(int tank) { + return delegate.getTankCapacity(tank); + } + + @Override + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + return delegate.isFluidValid(tank, stack); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + if (resource == null || resource.isEmpty()) return 0; + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); + BlockPos controllerPos = controller != null ? controller.getBlockPos() : null; + + // Fluid locks are server-authoritative (persisted per-level via PersistentFluidLocks). + // The client stays permissive; the server syncs the real tank state back. + if (controllerPos != null && level instanceof ServerLevel serverLevel + && !PersistentFluidLocks.get(serverLevel).canAccept(controllerPos, resource.getFluid())) { + return 0; + } + + int filled = delegate.fill(resource, action); + if (filled > 0 && action.execute() && controllerPos != null && level instanceof ServerLevel serverLevel) { + PersistentFluidLocks.get(serverLevel).tryLock(controllerPos, resource.getFluid()); + } + return filled; + } + + @Override + public @NotNull FluidStack drain(FluidStack resource, FluidAction action) { + FluidStack drained = delegate.drain(resource, action); + clearLockIfEmptied(drained, action); + return drained; + } + + @Override + public @NotNull FluidStack drain(int maxDrain, FluidAction action) { + FluidStack drained = delegate.drain(maxDrain, action); + clearLockIfEmptied(drained, action); + return drained; + } + + /** + * Releases the controller's fluid lock once this input has been fully drained. + * Server-authoritative: the lock lives in {@link PersistentFluidLocks}, so this is + * a no-op on the client. + */ + private void clearLockIfEmptied(FluidStack drained, FluidAction action) { + if (drained.isEmpty() || !action.execute() || !(level instanceof ServerLevel serverLevel)) + return; + if (!delegate.getFluidInTank(0).isEmpty()) + return; + + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); + if (controller != null) + PersistentFluidLocks.get(serverLevel).clearLock(controller.getBlockPos()); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java new file mode 100644 index 000000000..ce60aa6ab --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class ReactorFluidInputGenerator extends SpecialBlockStateGen { + @Override + protected int getXRotation(BlockState state) { + return state.getValue(ReactorFluidInput.FACING) == Direction.DOWN ? 180 : 0; + } + + @Override + protected int getYRotation(BlockState state) { + return state.getValue(ReactorFluidInput.FACING).getAxis().isVertical() + ? 0 + : horizontalAngle(state.getValue(ReactorFluidInput.FACING)); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { + return prov + .models() + .getExistingFile(prov + .modLoc("block/reactor/fluid_input/fluid_input" + (state.getValue(ReactorFluidInput.FACING).getAxis().isVertical() + ? "_vertical" + : "" + ))); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/VirtualReactorInputFluid.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/VirtualReactorInputFluid.java new file mode 100644 index 000000000..fb081591b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/VirtualReactorInputFluid.java @@ -0,0 +1,89 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.fluid; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.Map.Entry; + +/** + * A lightweight, in-memory aggregation of fluid quantities keyed by + * fluid ResourceLocation. This record is used to represent the combined + * input fluids available to a reactor without modifying the real handlers. + */ +public record VirtualReactorInputFluid(Map fluids) { + + /** + * Create an empty virtual inventory. + */ + public VirtualReactorInputFluid() { + this(new HashMap<>()); + } + + /** + * Add the contents of the provided FluidStack to this virtual inventory. + * Empty stacks or non-registered fluids are ignored. + * @param stack the fluid stack to add + */ + public void addFluid(@NotNull FluidStack stack) { + if (stack.isEmpty() || stack.getAmount() <= 0) return; + ResourceLocation id = ForgeRegistries.FLUIDS.getKey(stack.getFluid()); + if (id == null) return; + fluids.merge(id, (long) stack.getAmount(), Long::sum); + } + + /** + * Remove up to {@code amount} units of the specified fluid from this virtual inventory. + * Returns a FluidStack describing the removed amount (or {@link FluidStack#EMPTY}). + * @param fluidId fluid identifier + * @param amount maximum amount to remove + */ + public FluidStack removeFluid(@NotNull ResourceLocation fluidId, long amount) { + if (amount < 0 || fluidId == null) return FluidStack.EMPTY; + long current = fluids.getOrDefault(fluidId, 0L); + long removed = Math.min(current, amount); + if (removed == 0) return FluidStack.EMPTY; + long remaining = current - removed; + if (remaining == 0) fluids.remove(fluidId); + else fluids.put(fluidId, remaining); + + int removedInt = (int) Math.min(removed, Integer.MAX_VALUE); + return new FluidStack(ForgeRegistries.FLUIDS.getValue(fluidId), removedInt); + } + + /** + * Get the stored amount for the given fluid id. + * @param fluidId fluid identifier + * @return total amount stored for that fluid + */ + public long getAmount(@NotNull ResourceLocation fluidId) { + if (fluidId == null) return 0L; + return fluids.getOrDefault(fluidId, 0L); + } + + /** + * Convert a map of ResourceLocation->long into a list of BigFluidStack + * suitable for display or consumption elsewhere. + */ + public static List toBigList(Map map) { + List list = new ArrayList<>(); + for (Entry e : map.entrySet()) { + ResourceLocation id = e.getKey(); + long total = e.getValue(); + Fluid fluid = ForgeRegistries.FLUIDS.getValue(id); + if (fluid == null || total <= 0) continue; + int amount = (int) Math.min(total, BigFluidStack.INF); + list.add(new BigFluidStack(new FluidStack(fluid, amount), amount)); + } + return list; + } + + @Override + public @NotNull String toString() { + return "VirtualReactorInputFluid" + fluids.toString(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java new file mode 100644 index 000000000..9392a12a7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java @@ -0,0 +1,113 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.item.ItemHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +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.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; + +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +import net.minecraftforge.network.NetworkHooks; +import net.nuclearteam.createnuclear.CNBlockEntityTypes; +import net.nuclearteam.createnuclear.CNShapes; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + + +@ParametersAreNonnullByDefault +public class ReactorRodInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { + + public ReactorRodInput(Properties properties) { + super(properties); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + super.createBlockStateDefinition(builder); + } + + @Override + public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + ItemStack itemInHand = player.getItemInHand(handIn); + + if (itemInHand.getItem() instanceof BlockItem) { + return InteractionResult.PASS; + } + + + if (worldIn.isClientSide()) {return InteractionResult.SUCCESS;} + + withBlockEntityDo(worldIn, pos, be -> NetworkHooks.openScreen((ServerPlayer) player, be, be::sendToMenu)); + return InteractionResult.SUCCESS; + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, level, pos, oldState, isMoving); + MultiblockHelpers.handleOnPlace(pos, level, ReactorControllerBlockEntity::addInput); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); + } + + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + // Only act when the block is actually removed/replaced, not on a mere state change + // (e.g. a FACING update) — otherwise rotating the block would spill its rods. + if (!pState.is(pNewState.getBlock())) { + // Drop the contents BEFORE super removes the block entity: super.onRemove() + // calls level.removeBlockEntity(pos), after which the inventory is gone. + withBlockEntityDo(pLevel, pPos, be -> ItemHelper.dropContents(pLevel, pPos, be.inventory)); + MultiblockHelpers.handleRemoval(pPos, pLevel, ReactorControllerBlockEntity::removeInput); + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState() + .setValue(FACING, context.getNearestLookingDirection().getOpposite()); + } + @Override + public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + return CNShapes.REACTOR_ROD_INPUT.get(state.getValue(FACING)); + } + + @Override + public Class getBlockEntityClass() { + return ReactorRodInputEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return CNBlockEntityTypes.REACTOR_ROD_INPUT.get(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java new file mode 100644 index 000000000..6fb2089c3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java @@ -0,0 +1,104 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +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.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; + +import javax.annotation.Nullable; +import java.util.List; + +public class ReactorRodInputEntity extends SmartBlockEntity implements MenuProvider { + //protected ReactorControllerBlockEntity controller; + public ReactorControllerBlock controller = null; + + public ReactorRodInputInventory inventory; + LazyOptional inventoryProvider; + + + public ReactorRodInputEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + inventory = new ReactorRodInputInventory(this); + inventoryProvider = LazyOptional.of(() -> inventory); + + } + + @Override + public void addBehaviours(List behaviours) { } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); // Always call super first + + if (!clientPacket) { + tag.put("Inventory", inventory.serializeNBT()); + } + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + + if (!clientPacket) { + if (tag.contains("Inventory")) { + inventory.deserializeNBT(tag.getCompound("Inventory")); + } + } + } + + @Nullable + @Override + public Level getLevel() { + return super.getLevel(); + } + + @Override + public Component getDisplayName() { + return Component.translatable("gui.createnuclear.reactor_input.title"); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { + return ReactorRodInputMenu.create(i, inventory, this); + } + + @Override + public void tick() { + super.tick(); + } + + protected boolean isItemHandlerCap(Capability cap) { + return cap == ForgeCapabilities.ITEM_HANDLER; + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (isItemHandlerCap(cap)){ + if (side != null && side != getBlockState().getValue(MultiDirectionalReactorBlock.FACING)) + return LazyOptional.empty(); + return inventoryProvider.cast(); + } + + return super.getCapability(cap, side); + } + + public void setController(ReactorControllerBlock controller) { + this.controller = controller; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java new file mode 100644 index 000000000..3789ac92f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class ReactorRodInputGenerator extends SpecialBlockStateGen { + @Override + protected int getXRotation(BlockState state) { + return state.getValue(ReactorRodInput.FACING) == Direction.DOWN ? 180 : 0; + } + + @Override + protected int getYRotation(BlockState state) { + return state.getValue(ReactorRodInput.FACING).getAxis().isVertical() + ? 0 + : horizontalAngle(state.getValue(ReactorRodInput.FACING)); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { + return prov + .models() + .getExistingFile(prov + .modLoc("block/reactor/rod_input/rod_input" + (state.getValue(ReactorRodInput.FACING).getAxis().isVertical() + ? "_vertical" + : "" + ))); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java new file mode 100644 index 000000000..ecc72da36 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java @@ -0,0 +1,32 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.items.ItemStackHandler; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import org.jetbrains.annotations.NotNull; + +public class ReactorRodInputInventory extends ItemStackHandler { + private final ReactorRodInputEntity be; + + public ReactorRodInputInventory(ReactorRodInputEntity be) { + super(1); + this.be = be; + } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + be.setChanged(); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + Level level = be.getLevel(); + return switch (slot) { + case 0 -> level != null && (TypeRodPredicate.isFuel(stack, level) || TypeRodPredicate.isCooled(stack, level)); + default -> !super.isItemValid(slot, stack); + }; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java new file mode 100644 index 000000000..981c507d3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java @@ -0,0 +1,125 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.foundation.gui.menu.MenuBase; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.SlotItemHandler; +import net.nuclearteam.createnuclear.CNMenus; + +public class ReactorRodInputMenu extends MenuBase { + + + public ReactorRodInputMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public ReactorRodInputMenu(MenuType type, int id, Inventory inv, ReactorRodInputEntity contentHolder) { + super(type, id, inv, contentHolder); + } + + public static ReactorRodInputMenu create(int id, Inventory inv, ReactorRodInputEntity contentHolder) { + return new ReactorRodInputMenu(CNMenus.SLOT_ITEM_STORAGE.get(), id, inv, contentHolder); + } + + @Override + public ItemStack quickMoveStack(Player playerIn, int index) { + ItemStack result = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + if (slot != null && slot.hasItem()) { + ItemStack stackInSlot = slot.getItem(); + result = stackInSlot.copy(); + + int playerInventorySize = player.getInventory().items.size(); // normally 36 + int containerStart = playerInventorySize; + int containerEnd = containerStart + 1; // 1 machine slot + + // Clicked a machine slot (after the player slots) + if (index >= containerStart && index < containerEnd) { + if (!this.moveItemStackTo(stackInSlot, 0, playerInventorySize, true)) { + return ItemStack.EMPTY; + } + } else { + // Clicked a player slot — try moving the stack into the machine container + if (!this.moveItemStackTo(stackInSlot, containerStart, containerEnd, false)) { + return ItemStack.EMPTY; + } + } + + if (stackInSlot.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (stackInSlot.getCount() == result.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, stackInSlot); + } + return result; + } + + + @Override + protected ReactorRodInputEntity createOnClient(FriendlyByteBuf extraData) { + ClientLevel world = Minecraft.getInstance().level; + BlockEntity entity = world.getBlockEntity(extraData.readBlockPos()); + if (entity instanceof ReactorRodInputEntity reactorRodInputEntity) { + reactorRodInputEntity.readClient(extraData.readNbt()); + return reactorRodInputEntity; + } + return null; + } + + @Override + protected void initAndReadInventory(ReactorRodInputEntity contentHolder) { + + } + + @Override + protected void addSlots() { + + // player Slots + for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) { + this.addSlot(new Slot(player.getInventory(), hotbarSlot, -31 + hotbarSlot * 18, 155)); + } + + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 9; ++col) { + this.addSlot(new Slot(player.getInventory(), col + row * 9 + 9, -31 + col * 18, 97 + row * 18)); + } + } + + Slot slot1 = new SlotItemHandler(contentHolder.inventory, 0, 42, 29); + + addSlot(slot1); + } + + @Override + protected void saveData(ReactorRodInputEntity contentHolder) { + } + + @Override + public void clicked(int slotId, int button, ClickType clickType, Player player) { + if (clickType == ClickType.THROW) { + int[] targetSlotIds = {9, 18, 27, 0, 1, 28, 19, 10, 16, 17, 26, 25, 34, 35, 8, 7}; + for (int id : targetSlotIds) { + if (slotId == id) { + clickType = ClickType.PICKUP; + super.clicked(slotId, button, clickType, player); + } + } + return; + } + super.clicked(slotId, button, clickType, player); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java new file mode 100644 index 000000000..5b6621d13 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java @@ -0,0 +1,39 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.nuclearteam.createnuclear.foundation.gui.CNGuiTextures; + +import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; + +public class ReactorRodInputScreen extends AbstractSimiContainerScreen { + + protected static final CNGuiTextures background = CNGuiTextures.REACTOR_SLOT_INVENTOR; + + public ReactorRodInputScreen(ReactorRodInputMenu container, Inventory inv, Component title) { + super(container, inv, title); + } + + @Override + protected void init() { + setWindowSize(background.width, background.height+ 4 + AllGuiTextures.PLAYER_INVENTORY.getHeight()); + setWindowOffset(0,0); + super.init(); + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { + int invX = getLeftOfCentered(PLAYER_INVENTORY.getWidth()); + int invY = topPos + background.height + 4; + renderPlayerInventory(guiGraphics, invX, invY); + + int x = leftPos; + int y = topPos; + + background.render(guiGraphics, x, y); + + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/VirtualReactorInputsItem.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/VirtualReactorInputsItem.java new file mode 100644 index 000000000..b9807e885 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/VirtualReactorInputsItem.java @@ -0,0 +1,19 @@ +package net.nuclearteam.createnuclear.content.multiblock.input.item; + +import com.simibubi.create.content.logistics.BigItemStack; +import net.nuclearteam.createnuclear.CNItems; +import org.jetbrains.annotations.NotNull; + +public record VirtualReactorInputsItem(int fuel, int cooler) { + public VirtualReactorInputsItem() { + this(0,0); + } + + + + @Override + public @NotNull String toString() { + return "fuel: " + fuel + " cooler: " + cooler; + } +} + diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java index eb77a457f..84364f67e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutput.java @@ -1,23 +1,29 @@ package net.nuclearteam.createnuclear.content.multiblock.output; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; import com.simibubi.create.foundation.block.IBE; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -27,74 +33,51 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.nuclearteam.createnuclear.*; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Objects; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.function.Predicate; +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class ReactorOutput extends DirectionalKineticBlock implements IWrenchable, IBE { - - //public static final IntegerProperty SPEED = IntegerProperty.create("speed", 0, 256); public static final IntegerProperty DIR = IntegerProperty.create("dir", 0, 2); + private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); + public ReactorOutput(Properties properties) { super(properties); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - //builder.add(SPEED); builder.add(DIR); super.createBlockStateDefinition(builder); } - @Override - public @NotNull InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if (level.isClientSide) - return InteractionResult.SUCCESS; - else { - ReactorControllerBlock controller = FindController(pos, level, level.players(), false); - if (controller != null){ - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, pos.above(3)); - assert entity != null; - if (entity.getAssembled()){ - ReactorOutputEntity control = Objects.requireNonNull(getBlockEntity(level, pos)); - if (control.getDir() == 0) - control.setDir(1, level, pos); - else control.setDir(0, level, pos); - } - } - return InteractionResult.CONSUME; - } - } @Override public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { super.onPlace(state, level, pos, oldState, isMoving); - List players = level.players(); - FindController(pos, level, players, true); + MultiblockHelpers.handleOnPlace(pos, level, ReactorControllerBlockEntity::addOutput); } @Override - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); - List players = pLevel.players(); - FindController(pPos, pLevel, players, false); + MultiblockHelpers.handleRemoval(pPos, pLevel, ReactorControllerBlockEntity::removeOutput); } @Override - public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { return CNShapes.REACTOR_OUTPUT.get(state.getValue(FACING)); } @@ -104,7 +87,21 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { if ((context.getPlayer() != null && context.getPlayer() .isShiftKeyDown()) || preferred == null) return super.getStateForPlacement(context); - return defaultBlockState().setValue(FACING, preferred)/*.setValue(SPEED, 0)*/.setValue(DIR, 0); + return defaultBlockState().setValue(FACING, preferred).setValue(DIR, 0); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + ItemStack heldItem = player.getItemInHand(hand); + IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); + if (!player.isShiftKeyDown() && player.mayBuild()) { + if (placementHelper.matchesItem(heldItem) && placementHelper.getOffset(player, level, state, pos, hitResult) + .placeInWorld(level, (BlockItem) heldItem.getItem(), player, hand, hitResult) + .consumesAction()) + return InteractionResult.SUCCESS; + } + + return super.use(state, level, pos, player, hand, hitResult); } // IRotate: @@ -140,18 +137,27 @@ public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_OUTPUT.get(); } - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first) { - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - newBlock = new BlockPos(pos.getX(), pos.getY() + 3, pos.getZ()); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } + private static class PlacementHelper implements IPlacementHelper { + + @Override + public Predicate getItemPredicate() { + return AllBlocks.SHAFT::isIn; + } + + @Override + public Predicate getStatePredicate() { + return s -> s.getBlock() instanceof ReactorOutput; + } + + @Override + public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, BlockHitResult ray) { + Direction facing = state.getValue(FACING); + BlockPos target = pos.relative(facing); + + if (!world.getBlockState(target).canBeReplaced()) + return PlacementOffset.fail(); + + return PlacementOffset.success(target, s -> s.setValue(BlockStateProperties.AXIS, facing.getAxis())); } - return null; } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java index fbf69ecf0..6487fcfdb 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/output/ReactorOutputEntity.java @@ -12,33 +12,22 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraft.util.Mth; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import java.util.List; -import java.util.Objects; - -import static net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput.DIR; - public class ReactorOutputEntity extends GeneratingKineticBlockEntity { - public int speed = 1; + public int speed = 0; public float heat = 0; - ReactorControllerBlock controller = null; - ReactorControllerBlockEntity controllerEntity = null; + protected ReactorPattern pattern = new ReactorPattern(); - // protected ScrollValueBehaviour generatedSpeed; protected float generatedSpeed; public ReactorOutputEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -48,11 +37,6 @@ public ReactorOutputEntity(BlockEntityType type, BlockPos pos, BlockState sta @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - // generatedSpeed = new KineticScrollValueBehaviour(CreateNuclearLang.translateDirect("kinetics.reactor_output.rotation_speed"), this, new ReactorOutputValue()); - // generatedSpeed.between(-1500000, 1500000); - // generatedSpeed.setValue(speed); - // generatedSpeed.withCallback(i -> this.updateGeneratedRotation()); - // behaviours.add(generatedSpeed); } @@ -77,35 +61,33 @@ public void setSpeedAndUpdate(int speed) { setChanged(); } + // Tracks the output's linked block position for persistence across reloads. + private BlockPos outputPos; + @Override - protected void read(CompoundTag compound, boolean clientPacket) { - super.read(compound, clientPacket); - generatedSpeed = compound.getFloat("generatedSpeed"); - } - - - - @Override - public void write(CompoundTag compound, boolean clientPacket) { - super.write(compound, clientPacket); - compound.putFloat("generatedSpeed", generatedSpeed); - } + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + + // Restore the generated rotation speed + generatedSpeed = compound.getFloat("generatedSpeed"); + + // Restore the output position, if present in the tag + if (compound.contains("outputPos")) { + this.outputPos = BlockPos.of(compound.getLong("outputPos")); + } + } @Override - public void tick() { - super.tick(); - - BlockGetter level = getLevel(); - - if (level.getBlockState(getBlockPos().above(3)).getBlock() == CNBlocks.REACTOR_CONTROLLER.get()) { - controller = (ReactorControllerBlock) level.getBlockState(getBlockPos().above(3)).getBlock(); - controllerEntity = (ReactorControllerBlockEntity) level.getBlockEntity(getBlockPos().above(3)); - if (controllerEntity != null) { - if (!controllerEntity.getAssembled() && getSpeed() != 0) { - setSpeed(0); - } - } - } else setSpeed(0); + public void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + + // Persist the generated rotation speed + compound.putFloat("generatedSpeed", generatedSpeed); + + // Persist the output position, if set + if (this.outputPos != null) { + compound.putLong("outputPos", this.outputPos.asLong()); + } } @Override @@ -140,45 +122,17 @@ public void initialize() { if (!hasSource() || getGeneratedSpeed() > getTheoreticalSpeed()) { - FindController(getBlockPos(), Objects.requireNonNull(getLevel())); - } - } - - public void FindController(BlockPos pos, Level level){ - if (level.getBlockState(pos.above(3)).getBlock() == CNBlocks.REACTOR_CONTROLLER.get()){ - ReactorControllerBlock controller = (ReactorControllerBlock)level.getBlockState(pos.above(3)).getBlock(); - controller.Verify(controller.defaultBlockState(), pos.above(3), level, level.players(), false); + assert level != null; + pattern.findController(getBlockPos(), level, true); } } - public void setSpeed(int speed) { - this.speed = speed; - } - - public int getDir() { - BlockState state = getBlockState(); - return state.getValue(DIR); - } - - public void setDir(int dir, Level level, BlockPos pos) { - BlockState state = getBlockState(); - level.setBlockAndUpdate(pos, state.setValue(DIR, dir)); - } - @Override public float getGeneratedSpeed() { - // if (!CNBlocks.REACTOR_OUTPUT.has(getBlockState())) - // return 0; - // return speed; //convertToDirection(speed, getBlockState().getValue(ReactorOutput.FACING)); return Mth.clamp(generatedSpeed, 0, 1500000); } - @Override - protected Block getStressConfigKey() { - return super.getStressConfigKey(); - } - - class ReactorOutputValue extends ValueBoxTransform.Sided { + static class ReactorOutputValue extends ValueBoxTransform.Sided { @Override protected Vec3 getSouthLocation() { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java new file mode 100644 index 000000000..97628c18d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java @@ -0,0 +1,114 @@ +package net.nuclearteam.createnuclear.content.multiblock.pattern; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.world.entity.player.Player; +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.level.block.state.pattern.BlockInWorld; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.content.multiblock.ReactorAssembler; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public class ReactorPattern { + + private static final Predicate blockInWorldAPredicate = state -> + stateIs(CNBlocks.REACTOR_CASING.get()).test(state) + || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ROD_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_FLUID_INPUT.get()).test(state) + || stateIs(CNBlocks.REACTOR_ALARM.get()).test(state) + ; + + private static Predicate stateIs(Block block) { + return a -> { + BlockState state = a.getState(); + return state != null && state.is(block); + }; + } + + @FunctionalInterface + private interface ControllerVisitor { + boolean visit(BlockPos controllerPos, ReactorControllerBlockEntity entity); + } + + private void scanControllerCandidates(BlockPos blockPos, Level level, ControllerVisitor visitor) { + BlockPos newBlock; + Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); + for (int y = pos.getY()-5; y != pos.getY()+6; y+=1) { + for (int x = pos.getX()-9; x != pos.getX()+10; x+=1) { + for (int z = pos.getZ()-9; z != pos.getZ()+10; z+=1) { + newBlock = new BlockPos(x, y, z); + if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get()) + && level.getBlockEntity(newBlock) instanceof ReactorControllerBlockEntity entity) { + if (visitor.visit(newBlock, entity)) { + return; + } + } + } + } + } + } + + public void findController(BlockPos blockPos, Level level, boolean first){ + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + boolean inRange = isInReactorRange(entity.getMultiblockPos(), blockPos); + if (first) { + if (inRange || !entity.isAssembled()) { + ReactorAssembler.assemble(controllerPos, level); + } + } else if (inRange) { + ReactorAssembler.disassemble(controllerPos, level); + } + + return false; + })); + } + + public BlockPos findControllerPos(BlockPos blockPos, Level level, boolean first){ + BlockPos[] found = {null}; + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + boolean inRange = isInReactorRange(entity.getMultiblockPos(), blockPos); + if (first) { + if (inRange || !entity.isAssembled()) { + ReactorAssembler.assemble(controllerPos, level); + } + } else if (inRange) { + ReactorAssembler.disassemble(controllerPos, level); + } + + if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { + found[0] = controllerPos; + return true; + } + + return false; + })); + + return found[0]; + } + + public BlockPos findControllerPos(BlockPos blockPos, Level level){ + BlockPos[] found = {null}; + scanControllerCandidates(blockPos, level, ((controllerPos, entity) -> { + ReactorAssembler.assemble(controllerPos, level); + if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { + found[0] = controllerPos; + return true; + } + + return false; + })); + + return found[0]; + } + + public boolean isInReactorRange(@Nullable BoundingBox reactorPos, BlockPos blockPos) { + return reactorPos != null && reactorPos.isInside(blockPos); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorCooler/ReactorCooler.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorCooler/ReactorCooler.java deleted file mode 100644 index 7ff6fc0fb..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorCooler/ReactorCooler.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.reactorCooler; - -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; - -import javax.annotation.Nullable; -import java.util.List; - -public class ReactorCooler extends Block implements IWrenchable { - public ReactorCooler(Properties properties) { - super(properties); - } - - - @Override // Called when the block is placed on the world - public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { - super.onPlace(state, level, pos, oldState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, true); - } - - @Override // called when the player destroys the block, with or without a tool - public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { - super.playerDestroy(level, player, pos, state, blockEntity, tool); - List players = level.players(); - FindController(pos, level, players, false); - } - - @Override - public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { - super.onRemove(state, level, pos, newState, movedByPiston); - List players = level.players(); - FindController(pos, level, players, false); - } - - public ReactorControllerBlock FindController(BlockPos blockPos, Level level, List players, boolean first){ // Function that checks the surrounding blocks in order - BlockPos newBlock; // to find the controller and verify the pattern - Vec3i pos = new Vec3i(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - for (int y = pos.getY()-3; y != pos.getY()+4; y+=1) { - for (int x = pos.getX()-5; x != pos.getX()+5; x+=1) { - for (int z = pos.getZ()-5; z != pos.getZ()+5; z+=1) { - newBlock = new BlockPos(x, y, z); - if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get())) { // verifying the pattern - ReactorControllerBlock controller = (ReactorControllerBlock) level.getBlockState(newBlock).getBlock(); - controller.Verify(level.getBlockState(newBlock), newBlock, level, players, first); - ReactorControllerBlockEntity entity = controller.getBlockEntity(level, newBlock); - if (entity.created) { - return controller; - } - } - } - } - } - return null; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java new file mode 100644 index 000000000..6de95ac6d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java @@ -0,0 +1,111 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraftforge.items.ItemStackHandler; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItem; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DefaultHeatCalculator implements IHeatCalculator { + private static final int[][] FORMATTED_PATTERN = new int[][]{ + {99,99,99,0,1,2,99,99,99}, + {99,99,3,4,5,6,7,99,99}, + {99,8,9,10,11,12,13,14,99}, + {15,16,17,18,19,20,21,22,23}, + {24,25,26,27,28,29,30,31,32}, + {33,34,35,36,37,38,39,40,41}, + {99,42,43,44,45,46,47,48,99}, + {99,99,49,50,51,52,53,99,99}, + {99,99,99,54,55,56,99,99,99} + }; + private static final int[][] OFFSETS = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; + + private static final Map> NEIGHBORS_BY_SLOT = buildNeighborsBySlot(); + + private static Map> buildNeighborsBySlot() { + Map> result = new HashMap<>(); + for (int row = 0; row < FORMATTED_PATTERN.length; row++) { + for (int col = 0; col < FORMATTED_PATTERN[row].length; col++) { + int slot = FORMATTED_PATTERN[row][col]; + if (slot == 99) continue; + + List neighbors = new ArrayList<>(); + for (int[] offset : OFFSETS) { + int nj = row + offset[0]; + int nk = col + offset[1]; + + if (nj < 0 || nj >= FORMATTED_PATTERN.length || nk < 0 || nk >= FORMATTED_PATTERN[nj].length) continue; + + int neighborSlot = FORMATTED_PATTERN[nj][nk]; + if (neighborSlot != 99) neighbors.add(neighborSlot); + } + + result.put(slot, neighbors); + } + } + + return result; + } + + @Override + public double computeHeat(BigFluidStack bigFluidStack, ReactorFluidType type, ReactorControllerInventory inventory, double overHeat, ReactorDisplayState displayState, Level level) { + double heat = 0; + + ItemStackHandler pattern = ReactorBluePrintItem.getItemStorage(inventory.getStackInSlot(0)); + + Map availableItems = displayState != null && displayState.items() != null + ? new HashMap<>(displayState.items()) + : new HashMap<>(); + + Map actualRods = new HashMap<>(); + + for (int slot = 0; slot < pattern.getSlots(); slot++) { + ItemStack currentStack = pattern.getStackInSlot(slot); + if (currentStack.isEmpty()) continue; + + Item rodItem = currentStack.getItem(); + if (availableItems.getOrDefault(rodItem, 0) > 0) { + availableItems.put(rodItem, availableItems.get(rodItem) - 1); + actualRods.put(slot, currentStack); + } + } + + for (Map.Entry entry : actualRods.entrySet()) { + int slot = entry.getKey(); + ItemStack currentStack = entry.getValue(); + RodType rod = RodType.resolveRodType(currentStack.getItem(), level); + + if (!rod.isNotEmptyItem() || rod.type() == TypeRod.NONE) continue; + + heat += rod.baseRodHeat().get(); + + // find position in formattedPattern and check neighbors + for (int neighborSlot : NEIGHBORS_BY_SLOT.getOrDefault(slot, List.of())) { + ItemStack neighborStack = actualRods.get(neighborSlot); + if (neighborStack == null) continue; + + RodType neighborRod = RodType.resolveRodType(neighborStack.getItem(), level); + if (!neighborRod.isNotEmptyItem()) continue; + + if (TypeRodPredicate.isFuel(rod) && TypeRodPredicate.isFuel(neighborRod)) { + heat += rod.proximityRodHeat().get(); + } else if (TypeRodPredicate.isCooled(rod) && TypeRodPredicate.isFuel(neighborRod)) { + heat += neighborRod.baseRodHeat().get() * rod.proximityRodHeat().get(); + } + } + } + return Math.max(0, heat + overHeat); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java new file mode 100644 index 000000000..54ab6e633 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +class DefaultOverheatController implements IOverheatController { + private int overFlowHeatTimer = 0; + private int overFlowLimiter = 30; + private double overHeat = 0; + + private final int liquidTimer = 3600; + + @Override + public void updateState(HeatBalance heatBalance, int currentHeat, BigFluidStack bigFluidStack, ReactorFluidType type) { + int fluidAmount = bigFluidStack == null ? 0 : bigFluidStack.amount; + int fluidEfficiency = type == null ? -1 : type.efficiency(); + boolean exceedsFluidMaxHeat = type != null && Math.abs(currentHeat) > type.maxHeat(); + + boolean rodMalus = heatBalance.resolve() == EquilibriumState.OVERHEATING; + boolean fluidMalus = fluidEfficiency == -1 || fluidAmount < fluidEfficiency || exceedsFluidMaxHeat; + + int malusPoints = (rodMalus ? 1 : 0) + (fluidMalus ? 1 : 0); + + if (malusPoints > 0) { + overFlowHeatTimer++; + if (overFlowHeatTimer >= overFlowLimiter) { + overHeat += malusPoints; + overFlowHeatTimer = 0; + overFlowLimiter = Math.max(2, overFlowLimiter - malusPoints); + } + } else { + overFlowHeatTimer = 0; + overFlowLimiter = 30; + if (overHeat > 0) overHeat -= 2; + else overHeat = 0; + } + } + + @Override + public double getOverHeat() { return overHeat; } + + + @Override + public int getLiquidTimer() { return liquidTimer; } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java new file mode 100644 index 000000000..3dbe6ea07 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/EquilibriumState.java @@ -0,0 +1,21 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +/** + * Reactor thermal equilibrium state, derived from the fuel:cooler ratio + * (wiki reference: {@code heatPoints / coolingPoints} ratio compared to 6). + *

+ * Only {@link #OVERHEATING} is currently consumed by + * {@link DefaultOverheatController} (triggers the escalation toward + * shutdown/explosion). {@link #BALANCED} and {@link #OVERCOOLING} are kept + * for future versions (wiki-style status display, output bonus/malus) but + * have no effect on overheating today: a reactor in overcooling is simply + * suboptimal (less heat produced), not penalized. + */ +public enum EquilibriumState { + /** ratio > 6:1 — too much fuel for the cooling, leads to explosion. */ + OVERHEATING, + /** ratio == 6:1 — exact wiki equilibrium. */ + BALANCED, + /** ratio < 6:1 — safe but suboptimal output, no malus. */ + OVERCOOLING +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java new file mode 100644 index 000000000..ea6b3f921 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatBalance.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +/** + * Thermal balance of a pattern: heat points (fuel) and cooling points + * (cooler), each weighted by {@link net.nuclearteam.createnuclear.api.multiblock.rods.RodType#ratio()}. + *

+ * Since {@code graphiteHeatRatio} switched to a positive value (1), + * {@code heatPoints} and {@code coolingPoints} are both raw positive sums + * (e.g. uranium=2/rod, thorium=1/rod, graphite=1/rod) — the 6:1 equilibrium + * ratio (wiki reference) is therefore no longer implicit in the config and + * must be compared explicitly via {@link #TARGET_RATIO}. + */ +public record HeatBalance(int heatPoints, int coolingPoints) { + /** Reference fuel:cooler ratio (wiki) at equilibrium. */ + public static final int TARGET_RATIO = 6; + + /** + * Resolves the equilibrium state from this balance. + * + * @return {@link EquilibriumState#OVERHEATING} if no cooler is present + * while there is fuel, otherwise the state corresponding to the + * comparison of {@code heatPoints / coolingPoints} against + * {@link #TARGET_RATIO} + */ + public EquilibriumState resolve() { + if (coolingPoints == 0) return heatPoints() > 0 ? EquilibriumState.OVERHEATING : EquilibriumState.BALANCED; + + double ration = (double) heatPoints() / coolingPoints(); + if (ration > TARGET_RATIO) return EquilibriumState.OVERHEATING; + if (ration < TARGET_RATIO) return EquilibriumState.OVERCOOLING; + + return EquilibriumState.BALANCED; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java new file mode 100644 index 000000000..e546466a8 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java @@ -0,0 +1,33 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +/** + * HeatManager facade delegating to extracted components (in separate files). + */ +public class HeatManager { + private final IHeatCalculator calculator; + private final IOverheatController overheatController; + + public HeatManager(IHeatCalculator calculator, IOverheatController overheatController) { + this.calculator = calculator; + this.overheatController = overheatController; + } + + public HeatManager() { + this(new DefaultHeatCalculator(), new DefaultOverheatController()); + } + + public double calculateHeat(BigFluidStack bigFluidStack, HeatBalance heatBalance, int previousHeat, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + ReactorFluidType type = bigFluidStack == null ? null : bigFluidStack.getFluidtype(level); + overheatController.updateState(heatBalance, previousHeat, bigFluidStack, type); + + return calculator.computeHeat(bigFluidStack, type, inventory, overheatController.getOverHeat(), displayState, level); + } + + public int getLiquidTimer() { return overheatController.getLiquidTimer();} +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java new file mode 100644 index 000000000..09dbba96a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java @@ -0,0 +1,11 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.minecraft.world.level.Level; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; + +public interface IHeatCalculator { + double computeHeat(BigFluidStack bigFluidStack, ReactorFluidType type, ReactorControllerInventory inventory, double overHeat, ReactorDisplayState displayState, Level level); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java new file mode 100644 index 000000000..62090d526 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java @@ -0,0 +1,10 @@ +package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; + +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; + +public interface IOverheatController { + void updateState(HeatBalance heatBalance, int currentHeat, BigFluidStack bigFluidStack, ReactorFluidType type); + double getOverHeat(); + int getLiquidTimer(); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reinforced/ReinforcedGlassBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reinforced/ReinforcedGlassBlock.java index 7efb05f6f..ae7d0c488 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reinforced/ReinforcedGlassBlock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reinforced/ReinforcedGlassBlock.java @@ -3,7 +3,10 @@ import com.simibubi.create.content.decoration.palettes.ConnectedGlassBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.GlassBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -11,10 +14,19 @@ import net.minecraft.world.level.material.FluidState; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; + +import javax.annotation.Nullable; public class ReinforcedGlassBlock extends ConnectedGlassBlock { public ReinforcedGlassBlock(Properties properties) { super(properties); } + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { + super.setPlacedBy(level, pos, state, pPlacer, stack); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java new file mode 100644 index 000000000..24d56c8c3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java @@ -0,0 +1,42 @@ +package net.nuclearteam.createnuclear.content.multiblock.rod; + +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.Items; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; + +import static net.nuclearteam.createnuclear.api.ItemRodTypesValue.DEFAULT_ROD_TYPE; + +public class CNRodTypes { + /** + * Static registry of rod types ({@code RodType}) for the CreateNuclear mod. + * + *

This class exposes the {@link ResourceKey}s and the {@code bootstrap} + * method invoked by the datapack system to register rod types used by the + * multiblock (for example, fuel rods and cooler rods). The examples below + * show how to create a {@code RodType} via its {@code RodType.Builder}.

+ * + *

Example — Custom Rod:

+ *
{@code
+     * register(ctx, "name", new RodType.Builder()
+     *     .baseRodHeat(int)
+     *     .proximityRodHeat(int)
+     *     .rodTimer(int)
+     *     .item(Item)
+     *     .fuelRodType()
+     *     .build());
+     * }
+ * + * @see net.nuclearteam.createnuclear.api.multiblock.rods.RodType + * @see net.nuclearteam.createnuclear.api.CreateNuclearRegistries + */ + public static void bootstrap(BootstapContext ctx) { + register(ctx, "fallback", DEFAULT_ROD_TYPE); + } + + private static void register(BootstapContext ctx, String name, RodType type) { + ctx.register(ResourceKey.create(CreateNuclearRegistries.ROD_TYPE, CreateNuclear.asResource(name)), type); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticles.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticles.java new file mode 100644 index 000000000..e199d6a08 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticles.java @@ -0,0 +1,50 @@ +package net.nuclearteam.createnuclear.content.particles; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.util.RandomSource; + +import javax.annotation.Nullable; + +public class IrradiatedParticles extends TextureSheetParticle { + protected IrradiatedParticles(ClientLevel pLevel, double pX, double pY, double pZ, + SpriteSet spriteSet, double pXSpeed, double pYSpeed, double pZSpeed) { + super(pLevel, pX, pY, pZ, pXSpeed, pYSpeed, pZSpeed); + + RandomSource randomSource = level.random; + + this.xo = randomSource.nextGaussian() * (double)1.0E-6f; + this.yo = randomSource.nextGaussian() * (double)1.0E-4f; + this.zo = randomSource.nextGaussian() * (double)1.0E-6f; + + this.quadSize *= this.random.nextFloat() * 0.6f + 0.6f; + this.hasPhysics = false; + this.gravity = 0.0f; + + this.friction = 0.8f; + this.lifetime = 40; + + this.setSpriteFromAge(spriteSet); + + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + public static class Provider implements ParticleProvider { + private final SpriteSet spriteSet; + + public Provider(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + @Nullable + @Override + public Particle createParticle(IrradiatedParticlesData pType, ClientLevel pLevel, double pX, double pY, double pZ, + double pXSpeed, double pYSpeed, double pZSpeed) { + return new IrradiatedParticles(pLevel, pX, pY, pZ, this.spriteSet, pXSpeed, pYSpeed, pZSpeed); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticlesData.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticlesData.java new file mode 100644 index 000000000..feec3db65 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/IrradiatedParticlesData.java @@ -0,0 +1,84 @@ +package net.nuclearteam.createnuclear.content.particles; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.simibubi.create.foundation.particle.ICustomParticleDataWithSprite; +import net.minecraft.client.particle.ParticleEngine.SpriteParticleRegistration; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.FriendlyByteBuf; +import net.nuclearteam.createnuclear.CNParticleTypes; + +import java.util.Locale; + +public class IrradiatedParticlesData implements ParticleOptions, ICustomParticleDataWithSprite { + + public static final Codec CODEC = RecordCodecBuilder.create(i -> + i.group( + Codec.INT.fieldOf("t").forGetter(p -> p.t) + ) + .apply(i, IrradiatedParticlesData::new) + ); + + public static final Deserializer DESERIALIZER = + new Deserializer<>() { + @Override + public IrradiatedParticlesData fromCommand(ParticleType particleType, StringReader reader) throws CommandSyntaxException { + return new IrradiatedParticlesData(); + } + + @Override + public IrradiatedParticlesData fromNetwork(ParticleType particleType, FriendlyByteBuf buffer) { + return new IrradiatedParticlesData(); + } + }; + + + int t; + + public IrradiatedParticlesData(int _t) { + t = _t; + } + + public IrradiatedParticlesData() { + this(0); + } + + @Override + public ParticleType getType() { + return CNParticleTypes.IRRADIATED_PARTICLES.get(); + } + + @Override + public void writeToNetwork(FriendlyByteBuf buffer) { + buffer.writeInt(t); + } + + @Override + public String writeToString() { + return String.format(Locale.ROOT, "%s %d", CNParticleTypes.IRRADIATED_PARTICLES.parameter(), t); + } + + @Override + public Deserializer getDeserializer() { + return DESERIALIZER; + } + + @Override + public Codec getCodec(ParticleType type) { + return CODEC; + } + + @Override + public SpriteParticleRegistration getMetaFactory() { + return IrradiatedParticles.Provider::new; + } + + + + + + +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudModel.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudModel.java new file mode 100644 index 000000000..dbc75c7bf --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudModel.java @@ -0,0 +1,213 @@ +package net.nuclearteam.createnuclear.content.particles; + +import com.google.common.collect.ImmutableList; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.nuclearteam.createnuclear.content.explosion.CNAdvancedEntityModel; +import net.nuclearteam.createnuclear.content.explosion.CNAdvancedModelBox; +import net.nuclearteam.createnuclear.content.explosion.CNBasicModelPart; + +public class NuclearMushroomCloudModel extends CNAdvancedEntityModel { + private final CNAdvancedModelBox mushroom_cloud; + private final CNAdvancedModelBox lightBall; + private final CNAdvancedModelBox lowerCloud; + private final CNAdvancedModelBox lowerCloud_planes; + private final CNAdvancedModelBox cube_r1; + private final CNAdvancedModelBox cube_r2; + private final CNAdvancedModelBox cube_r3; + private final CNAdvancedModelBox cube_r4; + private final CNAdvancedModelBox plume; + private final CNAdvancedModelBox cube_r5; + private final CNAdvancedModelBox cube_r6; + private final CNAdvancedModelBox plumeBlast; + private final CNAdvancedModelBox plumeRing; + private final CNAdvancedModelBox upperCloud; + private final CNAdvancedModelBox upperCloud1; + private final CNAdvancedModelBox upperCloud_planes; + private final CNAdvancedModelBox cube_r7; + private final CNAdvancedModelBox cube_r8; + private final CNAdvancedModelBox cube_r9; + private final CNAdvancedModelBox cube_r10; + private final CNAdvancedModelBox rings; + private final CNAdvancedModelBox upperRing; + private final CNAdvancedModelBox lowerRing; + + public NuclearMushroomCloudModel() { + texWidth = 512; + texHeight = 512; + + mushroom_cloud = new CNAdvancedModelBox(this); + mushroom_cloud.setRotationPoint(0.0F, 24.0F, 0.0F); + + + lightBall = new CNAdvancedModelBox(this); + lightBall.setRotationPoint(0.0F, -19.0F, 0.0F); + mushroom_cloud.addChild(lightBall); + lightBall.setTextureOffset(300, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F, 0.0F, false); + + lowerCloud = new CNAdvancedModelBox(this); + lowerCloud.setRotationPoint(0.0F, 5.0F, 0.0F); + lightBall.addChild(lowerCloud); + lowerCloud.setTextureOffset(0, 0).addBox(-50.0F, -9.0F, -50.0F, 100.0F, 16.0F, 100.0F, 0.0F, false); + + lowerCloud_planes = new CNAdvancedModelBox(this); + lowerCloud_planes.setRotationPoint(0.0F, 0.0F, 0.0F); + lowerCloud.addChild(lowerCloud_planes); + + + cube_r1 = new CNAdvancedModelBox(this); + cube_r1.setRotationPoint(-16.0F, -20.0F, 16.0F); + lowerCloud_planes.addChild(cube_r1); + setRotateAngle(cube_r1, 0.0F, 0.7854F, 0.0F); + cube_r1.setTextureOffset(142, 342).addBox(-66.0F, -13.0F, 0.0F, 66.0F, 40.0F, 0.0F, 0.0F, true); + + cube_r2 = new CNAdvancedModelBox(this); + cube_r2.setRotationPoint(16.0F, -20.0F, -16.0F); + lowerCloud_planes.addChild(cube_r2); + setRotateAngle(cube_r2, 0.0F, 0.7854F, 0.0F); + cube_r2.setTextureOffset(142, 342).addBox(0.0F, -13.0F, 0.0F, 66.0F, 40.0F, 0.0F, 0.0F, false); + + cube_r3 = new CNAdvancedModelBox(this); + cube_r3.setRotationPoint(16.0F, -20.0F, 16.0F); + lowerCloud_planes.addChild(cube_r3); + setRotateAngle(cube_r3, 0.0F, -0.7854F, 0.0F); + cube_r3.setTextureOffset(142, 342).addBox(0.0F, -13.0F, 0.0F, 66.0F, 40.0F, 0.0F, 0.0F, false); + + cube_r4 = new CNAdvancedModelBox(this); + cube_r4.setRotationPoint(-16.0F, -20.0F, -16.0F); + lowerCloud_planes.addChild(cube_r4); + setRotateAngle(cube_r4, 0.0F, -0.7854F, 0.0F); + cube_r4.setTextureOffset(142, 342).addBox(-66.0F, -13.0F, 0.0F, 66.0F, 40.0F, 0.0F, 0.0F, true); + + plume = new CNAdvancedModelBox(this); + plume.setRotationPoint(0.0F, 9, 0.0F); + lightBall.addChild(plume); + + + cube_r5 = new CNAdvancedModelBox(this); + cube_r5.setRotationPoint(0.0F, -44.8333F, 0.0F); + plume.addChild(cube_r5); + setRotateAngle(cube_r5, 0.0F, -0.7854F, 0.0F); + cube_r5.setTextureOffset(256, 220).addBox(-32.0F, -61.0F, 0.0F, 64.0F, 122.0F, 0.0F, 0.0F, false); + + cube_r6 = new CNAdvancedModelBox(this); + cube_r6.setRotationPoint(0.0F, -44.8333F, 0.0F); + plume.addChild(cube_r6); + setRotateAngle(cube_r6, 0.0F, 0.7854F, 0.0F); + cube_r6.setTextureOffset(256, 220).addBox(-32.0F, -61.0F, 0.0F, 64.0F, 122.0F, 0.0F, 0.0F, false); + + plumeBlast = new CNAdvancedModelBox(this); + plumeBlast.setRotationPoint(0.0F, -80.8333F, 0.0F); + plume.addChild(plumeBlast); + plumeBlast.setTextureOffset(240, 116).addBox(-18.0F, 0.0F, -18.0F, 36.0F, 29.0F, 36.0F, 0.0F, false); + + plumeRing = new CNAdvancedModelBox(this); + plumeRing.setRotationPoint(0.0F, -35.8333F, 0.0F); + plume.addChild(plumeRing); + plumeRing.setTextureOffset(296, 440).addBox(-36.0F, 0.0F, -36.0F, 72.0F, 0.0F, 72.0F, 0.0F, false); + + upperCloud = new CNAdvancedModelBox(this); + upperCloud.setRotationPoint(0.0F, -80.8333F, 0.0F); + plume.addChild(upperCloud); + upperCloud.setTextureOffset(0, 116).addBox(-40.0F, -24.0F, -40.0F, 80.0F, 24.0F, 80.0F, 0.0F, false); + + upperCloud1 = new CNAdvancedModelBox(this); + upperCloud1.setRotationPoint(0.0F, -24.0F, 0.0F); + upperCloud.addChild(upperCloud1); + upperCloud1.setTextureOffset(0, 220).addBox(-32.0F, -15.0F, -32.0F, 64.0F, 15.0F, 64.0F, 0.0F, false); + + upperCloud_planes = new CNAdvancedModelBox(this); + upperCloud_planes.setRotationPoint(0.0F, -12.0F, 0.0F); + upperCloud.addChild(upperCloud_planes); + + + cube_r7 = new CNAdvancedModelBox(this); + cube_r7.setRotationPoint(16.0F, 112.0F, -16.0F); + upperCloud_planes.addChild(cube_r7); + setRotateAngle(cube_r7, 0.0F, 0.7854F, 0.0F); + cube_r7.setTextureOffset(0, 299).addBox(-23.0F, -152.0F, 0.0F, 71.0F, 69.0F, 0.0F, 0.0F, false); + + cube_r8 = new CNAdvancedModelBox(this); + cube_r8.setRotationPoint(16.0F, 112.0F, 16.0F); + upperCloud_planes.addChild(cube_r8); + setRotateAngle(cube_r8, 0.0F, -0.7854F, 0.0F); + cube_r8.setTextureOffset(0, 299).addBox(-23.0F, -152.0F, 0.0F, 71.0F, 69.0F, 0.0F, 0.0F, false); + + cube_r9 = new CNAdvancedModelBox(this); + cube_r9.setRotationPoint(-16.0F, 112.0F, 16.0F); + upperCloud_planes.addChild(cube_r9); + setRotateAngle(cube_r9, 0.0F, 0.7854F, 0.0F); + cube_r9.setTextureOffset(0, 299).addBox(-48.0F, -152.0F, 0.0F, 71.0F, 69.0F, 0.0F, 0.0F, true); + + cube_r10 = new CNAdvancedModelBox(this); + cube_r10.setRotationPoint(-16.0F, 112.0F, -16.0F); + upperCloud_planes.addChild(cube_r10); + setRotateAngle(cube_r10, 0.0F, -0.7854F, 0.0F); + cube_r10.setTextureOffset(0, 299).addBox(-48.0F, -152.0F, 0.0F, 71.0F, 69.0F, 0.0F, 0.0F, true); + + rings = new CNAdvancedModelBox(this); + rings.setRotationPoint(0.0F, -55.0F, 0.0F); + upperCloud.addChild(rings); + + + upperRing = new CNAdvancedModelBox(this); + upperRing.setRotationPoint(0.0F, -4.0F, 0.0F); + rings.addChild(upperRing); + upperRing.setTextureOffset(296, 440).addBox(-36.0F, 0.0F, -36.0F, 72.0F, 0.0F, 72.0F, 0.0F, false); + + lowerRing = new CNAdvancedModelBox(this); + lowerRing.setRotationPoint(0.0F, 4.0F, 0.0F); + rings.addChild(lowerRing); + lowerRing.setTextureOffset(296, 440).addBox(-36.0F, 0.0F, -36.0F, 72.0F, 0.0F, 72.0F, 0.0F, false); + this.updateDefaultPose(); + } + + + @Override + public Iterable parts() { + return ImmutableList.of(mushroom_cloud); + } + + @Override + public Iterable getAllParts() { + return ImmutableList.of(rings, mushroom_cloud, lowerCloud, lowerCloud_planes, lightBall, cube_r1, cube_r2, cube_r3, cube_r4, cube_r5, cube_r6, cube_r7, cube_r8, cube_r9, cube_r10, plume, plumeBlast, plumeRing, upperCloud, upperCloud_planes, upperCloud1, upperRing, lowerRing); + } + + + @Override + public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.resetToDefaultPose(); + } + + public void hideFireball(boolean fireball) { + this.plume.showModel = fireball; + this.lowerCloud.showModel = fireball; + this.upperCloud.showModel = fireball; + } + + public void animateParticle(float age, float life, float partialTicks) { + this.resetToDefaultPose(); + float lerpedAge = age + partialTicks; + float baseExpand1 = life + life * life; + float upperExpand = offset(life, 0.3F, 0.4F, 1.5F); + float plumeRingExpand = offset(life, 0.0F, 0.0F, 0.5F) * 45; + float lowerRingExpand = offset(life, 0.0F, 0.1F, 0.65F) * 20; + float upperRingExpand = offset(life, 0.0F, 0.2F, 0.65F) * 15; + this.plume.scaleChildren = true; + this.upperCloud.scaleChildren = true; + this.lowerCloud.scaleChildren = true; + this.plume.setScale(1, life * 1.5F, 1); + this.upperCloud.setScale(upperExpand, 1, upperExpand); + this.plumeRing.setScale(plumeRingExpand, 1, plumeRingExpand); + this.lowerRing.setScale(lowerRingExpand, 1, lowerRingExpand); + this.upperRing.setScale(upperRingExpand, 1, upperRingExpand); + this.lowerCloud.setScale(baseExpand1, baseExpand1, baseExpand1); + this.plumeRing.rotateAngleY += lerpedAge * 0.1; + this.lowerRing.rotateAngleY -= lerpedAge * 0.2; + this.upperRing.rotateAngleY += lerpedAge * 0.1; + } + + public float offset(float life, float forwards, float min, float max) { + return Mth.clamp(life + forwards, min, max); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java new file mode 100644 index 000000000..5a0479823 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java @@ -0,0 +1,171 @@ +package net.nuclearteam.createnuclear.content.particles; + +import net.nuclearteam.createnuclear.*; +import net.nuclearteam.createnuclear.compat.alexscave.AlexscaveCompat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.nuclearteam.createnuclear.compat.Mods; +import net.nuclearteam.createnuclear.content.explosion.CNNuclearExplosionSound; +import net.nuclearteam.createnuclear.foundation.utility.Maths; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +public class NuclearMushroomCloudParticle extends Particle { + + private static final ResourceLocation TEXTURE = CreateNuclear.asResource("textures/particle/nuclear_mushroom_cloud.png"); + private static final ResourceLocation TEXTURE_GLOW = CreateNuclear.asResource("textures/particle/nuclear_mushroom_cloud_glow.png"); + private static final ResourceLocation TEXTURE_PINK = CreateNuclear.asResource("textures/particle/nuclear_mushroom_cloud_pink.png"); + private static final ResourceLocation TEXTURE_PINK_GLOW = CreateNuclear.asResource("textures/particle/nuclear_mushroom_cloud_pink_glow.png"); + private static final NuclearMushroomCloudModel MODEL = new NuclearMushroomCloudModel(); + private static final int BALL_FOR = 10; + private static final int GLOW_FOR = 20; + private static final int FADE_SPEED = 10; + private final float scale; + + private boolean playedRinging; + private boolean playedExplosion; + private boolean playedRumble; + + private final boolean pink; + + private Object alexscaveHandler; + + protected NuclearMushroomCloudParticle(ClientLevel level, double x, double y, double z, float scale, boolean pink) { + super(level, x, y, z); + this.gravity = 0.0F; + this.lifetime = (int) Math.ceil(133.33F * scale); + this.scale = scale + 0.2F; + this.setSize(3.0F, 3.0F); + this.pink = pink; + + if (Mods.ALEXS_CAVE.isLoaded()) { + this.alexscaveHandler = new AlexscaveCompat(); + } + } + + public boolean shouldCull() { + return false; + } + + public void tick() { + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + ((AlexscaveCompat)alexscaveHandler).NukeParam(); + } + else { + CNClientProxy.renderNukeSkyDarkFor = 70; + CNClientProxy.muteNonNukeSoundsFor = 50; + } + boolean large = this.scale > 2.0F; + if(age > BALL_FOR / 2 + 5){ + if(!playedExplosion){ + playedExplosion = true; + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + CreateNuclear.LOGGER.info("EXPLOSIOOOOOON, (With Alex's Cave)"); + SoundEvent[] nuclear_explosions = ((AlexscaveCompat)alexscaveHandler).GetACSounds(); + playSound(large ? nuclear_explosions[0] : nuclear_explosions[1], lifetime - 20, lifetime, 0.2F, false); + } else { + CreateNuclear.LOGGER.info("EXPLOSIOOOOOON, (WITHOUT Alex's Cave)"); + playSound(CNSoundEvents.NUCLEAR_EXPLOSION_MAIN.getMainEvent(), lifetime - 20, lifetime, 0.2F, false); + } + } + } + if (age < BALL_FOR) { + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + if (!playedRinging && ((AlexscaveCompat)alexscaveHandler).GetACConfig()) { + playedRinging = true; + playSound(((AlexscaveCompat)alexscaveHandler).GetACSounds()[2], 100, 50, 0.05F, true); + } + ((AlexscaveCompat)alexscaveHandler).UpdateACProxy(); + } else { + if (!playedRinging && CNConfigs.client().nuclearBombFlash.get()) { + playedRinging = true; + // ringing.ogg lasts 8.91s = 178 ticks. Stopping at 100 ticks cut it mid-file, + // so the tinnitus now runs to the end of the asset and fades over its last 3s. + // Not looping: the file has no seamless loop point, and duration never exceeds it. + playSound(CNSoundEvents.NUCLEAR_EXPLOSION_RINGING.getMainEvent(), 178, 118, 0.05F, false); + // playSound(CNSoundEvents.NUCLEAR_EXPLOSION_SHOCKWAVE.getMainEvent(), 100, 50, 0.05F, true); + } + CNClientProxy.renderNukeFlashFor = 16; + } + } else if (age < lifetime - FADE_SPEED) { + float life = (float) (Math.log(1 + (age - BALL_FOR) / (float) (lifetime - BALL_FOR))) * 2F; + float explosionSpread = (12 * life + 4F) * scale; + for (int i = 0; i < (1 + random.nextInt(2)) * scale; i++) { + Vec3 from = new Vec3(level.random.nextFloat() - 0.5F, level.random.nextFloat() - 0.5F, level.random.nextFloat() - 0.5F).scale(scale * 1.4F).add(this.x, this.y, this.z); + Vec3 away = new Vec3(level.random.nextFloat() - 0.5F, level.random.nextFloat() - 0.5F, level.random.nextFloat() - 0.5F).scale(2.34F); + this.level.addParticle(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD_SMOKE.get(), from.x, from.y, from.z, away.x, away.y, away.z); + } + for (int j = 0; j < scale * scale; j++) { + Vec3 explosionBase = new Vec3((level.random.nextFloat() - 0.5F) * explosionSpread, (-0.6F + level.random.nextFloat() * 0.5F) * explosionSpread * 0.1F, (level.random.nextFloat() - 0.5F) * explosionSpread).add(this.x, this.y, this.z); + this.level.addParticle(CNParticleRegistry.NUCLEAR_MUSHROOM_CLOUD_EXPLOSION.get(), explosionBase.x, explosionBase.y, explosionBase.z, 0, 0, 0); + } + if(age > BALL_FOR){ + if(!playedRumble){ + playedRumble = true; + + if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { + playSound(((AlexscaveCompat)alexscaveHandler).GetACSounds()[3], lifetime + 100, lifetime, 0.1F, true); + } else { + playSound(CNSoundEvents.NUCLEAR_EXPLOSION_RUMBLE_2.getMainEvent(), lifetime + 100, lifetime, 0.1F, true); + + } + } + } + } + super.tick(); + } + + private void playSound(SoundEvent soundEvent, int duration, int fadesAt, float fadeInBy, boolean looping){ + Minecraft.getInstance().getSoundManager().queueTickingSound(new CNNuclearExplosionSound(soundEvent, this.x, this.y, this.z, duration, fadesAt, fadeInBy, looping)); + } + + public void render(VertexConsumer vertexConsumer, Camera camera, float partialTick) { + Vec3 vec3 = camera.getPosition(); + float f = (float) (Mth.lerp((double) partialTick, this.xo, this.x) - vec3.x()); + float f1 = (float) (Mth.lerp((double) partialTick, this.yo, this.y) - vec3.y()); + float f2 = (float) (Mth.lerp((double) partialTick, this.zo, this.z) - vec3.z()); + PoseStack posestack = new PoseStack(); + posestack.pushPose(); + posestack.translate(f, f1 - 0.5F, f2); + posestack.scale(-scale, -scale, scale); + MultiBufferSource.BufferSource multibuffersource$buffersource = Minecraft.getInstance().renderBuffers().bufferSource(); + MODEL.hideFireball(age >= BALL_FOR); + float life = (float) (Math.log(1 + (age - BALL_FOR + partialTick) / (lifetime - BALL_FOR))) * 2F; + float glowLife = life < 1F ? 1F - life : 0; + int left = lifetime - age; + float alpha = left <= FADE_SPEED ? left / (float) FADE_SPEED : 1.0F; + MODEL.animateParticle(age, Maths.smin(life, 1.0F, 0.5F), partialTick); + VertexConsumer baseConsumer = multibuffersource$buffersource.getBuffer(RenderType.entityTranslucent(pink ? TEXTURE_PINK : TEXTURE)); + MODEL.renderToBuffer(posestack, baseConsumer, getLightColor(partialTick), OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); + multibuffersource$buffersource.endBatch(); + posestack.popPose(); + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.CUSTOM; + } + + public static class Factory implements ParticleProvider { + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + if (xSpeed == 0.0) { + xSpeed = 1.0F; + } + return new NuclearMushroomCloudParticle(worldIn, x, y, z, (float) Math.max(0.5F, xSpeed), ySpeed >= 1.0F); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/SmallNuclearExplosionParticle.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/SmallNuclearExplosionParticle.java new file mode 100644 index 000000000..9318a3344 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/SmallNuclearExplosionParticle.java @@ -0,0 +1,280 @@ +package net.nuclearteam.createnuclear.content.particles; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.FastColor; + +public class SmallNuclearExplosionParticle extends TextureSheetParticle { + + private final SpriteSet sprites; + private boolean hasFadeColor = false; + private float fadeR; + private float fadeG; + private float fadeB; + protected SmallNuclearExplosionParticle(ClientLevel world, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed, SpriteSet sprites, boolean shortLifespan, int color1) { + super(world, x, y, z, xSpeed, ySpeed, zSpeed); + this.xd = xSpeed; + this.yd = ySpeed; + this.zd = zSpeed; + this.setSize(0.5F, 0.5F); + this.quadSize = (shortLifespan ? 1 : 0.8F) + world.random.nextFloat() * 0.3F; + this.lifetime = shortLifespan ? 5 + world.random.nextInt(3) : 15 + world.random.nextInt(10); + this.friction = 0.96F; + float randCol = world.random.nextFloat() * 0.05F; + this.sprites = sprites; + this.setColor(Math.min(FastColor.ARGB32.red(color1) / 255F + randCol, 1), Math.min(1F, FastColor.ARGB32.green(color1) / 255F + randCol), Math.min(1F, FastColor.ARGB32.blue(color1) / 255F + randCol)); + } + + public void setFadeColor(int i){ + hasFadeColor = true; + this.fadeR = (float) ((i & 16711680) >> 16) / 255.0F; + this.fadeG = (float) ((i & '\uff00') >> 8) / 255.0F; + this.fadeB = (float) ((i & 255) >> 0) / 255.0F; + } + + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + this.setSpriteFromAge(this.sprites); + if (this.age++ >= this.lifetime) { + this.remove(); + } else { + if(hasFadeColor){ + this.rCol += (fadeR - this.rCol) * 0.2F; + this.gCol += (fadeG - this.gCol) * 0.2F; + this.bCol += (fadeB - this.bCol) * 0.2F; + }else{ + this.rCol = this.rCol * 0.95F; + this.gCol = this.gCol * 0.95F; + this.bCol = this.bCol * 0.95F; + } + this.move(this.xd, this.yd, this.zd); + this.xd *= (double) this.friction; + this.yd *= (double) this.friction; + this.zd *= (double) this.friction; + } + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_LIT; + } + + public float getQuadSize(float scaleFactor) { + return super.getQuadSize(scaleFactor); + } + + public int getLightColor(float partialTicks) { + return 240; + } + + public static class NukeFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public NukeFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, false, 0XFFB300); + particle.setSpriteFromAge(spriteSet); + return particle; + } + } + + public static class MineFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public MineFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XFFB300); + particle.setSpriteFromAge(spriteSet); + return particle; + } + } + + public static class UnderzealotFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public UnderzealotFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, false, 0); + particle.setSpriteFromAge(spriteSet); + return particle; + } + } + + public static class RaygunFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public RaygunFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XEEEEEE); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 5 + worldIn.random.nextInt(3); + particle.scale(0.6F + worldIn.random.nextFloat() * 0.3F); + particle.setFadeColor(0X40EE40); + return particle; + } + } + + public static class BlueRaygunFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public BlueRaygunFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XEEEEEE); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 5 + worldIn.random.nextInt(5); + particle.scale(0.5F + worldIn.random.nextFloat() * 0.5F); + particle.setFadeColor(0X40EEDA); + return particle; + } + } + + public static class TremorzillaFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public TremorzillaFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XEEEEEE); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 9 + worldIn.random.nextInt(3); + particle.scale(1.0F + worldIn.random.nextFloat() * 0.9F); + particle.setFadeColor(0X9BFF3D); + return particle; + } + } + + public static class TremorzillaRetroFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public TremorzillaRetroFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XEEEEEE); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 9 + worldIn.random.nextInt(3); + particle.scale(1.0F + worldIn.random.nextFloat() * 0.9F); + particle.setFadeColor(0XE06EFF); + return particle; + } + } + + + public static class TremorzillaTectonicFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public TremorzillaTectonicFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XEEEEEE); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 9 + worldIn.random.nextInt(3); + particle.scale(1.0F + worldIn.random.nextFloat() * 0.9F); + particle.setFadeColor(0XFFD631); + return particle; + } + } + + public static class AmberFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public AmberFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, false, 0XFFDA1E); + particle.setSpriteFromAge(spriteSet); + particle.scale(0.8F); + return particle; + } + } + + public static class TotemFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public TotemFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XFF0000); + particle.setSpriteFromAge(spriteSet); + particle.lifetime = 5 + worldIn.random.nextInt(3); + particle.scale(1.2F + worldIn.random.nextFloat() * 0.3F); + particle.setFadeColor(0); + return particle; + } + } + + public static class PurpleWitchFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public PurpleWitchFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XFF69FF); + particle.setSpriteFromAge(spriteSet); + particle.scale(0.8F); + particle.setFadeColor(0XFFFFFF); + return particle; + } + } + + public static class ConversionCrucibleFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public ConversionCrucibleFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, 0.0D, 0.0D, 0.0D, spriteSet, true, FastColor.ARGB32.color(255, (int)(255F * xSpeed), (int)(255F * ySpeed), (int)(255F * zSpeed))); + particle.setSpriteFromAge(spriteSet); + particle.scale(0.8F); + particle.setFadeColor(0XFFFFFF); + return particle; + } + } + + public static class FrostmintFactory implements ParticleProvider { + private final SpriteSet spriteSet; + + public FrostmintFactory(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SmallNuclearExplosionParticle particle = new SmallNuclearExplosionParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, spriteSet, true, 0XFFFFFF); + particle.quadSize *= 1.6F; + particle.setSpriteFromAge(spriteSet); + particle.setFadeColor(0XE5F9FA); + return particle; + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java new file mode 100644 index 000000000..1f7433abe --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java @@ -0,0 +1,19 @@ +package net.nuclearteam.createnuclear.content.radiation; + +import com.simibubi.create.AllItems; +import net.nuclearteam.createnuclear.api.radiation.RadiationRegistry; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; + +public class CNRadiationValues { + public static void register() { + RadiationRegistry.register() + .item(AllItems.CRUSHED_URANIUM.asItem()) + .value(.5D) + .build(); + + RadiationRegistry.register() + .biome(CNBiomes.Irradiated.PLAIN) + .value(25D) + .build(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationBucketItem.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationBucketItem.java new file mode 100644 index 000000000..38b13da68 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationBucketItem.java @@ -0,0 +1,39 @@ +package net.nuclearteam.createnuclear.content.radiation; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper; +import net.nuclearteam.createnuclear.api.radiation.IRadiationSource; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class RadiationBucketItem extends BucketItem implements IRadiationSource { + private final double radiation; + + public RadiationBucketItem(Supplier supplier, Properties builder, double radiation) { + super(supplier, builder); + this.radiation = radiation; + } + + /** + * Forge's {@link BucketItem#initCapabilities} only provides the {@link FluidBucketWrapper} + * fluid-handler capability when {@code getClass() == BucketItem.class}. Because this is a + * subclass, it would otherwise return no fluid capability — making the bucket impossible to + * empty into fluid handlers (e.g. Create fluid tanks). Re-declare it here to restore that. + */ + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + return new FluidBucketWrapper(stack); + } + + @Override + public double getRadiation(ItemStack stack, LivingEntity entity) { + return this.radiation; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java new file mode 100644 index 000000000..56e318da2 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java @@ -0,0 +1,71 @@ +package net.nuclearteam.createnuclear.content.radiation; + +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; + +import net.nuclearteam.createnuclear.CNEffects; +import net.nuclearteam.createnuclear.content.effects.VicinityEffect; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; + +public class RadiationEffect extends VicinityEffect { + private static final int CONTAGION_DURATION_TICKS = 300; + + /** + * Constructs the RadiationEffect with harmful category and color. + * Also applies attribute modifiers to reduce speed, attack damage, and attack speed. + */ + public RadiationEffect() { + super(MobEffectCategory.HARMFUL, 15453236, + amplifier -> 10, + RadiationCapability::canBeIrradiated, + timer -> {}); // Custom color (hex value) + + // Reduces movement speed by 20% + this.addAttributeModifier(Attributes.MOVEMENT_SPEED, + "91AEAA56-376B-4498-935B-2F7F68070635", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); + + // Reduces attack damage by 20% + this.addAttributeModifier(Attributes.ATTACK_DAMAGE, + "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); + + // Reduces attack speed by 20% + this.addAttributeModifier(Attributes.ATTACK_SPEED, + "55FCED67-E92A-486E-9800-B47F202C4386", -0.2D, AttributeModifier.Operation.MULTIPLY_TOTAL); + } + + /** + * Determines if the effect should be applied this tick. + * Returning true causes the effect to apply every tick. + * + * @param duration The remaining duration of the effect. + * @param amplifier The strength (level) of the effect. + * @return true if the effect should apply on this tick. + */ + @Override + public boolean isDurationEffectTick(int duration, int amplifier) { + return true; + } + + @Override + protected void onContaminate(LivingEntity nearby) { + RadiationCapability.applyContagion(nearby, 15D, CONTAGION_DURATION_TICKS); + } + + @Override + public void applyEffectTick(LivingEntity entity, int amplifier) { + super.applyEffectTick(entity, amplifier); + + double resistance = RadiationCapability.getRadiationResistance(entity); + + float damage = (float) ((1 << amplifier) * (1.0 - resistance)); + + if (damage <= 0.0f) { + return; + } + + entity.hurt(CNDamageSources.radiation(entity.level()), damage); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java new file mode 100644 index 000000000..8a32a83f3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java @@ -0,0 +1,25 @@ +package net.nuclearteam.createnuclear.content.radiation; + +import com.simibubi.create.api.effect.OpenPipeEffectHandler; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.fluids.FluidStack; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; + +import java.util.List; + +public class RadiationEffectHandler implements OpenPipeEffectHandler { + private static final double PIPE_LEAK_DOSE = 40.0D; + + @Override + public void apply(Level level, AABB area, FluidStack fluid) { + if (level.getGameTime() % 5 != 0) return; + + List entities = level.getEntitiesOfClass(LivingEntity.class, area, LivingEntity::isAffectedByPotions); + for (LivingEntity entity : entities) { + if (!RadiationCapability.canBeIrradiated(entity)) continue; + RadiationCapability.applyContagion(entity, PIPE_LEAK_DOSE, 20); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java new file mode 100644 index 000000000..5e02a0fb3 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java @@ -0,0 +1,22 @@ +package net.nuclearteam.createnuclear.content.radiation; + +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.nuclearteam.createnuclear.api.radiation.IRadiationSource; + +public class RadiationItem extends Item implements IRadiationSource { + + private final double radiation; + + public RadiationItem(Item.Properties settings, double radiation) { + super(settings); + this.radiation = radiation; + } + + @Override + public double getRadiation(ItemStack stack, LivingEntity entity) { + return this.radiation * stack.getCount(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java new file mode 100644 index 000000000..3b1f550d2 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java @@ -0,0 +1,20 @@ +package net.nuclearteam.createnuclear.content.radiation.capability; + +import net.minecraft.resources.ResourceLocation; + +public interface IRadiationCapability { + double getRadiation(); + void setRadiation(double value); + + long getInventoryHash(); + void setInventoryHash(long hash); + + ResourceLocation getLastBiomeLocation(); + void setLastBiomeLocation(ResourceLocation location); + + double getContagionDose(); + void setContagionDose(double dose); + + int getContagionTicks(); + void setContagionTicks(int ticks); +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java new file mode 100644 index 000000000..d57e3cc5d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationCapability.java @@ -0,0 +1,246 @@ +package net.nuclearteam.createnuclear.content.radiation.capability; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; +import net.nuclearteam.createnuclear.CNAttributes; +import net.nuclearteam.createnuclear.CNEffects; +import net.nuclearteam.createnuclear.CNTags; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.radiation.IRadiationSource; +import net.nuclearteam.createnuclear.api.radiation.RadiationRegistry; +import net.nuclearteam.createnuclear.foundation.utility.ConfigValueResolver; +import net.nuclearteam.createnuclear.foundation.utility.InventoryHashUtil; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +public class RadiationCapability implements IRadiationCapability { + private double radiation; + private long inventoryHash; + private ResourceLocation lastBiomeLocation; + private double contagionDose; + private int contagionTicks; + + @Override + public double getRadiation() { + return this.radiation; + } + + @Override + public void setRadiation(double value) { + this.radiation = value; + } + + @Override + public long getInventoryHash() { + return this.inventoryHash; + } + + @Override + public void setInventoryHash(long hash) { + this.inventoryHash = hash; + } + + @Override + public ResourceLocation getLastBiomeLocation() { + return this.lastBiomeLocation; + } + + @Override + public void setLastBiomeLocation(ResourceLocation location) { + this.lastBiomeLocation = location; + } + + @Override + public double getContagionDose() { + return this.contagionDose; + } + + @Override + public void setContagionDose(double dose) { + this.contagionDose = dose; + } + + @Override + public int getContagionTicks() { + return this.contagionTicks; + } + + @Override + public void setContagionTicks(int ticks) { + this.contagionTicks = ticks; + } + + public static void attach(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof LivingEntity) { + event.addCapability(CreateNuclear.asResource("irradiated_resistance"), new RadiationProvider()); + } + } + + public static void onLivingEntityTick(LivingTickEvent event) { + tickRadiation(event.getEntity()); + } + + public static void applyContagion(LivingEntity entity, double doseValue, int durationTicks) { + entity.getCapability(RadiationProvider.CAP).ifPresent(cap -> { + cap.setContagionDose(doseValue); + cap.setContagionTicks(durationTicks); + }); + } + + public static void tickRadiation(LivingEntity entity) { + Level level = entity.level(); + if (level.isClientSide) return; + + entity.getCapability(RadiationProvider.CAP).ifPresent(cap -> { + if (entity instanceof Player player) { + long newHash = InventoryHashUtil.compute(player); + if (newHash != cap.getInventoryHash()) { + cap.setInventoryHash(newHash); + cap.setRadiation(Math.max(0, computeItemRadiation(player))); + } + } else { + cap.setRadiation(Math.max(0, computeItemRadiation(entity))); + } + + ResourceKey biomeKey = level.getBiome(entity.blockPosition()).unwrapKey().orElse(null); + ResourceLocation biomeLoc = biomeKey != null ? biomeKey.location() : null; + if (!Objects.equals(biomeLoc, cap.getLastBiomeLocation())) { + cap.setLastBiomeLocation(biomeLoc); + } + + if (!canBeIrradiated(entity)) return; + + if (cap.getContagionTicks() > 0) { + cap.setContagionTicks(cap.getContagionTicks() - 1); + } + + double contagionDose = cap.getContagionTicks() > 0 ? cap.getContagionDose() : 0; + + double totalRaw = cap.getRadiation() + getRawBiomeRadiation(biomeKey) + contagionDose; + double resistance = getRadiationResistance(entity); + double totalRadiation = totalRaw * (1.0 - resistance); + + applyEffects(entity, totalRadiation); + }); + } + + private static double computeItemRadiation(Player player) { + double radiation = 0; + for (ItemStack stack : player.getInventory().items) { + if (stack.getItem() instanceof IRadiationSource source) + radiation += source.getRadiation(stack, player); + radiation += RadiationRegistry.getRadiation(stack, player); + } + for (ItemStack stack : player.getInventory().offhand) { + if (stack.getItem() instanceof IRadiationSource source) + radiation += source.getRadiation(stack, player); + radiation += RadiationRegistry.getRadiation(stack, player); + } + return radiation; + } + + private static double getStackRadiation(ItemStack stack, LivingEntity entity) { + double radiation = 0; + if (stack.getItem() instanceof IRadiationSource source) radiation += source.getRadiation(stack, entity); + radiation += RadiationRegistry.getRadiation(stack, entity); + + return radiation; + } + + private static double computeItemRadiation(LivingEntity entity) { + double radiation = 0; + for (ItemStack stack : entity.getArmorSlots()) { + radiation += getStackRadiation(stack, entity); + } + radiation += getStackRadiation(entity.getMainHandItem(), entity); + radiation += getStackRadiation(entity.getOffhandItem(), entity); + return radiation; + } + + private static double getRawBiomeRadiation(ResourceKey biomeKey) { + if (biomeKey == null) return 0; + return RadiationRegistry.get(biomeKey); + } + + /** + * Single source of truth for radiation eligibility, shared by every application path + * (item/biome tick, vicinity effect, open-pipe leak). Covers eligibility only — + * the continuous attenuation by resistance lives in {@link #applyEffects} / the effect tick. + */ + public static boolean canBeIrradiated(LivingEntity entity) { + if (entity.isSpectator()) return false; + if (entity.getType().is(CNTags.CNEntityTags.IRRADIATED_IMMUNE.tag)) return false; + if (!CNConfigs.server().radiation.enabledItemRadiation.get()) return false; + if (getEntityBlacklist().contains(entity.getType())) return false; + return getRadiationResistance(entity) < 1.0; + } + + // Cached, parsed entity blacklist. Rebuilt only when the underlying config list instance + // changes (ForgeConfigSpec returns a fresh list on reload), so no per-tick parsing. + private static List cachedBlacklistSource; + private static Set> cachedBlacklist = Set.of(); + + private static Set> getEntityBlacklist() { + List source = CNConfigs.server().radiation.configuredLists.getEntityBlackList(); + if (source != cachedBlacklistSource) { + Set> resolved = new HashSet<>(); + ConfigValueResolver.loadValuesInSet(source, resolved, + entry -> BuiltInRegistries.ENTITY_TYPE.get(ResourceLocation.tryParse(entry))); + cachedBlacklist = resolved; + cachedBlacklistSource = source; + } + return cachedBlacklist; + } + + public static double getRadiationResistance(LivingEntity entity) { + double resistance = 0d; + + AttributeInstance attribute = entity.getAttribute(CNAttributes.IRRADIATED_RESISTANCE.get()); + + if (attribute != null) resistance += attribute.getValue(); + + return Mth.clamp(resistance, 0.0, 1.0); + } + + private static void applyEffects(LivingEntity entity, double radiation) { + final double radiation_desactive = 0; + MobEffect radiationEffect = CNEffects.RADIATION.get(); + + if (radiation <= radiation_desactive) return; + + int amp; + if (radiation < CNConfigs.server().radiation.radiationLevel1.get()) amp = CNConfigs.server().radiation.amplifierLevel0.get(); + else if (radiation < CNConfigs.server().radiation.radiationLevel2.get()) amp = CNConfigs.server().radiation.amplifierLevel1.get(); + else if (radiation < CNConfigs.server().radiation.radiationLevel3.get()) amp = CNConfigs.server().radiation.amplifierLevel2.get(); + else amp = CNConfigs.server().radiation.amplifierLevel2.get(); + + MobEffectInstance current = entity.getEffect(radiationEffect); + + if (current != null && current.getAmplifier() != amp) { + entity.removeEffect(radiationEffect); + current = null; + } + + if (current == null || current.getDuration() <= 40) { + entity.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 100, amp, true, true)); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java new file mode 100644 index 000000000..a9fea11de --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java @@ -0,0 +1,43 @@ +package net.nuclearteam.createnuclear.content.radiation.capability; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class RadiationProvider implements ICapabilitySerializable { + public static final Capability CAP = CapabilityManager.get(new CapabilityToken<>() {}); + private final IRadiationCapability instance = new RadiationCapability(); + private final LazyOptional optional = LazyOptional.of(() -> instance); + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return cap == CAP ? optional.cast() : LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putDouble("radiation", instance.getRadiation()); + tag.putLong("hash", instance.getInventoryHash()); + if (instance.getLastBiomeLocation() != null) { + tag.putString("lastBiome", instance.getLastBiomeLocation().toString()); + } + return tag; + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + instance.setRadiation(nbt.getDouble("radiation")); + instance.setInventoryHash(nbt.getLong("hash")); + instance.setLastBiomeLocation(nbt.contains("lastBiome") + ? ResourceLocation.tryParse(nbt.getString("lastBiome")) + : null); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java new file mode 100644 index 000000000..b33d9b4f7 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/AbstractReactorStatDisplaySource.java @@ -0,0 +1,54 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +public abstract class AbstractReactorStatDisplaySource extends NumericSingleLineDisplaySource { + protected abstract String getLabelKey(); + protected abstract int getMax(); + protected abstract int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context); + protected abstract ChatFormatting getColor(int value, ReactorControllerBlockEntity controller); + protected MutableComponent getUnitSuffix() { return null; } + + @Override + protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); + if (controller == null || controller.isRemoved()) return ZERO.copy(); + + MutableComponent label = CreateNuclearLang.translateDirect(getLabelKey()).append(" "); + int mode = context.sourceConfig().getInt("display_mode"); + int value = computeValue(controller, context); + int max = getMax(); + ChatFormatting color = getColor(value, controller); + + return label.append(switch (mode) { + case 1 -> Component.literal((value * 100 / max) + "%").withStyle(color); + case 2 -> ReactorGaugeRenderer.drawGauge(value, max, color, 6); + default -> { + MutableComponent base = Component.literal(String.valueOf(value)); + MutableComponent unit = getUnitSuffix(); + yield (unit != null ? base.append(unit) : base).withStyle(color); + } + }); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineBuilder builder, boolean isFirstLine) { + if (isFirstLine) return; + builder.addSelectionScrollInput(0, 100, (input, l) -> input + .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "value", "percent", "gauge")), "display_mode"); + } + + @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java new file mode 100644 index 000000000..ce7934b55 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/CoolerDisplaySource.java @@ -0,0 +1,46 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +import java.util.Map; + +public class CoolerDisplaySource extends AbstractReactorStatDisplaySource { + + + @Override + protected String getLabelKey() { + return "display_source.reactor.cooler"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_COOLER; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.AQUA; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + int cooler = 0; + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { + if (RodType.TypeRodPredicate.isCooled(entry.getKey().getDefaultInstance(), context.level())) { + cooler += entry.getValue(); + } + } + } + return cooler; + } + + @Override + protected String getTranslationKey() { + return "cooler"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java new file mode 100644 index 000000000..56a8dc276 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/FuelDisplaySource.java @@ -0,0 +1,45 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +import java.util.Map; + +public class FuelDisplaySource extends AbstractReactorStatDisplaySource { + + @Override + protected String getLabelKey() { + return "display_source.reactor.fuel"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FUEL; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.GREEN; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + int fuel = 0; + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { + if (TypeRodPredicate.isFuel(entry.getKey().getDefaultInstance(), context.level())) { + fuel += entry.getValue(); + } + } + } + return fuel; + } + + @Override + protected String getTranslationKey() { + return "fuel"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java new file mode 100644 index 000000000..98f052620 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/HeatDisplaySource.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import net.minecraft.ChatFormatting; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; + +public class HeatDisplaySource extends AbstractReactorStatDisplaySource { + + @Override + protected String getLabelKey() { + return "display_source.reactor.heat"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_HEAT; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return IHeat.HeatLevel.of(value, controller.getMultiblockSize()).getTextColor(); + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + return (int) controller.getConfiguredPattern().getOrCreateTag().getDouble("heat"); + } + + @Override + protected String getTranslationKey() { + return "heat"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java new file mode 100644 index 000000000..6acaab848 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/LiquidLevelDisplaySource.java @@ -0,0 +1,51 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.List; + +public class LiquidLevelDisplaySource extends AbstractReactorStatDisplaySource { + @Override + protected String getLabelKey() { + return "display_source.reactor.fluid"; + } + + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FLUID; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.BLUE; + } + + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + List fluidList = controller.getBigFluidStack(); + return (fluidList != null && !fluidList.isEmpty()) ? fluidList.get(0).amount : 0; + } + + @Override + protected MutableComponent getUnitSuffix() { + return CreateNuclearLang.translateDirect("generic.unit.fluid.value"); + } + + @Override + protected String getTranslationKey() { + return "liquid_level"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java new file mode 100644 index 000000000..28360ff21 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorDisplayConstants.java @@ -0,0 +1,9 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +final class ReactorDisplayConstants { + static final int MAX_FUEL = 64; + static final int MAX_COOLER = 64; + static final int MAX_FLUID = 16000; + static final int MAX_HEAT = 1000; + private ReactorDisplayConstants() {} +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java new file mode 100644 index 000000000..4b590b166 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorGaugeRenderer.java @@ -0,0 +1,15 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; + +public final class ReactorGaugeRenderer { + private ReactorGaugeRenderer() {} + + static MutableComponent drawGauge(int current, int max, ChatFormatting color, int width) { + int filled = (int) (Mth.clamp((float) current / max, 0, 1) * width); + return Component.literal("█".repeat(filled) + "▒".repeat(Math.max(0, width - filled))).withStyle(color); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java new file mode 100644 index 000000000..53bbfca1a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSizeDisplaySource.java @@ -0,0 +1,54 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +public class ReactorSizeDisplaySource extends NumericSingleLineDisplaySource { + + @Override + protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); + if (controller == null || controller.isRemoved()) return ZERO.copy(); + + // Label + trailing space + MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.size").append(" "); + + int mode = context.sourceConfig().getInt("display_mode"); + int size = controller.getMultiblockSize(); + int tier = size <= 5 ? 1 : size <= 7 ? 2 : 3; + + return label.append(switch (mode) { + case 1 -> Component.literal((tier * 100 / 3) + "%").withStyle(ChatFormatting.BLUE); + case 2 -> { + // Short 3-segment gauge representing the tier + yield Component.literal("█".repeat(tier) + "▒".repeat(3 - tier)).withStyle(ChatFormatting.BLUE); + } + default -> { + String key = tier == 1 ? "small" : tier == 2 ? "medium" : "large"; + yield CreateNuclearLang.translateDirect("display_source.reactor.size." + key).withStyle(ChatFormatting.BLUE); + } + }); + } + + @Override protected String getTranslationKey() { return "size"; } + + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineBuilder builder, boolean isFirstLine) { + if (isFirstLine) return; + builder.addSelectionScrollInput(0, 100, (selectionScrollInput, l) -> selectionScrollInput + .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "value", "percent", "gauge")), "display_mode"); + } + + @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummary.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummary.java new file mode 100644 index 000000000..807952083 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummary.java @@ -0,0 +1,106 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import net.minecraft.network.chat.MutableComponent; + +import java.util.ArrayList; +import java.util.List; + +/** + * Typed, immutable snapshot of a reactor controller's summary stats (status, size, + * fuel, cooler, fluid, heat), one named {@link ReactorSummaryRow} per stat. + *

+ * Replaces the previous {@code List>} representation, which + * relied on a size-based sentinel (1 element = no controller, 6 elements = full + * summary) and on fragile positional access (e.g. {@code components.get(2).get(1)} + * for the fuel value) that silently broke if the row order ever changed. + *

+ * Callers should build instances via {@link Builder}, and only call {@link #toRows()} + * at the point where Create's {@code DisplaySource} API actually requires the + * positional list format. + */ +public record ReactorSummary(ReactorSummaryRow status, + ReactorSummaryRow size, + ReactorSummaryRow fuel, + ReactorSummaryRow cooler, + ReactorSummaryRow fluid, + ReactorSummaryRow heat) { + + /** A single display row: a label component and its associated value component. */ + public record ReactorSummaryRow(MutableComponent label, MutableComponent value) { + List toPair() { + return List.of(label(), value()); + } + } + + /** + * Converts this summary to the positional {@code List>} + * format required by Create's {@code DisplaySource} API. This is the single place + * where row order matters; every other consumer should access fields by name + * (e.g. {@link #fuel()}) instead of relying on this order. + */ + public List> toRows() { + return List.of( + status().toPair(), size().toPair(), fuel().toPair(), + cooler().toPair(), fluid().toPair(), heat().toPair() + ); + } + + /** + * Fluent builder for {@link ReactorSummary}. All six rows are required; + * {@link #build()} throws {@link IllegalStateException} naming any missing row + * instead of allowing a partially-populated summary to be constructed silently. + */ + public static class Builder { + private ReactorSummaryRow status; + private ReactorSummaryRow size; + private ReactorSummaryRow fuel; + private ReactorSummaryRow cooler; + private ReactorSummaryRow fluid; + private ReactorSummaryRow heat; + + public Builder status(MutableComponent label, MutableComponent value) { + this.status = new ReactorSummaryRow(label, value); + return this; + } + + public Builder size(MutableComponent label, MutableComponent value) { + this.size = new ReactorSummaryRow(label, value); + return this; + } + + public Builder fuel(MutableComponent label, MutableComponent value) { + this.fuel = new ReactorSummaryRow(label, value); + return this; + } + + public Builder cooler(MutableComponent label, MutableComponent value) { + this.cooler = new ReactorSummaryRow(label, value); + return this; + } + + public Builder fluid(MutableComponent label, MutableComponent value) { + this.fluid = new ReactorSummaryRow(label, value); + return this; + } + + public Builder heat(MutableComponent label, MutableComponent value) { + this.heat = new ReactorSummaryRow(label, value); + return this; + } + + public ReactorSummary build() { + List missing = new ArrayList<>(); + if (status == null) missing.add("status"); + if (size == null) missing.add("size"); + if (fuel == null) missing.add("fuel"); + if (cooler == null) missing.add("cooler"); + if (fluid == null) missing.add("fluid"); + if (heat == null) missing.add("heat"); + + if (!missing.isEmpty()) + throw new IllegalStateException("Missing required ReactorSummary fields: " + String.join(", ", missing)); + + return new ReactorSummary(status, size, fuel, cooler, fluid, heat); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java new file mode 100644 index 000000000..57e2e4a0e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/redstone/displayLink/source/ReactorSummaryDisplaySource.java @@ -0,0 +1,239 @@ +package net.nuclearteam.createnuclear.content.redstone.displayLink.source; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Stream; + +import com.simibubi.create.api.behaviour.display.DisplaySource; +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; +import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; +import com.simibubi.create.content.trains.display.FlapDisplayLayout; +import com.simibubi.create.content.trains.display.FlapDisplaySection; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.entity.LecternBlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; +import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; +import net.nuclearteam.createnuclear.content.multiblock.IHeat; +import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +/** + * Display source rendering a reactor controller's summary (status, size, fuel, + * cooler, fluid, heat) as one line per stat, for both regular displays and + * flap displays. + *

+ * The underlying data is built by {@link #getReactorSummary} into a + * {@link ReactorSummary}, which is only converted to Create's positional + * {@code List>} format at the last moment via + * {@link ReactorSummary#toRows()}, right before returning it to the caller. + */ +public class ReactorSummaryDisplaySource extends DisplaySource { + + /** Fallback line shown when only a single display row is available. */ + public static final List notEnoughSpaceSingle = + List.of(CreateNuclearLang.translateDirect("display_source.reactor.not_enough_space") + .append(CreateNuclearLang.translateDirect("display_source.reactor.for_reactor_status"))); + + /** Fallback lines shown when fewer than 6 rows are available (not enough for the full summary). */ + public static final List notEnoughSpaceDouble = + List.of(CreateNuclearLang.translateDirect("display_source.reactor.not_enough_space"), + CreateNuclearLang.translateDirect("display_source.reactor.for_reactor_status")); + + /** Fallback flap display rows, mirroring {@link #notEnoughSpaceDouble} for the flap layout. */ + public static final List> notEnoughSpaceFlap = + List.of(List.of(CreateNuclearLang.translateDirect("display_source.reactor.not_enough_space")), + List.of(CreateNuclearLang.translateDirect("display_source.reactor.for_reactor_status"))); + + /** + * Provides the text lines for a regular (non-flap) display target. + * Falls back to {@link #notEnoughSpaceSingle}/{@link #notEnoughSpaceDouble} when there + * isn't enough room, and to the "no controller" message when no reactor controller + * could be resolved for this source. + */ + @Override + public List provideText(DisplayLinkContext context, DisplayTargetStats stats) { + if (stats.maxRows() < 2) return notEnoughSpaceSingle; + if (stats.maxRows() < 6) return notEnoughSpaceDouble; + + int gaugeWidth = (stats.maxColumns() >= 80) ? 10 : 6; + + Optional summary = getReactorSummary(context, gaugeWidth); + if (summary.isEmpty()) { + return List.of(CreateNuclearLang.translateDirect("display_source.reactor.no_controller")); + } + + List> components = summary.get().toRows(); + + if (context.getTargetBlockEntity() instanceof LecternBlockEntity) { + Stream componentList = components.stream().map(list -> list.stream().reduce(MutableComponent::append).orElse(EMPTY_LINE)); + return List.of(componentList.reduce((c1, c2) -> c1.append(Component.literal("\n")).append(c2)).orElse(EMPTY_LINE)); + } + + return components.stream().map(list -> list.stream().reduce(MutableComponent::append).orElse(EMPTY_LINE)).toList(); + } + + /** + * Provides the rows for a flap display target. Disables the flap display context + * (falls back to the default layout) when there isn't enough room, either because + * of the row count or because the fuel value wouldn't fit the available columns. + */ + @Override + public List> provideFlapDisplayText(DisplayLinkContext context, DisplayTargetStats stats) { + if (stats.maxRows() < 6) { + context.flapDisplayContext = Boolean.FALSE; + return notEnoughSpaceFlap; + } + + int gaugeWidth = 6; + Optional summary = getReactorSummary(context, gaugeWidth); + + if (summary.isEmpty()) { + return notEnoughSpaceFlap; + } + + ReactorSummary reactorSummary = summary.get(); + + if (stats.maxColumns() * FlapDisplaySection.MONOSPACE < 6 * FlapDisplaySection.MONOSPACE + reactorSummary.fuel() + .value().getString().length() * FlapDisplaySection.WIDE_MONOSPACE) { + context.flapDisplayContext = Boolean.FALSE; + return notEnoughSpaceFlap; + } + + return reactorSummary.toRows(); + } + + /** + * Configures the flap display layout: the default layout for the first line + * (or when the flap display context was disabled by {@link #provideFlapDisplayText}), + * otherwise a two-section "Reactor" layout (label column + value/gauge column). + */ + @Override + public void loadFlapDisplayLayout(DisplayLinkContext context, FlapDisplayBlockEntity flapDisplay, FlapDisplayLayout layout, int lineIndex) { + if (lineIndex == 0 || context.flapDisplayContext instanceof Boolean b && !b) { + if (layout.isLayout("Default")) return; + layout.loadDefault(flapDisplay.getMaxCharCount()); + return; + } + + String layoutKey = "Reactor"; + if (layout.isLayout(layoutKey)) return; + + int lw = labelWidth(); + int labelLength = (int) (lw * FlapDisplaySection.MONOSPACE); + float maxSpace = flapDisplay.getMaxCharCount(1) * FlapDisplaySection.MONOSPACE; + + FlapDisplaySection label = new FlapDisplaySection(labelLength, "alphabet", false, true); + FlapDisplaySection symbols = new FlapDisplaySection(maxSpace - labelLength, "pixel", false, false).wideFlaps(); + + layout.configure(layoutKey, List.of(label, symbols)); + } + + /** + * Resolves the reactor controller for this source and builds a {@link ReactorSummary} + * from its current state. Returns {@link Optional#empty()} when no controller is + * assigned to this display source or it has been removed, so callers can distinguish + * that case from a valid summary without relying on list size/positional access. + */ + private Optional getReactorSummary(DisplayLinkContext context, int gaugeWidth) { + ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); + + if (controller == null || controller.isRemoved()) { + return Optional.empty(); + } + + int mode = context.sourceConfig().getInt("display_mode"); + + int heat = (int) controller.getConfiguredPattern().getOrCreateTag().getDouble("heat"); + int fuel = 0; + int cooler = 0; + + if (controller.getDisplayState() != null && controller.getDisplayState().items() != null) { + for (Map.Entry entry : controller.getDisplayState().items().entrySet()) { + if (TypeRodPredicate.isFuel(entry.getKey().getDefaultInstance(), context.level())) { + fuel += entry.getValue(); + } else if (TypeRodPredicate.isCooled(entry.getKey().getDefaultInstance(), context.level())) { + cooler += entry.getValue(); + } + } + } + + int size = controller.getMultiblockSize(); + List fluidList = controller.getBigFluidStack(); + int fluid = (fluidList != null && !fluidList.isEmpty() && fluidList.get(0) != null) ? fluidList.get(0).amount : 0; + + int lw = labelWidth(); + MutableComponent lStatus = padLabel("status", lw).append(" "); + MutableComponent lSize = padLabel("size", lw).append(" "); + MutableComponent lFuel = padLabel("fuel", lw).append(" "); + MutableComponent lCooler = padLabel("cooler", lw).append(" "); + MutableComponent lFluid = padLabel("fluid", lw).append(" "); + MutableComponent lHeat = padLabel("heat", lw).append(" "); + + return Optional.of(new ReactorSummary.Builder() + .status(lStatus, controller.isAssembled() ? + CreateNuclearLang.translateDirect("display_source.reactor.active").withStyle(ChatFormatting.GOLD) : + CreateNuclearLang.translateDirect("display_source.reactor.idle").withStyle(ChatFormatting.GRAY)) + .size(lSize, formatSize(size)) + .fuel(lFuel, formatValue(fuel, ReactorDisplayConstants.MAX_FUEL, mode, false, ChatFormatting.GREEN, gaugeWidth)) + .cooler(lCooler, formatValue(cooler, ReactorDisplayConstants.MAX_COOLER, mode, false, ChatFormatting.AQUA, gaugeWidth)) + .fluid(lFluid, formatFluid(fluid, ReactorDisplayConstants.MAX_FLUID, mode, ChatFormatting.BLUE, gaugeWidth)) + .heat(lHeat, formatValue(heat, ReactorDisplayConstants.MAX_HEAT, mode, true, IHeat.HeatLevel.of(heat, controller.getMultiblockSize()).getTextColor(), gaugeWidth)) + .build()); + } + + private MutableComponent padLabel(String key, int lw) { + return Component.literal(" ".repeat(lw - labelWidthOf(key))).append(labelOf(key)); + } + + private MutableComponent formatSize(int size) { + String key = size <= 5 ? "small" : size <= 7 ? "medium" : "large"; + return CreateNuclearLang.translateDirect("display_source.reactor.size." + key).withStyle(ChatFormatting.BLUE); + } + + private MutableComponent formatFluid(int current, int max, int mode, ChatFormatting color, int width) { + if (mode == 0 || mode == 3) return ReactorGaugeRenderer.drawGauge(current, max, color, width); + if (mode == 2) return Component.literal((current * 100 / max) + "%").withStyle(color); + return Component.literal(String.valueOf(current)).append(" ").append(CreateNuclearLang.translateDirect("generic.unit.fluid.value")).withStyle(color); + } + + private MutableComponent formatValue(int current, int max, int mode, boolean gaugeOnNormal, ChatFormatting color, int width) { + if (mode == 3 || (mode == 0 && gaugeOnNormal)) return ReactorGaugeRenderer.drawGauge(current, max, color, width); + if (mode == 2) return Component.literal((current * 100 / max) + "%").withStyle(color); + return Component.literal(String.valueOf(current)).withStyle(color); + } + + private int labelWidth() { + return Stream.of("status", "size", "fuel", "cooler", "fluid", "heat").mapToInt(this::labelWidthOf).max().orElse(0); + } + + private int labelWidthOf(String label) { + return labelOf(label).getString().length(); + } + + private MutableComponent labelOf(String label) { + return CreateNuclearLang.translateDirect("display_source.reactor." + label); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineBuilder builder, boolean isFirstLine) { + if (isFirstLine) return; + builder.addSelectionScrollInput(0, 100, (selectionScrollInput, label) -> selectionScrollInput + .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "normal", "value", "percent", "gauge")), "display_mode"); + } + + @Override + protected String getTranslationKey() { + return "reactor_summary"; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java b/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java new file mode 100644 index 000000000..20cd0258e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java @@ -0,0 +1,22 @@ +package net.nuclearteam.createnuclear.content.uraniumOre; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.nuclearteam.createnuclear.api.radiation.IRadiationSource; + +public class UraniumOreItem extends BlockItem implements IRadiationSource { + private final double radiation; + + public UraniumOreItem(Block block, Properties properties, double radiation) { + super(block, properties); + this.radiation = radiation; + } + + @Override + public double getRadiation(ItemStack stack, LivingEntity entity) { + return this.radiation * stack.getCount(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java index 2b8b7c574..3c76031e3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java @@ -4,16 +4,17 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.advancements.critereon.*; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.DyeColor; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.CNFluids; -import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.CNTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.common.Tags; +import net.nuclearteam.createnuclear.*; +import net.nuclearteam.createnuclear.content.decoration.palettes.CNPaletteStoneTypes; import net.nuclearteam.createnuclear.foundation.advancement.CreateNuclearAdvancement.Builder; @@ -27,185 +28,338 @@ import java.util.function.Consumer; import java.util.function.UnaryOperator; - -import static net.nuclearteam.createnuclear.foundation.advancement.CreateNuclearAdvancement.TaskType.SILENT; -import static net.nuclearteam.createnuclear.foundation.advancement.CreateNuclearAdvancement.TaskType.SECRET; +import static net.nuclearteam.createnuclear.foundation.advancement.CreateNuclearAdvancement.TaskType.*; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @SuppressWarnings("unused") public class CNAdvancement implements DataProvider { + public static final EntityEquipmentPredicate FULL_ARMOR = new EntityEquipmentPredicate.Builder() + .head(ItemPredicate.Builder.item().of(CNItems.ANTI_RADIATION_HELMETS).build()) + .chest(ItemPredicate.Builder.item().of(CNItems.ANTI_RADIATION_CHESTPLATES).build()) + .legs(ItemPredicate.Builder.item().of(CNItems.ANTI_RADIATION_LEGGINGS).build()) + .feet(ItemPredicate.Builder.item().of(CNItems.ANTI_RADIATION_BOOTS).build()) + .build(); + + private static final List PREDICATES = List.of( + ItemPredicate.Builder.item().of(CNBlocks.ENRICHED_SOUL_SOIL).build(), + ItemPredicate.Builder.item().of(ItemTags.LOGS).build(), + ItemPredicate.Builder.item().of(Tags.Items.RODS_WOODEN).build() + ); + public static final List ENTRIES = new ArrayList<>(); public static final CreateNuclearAdvancement START = null, ROOT = create("root", b -> b.icon(CNItems.URANIUM_POWDER) - .title("Starting The Nuclear Journey") - .description("Unlock the basics of nuclear energy and get your first uranium powder") - .awardedForFree() - .special(SILENT)), + .title("Starting The Nuclear Journey") + .description("Unlock the basics of nuclear energy and get your first uranium powder") + .awardedForFree() + .special(SILENT) + ), + + CRAFT_ENRICHING_CAMPFIRE = create("craft_enriching_campfire", b -> b.icon(CNBlocks.ENRICHING_CAMPFIRE.asItem()) + .title("Does That Make Smoke?") + .description("Craft an Enriching Campfire") + .externalTrigger(RecipeCraftedTrigger.TriggerInstance.craftedItem(CreateNuclear.asResource("crafting/enriching_campfire"), PREDICATES)) + .after(ROOT) + ), RAW_URANIUM = create("raw_uranium", b -> b.icon(CNItems.RAW_URANIUM) - .title("The Raw Power") - .description("Mine uranium ore to obtain raw uranium for further processing") - .after(ROOT) - .whenIconCollected()), + .title("The Raw Power") + .description("Mine uranium ore to obtain raw uranium for further processing") + .after(ROOT) + .whenIconCollected() + ), URANIUM_POWDER = create("uranium_powder", b -> b.icon(CNItems.URANIUM_POWDER) - .title("Powdered Uranium") - .description("Crush raw uranium into powder to prepare for further refining") - .after(RAW_URANIUM) - .whenIconCollected()), + .title("Powdered Uranium") + .description("Crush raw uranium into powder to prepare for further refining") + .after(RAW_URANIUM) + .whenIconCollected() + ), + + AUTOMATIC_URANIUM = create("automatic_uranium", b -> b.icon(CNItems.URANIUM_POWDER) + .title("Automating Uranium") + .description("Obtain some uranium powder using the automatic uranium processing") + .after(ROOT) + .special(SECRET) + ), URANIUM_LIQUID = create("uranium_liquid", b -> b.icon(CNFluids.URANIUM.getBucket().get()) - .title("Turning Solid To Liquid") - .description("Obtain some uranium liquid by mixing uranium powder") - .after(URANIUM_POWDER) - .whenIconCollected()), + .title("Turning Solid To Liquid") + .description("Obtain some uranium liquid by mixing uranium powder") + .after(URANIUM_POWDER) + .whenIconCollected() + ), YELLOWCAKE = create("yellowcake", b -> b.icon(CNItems.YELLOWCAKE) - .title("The Yellowcake Process") - .description("Compact uranium liquid to create yellowcake") - .after(URANIUM_LIQUID) - .whenIconCollected()), + .title("The Yellowcake Process") + .description("Compact uranium liquid to create yellowcake") + .after(URANIUM_LIQUID) + .whenIconCollected() + ), + + CRUNCHY_URANIUM = create("crunchy_uranium", b -> b.icon(CNItems.YELLOWCAKE) + .title("What Did You Expect") + .description("Bro..... you did what ??") + .after(YELLOWCAKE) + .externalTrigger(ConsumeItemTrigger.TriggerInstance.usedItem(CNItems.YELLOWCAKE)) + .special(SECRET) + ), ENRICHED_YELLOWCAKE = create("enriched_yellowcake", b -> b.icon(CNItems.ENRICHED_YELLOWCAKE) - .title("Enhancing Yellowcake") - .description("Use a fan to enrich yellowcake and make it more powerful") - .after(YELLOWCAKE) - .whenIconCollected()), + .title("Enhancing Yellowcake") + .description("Use a fan to enrich yellowcake and make it more powerful") + .after(YELLOWCAKE) + .whenIconCollected() + ), URANIUM_ROD = create("uranium_rod", b -> b.icon(CNItems.URANIUM_ROD) - .title("The Power Of The Atom") - .description("Create your first uranium rod using enriched yellowcake in a mechanical crafter") - .after(ENRICHED_YELLOWCAKE) - .whenIconCollected()), - + .title("The Power Of The Atom") + .description("Create your first uranium rod using enriched yellowcake in a mechanical crafter") + .after(ENRICHED_YELLOWCAKE) + .whenIconCollected() + ), + + RAW_THORIUM = create("raw_thorium", b -> b.icon(CNItems.RAW_THORIUM) + .title("Thorium's Glow") + .description("Mine thorium ore to obtain raw thorium for further processing") + .after(ROOT) + .whenIconCollected() + ), + + THORIUM_DUST = create("thorium_dust", b -> b.icon(CNItems.THORIUM_DUST) + .title("Powdered Thorium") + .description("Crush raw thorium into dust to prepare for further refining") + .after(RAW_THORIUM) + .whenIconCollected() + ), + + THORIUM_LIQUID = create("thorium_liquid", b -> b.icon(CNFluids.THORIUM.getBucket().get()) + .title("Molten Thorium") + .description("Obtain some thorium liquid by mixing thorium dust") + .after(THORIUM_DUST) + .whenIconCollected() + ), + + THORIUM_INGOT = create("thorium_ingot", b -> b.icon(CNItems.THORIUM_INGOT) + .title("Compacted Thorium") + .description("Compact thorium liquid to create a thorium ingot") + .after(THORIUM_LIQUID) + .whenIconCollected() + ), + + THORIUM_ROD = create("thorium_rod", b -> b.icon(CNItems.THORIUM_ROD) + .title("What A Blue Stick") + .description("Craft a thorium rod for the first time") + .after(THORIUM_INGOT) + .whenIconCollected() + ), + + CHEMISTRY_101 = create("chemistry_101", b -> b.icon(CNItems.NITRATE) + .title("Crushing It") + .description("Mine nitrate ore or crush limestone to obtain nitrate") + .after(ROOT) + .whenIconCollected() + ), + + GETTING_CONCENTRATED = create("getting_concentrated", b -> b.icon(CNItems.NITROGEN_CONCENTRATE) + .title("Getting Concentrated") + .description("Smelt nitrate in a blast furnace to obtain nitrogen concentrate") + .after(CHEMISTRY_101) + .whenIconCollected() + ), + + CHILL_OUT = create("chill_out", b -> b.icon(CNItems.COOLED_NITROGEN_CONCENTRATE) + .title("Chill Out") + .description("Cool down nitrogen concentrate to prepare it for liquefaction") + .after(GETTING_CONCENTRATED) + .whenIconCollected() + ), + + ABSOLUTE_ZERO = create("absolute_zero", b -> b.icon(CNFluids.LIQUID_NITROGEN.getBucket().get()) + .title("Absolute Zero") + .description("Mix cooled nitrogen concentrate to obtain liquid nitrogen") + .after(CHILL_OUT) + .whenIconCollected() + ), + + CRYOGENIC_BAPTISM = create("cryogenic_baptism", b -> b.icon(CNFluids.LIQUID_NITROGEN.getBucket().get()) + .title("I can't Feel My Feet Anymore") + .description("Swim in the liquid nitrogen for the first time") + .after(ABSOLUTE_ZERO) + .special(SECRET) + ), COAL_DUST = create("coal_dust", b -> b.icon(CNItems.COAL_DUST) - .title("Coal Dust") - .description("Crush coal or charcoal to obtain coal dust, a key crafting material") - .after(ROOT) - .whenIconCollected()), + .title("Coal Dust") + .description("Crush coal or charcoal to obtain coal dust, a key crafting material") + .after(ROOT) + .whenIconCollected() + ), STEEL_INGOT = create("steel_ingot", b -> b.icon(CNItems.STEEL_INGOT) - .title("Steel Ingot") - .description("Combine coal dust and iron ingots to create steel ingots") - .after(COAL_DUST) - .whenIconCollected()), + .title("Steel Ingot") + .description("Combine coal dust and iron ingots to create steel ingots") + .after(COAL_DUST) + .whenIconCollected() + ), GRAPHENE = create("graphene", b -> b.icon(CNItems.GRAPHENE) - .title("Graphene") - .description("Press coal dust to create graphene") - .after(COAL_DUST) - .whenIconCollected()), + .title("Graphene") + .description("Press coal dust to create graphene") + .after(COAL_DUST) + .whenIconCollected() + ), GRAPHITE_ROD = create("graphite_rod", b -> b.icon(CNItems.GRAPHITE_ROD) - .title("Don't Forget Those Ones") - .description("Combine graphene and steel ingots in a mechanical crafter to make graphite rods") - .after(GRAPHENE) - .whenIconCollected()), - + .title("Don't Forget Those Ones") + .description("Combine graphene and steel ingots in a mechanical crafter to make graphite rods") + .after(GRAPHENE) + .whenIconCollected() + ), RAW_LEAD = create("raw_lead", b -> b.icon(CNItems.RAW_LEAD) - .title("Raw Lead") - .description("Obtain some raw lead by mining lead ore") - .after(ROOT) - .whenIconCollected()), + .title("Raw Lead") + .description("Obtain some raw lead by mining lead ore") + .after(ROOT) + .whenIconCollected() + ), LEAD_INGOT = create("lead_ingot", b -> b.icon(CNItems.LEAD_INGOT) - .title("Lead ingot") - .description("Smelt a raw lead to obtain a lead ingot") - .after(RAW_LEAD) - .whenIconCollected()), + .title("Lead Ingot") + .description("Smelt a raw lead to obtain a lead ingot") + .after(RAW_LEAD) + .whenIconCollected() + ), REINFORCED_GLASS = create("reinforced_glass", b -> b.icon(CNBlocks.REINFORCED_GLASS) - .title("Reinforced Glass") - .description("Craft some reinforced glass for the first time") - .after(LEAD_INGOT) - .whenIconCollected()), - - ANTI_RADIATION_ARMOR = create("anti_radiation_armor", b -> b.icon(CNItems.ANTI_RADIATION_HELMETS.get(DyeColor.WHITE)) - .title("Anti radiation Armor") - .description("Craft your first anti-radiation armor piece to protect yourself from radiation") - .after(LEAD_INGOT) - .whenItemCollected(CNTags.CNItemTags.ALL_ANTI_RADIATION_ARMORS.tag)), - - FULL_ANTI_RADIATION_ARMOR = create("full_anti_radiation_armor", b -> b.icon(CNItems.ANTI_RADIATION_CHESTPLATES.get(DyeColor.WHITE)) - .title("Fully Protected") - .description("Wear a full set of anti-radiation armor to fully protect yourself from radiation") - .externalTrigger( - InventoryChangeTrigger.TriggerInstance.hasItems( - new ItemPredicate(CNTags.CNItemTags.ANTI_RADIATION_HELMET_FULL_DYE.tag, null, MinMaxBounds.Ints.ANY, MinMaxBounds.Ints.ANY, EnchantmentPredicate.NONE, EnchantmentPredicate.NONE, null, NbtPredicate.ANY), - new ItemPredicate(CNTags.CNItemTags.ANTI_RADIATION_CHESTPLATE_FULL_DYE.tag, null, MinMaxBounds.Ints.ANY, MinMaxBounds.Ints.ANY, EnchantmentPredicate.NONE, EnchantmentPredicate.NONE, null, NbtPredicate.ANY), - new ItemPredicate(CNTags.CNItemTags.ANTI_RADIATION_LEGGINGS_FULL_DYE.tag, null, MinMaxBounds.Ints.ANY, MinMaxBounds.Ints.ANY, EnchantmentPredicate.NONE, EnchantmentPredicate.NONE, null, NbtPredicate.ANY), - new ItemPredicate(CNTags.CNItemTags.ANTI_RADIATION_BOOTS_DYE.tag, null, MinMaxBounds.Ints.ANY, MinMaxBounds.Ints.ANY, EnchantmentPredicate.NONE, EnchantmentPredicate.NONE, null, NbtPredicate.ANY) - )) - .after(ANTI_RADIATION_ARMOR)), - - DYE_ANTI_RADIATION_ARMOR = create("dye_anti_radiation_armor", b -> b.icon(CNItems.ANTI_RADIATION_HELMETS.get(DyeColor.RED)) - .title("Pimp My Armor") - .description("Dye your anti radiation armor to any color") - .whenItemCollected(CNTags.CNItemTags.ANTI_RADIATION_HELMET_DYE.tag) - .whenItemCollected(CNTags.CNItemTags.ANTI_RADIATION_CHESTPLATE_DYE.tag) - .whenItemCollected(CNTags.CNItemTags.ANTI_RADIATION_LEGGINGS_DYE.tag) - .after(ANTI_RADIATION_ARMOR)), - - - AUTOMATIC_URANIUM = create("automatic_uranium", b -> b.icon(CNItems.URANIUM_POWDER) - .title("Automating Uranium") - .description("Obtain some uranium powder using the automatic uranium processing") - .after(ROOT) - .special(SECRET)), + .title("Reinforced Glass") + .description("Craft some reinforced glass for the first time") + .after(LEAD_INGOT) + .whenIconCollected() + ), + + ANTI_RADIATION_ARMOR = create("anti_radiation_armor", b -> b.icon(CNItems.ANTI_RADIATION_HELMETS) + .title("Anti Radiation Armor") + .description("Craft your first anti-radiation armor piece to protect yourself from radiation") + .after(LEAD_INGOT) + .whenItemCollected(CNTags.CNItemTags.ANTI_RADIATION_ARMOR.tag) + ), + + AVOIDING_CANCER = create("avoiding_cancer", b -> b.icon(CNItems.ANTI_RADIATION_HELMETS) + .title("Best Keep Yourself Covered") + .description("Equip anti-radiation armor for the first time") + .after(ANTI_RADIATION_ARMOR) + .externalTrigger( + new PlayerTrigger.TriggerInstance(CriteriaTriggers.INVENTORY_CHANGED.getId(), EntityPredicate.wrap(EntityPredicate.Builder.entity().of(EntityType.PLAYER).equipment(FULL_ARMOR).build())) + ) + ), + + DYE_ANTI_RADIATION_ARMOR = create("dye_anti_radiation_armor", b -> b.icon(CNItems.ANTI_RADIATION_HELMETS) + .title("Pimp My Armor") + .description("Dye your anti radiation armor to any color") + .after(ANTI_RADIATION_ARMOR) + ), REACTOR_CASING = create("reactor_casing", b -> b.icon(CNBlocks.REACTOR_CASING) - .title("The Power Of The Reactor") - .description("Craft a reactor casing to begin building your nuclear reactor") - .after(ROOT) - .whenIconCollected()), + .title("The Power Of The Reactor") + .description("Craft a reactor casing to begin building your nuclear reactor") + .after(ROOT) + .whenIconCollected() + ), + + SILENCE_THE_CORE = create("silence_the_core", b -> b.icon(CNBlocks.REACTOR_ALARM.asItem()) + .title("It Makes So Much Noise !") + .description("sound the alarm for the first time") + .after(REACTOR_CASING) + ), REACTOR_CONTROLLER = create("reactor_controller", b -> b.icon(CNBlocks.REACTOR_CONTROLLER) - .title("Controller Of The Core") - .description("Craft a reactor controller to manage and regulate your reactor") - .after(REACTOR_CASING) - .whenIconCollected()), - + .title("Controller Of The Core") + .description("Craft a reactor controller to manage and regulate your reactor") + .after(REACTOR_CASING) + .whenIconCollected() + ), + + NO_TIME_TO_DIE = create("no_time_to_die", b -> b.icon(CNPaletteStoneTypes.AUTUNITE.baseBlock.get().asItem()) + .title("No Time To Die") + .description("Stop the reactor before the KABOOOM !") + .after(REACTOR_CONTROLLER) + ), + + T1_REACTOR = create("t1", b -> b.icon(CNBlocks.REACTOR_CONTROLLER.asItem()) + .title("Reactor Controller T1") + .description("Build a tier 1 Nuclear Reactor") + .special(EXPERT) + .after(REACTOR_CONTROLLER) + ), + + T2_REACTOR = create("t2", b -> b.icon(CNBlocks.REACTOR_CONTROLLER.asItem()) + .title("Reactor Controller T2") + .description("Build a tier 2 Nuclear Reactor") + .special(EXPERT) + .after(T1_REACTOR) + ), + + T3_REACTOR = create("t3", b -> b.icon(CNBlocks.REACTOR_CONTROLLER.asItem()) + .title("Reactor Controller T3") + .description("Build a tier 3 Nuclear Reactor") + .special(EXPERT) + .after(T2_REACTOR) + ), REACTOR_BLUEPRINT = create("reactor_blueprint", b -> b.icon(CNItems.REACTOR_BLUEPRINT) - .title("Blueprint For Power") - .description("Craft a reactor blueprint to design the layout of rods in your reactor") - .after(REACTOR_CONTROLLER) - .whenIconCollected()), + .title("Blueprint For Power") + .description("Craft a reactor blueprint to design the layout of rods in your reactor") + .after(REACTOR_CONTROLLER) + .whenIconCollected() + ), + + REACTOR_ROD_INPUT = create("feeding_the_reactor", b -> b.icon(CNBlocks.REACTOR_ROD_INPUT) + .title("Feeding The Reactor") + .description("Craft a Reactor Rod Input to feed heating and cooling rods into your reactor") + .after(REACTOR_CASING) + .whenIconCollected() + ), + + REACTOR_FLUID_INPUT = create("fueling_the_reactor", b -> b.icon(CNBlocks.REACTOR_FLUID_INPUT) + .title("Fueling The Reactor") + .description("Craft a Reactor Fluid Input to feed liquid coolant into your reactor") + .after(REACTOR_ROD_INPUT) + .whenIconCollected() + ), + + REACTOR_OUTPUT = create("unlimited_power", b -> b.icon(CNBlocks.REACTOR_OUTPUT) + .title("Unlimited Power") + .description("Craft a Reactor Output to extract the energy produced by your reactor") + .after(REACTOR_FLUID_INPUT) + .whenIconCollected() + ), + + REACTOR_CORE = create("reactor_core", b -> b.icon(CNBlocks.REACTOR_CORE) + .title("Core Of Power") + .description("Craft the reactor core to harness the full energy of your nuclear reactor") + .after(REACTOR_CASING) + .whenIconCollected() + ), REACTOR_COOLER = create("reactor_cooler", b -> b.icon(CNBlocks.REACTOR_COOLER) - .title("Cooling The Reactor") - .description("Craft a reactor cooler to cool your reactor") - .after(REACTOR_CASING) - .whenIconCollected()), + .title("Cooling The Reactor") + .description("Craft a reactor cooler to cool your reactor") + .after(REACTOR_CORE) + .whenIconCollected() + ), REACTOR_FRAME = create("reactor_frame", b -> b.icon(CNBlocks.REACTOR_FRAME) - .title("Reactor Frame") - .description("Craft a reactor frame to build your nuclear reactor") - .after(REACTOR_CASING) - .whenIconCollected()), - - REACTOR_INPUT = create("reactor_input", b -> b.icon(CNBlocks.REACTOR_INPUT) - .title("Fueling The Reactor") - .description("Craft a reactor input to feed uranium and graphite rods into your reactor") - .after(REACTOR_CASING) - .whenIconCollected()), - - REACTOR_OUTPUT = create("reactor_output", b -> b.icon(CNBlocks.REACTOR_OUTPUT) - .title("Power Output") - .description("Craft a reactor output to transfer the energy produced by your reactor") - .after(REACTOR_CASING) - .whenIconCollected()), + .title("Reactor Frame") + .description("Craft a reactor frame to build your nuclear reactor") + .after(REACTOR_COOLER) + .whenIconCollected() + ) - REACTOR_CORE = create("reactor_core", b -> b.icon(CNBlocks.REACTOR_CORE) - .title("Core of Power") - .description("Craft the reactor core to harness the full energy of your nuclear reactor") - .after(REACTOR_CASING) - .whenIconCollected()); + ; private final PackOutput output; @@ -247,4 +401,6 @@ public static void provideLang(BiConsumer consumer) { for (CreateNuclearAdvancement advancement : ENTRIES) advancement.provideLang(consumer); } + + public static void register() {} } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java new file mode 100644 index 000000000..9abf48ef4 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java @@ -0,0 +1,114 @@ +package net.nuclearteam.createnuclear.foundation.advancement; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.util.FakePlayer; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class CNAdvancementBehaviour extends BlockEntityBehaviour { + public static final BehaviourType TYPE = new BehaviourType<>(); + + private UUID playerId; + private final Set advancements; + + public CNAdvancementBehaviour(SmartBlockEntity be, CreateNuclearAdvancement ...advancement) { + super(be); + this.advancements = new HashSet<>(); + add(advancement); + } + + public void add(CreateNuclearAdvancement ...advancement) { + this.advancements.addAll(Arrays.asList(advancement)); + } + + public boolean isOwnerPresent() { + return playerId != null; + } + + public void setPlayer(UUID id) { + Player player = getWorld().getPlayerByUUID(id); + if (player == null) return; + playerId = id; + removeAwarded(); + blockEntity.setChanged(); + } + + @Override + public void initialize() { + super.initialize(); + removeAwarded(); + } + + private void removeAwarded() { + Player player = getPlayer(); + if (player == null) return; + + advancements.removeIf(c -> c.isAlreadyAwardedTo(player)); + if (advancements.isEmpty()) { + playerId = null; + blockEntity.setChanged(); + } + } + + public void awardPlayer(CreateNuclearAdvancement advancement) { + Player player = getPlayer(); + if (player == null) + return; + award(advancement, player); + } + + public static void setPlacedBy(Level worldIn, BlockPos pos, LivingEntity placer) { + CNAdvancementBehaviour behaviour = BlockEntityBehaviour.get(worldIn, pos, TYPE); + if (behaviour == null) + return; + if (placer instanceof FakePlayer) + return; + if (placer instanceof ServerPlayer) + behaviour.setPlayer(placer.getUUID()); + } + + @Override + public void write(CompoundTag nbt, boolean clientPacket) { + super.write(nbt, clientPacket); + if (playerId != null) + nbt.putUUID("Owner", playerId); + } + + @Override + public void read(CompoundTag nbt, boolean clientPacket) { + super.read(nbt, clientPacket); + if (nbt.contains("Owner")) + playerId = nbt.getUUID("Owner"); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + private Player getPlayer() { + if (playerId == null) return null; + return getWorld().getPlayerByUUID(playerId); + } + + private void award(CreateNuclearAdvancement advancement, Player player) { + if (!advancement.isAlreadyAwardedTo(player)) advancement.awardTo(player); + removeAwarded(); + } + + @Override + public String toString() { + return "CNAdvancementBehaviour: [playerId => " + playerId + ", advancement => " + advancements.toArray() + "]"; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNTriggers.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNTriggers.java new file mode 100644 index 000000000..69c952735 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNTriggers.java @@ -0,0 +1,23 @@ +package net.nuclearteam.createnuclear.foundation.advancement; + +import net.minecraft.advancements.CriteriaTriggers; + +import java.util.ArrayList; +import java.util.List; + +public class CNTriggers { + private static final List> triggers = new ArrayList<>(); + + public static SimpleCreateNuclearTrigger addSimple(String id) { + return add(new SimpleCreateNuclearTrigger(id)); + } + + private static > T add(T instance) { + triggers.add(instance); + return instance; + } + + public static void register() { + triggers.forEach(CriteriaTriggers::register); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java index bbab8cd53..83fcc72c8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java @@ -1,7 +1,5 @@ package net.nuclearteam.createnuclear.foundation.advancement; -import com.simibubi.create.foundation.advancement.AllTriggers; -import com.simibubi.create.foundation.advancement.SimpleCreateTrigger; import com.tterrag.registrate.util.entry.ItemProviderEntry; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.CriterionTriggerInstance; @@ -25,12 +23,12 @@ @SuppressWarnings("unused") public class CreateNuclearAdvancement { - static final ResourceLocation BACKGROUND = CreateNuclear.asResource("textures/block/steel_block.png"); + static final ResourceLocation BACKGROUND = CreateNuclear.asResource("textures/gui/advancements/backgrounds/background_advancement.png"); static final String LANG = "advancement." + CreateNuclear.MOD_ID + "."; static final String SECRET_SUFFIX = "\n\u00A77(Hidden Advancement)"; private final Advancement.Builder builder; - private SimpleCreateTrigger builtinTrigger; + private SimpleCreateNuclearTrigger builtinTrigger; private CreateNuclearAdvancement parent; Advancement datagenResult; @@ -48,7 +46,7 @@ public CreateNuclearAdvancement(String id, UnaryOperator b) { b.apply(t); if (!t.externalTrigger) { - builtinTrigger = AllTriggers.addSimple(id + "_builtin"); + builtinTrigger = CNTriggers.addSimple(id + "_builtin"); builder.addCriterion("0", builtinTrigger.instance()); } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CriterionTriggerBase.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CriterionTriggerBase.java new file mode 100644 index 000000000..60b1c56f5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CriterionTriggerBase.java @@ -0,0 +1,84 @@ +package net.nuclearteam.createnuclear.foundation.advancement; + +import com.google.common.collect.Maps; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.advancements.CriterionTrigger; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; +import net.nuclearteam.createnuclear.CreateNuclear; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.*; +import java.util.function.Supplier; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public abstract class CriterionTriggerBase implements CriterionTrigger { + + public CriterionTriggerBase(String id) { + this.id = CreateNuclear.asResource(id); + } + + private final ResourceLocation id; + protected final Map>> listeners = Maps.newHashMap(); + + @Override + public void addPlayerListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { + Set> playerListeners = this.listeners.computeIfAbsent(playerAdvancementsIn, k -> new HashSet<>()); + + playerListeners.add(listener); + } + + @Override + public void removePlayerListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { + Set> playerListeners = this.listeners.get(playerAdvancementsIn); + if (playerListeners != null) { + playerListeners.remove(listener); + if (playerListeners.isEmpty()) { + this.listeners.remove(playerAdvancementsIn); + } + } + } + + @Override + public void removePlayerListeners(PlayerAdvancements playerAdvancementsIn) { + this.listeners.remove(playerAdvancementsIn); + } + + @Override + public ResourceLocation getId() { + return id; + } + + protected void trigger(ServerPlayer player, @Nullable List> suppliers) { + PlayerAdvancements playerAdvancements = player.getAdvancements(); + Set> playerListeners = this.listeners.get(playerAdvancements); + if (playerListeners != null) { + List> list = new LinkedList<>(); + + for (Listener listener : playerListeners) { + if (listener.getTriggerInstance() + .test(suppliers)) { + list.add(listener); + } + } + + list.forEach(listener -> listener.run(playerAdvancements)); + + } + } + + public abstract static class Instance extends AbstractCriterionTriggerInstance { + + public Instance(ResourceLocation idIn, ContextAwarePredicate predicate) { + super(idIn, predicate); + } + + protected abstract boolean test(@Nullable List> suppliers); + } + +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/SimpleCreateNuclearTrigger.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/SimpleCreateNuclearTrigger.java new file mode 100644 index 000000000..90ace6212 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/SimpleCreateNuclearTrigger.java @@ -0,0 +1,41 @@ +package net.nuclearteam.createnuclear.foundation.advancement; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Supplier; + +public class SimpleCreateNuclearTrigger extends CriterionTriggerBase { + public SimpleCreateNuclearTrigger(String id) { + super(id); + } + + @Override + public Instance createInstance(JsonObject pJson, DeserializationContext pContext) { + return new SimpleCreateNuclearTrigger.Instance(getId()); + } + + public void trigger(ServerPlayer player) { + super.trigger(player, null); + } + + public SimpleCreateNuclearTrigger.Instance instance() { + return new SimpleCreateNuclearTrigger.Instance(getId()); + } + + public static class Instance extends CriterionTriggerBase.Instance { + public Instance(ResourceLocation id) { + super(id, ContextAwarePredicate.ANY); + } + + @Override + protected boolean test(@Nullable List> suppliers) { + return true; + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/block/EventTriggerBlock.java b/src/main/java/net/nuclearteam/createnuclear/foundation/block/EventTriggerBlock.java deleted file mode 100644 index 5a724318b..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/block/EventTriggerBlock.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.block; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -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.nuclearteam.createnuclear.CNPackets; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.content.multiblock.controller.EventTriggerPacket; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@SuppressWarnings("deprecation") -public class EventTriggerBlock extends Block { - public EventTriggerBlock(Properties properties) { - super(properties); - } - - @Override - public InteractionResult use(BlockState state, Level level, BlockPos pos, - Player player, InteractionHand hand, BlockHitResult hit) { - if (!level.isClientSide) { - // Send a packet to all clients around this block within 16 blocks - EventTriggerPacket packet = new EventTriggerPacket(100); // display for 100 ticks - CreateNuclear.LOGGER.warn("hum EventTriggerBlock ? {}", packet); - CNPackets.sendToNear(level, pos, 16, packet); - } - return InteractionResult.SUCCESS; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/block/MultiDirectionalReactorBlock.java b/src/main/java/net/nuclearteam/createnuclear/foundation/block/MultiDirectionalReactorBlock.java new file mode 100644 index 000000000..1ea7e18a6 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/block/MultiDirectionalReactorBlock.java @@ -0,0 +1,34 @@ +package net.nuclearteam.createnuclear.foundation.block; + +import com.mojang.math.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraftforge.common.extensions.IForgeBlock; + +@MethodsReturnNonnullByDefault +@SuppressWarnings("deprecation") +public abstract class MultiDirectionalReactorBlock extends Block { + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public MultiDirectionalReactorBlock(Properties properties) { + super(properties); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java new file mode 100644 index 000000000..96b9761a9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CNDamageSources.java @@ -0,0 +1,37 @@ +package net.nuclearteam.createnuclear.foundation.damageTypes; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.nuclearteam.createnuclear.CNDamageTypes; + +import javax.annotation.Nullable; + +public class CNDamageSources { + public static DamageSource radiation(Level level) { + return source(CNDamageTypes.RADIATION, level); + } + public static DamageSource fanRadiation(Level level) { + return source(CNDamageTypes.FAN_RADIATION, level); + } + + private static DamageSource source(ResourceKey key, LevelReader level) { + Registry registry = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE); + return new DamageSource(registry.getHolderOrThrow(key)); + } + + private static DamageSource source(ResourceKey key, LevelReader level, @Nullable Entity entity) { + Registry registry = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE); + return new DamageSource(registry.getHolderOrThrow(key), entity); + } + + private static DamageSource source(ResourceKey key, LevelReader level, @Nullable Entity causingEntity, @Nullable Entity directEntity) { + Registry registry = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE); + return new DamageSource(registry.getHolderOrThrow(key), causingEntity, directEntity); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/CNBuilderTransformers.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/CNBuilderTransformers.java new file mode 100644 index 000000000..d25d6cc50 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/CNBuilderTransformers.java @@ -0,0 +1,97 @@ +package net.nuclearteam.createnuclear.foundation.data; + +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateItemModelProvider; +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.common.ForgeSpawnEggItem; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.biome.BiomeIrradiationExtractorItem; + +import java.util.List; +import java.util.function.Supplier; + +public class CNBuilderTransformers { + + /** + * Generates the item model for a dyeable anti-radiation armor piece. + *

+ * The undyed ("default") piece uses a flat 2D icon ({@code item/generated} with the + * {@code item/armors/default_anti_radiation_} sprite) instead of the 3D Blockbench + * model, since the dropped/inventory 3D rendering was problematic. The worn armor on the + * body is unaffected (handled by {@code AntiRadiationArmorModel}). + *

+ * One model override per {@link DyeColor} is added, driven by the client-side + * {@code createnuclear:cloth_color} item property (see {@code CreateNuclearClient}). Each + * per-color child model still re-textures the 3D Blockbench geometry ({@code item//item}) + * with the matching {@code item/armors/_anti_radiation_suit} sheet. + *

+ * The texture keys differ per slot: the helmet geometry uses {@code layer0}/{@code particle}, + * the other pieces use {@code 14} — hence {@code textureKeys} is passed explicitly. + */ + public static NonNullBiConsumer, RegistrateItemModelProvider> coloredArmorModel(String slot, String... textureKeys) { + return (c, p) -> { + ResourceLocation baseParent = p.modLoc("item/" + c.getName() + "/item"); + ItemModelBuilder outer = p.generated(c, CreateNuclear.asResource("item/armors/default_anti_radiation_" + slot)); + // DyeColor.values() is ordered by id (0..15); overrides must be ascending by predicate + // value so vanilla override resolution selects the exact color (returns last match <= value).cloth + // The cloth_color property is clamped to [0,1] (see CreateNuclearClient), hence the + // (id+1)/16 normalization here must match the value returned there exactly. + for (DyeColor color : DyeColor.values()) { + String colorName = color.getSerializedName(); + ItemModelBuilder child = p.withExistingParent("item/colored/" + colorName + "_anti_radiation_" + slot, baseParent); + for (String key : textureKeys) { + child.texture(key, "item/armors/" + colorName + "_anti_radiation_suit"); + } + outer.override() + .predicate(CreateNuclear.asResource("cloth_color"), (color.getId() + 1) / 16f) + .model(child) + .end(); + } + }; + } + + /** + * Generates the per-tier model overrides for the biome restore cell, driven by the + * client-side {@code createnuclear:charge} item property (see {@code CreateNuclearClient}). + * Overrides must stay ascending by predicate value (vanilla resolves to the last match <= value), + * and the thresholds here must match the ratio returned by {@code biomeRestoreItemProperties}. + */ + public static NonNullBiConsumer, RegistrateItemModelProvider> biomeRestoreModel() { + return (c, p) -> { + ItemModelBuilder outer = p.generated(c, CreateNuclear.asResource("item/biome_irradiation_extractor/empty")); + + record Tier(String name, float threshold) {} + List tiers = List.of( + new Tier("quarter", 0.25f), + new Tier("half", 0.5f), + new Tier("three_quarters", 0.75f), + new Tier("full", 1.0f) + ); + + for (Tier tier : tiers) { + ItemModelBuilder child = p.withExistingParent("item/biome_irradiation_extractor/" + tier.name(), p.mcLoc("item/generated")) + .texture("layer0", CreateNuclear.asResource("item/biome_irradiation_extractor/" + tier.name())); + + outer.override() + .predicate(CreateNuclear.asResource(BiomeIrradiationExtractorItem.TAG), tier.threshold()) + .model(child) + .end(); + } + }; + } + + public static ItemEntry spawnEgg(String name, Supplier> entity, int backgroundColor, int highlightColor, String nameItems) { + return CreateNuclear.REGISTRATE + .item(name, p -> new ForgeSpawnEggItem(entity, backgroundColor, highlightColor, p)) + .lang(nameItems) + .model((c, p) -> p.withExistingParent(c.getName(), new ResourceLocation("item/template_spawn_egg"))) + .register(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCompactingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCompactingRecipeGen.java index a7bdd5a8d..25633869b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCompactingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCompactingRecipeGen.java @@ -3,7 +3,6 @@ import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.api.data.recipe.CompactingRecipeGen; import net.minecraft.data.PackOutput; -import net.nuclearteam.createnuclear.CNFluids; import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CreateNuclear; @@ -13,7 +12,13 @@ public class CNCompactingRecipeGen extends CompactingRecipeGen { YELLOWCAKE = create(CreateNuclear.asResource("uranium_fluid_to_yellowcake"), b -> b .require(CNTags.CNFluidTags.URANIUM.tag, 100) .output(CNItems.YELLOWCAKE, 1) - ); + ), + + THORIUM = create(CreateNuclear.asResource("thorium_fluid_to_thorium_ingot"), b -> b + .require(CNTags.CNFluidTags.THORIUM.tag, 200) + .output(CNItems.THORIUM_INGOT, 1) + ) + ; public CNCompactingRecipeGen(PackOutput output) { diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCrushingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCrushingRecipeGen.java index 89b4eeabc..1f5bdfde6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCrushingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNCrushingRecipeGen.java @@ -1,11 +1,14 @@ package net.nuclearteam.createnuclear.foundation.data.recipe; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.api.data.recipe.CrushingRecipeGen; +import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes; import com.simibubi.create.content.processing.recipe.ProcessingRecipe; import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; +import net.createmod.catnip.lang.Lang; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; @@ -22,17 +25,18 @@ import java.util.function.Supplier; import java.util.function.UnaryOperator; + public class CNCrushingRecipeGen extends CrushingRecipeGen { GeneratedRecipe COAL_DUST = create("coal", b -> b .duration(250) .require(ItemTags.COALS) - .output(.50f, CNItems.COAL_DUST) + .output(0.50f, CNItems.COAL_DUST) ), GRANITE_URANIUM_POWDER = create(() -> Items.GRANITE, b -> b.duration(250) - .output(.5f, CNItems.URANIUM_POWDER) + .output(0.5f, CNItems.URANIUM_POWDER) .output(1f, Blocks.RED_SAND) ), @@ -41,31 +45,49 @@ public class CNCrushingRecipeGen extends CrushingRecipeGen { .output(1, CNItems.URANIUM_POWDER, 9) ), - RAW_URANIUM_BLOCK = create(() -> CNBlocks.RAW_URANIUM_BLOCK, b -> b + RAW_THORIUM_BLOCK = create(() -> CNBlocks.RAW_THORIUM_BLOCK, b -> b .duration(250) - .output(1, CNItems.URANIUM_POWDER,81) + .output(1, CNItems.THORIUM_DUST, 9) + .output(0.75f, AllItems.EXP_NUGGET, 9) + ), + + RAW_THORIUM_ITEM = create(() -> CNItems.RAW_THORIUM, b -> b + .duration(125) + .output(1, CNItems.THORIUM_DUST, 1) + .output(0.75f, AllItems.EXP_NUGGET, 1) ), RAW_ZINC = create(() -> AllItems.RAW_ZINC, b -> b.duration(250) .output(1, AllItems.CRUSHED_ZINC, 1) - .output(.75f, AllItems.EXP_NUGGET, 1) - .output(.25f, CNItems.LEAD_NUGGET,1) + .output(0.75f, AllItems.EXP_NUGGET, 1) + .output(0.25f, CNItems.LEAD_NUGGET,1) ), - RAW_COPPER = create(() -> Items.RAW_COPPER, b -> b.duration(250) .output(1, AllItems.CRUSHED_COPPER, 1) - .output(.75f, AllItems.EXP_NUGGET, 1) - .output(.15f, CNItems.LEAD_NUGGET,1) + .output(0.75f, AllItems.EXP_NUGGET, 1) + .output(0.15f, CNItems.LEAD_NUGGET,1) + ), + + NITRATE = create("nitrate", b -> b + .require(AllPaletteStoneTypes.LIMESTONE.materialTag) + .duration(250) + .output(0.6f, CNItems.NITRATE, 1) + .output(0.4f, CNItems.LEAD_NUGGET, 1) ) ; + protected GeneratedRecipe mineralRecycling(AllPaletteStoneTypes type, + UnaryOperator>> transform) { + create(Lang.asId(type.name()) + "_recycling", b -> transform.apply(b.require(type.materialTag))); + return create(type.getBaseBlock()::get, transform); + } + public CNCrushingRecipeGen(PackOutput generator) { super(generator, CreateNuclear.MOD_ID); } - protected > GeneratedRecipe createFix(String namespace, Supplier singleIngredient, UnaryOperator> transform) { ProcessingRecipeSerializer serializer = getSerializer(); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java new file mode 100644 index 000000000..53d3e8f1d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNDeployingRecipeGen.java @@ -0,0 +1,52 @@ +package net.nuclearteam.createnuclear.foundation.data.recipe; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.data.recipe.DeployingRecipeGen; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class CNDeployingRecipeGen extends DeployingRecipeGen { + + GeneratedRecipe REACTOR_ROD_INPUT = deploying("reactor_rod_input_from_hopper_and_reactor_casing", + Items.HOPPER, + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_ROD_INPUT.get() + ); + + GeneratedRecipe REACTOR_FLUID_INPUT = deploying("reactor_fluid_input_from_fluid_pipe_and_reactor_casing", + AllBlocks.FLUID_PIPE.asItem(), + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_FLUID_INPUT.get() + ); + + GeneratedRecipe REACTOR_OUTPUT = deploying("reactor_output_from_shaft_and_reactor_casing", + AllBlocks.SHAFT.asItem(), + CNBlocks.REACTOR_CASING.get(), + CNBlocks.REACTOR_OUTPUT.get() + ); + + protected GeneratedRecipe deploying(String name, Ingredient ingredient, ItemLike input, ItemLike output) { + return create(CreateNuclear.asResource(name), b -> + b.require(input) + .require(ingredient) + .output(output) + ); + } + + protected GeneratedRecipe deploying(String name, Item ingredient, ItemLike input, ItemLike output) { + return create(CreateNuclear.asResource(name), b -> + b.require(input) + .require(ingredient) + .output(output) + ); + } + + public CNDeployingRecipeGen(PackOutput generator) { + super(generator, CreateNuclear.MOD_ID); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java index b744d577f..5f46e9f00 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNEnrichedRecipeGen.java @@ -8,10 +8,11 @@ import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.api.data.recipe.EnrichedRecipeGen; import java.util.function.Supplier; +import net.nuclearteam.createnuclear.api.data.recipe.EnrichedRecipeGen; + public class CNEnrichedRecipeGen extends EnrichedRecipeGen { GeneratedRecipe diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java index a9172044c..9fb36a0ca 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java @@ -1,6 +1,7 @@ package net.nuclearteam.createnuclear.foundation.data.recipe; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.api.data.recipe.ItemApplicationRecipeGen; import net.minecraft.data.PackOutput; @@ -12,6 +13,7 @@ import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CreateNuclear; + public class CNItemApplicationRecipeGen extends ItemApplicationRecipeGen { GeneratedRecipe REACTOR_CASING = itemApplication("reactor_casing_from_steel_and_brass_casing", @@ -20,17 +22,6 @@ public class CNItemApplicationRecipeGen extends ItemApplicationRecipeGen { CNBlocks.REACTOR_CASING.get() ); - GeneratedRecipe REACTOR_OUTPUT = itemApplication("reactor_output_from_shaft_and_reactor_casing", - AllBlocks.SHAFT.asItem(), - CNBlocks.REACTOR_CASING.get(), - CNBlocks.REACTOR_OUTPUT.get() - ); - - GeneratedRecipe REACTOR_INPUT = itemApplication("reactor_input_from_hopper_and_reactor_casing", - Items.HOPPER, - CNBlocks.REACTOR_CASING.get(), - CNBlocks.REACTOR_INPUT.get() - ); protected GeneratedRecipe itemApplication(String name, Ingredient ingredient, ItemLike input, ItemLike output) { return create(CreateNuclear.asResource(name), b -> diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMechanicalCraftingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMechanicalCraftingRecipeGen.java index b73ba516e..ec898cce8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMechanicalCraftingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMechanicalCraftingRecipeGen.java @@ -2,11 +2,12 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeGen; import net.minecraft.data.PackOutput; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Blocks; + +import com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeGen; import net.nuclearteam.createnuclear.*; public class CNMechanicalCraftingRecipeGen extends MechanicalCraftingRecipeGen { @@ -32,11 +33,21 @@ public class CNMechanicalCraftingRecipeGen extends MechanicalCraftingRecipeGen { .patternLine("U ") ), + THORIUM_ROD = create(CNItems.THORIUM_ROD::get) + .recipe(b -> b + .key('U', Ingredient.of(CNItems.THORIUM_INGOT)) + .patternLine("U ") + .patternLine(" U ") + .patternLine(" U ") + .patternLine(" U ") + .patternLine(" U") + ), + REACTOR_MAIN_FRAME = create(CNBlocks.REACTOR_FRAME::get) .recipe(b -> b .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) .key('G', Ingredient.of(CNBlocks.REINFORCED_GLASS)) - .key('B', Ingredient.of(CNFluids.URANIUM.get().getBucket())) + .key('B', Ingredient.of(Items.BUCKET)) .key('S', Ingredient.of(CNTags.forgeItemTag("ingots/steel"))) .patternLine("CCCCC") .patternLine("CSGSC") @@ -45,46 +56,60 @@ public class CNMechanicalCraftingRecipeGen extends MechanicalCraftingRecipeGen { .patternLine("CCCCC") ), - REACTOR_CONTROLLER = create(CNBlocks.REACTOR_CONTROLLER::get) - .recipe(b -> b - .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) - .key('V', Ingredient.of(AllBlocks.ITEM_VAULT)) - .key('O', Ingredient.of(AllBlocks.SMART_OBSERVER)) - .key('T', Ingredient.of(AllItems.ELECTRON_TUBE)) - .key('N', Ingredient.of(Items.NETHERITE_INGOT)) - .key('X', Ingredient.of(Items.NETHER_STAR)) - .patternLine("CCCCC") - .patternLine("CNONC") - .patternLine("CTXTC") - .patternLine("CNVNC") - .patternLine("CCCCC") - ), + REACTOR_CONTROLLER = create(CNBlocks.REACTOR_CONTROLLER::get) + .recipe(b -> b + .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) + .key('V', Ingredient.of(AllBlocks.ITEM_VAULT)) + .key('O', Ingredient.of(AllBlocks.SMART_OBSERVER)) + .key('T', Ingredient.of(AllItems.ELECTRON_TUBE)) + .key('N', Ingredient.of(Items.NETHERITE_INGOT)) + .key('X', Ingredient.of(Items.NETHER_STAR)) + .patternLine("CCCCC") + .patternLine("CNONC") + .patternLine("CTXTC") + .patternLine("CNVNC") + .patternLine("CCCCC") + ), - REACTOR_COOLING_FRAME= create(CNBlocks.REACTOR_COOLER::get) - .recipe(b -> b - .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) - .key('I', Ingredient.of(Blocks.BLUE_ICE)) - .key('G', Ingredient.of(CNBlocks.REINFORCED_GLASS)) - .key('S', Ingredient.of(CNTags.forgeItemTag("ingots/steel"))) - .patternLine("CCCCC") - .patternLine("CSGSC") - .patternLine("CIGIC") - .patternLine("CSGSC") - .patternLine("CCCCC") - ), + REACTOR_COOLING_FRAME= create(CNBlocks.REACTOR_COOLER::get) + .recipe(b -> b + .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) + .key('I', Ingredient.of(Blocks.BLUE_ICE)) + .key('G', Ingredient.of(CNBlocks.REINFORCED_GLASS)) + .key('S', Ingredient.of(CNTags.forgeItemTag("ingots/steel"))) + .patternLine("CCCCC") + .patternLine("CSGSC") + .patternLine("CIGIC") + .patternLine("CSGSC") + .patternLine("CCCCC") + ), + + REACTOR_CORE = create(CNBlocks.REACTOR_CORE::get) + .recipe(b -> b + .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) + .key('P', Ingredient.of(AllItems.PRECISION_MECHANISM)) + .key('B', Ingredient.of(CNFluids.URANIUM.get().getBucket())) + .key('S', Ingredient.of(CNTags.forgeItemTag("ingots/steel"))) + .patternLine("CCCCC") + .patternLine("CPSPC") + .patternLine("CSBSC") + .patternLine("CPSPC") + .patternLine("CCCCC") + ), + + REACTOR_ALARM = create(CNBlocks.REACTOR_ALARM::get) + .recipe(b -> b + .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) + .key('N', Ingredient.of(Blocks.NOTE_BLOCK)) + .key('R', Ingredient.of(Blocks.REPEATER)) + .key('L', Ingredient.of(Items.CLOCK)) + .patternLine("CCCCC") + .patternLine("CNRNC") + .patternLine("CRLRC") + .patternLine("CNRNC") + .patternLine("CCCCC") + ); - REACTOR_CORE = create(CNBlocks.REACTOR_CORE::get) - .recipe(b -> b - .key('C', Ingredient.of(CNBlocks.REACTOR_CASING)) - .key('P', Ingredient.of(AllItems.PRECISION_MECHANISM)) - .key('B', Ingredient.of(CNFluids.URANIUM.get().getBucket())) - .key('S', Ingredient.of(CNTags.forgeItemTag("ingots/steel"))) - .patternLine("CCCCC") - .patternLine("CPSPC") - .patternLine("CSBSC") - .patternLine("CPSPC") - .patternLine("CCCCC") - ); public CNMechanicalCraftingRecipeGen(PackOutput output) { super(output, CreateNuclear.MOD_ID); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java index 074614fdb..293ddd98a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNMixingRecipeGen.java @@ -1,20 +1,15 @@ package net.nuclearteam.createnuclear.foundation.data.recipe; -import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.api.data.recipe.MixingRecipeGen; -import com.simibubi.create.content.processing.recipe.ProcessingRecipe; -import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; -import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; +import com.simibubi.create.content.processing.recipe.HeatCondition; import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; import net.minecraftforge.common.Tags; import net.nuclearteam.createnuclear.CNFluids; import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CreateNuclear; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; public class CNMixingRecipeGen extends MixingRecipeGen { @@ -28,13 +23,24 @@ public class CNMixingRecipeGen extends MixingRecipeGen { URANIUM_FLUID = create("uranium_fluid", b -> b .require(CNTags.forgeItemTag("dusts/uranium")) .output(CNFluids.URANIUM.get(), 25) - ) - ; + ), + + THORIUM_FLUID = create("thorium_fluid", b -> b + .require(CNTags.forgeItemTag("dusts/thorium")) + .output(CNFluids.THORIUM.get(), 25) + .requiresHeat(HeatCondition.HEATED) + ), + NITROGEN = create("liquid_nitrogen", b -> b + .require(CNItems.COOLED_NITROGEN_CONCENTRATE) + .duration(20) + .require(Items.ICE) + .output(CNFluids.LIQUID_NITROGEN.get(), 100) + ); + ; public CNMixingRecipeGen(PackOutput generator) { super(generator, CreateNuclear.MOD_ID); } - } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNPressingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNPressingRecipeGen.java index b1cf21dff..8c1bd75ca 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNPressingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNPressingRecipeGen.java @@ -11,11 +11,12 @@ public class CNPressingRecipeGen extends PressingRecipeGen { GeneratedRecipe GRAPHENE = create("graphene", b -> b - .require(Ingredient.of(CNTags.forgeItemTag("coal_dusts"))) + .require(Ingredient.of(CNTags.forgeItemTag("dusts/coal"))) .output(CNItems.GRAPHENE) ) ; + public CNPressingRecipeGen(PackOutput generator) { super(generator, CreateNuclear.MOD_ID); } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNProcessingRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNProcessingRecipeGen.java index 4e34b5ffa..aa8ea107c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNProcessingRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNProcessingRecipeGen.java @@ -1,15 +1,29 @@ package net.nuclearteam.createnuclear.foundation.data.recipe; +import com.simibubi.create.Create; +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; +import com.simibubi.create.foundation.data.recipe.CreateRecipeProvider; +import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; +import net.createmod.catnip.platform.CatnipServices; import com.simibubi.create.api.data.recipe.ProcessingRecipeGen; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.nuclearteam.createnuclear.CreateNuclear; import net.minecraft.data.recipes.RecipeProvider; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + public abstract class CNProcessingRecipeGen extends RecipeProvider { @@ -22,8 +36,9 @@ public static void registerAll(DataGenerator gen, PackOutput output) { GENERATORS.add(new CNMixingRecipeGen(output)); GENERATORS.add(new CNPressingRecipeGen(output)); GENERATORS.add(new CNEnrichedRecipeGen(output)); + GENERATORS.add(new CNSnowPowderRecipeGen(output)); GENERATORS.add(new CNWashingRecipeGen(output)); - + GENERATORS.add(new CNDeployingRecipeGen(output)); gen.addProvider(true, new DataProvider() { diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNShapelessRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNShapelessRecipeGen.java deleted file mode 100644 index f239e93a5..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNShapelessRecipeGen.java +++ /dev/null @@ -1,140 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.data.recipe; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.api.data.recipe.BaseRecipeProvider; -import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; -import com.tterrag.registrate.util.entry.ItemProviderEntry; -import net.createmod.catnip.platform.CatnipServices; -import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.data.PackOutput; -import net.minecraft.data.recipes.*; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.ItemLike; -import net.minecraftforge.common.crafting.CraftingHelper; -import net.minecraftforge.common.crafting.conditions.ICondition; -import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; -import net.minecraftforge.common.crafting.conditions.NotCondition; -import net.nuclearteam.createnuclear.CreateNuclear; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -@SuppressWarnings("unused") -public class CNShapelessRecipeGen extends BaseRecipeProvider { - - String currentFolder = ""; - - String enterFolder(String foldedr) { - currentFolder = foldedr; - return currentFolder; - } - - GeneratedRecipeBuilder create(Supplier result) { - return new GeneratedRecipeBuilder(currentFolder, result); - } - - GeneratedRecipeBuilder create(ResourceLocation result) { - return new GeneratedRecipeBuilder(currentFolder, result); - } - - GeneratedRecipeBuilder create(ItemProviderEntry result) { - return create(result::get); - } - - - class GeneratedRecipeBuilder { - - private String path; - private String suffix; - private Supplier result; - private ResourceLocation compatDatagenOutput; - List recipeConditions; - private RecipeCategory category; - - private Supplier unlockedBy; - private int amount; - - private GeneratedRecipeBuilder(String path) { - this.path = path; - this.recipeConditions = new ArrayList<>(); - this.suffix = ""; - this.amount = 1; - this.category = RecipeCategory.MISC; - } - - public GeneratedRecipeBuilder(String path, Supplier result) { - this(path); - this.result = result; - } - - public GeneratedRecipeBuilder(String path, ResourceLocation result) { - this(path); - this.compatDatagenOutput = result; - } - - GeneratedRecipeBuilder returns(int amount) { - this.amount = amount; - return this; - } - - GeneratedRecipeBuilder unlockedBy(Supplier item) { - this.unlockedBy = () -> ItemPredicate.Builder.item() - .of(item.get()) - .build(); - return this; - } - - GeneratedRecipeBuilder unlockedByTag(Supplier> tag) { - this.unlockedBy = () -> ItemPredicate.Builder.item() - .of(tag.get()) - .build(); - return this; - } - - GeneratedRecipeBuilder whenModLoaded(String modid) { - return withCondition(new ModLoadedCondition(modid)); - } - - GeneratedRecipeBuilder whenModMissing(String modid) { - return withCondition(new NotCondition(new ModLoadedCondition(modid))); - } - - GeneratedRecipeBuilder withCondition(ICondition condition) { - recipeConditions.add(condition); - return this; - } - - GeneratedRecipeBuilder withSuffix(String suffix) { - this.suffix = suffix; - return this; - } - - GeneratedRecipeBuilder withCategory(RecipeCategory category) { - this.category = category; - return this; - } - - private ResourceLocation createSimpleLocation(String recipeType) { - return CreateNuclear.asResource(recipeType + "/" + getRegistryName().getPath() + suffix); - } - - private ResourceLocation createLocation(String recipeType) { - return CreateNuclear.asResource(recipeType + "/" + path + "/" + getRegistryName().getPath() + suffix); - } - - private ResourceLocation getRegistryName() { - return compatDatagenOutput == null ? CatnipServices.REGISTRIES.getKeyOrThrow(result.get() - .asItem()) : compatDatagenOutput; - } - } - - public CNShapelessRecipeGen(PackOutput output) { - super(output, CreateNuclear.MOD_ID); - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java new file mode 100644 index 000000000..614f1481a --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNSnowPowderRecipeGen.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.foundation.data.recipe; + +import net.createmod.catnip.platform.CatnipServices; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.nuclearteam.createnuclear.CNFluids; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.data.recipe.SnowPowderRecipeGen; + +import java.util.function.Supplier; + +public class CNSnowPowderRecipeGen extends SnowPowderRecipeGen { + + GeneratedRecipe + COOLED_NITROGEN_CONCENTRATE = convert(CNItems.NITROGEN_CONCENTRATE, CNItems.COOLED_NITROGEN_CONCENTRATE) + ; + + public GeneratedRecipe convert(ItemLike input, ItemLike result) { + return convert(() -> Ingredient.of(input), () -> result); + } + + public GeneratedRecipe convert(Supplier input, Supplier result) { + return create(CreateNuclear.asResource(CatnipServices.REGISTRIES.getKeyOrThrow(result.get() + .asItem()) + .getPath()), + p -> p.withItemIngredients(input.get()) + .output(result.get())); + } + + public CNSnowPowderRecipeGen(PackOutput generator) { + super(generator, CreateNuclear.MOD_ID); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java index f146726f9..488092318 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java @@ -4,17 +4,14 @@ import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.api.data.recipe.BaseRecipeProvider; -import com.simibubi.create.foundation.data.recipe.CreateRecipeProvider; import com.tterrag.registrate.util.entry.ItemProviderEntry; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.*; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; @@ -23,7 +20,6 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.common.crafting.conditions.ICondition; import net.nuclearteam.createnuclear.CNBlocks; @@ -31,7 +27,6 @@ import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem; import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; import java.util.List; @@ -67,19 +62,21 @@ public class CNStandardRecipeGen extends BaseRecipeProvider { ImmutableList.of(() -> CNTags.forgeItemTag("nuggets/lead"), () -> CNTags.forgeItemTag("ingots/lead"), () -> CNTags.forgeItemTag("storage_blocks/lead"))), STEEL_COMPACTING = metalCompacting(ImmutableList.of(CNItems.STEEL_NUGGET, CNItems.STEEL_INGOT, CNBlocks.STEEL_BLOCK), - ImmutableList.of(() -> CNTags.forgeItemTag("nuggets/steel"), () -> CNTags.forgeItemTag("ingots/steel"), () -> CNTags.forgeItemTag("storage_blocks/steel"))) + ImmutableList.of(() -> CNTags.forgeItemTag("nuggets/steel"), () -> CNTags.forgeItemTag("ingots/steel"), () -> CNTags.forgeItemTag("storage_blocks/steel"))), + THORIUM_COMPACTING = metalCompacting(ImmutableList.of(CNItems.THORIUM_NUGGET, CNItems.THORIUM_INGOT, CNBlocks.THORIUM_BLOCK), + ImmutableList.of(() -> CNTags.forgeItemTag("nuggets/thorium"), () -> CNTags.forgeItemTag("ingots/thorium"), () -> CNTags.forgeItemTag("storage_blocks/thorium"))) ; private final String BLAST_FURNACE = enterFolder("blast_furnace"); GeneratedRecipe - URANIUM_ORE_TO_URANIUM_POWDER = blastFurnaceRecipeTags(() -> CNItems.RAW_URANIUM::get, () -> CNItemTags.URANIUM_ORES.tag, "_for_uranium_ore", 4), - RAW_LEAD_ORES = blastFurnaceRecipeTags(() -> CNItems.LEAD_INGOT::get, () -> CNItemTags.LEAD_ORES.tag, "_for_lead_ore", 1), + URANIUM_ORE_TO_URANIUM_POWDER = blastFurnaceRecipeTags(() -> CNItems.RAW_URANIUM::get, () -> CNTags.forgeItemTag("ores/uranium"), "_for_uranium_ore", 4), + RAW_LEAD_ORES = blastFurnaceRecipeTags(() -> CNItems.LEAD_INGOT::get, () -> CNTags.forgeItemTag("ores/lead"), "_for_lead_ore", 1), RAW_LEAD = blastFurnaceRecipeTags(CNItems.LEAD_INGOT::get, () -> CNTags.forgeItemTag("raw_materials/lead"), "_for_raw_lead", 1), - CRUSHED_RAW_LEAD_TO_LEAD_BLAST_FURNACE = blastFurnaceRecipe(CNItems.LEAD_INGOT::get, AllItems.CRUSHED_LEAD::get, "_for_lead", 1) + CRUSHED_RAW_LEAD_TO_LEAD_BLAST_FURNACE = blastFurnaceRecipe(CNItems.LEAD_INGOT::get, AllItems.CRUSHED_LEAD::get, "_for_lead", 1), + NITROGEN_CONCENTRATE = blastFurnaceRecipe(CNItems.NITROGEN_CONCENTRATE::get, CNItems.NITRATE::get, "_for_nitrogen_concentrate", 1) ; - String currentFolder = ""; String enterFolder(String foldedr) { @@ -226,7 +223,6 @@ GeneratedRecipeBuilder withCategory(RecipeCategory category) { return this; } - // FIXME 5.1 refactor - recipe categories as markers instead of sections? GeneratedRecipe viaShaped(UnaryOperator builder) { return register(consumer -> { ShapedRecipeBuilder b = builder.apply(ShapedRecipeBuilder.shaped(category, result.get(), amount)); @@ -351,7 +347,7 @@ private GeneratedRecipe create(RecipeSerializer b.save(result -> { consumer.accept( - isOtherMod ? new ModdedCookingRecipeResult(result, compatDatagenOutput, null ) + isOtherMod ? new ModdedCookingRecipeResult(result, compatDatagenOutput, List.of()) : result); }, createSimpleLocation(CatnipServices.REGISTRIES.getKeyOrThrow(serializer) .getPath())); @@ -390,9 +386,11 @@ public void serializeRecipeData(JsonObject object) { wrapped.serializeRecipeData(object); object.addProperty("result", outputOverride.toString()); - JsonArray conds = new JsonArray(); - conditions.forEach(c -> conds.add(CraftingHelper.serialize(c))); - object.add("conditions", conds); + if (conditions != null && !conditions.isEmpty()) { + JsonArray conds = new JsonArray(); + conditions.forEach(c -> conds.add(CraftingHelper.serialize(c))); + object.add("conditions", conds); + } } } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CNClientEvent.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CNClientEvent.java index f7b29e903..efb512605 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CNClientEvent.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CNClientEvent.java @@ -1,11 +1,14 @@ package net.nuclearteam.createnuclear.foundation.events; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.nuclearteam.createnuclear.CNEntityType; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorModel; import net.nuclearteam.createnuclear.foundation.events.overlay.IrradiatedOverlayRendererVision; @EventBusSubscriber(modid = CreateNuclear.MOD_ID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) @@ -18,5 +21,8 @@ public static void onRegisterGui(RegisterGuiOverlaysEvent event) { event.registerAbove(VanillaGuiOverlay.HELMET.id(), "irradiated_vision", IrradiatedOverlayRendererVision.OVERLAY); } - + @SubscribeEvent + public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + CNEntityType.registerModelLayer(event); + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java new file mode 100644 index 000000000..e9df5892e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java @@ -0,0 +1,104 @@ +package net.nuclearteam.createnuclear.foundation.events; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.nuclearteam.createnuclear.CNClientProxy; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem; +import net.nuclearteam.createnuclear.foundation.mixin.client.CameraAccessor; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +@Mod.EventBusSubscriber(modid = CreateNuclear.MOD_ID, value = Dist.CLIENT) +public class ClientEvents { + + /** + * Ticks down the nuke flash/darken timers, once per client tick. + */ + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + + // Store the previous value for smooth interpolation of the flash + CNClientProxy.prevNukeFlashAmount = CNClientProxy.nukeFlashAmount; + + // Count down the sky-darkening timer + if (CNClientProxy.renderNukeSkyDarkFor > 0) { + CNClientProxy.renderNukeSkyDarkFor--; + } + + // Ramp the white flash up while active, then fade it back out + if (CNClientProxy.renderNukeFlashFor > 0) { + if (CNClientProxy.nukeFlashAmount < 1F) { + CNClientProxy.nukeFlashAmount = Math.min(CNClientProxy.nukeFlashAmount + 0.4F, 1F); + } + CNClientProxy.renderNukeFlashFor--; + } else if (CNClientProxy.nukeFlashAmount > 0F) { + CNClientProxy.nukeFlashAmount = Math.max(CNClientProxy.nukeFlashAmount - 0.05F, 0F); + } + } + } + + /** + * Shakes the player's camera while a nuke explosion is active. + */ + @SubscribeEvent + public static void computeCameraAngles(ViewportEvent.ComputeCameraAngles event) { + Entity player = Minecraft.getInstance().getCameraEntity(); + float partialTick = Minecraft.getInstance().getPartialTick(); + + // Shake at 1.5F while the sky is darkened (nuke active), otherwise no shake + float tremorAmount = CNClientProxy.renderNukeSkyDarkFor > 0 ? 1.5F : 0F; + + if (player != null && CNConfigs.client().screenShaking.get()) { + if (tremorAmount > 0) { + // Generate random offsets for the shake, once per tick + if (CNClientProxy.lastTremorTick != player.tickCount) { + RandomSource rng = player.level().random; + CNClientProxy.randomTremorOffsets[0] = rng.nextFloat(); + CNClientProxy.randomTremorOffsets[1] = rng.nextFloat(); + CNClientProxy.randomTremorOffsets[2] = rng.nextFloat(); + CNClientProxy.lastTremorTick = player.tickCount; + } + + // Scale by Minecraft's screen-effect accessibility setting + double intensity = tremorAmount * Minecraft.getInstance().options.screenEffectScale().get(); + + // Physically offset the camera + ((CameraAccessor) event.getCamera()).callMove( + CNClientProxy.randomTremorOffsets[0] * 0.2F * intensity, + CNClientProxy.randomTremorOffsets[1] * 0.2F * intensity, + CNClientProxy.randomTremorOffsets[2] * 0.5F * intensity + ); + } + } + } + + @SubscribeEvent + public static void onRenderPlayerPre(RenderPlayerEvent.Pre event) { + Player player = event.getEntity(); + PlayerModel model = event.getRenderer().getModel(); + + if (player.getItemBySlot(EquipmentSlot.HEAD).getItem() instanceof AntiRadiationArmorItem) { + model.hat.visible = false; + } + if (player.getItemBySlot(EquipmentSlot.CHEST).getItem() instanceof AntiRadiationArmorItem) { + model.jacket.visible = false; + model.rightSleeve.visible = false; + model.leftSleeve.visible = false; + } + if (player.getItemBySlot(EquipmentSlot.LEGS).getItem() instanceof AntiRadiationArmorItem) { + model.rightPants.visible = false; + model.leftPants.visible = false; + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEventClients.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEventClients.java deleted file mode 100644 index d79c14042..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEventClients.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.events; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; -import net.nuclearteam.createnuclear.CNEntityType; - -@EventBusSubscriber(bus = Bus.MOD, value = Dist.CLIENT) -public class CommentEventClients { - @SubscribeEvent - public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { - CNEntityType.registerModelLayer(event); - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java index 76d0e9794..3bcbe1fb1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java @@ -1,9 +1,15 @@ package net.nuclearteam.createnuclear.foundation.events; +import net.minecraft.world.entity.*; +import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; +import net.minecraftforge.event.entity.EntityAttributeModificationEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.nuclearteam.createnuclear.*; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; @Mod.EventBusSubscriber public class CommentEvents { @@ -11,4 +17,26 @@ public class CommentEvents { public static void onServerTick(ServerTickEvent event) { if (event.phase == Phase.START) return; } + + @SubscribeEvent + public static void attachCapabilities(AttachCapabilitiesEvent event) { + RadiationCapability.attach(event); + } + + @SubscribeEvent + public static void onLivingEntityTick(LivingTickEvent event) { + RadiationCapability.onLivingEntityTick(event); + } + + @Mod.EventBusSubscriber(modid = CreateNuclear.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) + public static class RadiationEvent { + @SubscribeEvent + public static void onEntityAttribute(EntityAttributeModificationEvent event) { + for (EntityType type : event.getTypes()) { + event.add(type, CNAttributes.IRRADIATED_RESISTANCE.get()); + } + } + } + + } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/HudRenderer.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/HudRenderer.java index 2baf9f46c..4d94e48c7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/HudRenderer.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/HudRenderer.java @@ -1,19 +1,15 @@ package net.nuclearteam.createnuclear.foundation.events; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; -import net.nuclearteam.createnuclear.foundation.events.overlay.EventTextOverlay; import net.nuclearteam.createnuclear.foundation.events.overlay.HelmetOverlay; import net.nuclearteam.createnuclear.foundation.events.overlay.HudOverlay; -import net.nuclearteam.createnuclear.foundation.events.overlay.RadiationOverlay; import java.util.Comparator; import java.util.List; public class HudRenderer { private static final List overlays = List.of( - new HelmetOverlay(), - //new RadiationOverlay(), - new EventTextOverlay() + new HelmetOverlay() ); public void onHudRender(RegisterGuiOverlaysEvent event) { diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java new file mode 100644 index 000000000..b2b2c9d9c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.foundation.events; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.foundation.item.RodsStats; + +@Mod.EventBusSubscriber(modid = CreateNuclear.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class RodsTooltipHandler { + @SubscribeEvent + public static void onItemTooltip(ItemTooltipEvent event) { + ItemStack stack = event.getItemStack(); + Item item = stack.getItem(); + Player player = event.getEntity(); + + if (player == null) return; + + ResourceLocation id = ForgeRegistries.ITEMS.getKey(item); + // Mod items already get their rod tooltip via Registrate's setTooltipModifierFactory + // (CreateNuclear.java:48). This handler only serves EXTERNAL items (other mods or + // datapack-defined RodTypes resolved at runtime via RodType.resolveRodType), which + // setTooltipModifierFactory cannot cover. Do NOT remove/invert: doing so double-tooltips mod rods. + if (id != null && CreateNuclear.MOD_ID.equals(id.getNamespace())) return; + + RodsStats rodsStats = RodsStats.create(item); + rodsStats.modify(event); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EasingHudOverlay.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EasingHudOverlay.java deleted file mode 100644 index 217e85928..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EasingHudOverlay.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.events.overlay; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraftforge.client.gui.overlay.ForgeGui; - -/** - * Abstract HUD overlay with a smooth fade-in/out (ease-in-out) effect. - */ -public abstract class EasingHudOverlay implements HudOverlay { - private float progress = 0f; - protected float fadeSpeed = 0.03f; - - @Override - public void render(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { - // Update progress based on the active state - progress = isActive() - ? Math.min(1f, progress + fadeSpeed) - : Math.max(0f, progress - fadeSpeed); - if (progress > 0f) { - renderWithAlpha(graphics, partialTicks, ease(progress)); - } - } - - /** - * Smoothstep interpolation (ease-in-out). - * @param t linear progress [0,1] - * @return eased value - */ - private float ease(float t) { - return t * t * (3f - 2f * t); - } - - /** - * Renders the overlay with a specific alpha. - * Subclasses implement the actual drawing here. - * @param graphics the GUI graphics context - * @param partialTicks frame interpolation value - * @param alpha transparency level [0,1] - */ - protected abstract void renderWithAlpha(GuiGraphics graphics, float partialTicks, float alpha); -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EventTextOverlay.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EventTextOverlay.java deleted file mode 100644 index 035de48c2..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/EventTextOverlay.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.events.overlay; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.gui.overlay.IGuiOverlay; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; -import net.nuclearteam.createnuclear.CreateNuclear; - -/** - * HUD overlay for displaying localized text when a specific event occurs. - */ -public class EventTextOverlay implements HudOverlay { - private static int timer = 0; - - /** - * Called via a network packet to activate the overlay for a specific duration. - * @param displayDuration duration in ticks - */ - public static void triggerEvent(int displayDuration) { - timer = displayDuration; - } - - @Override - public ResourceLocation getAfterOverlay() { - return VanillaGuiOverlay.HELMET.id(); - } - - @Override - public String getOverlayId() { - return "event_text_overlay"; - } - - @Override - public boolean isActive() { - return timer > 0 && false; - } - - @Override - public void render(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { - if (!isActive()) return; - if (timer-- <= 0) return; - CreateNuclear.LOGGER.warn("hum EventTextOverlay: {}", timer); - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) return; - Component text = Component.translatable("overlay.event_message", timer).withStyle(ChatFormatting.RED); - int widths = graphics.guiWidth(); - int x = (widths - Minecraft.getInstance().font.width(text)) / 2; - graphics.drawString(Minecraft.getInstance().font, text, x, 10, 0xFFFFFF); - } - - @Override - public int getPriority() { - return 300; // render on top of other overlays - } - - @Override - public IGuiOverlay getOverlay() { - return this::render; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/HelmetOverlay.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/HelmetOverlay.java index ad2e828ad..0eb8e35f2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/HelmetOverlay.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/HelmetOverlay.java @@ -9,6 +9,7 @@ import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.nuclearteam.createnuclear.CNTags; import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.foundation.utility.RenderHelper; @@ -24,7 +25,6 @@ public class HelmetOverlay implements HudOverlay { CreateNuclear.asResource("textures/misc/helmet_vision/helmet_crack2.png"), CreateNuclear.asResource("textures/misc/helmet_vision/helmet_almost_broken.png") }; - private static final float[] COVERAGE_FACTORS = {.5f, 1f, 1.05f, 1.45f, 1.98f}; private static final int BASE_PRIORITY = 50; @Override @@ -42,7 +42,7 @@ public boolean isActive() { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return false; ItemStack helmet = player.getInventory().getArmor(EquipmentSlot.HEAD.getIndex()); - return !helmet.isEmpty() && helmet.is(CNItemTags.ANTI_RADIATION_HELMET_FULL_DYE.tag); + return !helmet.isEmpty() && helmet.is(CNItemTags.ANTI_RADIATION_ARMOR.tag) && helmet.is(CNTags.forgeItemTag("armors/helmets")); } @Override @@ -63,9 +63,6 @@ public void render(ForgeGui gui, GuiGraphics graphics, float partialTicks, int w : durabilityRatio >= 0.25f ? 3 : 4; - // Update radiation coverage based on helmet condition - RadiationOverlay.setCoverage(COVERAGE_FACTORS[index]); - // Render helmet overlay texture RenderHelper.renderFirstPersonOverlay(graphics, HELMET_TEXTURES[index], 1f, 1f); // Render the hotbar behind the helmet overlay diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/IrradiatedOverlayRendererVision.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/IrradiatedOverlayRendererVision.java index 5354f41a3..095656862 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/IrradiatedOverlayRendererVision.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/IrradiatedOverlayRendererVision.java @@ -20,8 +20,15 @@ public class IrradiatedOverlayRendererVision { public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { Minecraft mc = Minecraft.getInstance(); - if (mc.options.hideGui || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) return; + GameType playerMode = mc.gameMode.getPlayerMode(); + // Skip the irradiated vision overlay in creative/spectator: the effect icon still + // shows in the HUD so the player stays aware, but the screen overlay is not applied. + if (mc.options.hideGui || playerMode == GameType.SPECTATOR || playerMode == GameType.CREATIVE) { + irradiatedVisionAlpha = 0.0f; + return; + } LocalPlayer localPlayer = mc.player; + if (localPlayer == null) return; RenderSystem.enableBlend(); if (localPlayer.hasEffect(CNEffects.RADIATION.get())) { irradiatedVisionAlpha = Math.min(1.0f, irradiatedVisionAlpha + 0.01f); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/RadiationOverlay.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/RadiationOverlay.java deleted file mode 100644 index a9999507e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/overlay/RadiationOverlay.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.events.overlay; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.gui.overlay.IGuiOverlay; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; -import net.nuclearteam.createnuclear.CNEffects; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.foundation.utility.RenderHelper; - -/** - * HUD overlay for radiation effect when the player is irradiated. - */ -public class RadiationOverlay extends EasingHudOverlay { - private static final ResourceLocation RADIATION_TEXTURE = - CreateNuclear.asResource("textures/misc/irradiated_vision/irradiated_vision.png"); - private static float coverage = 1f; - - /** - * Updates the coverage scale for the radiation effect. - * @param newCoverage scale factor (1.0 = normal size) - */ - public static void setCoverage(float newCoverage) { - coverage = newCoverage; - } - - @Override - public ResourceLocation getAfterOverlay() { - return VanillaGuiOverlay.HELMET.id(); - } - - @Override - public String getOverlayId() { - return "radiation_overlay"; - } - - @Override - public boolean isActive() { - LocalPlayer player = Minecraft.getInstance().player; - return player != null && player.hasEffect(CNEffects.RADIATION.get()); - } - - @Override - protected void renderWithAlpha(GuiGraphics graphics, float partialTicks, float alpha) { - // Render radiation overlay with dynamic coverage and alpha - RenderHelper.renderTextureOverlay(graphics, RADIATION_TEXTURE, Math.round(alpha * coverage)); - } - - @Override - public int getPriority() { - return 100; // Fixed background priority for radiation effect - } - - @Override - public IGuiOverlay getOverlay() { - return this::render; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/events/possible code b/src/main/java/net/nuclearteam/createnuclear/foundation/events/possible code deleted file mode 100644 index 87cf86c20..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/possible code +++ /dev/null @@ -1,66 +0,0 @@ -/* - * META-INF/services/com.tonpackage.HudOverlay - * ------------------------------------------- - * Liste des implémentations de HudOverlay à charger via ServiceLoader - */ -com.tonpackage.HelmetOverlay -com.tonpackage.PotionOverlay -com.tonpackage.RadiationOverlay - -// -------------------------------------------------------- -package com.tonpackage; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.ServiceLoader; - -/** - * Chargement dynamique de tous les HudOverlay via Java SPI (ServiceLoader) - */ -public class HudOverlayRegistry { - private static final List ALL = new ArrayList<>(); - - static { - ServiceLoader.load(HudOverlay.class) - .forEach(ALL::add); - } - - /** - * Retourne la liste non modifiable de tous les overlays chargés. - */ - public static List getAll() { - return Collections.unmodifiableList(ALL); - } -} - -// -------------------------------------------------------- -package com.tonpackage; - -import net.minecraftforge.client.event.RenderGuiOverlayEvent; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; - -import java.util.Comparator; - -@Mod.EventBusSubscriber(value = Dist.CLIENT) -public class CNClientEvent { - - @SubscribeEvent - public static void onRenderGuiOverlay(RenderGuiOverlayEvent.Post event) { - // On ne rend qu'après l'overlay "helmet" - if (!event.getOverlay().id().equals(VanillaGuiOverlay.HELMET.id())) return; - - GuiGraphics gfx = event.getGuiGraphics(); - float pt = event.getPartialTick(); - - HudOverlayRegistry.getAll().stream() - .filter(HudOverlay::isActive) - .filter(o -> o.getAfterOverlay().equals(VanillaGuiOverlay.HELMET.id())) - .sorted(Comparator.comparingInt(HudOverlay::getPriority).reversed()) - .forEach(o -> o.render(gfx, pt)); - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/item/DyedItemsList.java b/src/main/java/net/nuclearteam/createnuclear/foundation/item/DyedItemsList.java index b93bd53c7..6a74ad09c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/item/DyedItemsList.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/item/DyedItemsList.java @@ -7,7 +7,15 @@ import java.util.Arrays; import java.util.Iterator; import java.util.NoSuchElementException; +import java.util.function.BiConsumer; import java.util.function.Function; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.nuclearteam.createnuclear.api.data.recipe.SmithingClothRecipeBuilder; +import net.nuclearteam.createnuclear.CNTags.CNItemTags; public class DyedItemsList implements Iterable> { diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java new file mode 100644 index 000000000..e754368a9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java @@ -0,0 +1,67 @@ +package net.nuclearteam.createnuclear.foundation.item; + +import com.simibubi.create.foundation.item.TooltipModifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; + +import java.util.ArrayList; +import java.util.List; + +public record RodsStats(Item item) implements TooltipModifier { + + public static RodsStats create(Item item) { + return new RodsStats(item); + } + + @Override + public void modify(ItemTooltipEvent context) { + List rodTypesStat = getRodTypeStats(item, context.getEntity()); + if (!rodTypesStat.isEmpty()) { + List tooltip = context.getToolTip(); + tooltip.add(CommonComponents.EMPTY); + tooltip.addAll(rodTypesStat); + } + } + + private static List getRodTypeStats(Item item, Player player) { + Level world = player.level(); + List components = new ArrayList<>(); + + RodType rodType = RodType.resolveRodType(item, world); + + if (rodType.isNotEmptyItem()) { + CreateNuclearLang.translate("tooltip.statRod") + .style(ChatFormatting.GRAY) + .addTo(components); + + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.baseRodHeat", rodType.baseRodHeat().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.proximityRodHeat", rodType.proximityRodHeat().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.rodTimer", rodType.rodTimer().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.ratio", rodType.ratio().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.typeRod", rodType.type().name())) + .style(rodType.type().equals(RodType.TypeRod.FUEL) ? ChatFormatting.GREEN : ChatFormatting.AQUA) + .addTo(components); + } + + return components; + + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/BaseFireBlockMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/BaseFireBlockMixin.java index 7a2e800a4..70472b902 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/BaseFireBlockMixin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/BaseFireBlockMixin.java @@ -13,8 +13,9 @@ @Mixin(BaseFireBlock.class) public abstract class BaseFireBlockMixin { - // @Inject(at = @At("HEAD"), method = "getState", cancellable = true) - @Inject(at = @At("HEAD"), method = "m_49245_", cancellable = true) + + @Inject(at = @At("HEAD"), method = "getState", cancellable = true) +// @Inject(at = @At("HEAD"), method = "m_49245_", cancellable = true) private static void CN$getState(BlockGetter reader, BlockPos pos, CallbackInfoReturnable cir) { BlockPos blockPos = pos.below(); BlockState blockState = reader.getBlockState(blockPos); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java new file mode 100644 index 000000000..52aa15a15 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.foundation.mixin; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.SmithingTransformRecipe; +import net.nuclearteam.createnuclear.CNTags; +import net.nuclearteam.createnuclear.foundation.utility.ClothTagHelper; +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.CallbackInfoReturnable; + +@Mixin(SmithingTransformRecipe.class) +public class SmithingTransformRecipeMixin { + + @Shadow + @Final + ItemStack result; + + @Inject(at = @At("HEAD"), method = "assemble", cancellable = true) + public void CN$assemble(Container pContainer, RegistryAccess pRegistryAccess, CallbackInfoReturnable cir) { + if (pContainer.getItem(1).is(CNTags.CNItemTags.ANTI_RADIATION_ARMOR.tag)) { + ItemStack resultItem = this.result.copy(); + ItemStack baseItem = pContainer.getItem(1); + ItemStack additionItem = pContainer.getItem(2); + + ClothTagHelper.initClothTagsForResult(resultItem, baseItem, additionItem); + + cir.setReturnValue(resultItem); + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java new file mode 100644 index 000000000..20f459f9c --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java @@ -0,0 +1,12 @@ +package net.nuclearteam.createnuclear.foundation.mixin.client; + +import net.minecraft.client.Camera; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Camera.class) +public interface CameraAccessor { + // Exposes the private Camera#move so it can be called from outside the class + @Invoker("move") + void callMove(double distanceOffset, double verticalOffset, double horizontalOffset); +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java new file mode 100644 index 000000000..cd8619ab5 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java @@ -0,0 +1,42 @@ +package net.nuclearteam.createnuclear.foundation.mixin.client; + +import net.minecraft.client.renderer.GameRenderer; +import net.nuclearteam.createnuclear.CNClientProxy; +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; + +@Mixin(GameRenderer.class) +public abstract class GameRendererMixin { + + @Shadow + private float darkenWorldAmount; + + // Handles darkening the sky/world during a nuclear explosion + @Inject( + method = {"Lnet/minecraft/client/renderer/GameRenderer;tick()V"}, + remap = true, + at = @At(value = "TAIL") + ) + public void CN$tick(CallbackInfo ci) { + if (CNClientProxy.renderNukeSkyDarkFor > 0 && darkenWorldAmount < 1.0F) { + darkenWorldAmount = Math.min(darkenWorldAmount + 0.3F, 1.0F); + } + } + + // Triggers the white flash render (preScreenRender) + @Inject( + method = {"Lnet/minecraft/client/renderer/GameRenderer;render(FJZ)V"}, + remap = true, + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/platform/Lighting;setupFor3DItems()V", + shift = At.Shift.AFTER + ) + ) + public void CN$render(float partialTick, long nanos, boolean idk, CallbackInfo ci) { + CNClientProxy.preScreenRender(partialTick); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java new file mode 100644 index 000000000..8e53aaf61 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java @@ -0,0 +1,39 @@ +package net.nuclearteam.createnuclear.foundation.mixin.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.nuclearteam.createnuclear.CNEffects; +import net.nuclearteam.createnuclear.CreateNuclear; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +// Gui.class is the target because that's where renderHeart is defined +@Mixin(Gui.class) +public class RadiationHeartMixin { + + private static final ResourceLocation RADIATION_ICONS = CreateNuclear.asResource("textures/gui/icons.png"); + private static final ResourceLocation VANILLA_ICONS = new ResourceLocation("textures/gui/icons.png"); + + @ModifyArg( + method = "renderHeart", // The single-heart method that actually draws each heart icon + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/GuiGraphics;blit(Lnet/minecraft/resources/ResourceLocation;IIIIII)V" + ), + index = 0 + ) + private ResourceLocation CN$changeHeartTexture(ResourceLocation originalTexture) { + if (originalTexture.equals(VANILLA_ICONS)) { + Player player = Minecraft.getInstance().player; + + // Swap to the radiation heart texture while the player has the radiation effect + if (player != null && player.hasEffect(CNEffects.RADIATION.get())) { + return RADIATION_ICONS; + } + } + return originalTexture; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java index 57982a4a3..d3a0f787a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java @@ -7,6 +7,7 @@ import net.minecraft.resources.ResourceLocation; import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.infrastructure.ponder.scenes.CNPonderReactorScenes; public class CNPonderIndex { @@ -14,16 +15,17 @@ public class CNPonderIndex { public static void register(PonderSceneRegistrationHelper helper) { PonderSceneRegistrationHelper> HELPER = helper.withKeyFunction(RegistryEntry::getId); - // Reactor + // Reactor - Storyboards pour chaque taille HELPER.forComponents(CNBlocks.REACTOR_CONTROLLER) - .addStoryBoard("reactor/setup", CNPonderReactor::init) - .addStoryBoard("reactor/setup", CNPonderReactor::enable); - + .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::t1) + .addStoryBoard("reactor/reactor_t2_ponder", CNPonderReactorScenes::t2) + .addStoryBoard("reactor/reactor_t3_ponder", CNPonderReactorScenes::t3) + .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::ioPlacement); HELPER.forComponents(CNItems.REACTOR_BLUEPRINT) - .addStoryBoard("reactor/setup", CNPonderReactor::enable); - - ; - + .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::t1) + .addStoryBoard("reactor/reactor_t2_ponder", CNPonderReactorScenes::t2) + .addStoryBoard("reactor/reactor_t3_ponder", CNPonderReactorScenes::t3) + .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::ioPlacement); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderReactor.java b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderReactor.java deleted file mode 100644 index 4436ba413..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderReactor.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.ponder; - -import net.createmod.catnip.math.Pointing; -import net.createmod.ponder.api.scene.SceneBuilder; -import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; - -public class CNPonderReactor { - - private static final BlockPos CONTROLLER = new BlockPos(4, 4, 6); - private static final BlockPos OUTPUT = new BlockPos(4, 1, 6); - private static final BlockPos INPUT = new BlockPos(4, 4, 2); - public static void init(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("reactor", "Construction of the reactor"); - scene.configureBasePlate(0,0,9); - scene.showBasePlate(); - - - for (int y = 1; y < 8; y++) { - scene.overlay().showText(10) - .text("Floor " + y) - .attachKeyFrame() - .placeNearTarget(); - - for (int x = 1; x < 7; x++) { - for (int z = 1; z < 7; z++) { - scene.world().showSection(util.select().position(x,y,z), Direction.NORTH); - scene.idle(5); - if (x == 5 && z == 5 && y == 1) { - scene.rotateCameraY(180f); - } - if (x == INPUT.getX() && y == INPUT.getY() && z == INPUT.getZ()) { - scene.rotateCameraY(180f); - scene.overlay().showText(90) - .text("Reactor Input: A block that stores uranium and graphite rods to operate the reactor.") - .pointAt(util.vector().blockSurface(INPUT, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(120); - scene.rotateCameraY(180f); - } - if (x == OUTPUT.getX() && y == OUTPUT.getY() && z == OUTPUT.getZ()) { - //AABB bb = new AABB(OUTPUT).inflate(1/16f, 0, 0); - scene.overlay().showText(90) - .text("Reactor Output: This is the block that outputs the energy (SU) generated by the reactor.") - .pointAt(util.vector().blockSurface(OUTPUT, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(120); - } - if (x == CONTROLLER.getX() && y == CONTROLLER.getY() && z == CONTROLLER.getZ()){ - scene.overlay().showText(90) - .text("Reactor Controller: The most important block to operate the reactor; it handles all the calculations needed to generate power.") - .pointAt(util.vector().blockSurface(CONTROLLER, Direction.DOWN)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(120); - } - } - } - - } - } - - public static void enable(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("reactor_blueprint", "Controller Activation"); - scene.configureBasePlate(0,0,9); - scene.world().showSection(util.select().layer(0), Direction.UP); - scene.showBasePlate(); - - scene.rotateCameraY(260f); - for (int y = 1; y < 8; y++) { - for (int x = 1; x < 7; x++) { - for (int z = 1; z < 7; z++) { - scene.world().showSection(util.select().position(x,y,z), Direction.NORTH); - } - } - } - // For more details, refer to the item's tooltip. - scene.idle(30); - scene.overlay() - .showText(90) - .text("Reactor Blueprint: the most important element; it allows the reactor to be configured according to specific models."); - - Vec3 topSide = util.vector().blockSurface(CONTROLLER, Direction.EAST); - - - scene.overlay() - .showControls(topSide, Pointing.UP, 90) - .withItem(CNItems.REACTOR_BLUEPRINT.asStack()) - .rightClick() - ; - - - scene.world().modifyBlock(CONTROLLER, s -> s.setValue(ReactorControllerBlock.ASSEMBLED, true), true); - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CreateNuclearPonderPlugin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CreateNuclearPonderPlugin.java index 3172b1b15..ef097696d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CreateNuclearPonderPlugin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CreateNuclearPonderPlugin.java @@ -5,6 +5,7 @@ import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; import net.minecraft.resources.ResourceLocation; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.infrastructure.ponder.CNCreateNuclearPonderTags; public class CreateNuclearPonderPlugin implements PonderPlugin { @Override diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java new file mode 100644 index 000000000..298d60943 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java @@ -0,0 +1,43 @@ +package net.nuclearteam.createnuclear.foundation.utility; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; + +public final class ClothTagHelper { + public static final String COLOR = "ClothColor"; + public static final String ITEM = "ClothItem"; + private ClothTagHelper() {} + + public static void initClothTagsForResult(ItemStack resultItem, ItemStack baseItem, ItemStack additionItem) { + CompoundTag baseTag = baseItem.getOrCreateTag(); + CompoundTag resultTag = resultItem.getOrCreateTag(); + + if (!resultTag.contains(COLOR)) { + if (baseTag.contains(COLOR)) + resultTag.putString(COLOR, baseTag.getString(COLOR)); + } + if (!resultTag.contains(ITEM)) { + if (baseTag.contains(ITEM)) + resultTag.put(ITEM, baseTag.getCompound(ITEM)); + } + + if (additionItem != null && additionItem.getItem() instanceof ClothItem) { + resultTag.putString(COLOR, ((ClothItem) additionItem.getItem()).getColor().getSerializedName()); + resultTag.put(ITEM, additionItem.serializeNBT()); + } + } + + public static String getClothColor(ItemStack stack, String defaultColor) { + if (stack == null) return defaultColor; + CompoundTag tag = stack.getTag(); + return (tag != null && tag.contains(COLOR)) ? tag.getString(COLOR) : defaultColor; + } + + public static String getArmorTexturePath(ItemStack stack, String armorFileName) { + String cloth = getClothColor(stack, "default"); + String textureFile = cloth + "_" + armorFileName; + return CreateNuclear.asResource("textures/models/armor/" + textureFile).toString(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ConfigValueResolver.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ConfigValueResolver.java new file mode 100644 index 000000000..1af7a8625 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ConfigValueResolver.java @@ -0,0 +1,57 @@ +package net.nuclearteam.createnuclear.foundation.utility; + +import net.nuclearteam.createnuclear.CreateNuclear; + +import java.util.Collection; +import java.util.Set; +import java.util.function.Function; + +/** + * Utility class for resolving and loading configuration values into a target set. + *

+ * This class provides a static method to map a collection of input values to a set of resolved values, + * using a provided resolver function. It handles errors and logs unknown or invalid values. + *

+ */ +public final class ConfigValueResolver { + private ConfigValueResolver() {} + + /** + * Loads and resolves values from a collection into a target set using the provided resolver function. + *

+ * The target set is cleared before loading. For each value in the input collection, the resolver function is applied. + * If the resolved value is not null, it is added to the target set. If the value is unknown or an exception occurs, + * an error is logged. + *

+ * + * Usage example: + *
+     * Set mySet = new HashSet<>();
+     * List configValues = Arrays.asList("A", "B", "C");
+     * ConfigValueResolver.loadValuesInSet(configValues, mySet, MyType::fromString);
+     * 
+ * + * @param values the collection of input values to resolve + * @param targetSet the set to populate with resolved values (will be cleared first) + * @param resolver the function to resolve each input value to the target type + * @param the input value type + * @param the target value type + */ + public static void loadValuesInSet(Collection values, Set targetSet, Function resolver) { + targetSet.clear(); + + for (I valueId : values) { + try { + T value = resolver.apply(valueId); + + if (value != null) { + targetSet.add(value); + } else { + CreateNuclear.LOGGER.error("Unknown value in config: {}", valueId); + } + } catch (Exception e) { + CreateNuclear.LOGGER.error("Unknown value in config: {} - {}", valueId, e.getMessage()); + } + } + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/CreateNuclearLang.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/CreateNuclearLang.java index 9d1d16aec..0bd33e503 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/CreateNuclearLang.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/CreateNuclearLang.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.foundation.utility; -import com.simibubi.create.Create; import net.createmod.catnip.lang.Lang; import net.createmod.catnip.lang.LangBuilder; import net.createmod.catnip.lang.LangNumberFormat; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java new file mode 100644 index 000000000..1863a8e65 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java @@ -0,0 +1,97 @@ +package net.nuclearteam.createnuclear.foundation.utility; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +/** + * Utility class for computing a compact long-valued hash that represents a + * {@link net.minecraft.world.entity.player.Player Player}'s inventory state. + * + *

The hash aggregates contributions from the player's main inventory, offhand + * slots, and armor slots. It is intended for fast change-detection, caching, + * or lightweight synchronization checks where a compact fingerprint is useful. + * This is not a cryptographic checksum and may collide for + * different inventories.

+ * + *

Implementation details: + * - Empty stacks contribute {@code 0}. + * - Each non-empty stack contributes a value computed from the numeric item id, + * stack count, and the NBT tag's {@code hashCode()} when present. Damage value + * is intentionally excluded: no radiation source reads it, so including it would + * only cause needless recomputation on every durability change. + * - Per-stack contributions are combined using a 31-multiplicative rolling scheme + * (similar to {@link String#hashCode()}).

+ * + *

Thread-safety: this class is stateless. Calling code must ensure the + * {@link Player} instance is not concurrently mutated if callers require + * perfectly consistent snapshots.

+ */ +public class InventoryHashUtil { + /** + * Computes a deterministic long value representing the contents of the + * provided player's inventory. + * + *

The method iterates the player's main inventory slots ({@code + * player.getInventory().items}), offhand slots ({@code + * player.getInventory().offhand}) and armor slots ({@code + * player.getArmorSlots()}) and combines each stack's contribution using a + * simple rolling scheme. Equal return values usually indicate identical + * inventory contents, but different inventories can collide.

+ * + * @param player the player whose inventory will be hashed; must not be + * {@code null} + * @return a long value derived from the contents of the player's + * inventory. This value is suitable for quick equality/change + * detection but is not collision-resistant. + * @throws NullPointerException if {@code player} is {@code null} + * @implNote The algorithm uses {@link Item#getId(net.minecraft.world.item.Item)} + * and basic stack properties (count, tag.hashCode()). It is + * intentionally simple and optimized for speed rather than + * cryptographic strength. + */ + public static long compute(Player player) { + long hash = 1; + + for (ItemStack stack : player.getInventory().items) { + hash = 31 * hash + stackHash(stack); + } + + for (ItemStack stack : player.getInventory().offhand) { + hash = 31 * hash + stackHash(stack); + } + + for (ItemStack stack : player.getArmorSlots()) { + hash = 31 * hash + stackHash(stack); + } + + return hash; + } + + /** + * Computes the contribution of a single {@link ItemStack} to the overall + * inventory hash. + * + *

Empty stacks return {@code 0}. For non-empty stacks the returned value + * encodes the numeric item id, the stack count, and, when applicable, the + * NBT tag's {@code hashCode()}.

+ * + * @param stack the item stack to hash; must not be {@code null} + * @return a {@code long} representing the stack's contribution; {@code 0} + * for empty stacks + * @throws NullPointerException if {@code stack} is {@code null} + * @see #compute(Player) + */ + private static long stackHash(ItemStack stack) { + if (stack.isEmpty()) return 0; + + long h = Item.getId(stack.getItem()); + h = 31 * h + stack.getCount(); + + if (stack.hasTag()) { + h = 31 * h + stack.getTag().hashCode(); + } + + return h; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java new file mode 100644 index 000000000..293ba522b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java @@ -0,0 +1,144 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package net.nuclearteam.createnuclear.foundation.utility; + +import com.google.common.collect.Sets; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.QuartPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class Maths { + public static final Direction[] HORIZONTAL_DIRECTIONS; + public static final Direction[] NOT_UP_DIRECTIONS; + public static final float HALF_SQRT_3; + public static final float QUARTER_PI = 0.7853982F; + + public Maths() { + } + + public static float smin(float a, float b, float k) { + float h = Math.max(k - Math.abs(a - b), 0.0F) / k; + return Math.min(a, b) - h * h * k * 0.25F; + } + + public static float sampleNoise2D(int x, int z, float simplexSampleRate) { + return (float) SimplexNoise.noise((double)(((float)x + simplexSampleRate) / simplexSampleRate), (double)(((float)z + simplexSampleRate) / simplexSampleRate)); + } + + public static float sampleNoise3D(int x, int y, int z, float simplexSampleRate) { + return (float) SimplexNoise.noise((double)(((float)x + simplexSampleRate) / simplexSampleRate), (double)(((float)y + simplexSampleRate) / simplexSampleRate), (double)(((float)z + simplexSampleRate) / simplexSampleRate)); + } + + public static float sampleNoise3D(float x, float y, float z, float simplexSampleRate) { + return (float) SimplexNoise.noise((double)((x + simplexSampleRate) / simplexSampleRate), (double)((y + simplexSampleRate) / simplexSampleRate), (double)((z + simplexSampleRate) / simplexSampleRate)); + } + + public static VoxelShape buildShape(VoxelShape... from) { + return (VoxelShape)Stream.of(from).reduce((v1, v2) -> { + return Shapes.join(v1, v2, BooleanOp.OR); + }).get(); + } + + public static float walkValue(float limbSwing, float limbSwingAmount, float speed, float offset, float degree, boolean inverse) { + return (float)(Math.cos((double)(limbSwing * speed + offset)) * (double)degree * (double)limbSwingAmount * (double)(inverse ? -1 : 1)); + } + + public static float approachRotation(float current, float target, float max) { + float f = Mth.wrapDegrees(target - current); + if (f > max) { + f = max; + } + + if (f < -max) { + f = -max; + } + + return Mth.wrapDegrees(current + f); + } + + public static Vec3 getGroundBelowPosition(BlockGetter level, Vec3 in) { + BlockPos pos; + for(pos = BlockPos.containing(in); pos.getY() > level.getMinBuildHeight() && level.getBlockState(pos).getCollisionShape(level, pos).isEmpty(); pos = pos.below()) { + } + + BlockState state = level.getBlockState(pos); + VoxelShape shape = state.getCollisionShape(level, pos); + float top; + if (shape.isEmpty()) { + top = 0.0F; + } else { + Vec3 modIn = new Vec3(in.x % 1.0, 1.0, in.z % 1.0); + Optional closest = shape.closestPointTo(modIn); + top = closest.isPresent() ? (float)((Vec3)closest.get()).y : 0.0F; + } + + return Vec3.upFromBottomCenterOf(pos, (double)top); + } + + public static Vec3 readVec3(FriendlyByteBuf buf) { + return new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); + } + + public static FriendlyByteBuf writeVec3(FriendlyByteBuf buf, Vec3 vec3) { + buf.writeDouble(vec3.x()); + buf.writeDouble(vec3.y()); + buf.writeDouble(vec3.z()); + return buf; + } + + public static float approachDegreesNoWrap(float from, float to, float by) { + float f = (to - from) % 360.0F; + return Mth.approach(from, from + f, by); + } + + public static float canyonStep(float heightScale, int scaleTo) { + int clampTo100 = (int)(heightScale * (float)scaleTo * (float)scaleTo); + return Mth.clamp((float)Math.round((float)clampTo100 / (float)scaleTo) / (float)scaleTo, 0.0F, 1.0F); + } + + public static Set> getBiomesWithinAtY(BiomeSource biomeSource, int x, int y, int z, int xzDist, Climate.Sampler sampler) { + int i = QuartPos.fromBlock(x - xzDist); + int j = QuartPos.fromBlock(y); + int k = QuartPos.fromBlock(z - xzDist); + int l = QuartPos.fromBlock(x + xzDist); + int j1 = QuartPos.fromBlock(z + xzDist); + int k1 = l - i + 1; + int i2 = j1 - k + 1; + Set> set = Sets.newHashSet(); + + for(int j2 = 0; j2 < i2; ++j2) { + for(int k2 = 0; k2 < k1; ++k2) { + int i3 = i + k2; + int k3 = k + j2; + set.add(biomeSource.getNoiseBiome(i3, j, k3, sampler)); + } + } + + return set; + } + + static { + HORIZONTAL_DIRECTIONS = new Direction[]{Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}; + NOT_UP_DIRECTIONS = new Direction[]{Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.DOWN}; + HALF_SQRT_3 = (float)(Math.sqrt(3.0) / 2.0); + } +} + diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/NotifyUtil.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/NotifyUtil.java new file mode 100644 index 000000000..d712be27f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/NotifyUtil.java @@ -0,0 +1,155 @@ +package net.nuclearteam.createnuclear.foundation.utility; + +import net.createmod.catnip.lang.LangBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket; +import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket; +import net.minecraft.network.protocol.game.ClientboundSetTitlesAnimationPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Utility class for sending player notifications server-side. + * Supports Action Bar messages and full-screen title/subtitle overlays, + * with radius-based or server-wide targeting. + */ +public class NotifyUtil { + + /** + * Convenience overload that accepts a {@link LangBuilder} message, + * converting it to a {@link MutableComponent} before sending. + * + * @see #sendActionBar(Level, BlockPos, MutableComponent, ChatFormatting, int, boolean) + */ + public static void sendActionBar(Level level, BlockPos pos, LangBuilder message, ChatFormatting color, int radius, boolean warnAll) { + sendActionBar(level, pos, message.component(), color, radius, warnAll); + } + + /** + * Sends a bold colored message to the Action Bar (above the hotbar) of nearby players. + * No-ops on the client side. + * + * @param level The server-side world used to resolve players + * @param pos Center position used to compute the notification radius + * @param message The component text to display; will be styled bold with {@code color} + * @param color {@link ChatFormatting} color applied to the message + * @param radius Block radius around {@code pos} within which players are notified; + * ignored when {@code warnAll} is {@code true} + * @param warnAll If {@code true}, all online players receive the message regardless of position + */ + public static void sendActionBar(Level level, BlockPos pos, MutableComponent message, ChatFormatting color, int radius, boolean warnAll) { + if (level.isClientSide) return; + + // Build the text component in BOLD with the chosen color + Component actionBarComp = message.withStyle(color, ChatFormatting.BOLD); + + List targets = getTargetPlayers(level, pos, radius, warnAll); + + for (ServerPlayer player : targets) { + // The 'true' parameter routes the message to the Action Bar + player.displayClientMessage(actionBarComp, true); + } + } + + /** + * Convenience overload that accepts {@link LangBuilder} title and subtitle, + * converting them to {@link MutableComponent} before sending. + * + * @see #sendTitle(Level, BlockPos, MutableComponent, MutableComponent, ChatFormatting, int, boolean, int, int, int) + */ + public static void sendTitle(Level level, BlockPos pos, LangBuilder title, LangBuilder subtitle, ChatFormatting color, + int radius, boolean warnAll, int fadeIn, int stay, int fadeOut) { + sendTitle(level, pos, title.component(), subtitle.component(), color, radius, warnAll, fadeIn, stay, fadeOut); + } + + /** + * Sends a full-screen title and subtitle overlay to nearby players. + * The title is rendered bold with {@code color}; the subtitle is always white. + * No-ops on the client side. + * + * @param level The server-side world used to resolve players + * @param pos Center position used to compute the notification radius + * @param title Main title text displayed in large letters + * @param subtitle Subtitle text displayed below the title + * @param color {@link ChatFormatting} color applied to the title + * @param radius Block radius around {@code pos} within which players are notified; + * ignored when {@code warnAll} is {@code true} + * @param warnAll If {@code true}, all online players receive the message regardless of position + * @param fadeIn Ticks for the fade-in animation + * @param stay Ticks the title remains fully visible + * @param fadeOut Ticks for the fade-out animation + */ + public static void sendTitle(Level level, BlockPos pos, MutableComponent title, MutableComponent subtitle, ChatFormatting color, + int radius, boolean warnAll, int fadeIn, int stay, int fadeOut) { + + if (level.isClientSide) return; + + Component titleComp = title.withStyle(color, ChatFormatting.BOLD); + Component subtitleComp = subtitle.withStyle(ChatFormatting.WHITE); + + List targets = getTargetPlayers(level, pos, radius, warnAll); + + for (ServerPlayer serverPlayer : targets) { + serverPlayer.connection.send(new ClientboundSetTitlesAnimationPacket(fadeIn, stay, fadeOut)); + serverPlayer.connection.send(new ClientboundSetSubtitleTextPacket(subtitleComp)); + serverPlayer.connection.send(new ClientboundSetTitleTextPacket(titleComp)); + } + } + + /** + * Convenience overload that accepts {@link LangBuilder} title and subtitle, + * converting them to {@link MutableComponent} before sending. + * + * @see #quickAlert(Level, BlockPos, MutableComponent, MutableComponent, ChatFormatting, int, boolean) + */ + public static void quickAlert(Level level, BlockPos pos, LangBuilder title, LangBuilder sub, ChatFormatting color, int radius, boolean warnAll) { + quickAlert(level, pos, title.component(), sub.component(), color, radius, warnAll); + } + + + /** + * Shortcut for {@link #sendTitle} using default animation timings (fadeIn=10, stay=50, fadeOut=10). + * + * @param level The server-side world used to resolve players + * @param pos Center position used to compute the notification radius + * @param title Main title text + * @param sub Subtitle text + * @param color {@link ChatFormatting} color applied to the title + * @param radius Block radius around {@code pos}; ignored when {@code warnAll} is {@code true} + * @param warnAll If {@code true}, all online players receive the message + */ + public static void quickAlert(Level level, BlockPos pos, MutableComponent title, MutableComponent sub, ChatFormatting color, int radius, boolean warnAll) { + sendTitle(level, pos, title, sub, color, radius, warnAll, 10, 50, 10); + } + + /** + * Resolves the list of players to notify. + * Returns all online players if {@code warnAll} is {@code true}, + * otherwise returns only those within {@code radius} blocks of {@code pos}. + * + * @param level The server-side world + * @param pos Center position for the radius check + * @param radius Block radius for proximity filtering + * @param warnAll If {@code true}, bypasses the radius check + * @return Mutable list of matching {@link ServerPlayer} instances; empty if the server is unavailable + */ + private static List getTargetPlayers(Level level, BlockPos pos, int radius, boolean warnAll) { + if (level.getServer() == null) return List.of(); + + List allPlayers = level.getServer().getPlayerList().getPlayers(); + if (warnAll) return new ArrayList<>(allPlayers); + + AABB area = new AABB(pos).inflate(radius); + return allPlayers.stream() + .filter(p -> area.contains(p.getX(), p.getY(), p.getZ())) + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/SimplexNoise.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/SimplexNoise.java new file mode 100644 index 000000000..6fedaf29b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/SimplexNoise.java @@ -0,0 +1,385 @@ +package net.nuclearteam.createnuclear.foundation.utility; + +public class SimplexNoise { + private static SimplexNoise.Grad[] grad3 = new SimplexNoise.Grad[]{new SimplexNoise.Grad(1.0, 1.0, 0.0), new SimplexNoise.Grad(-1.0, 1.0, 0.0), new SimplexNoise.Grad(1.0, -1.0, 0.0), new SimplexNoise.Grad(-1.0, -1.0, 0.0), new SimplexNoise.Grad(1.0, 0.0, 1.0), new SimplexNoise.Grad(-1.0, 0.0, 1.0), new SimplexNoise.Grad(1.0, 0.0, -1.0), new SimplexNoise.Grad(-1.0, 0.0, -1.0), new SimplexNoise.Grad(0.0, 1.0, 1.0), new SimplexNoise.Grad(0.0, -1.0, 1.0), new SimplexNoise.Grad(0.0, 1.0, -1.0), new SimplexNoise.Grad(0.0, -1.0, -1.0)}; + private static SimplexNoise.Grad[] grad4 = new SimplexNoise.Grad[]{new SimplexNoise.Grad(0.0, 1.0, 1.0, 1.0), new SimplexNoise.Grad(0.0, 1.0, 1.0, -1.0), new SimplexNoise.Grad(0.0, 1.0, -1.0, 1.0), new SimplexNoise.Grad(0.0, 1.0, -1.0, -1.0), new SimplexNoise.Grad(0.0, -1.0, 1.0, 1.0), new SimplexNoise.Grad(0.0, -1.0, 1.0, -1.0), new SimplexNoise.Grad(0.0, -1.0, -1.0, 1.0), new SimplexNoise.Grad(0.0, -1.0, -1.0, -1.0), new SimplexNoise.Grad(1.0, 0.0, 1.0, 1.0), new SimplexNoise.Grad(1.0, 0.0, 1.0, -1.0), new SimplexNoise.Grad(1.0, 0.0, -1.0, 1.0), new SimplexNoise.Grad(1.0, 0.0, -1.0, -1.0), new SimplexNoise.Grad(-1.0, 0.0, 1.0, 1.0), new SimplexNoise.Grad(-1.0, 0.0, 1.0, -1.0), new SimplexNoise.Grad(-1.0, 0.0, -1.0, 1.0), new SimplexNoise.Grad(-1.0, 0.0, -1.0, -1.0), new SimplexNoise.Grad(1.0, 1.0, 0.0, 1.0), new SimplexNoise.Grad(1.0, 1.0, 0.0, -1.0), new SimplexNoise.Grad(1.0, -1.0, 0.0, 1.0), new SimplexNoise.Grad(1.0, -1.0, 0.0, -1.0), new SimplexNoise.Grad(-1.0, 1.0, 0.0, 1.0), new SimplexNoise.Grad(-1.0, 1.0, 0.0, -1.0), new SimplexNoise.Grad(-1.0, -1.0, 0.0, 1.0), new SimplexNoise.Grad(-1.0, -1.0, 0.0, -1.0), new SimplexNoise.Grad(1.0, 1.0, 1.0, 0.0), new SimplexNoise.Grad(1.0, 1.0, -1.0, 0.0), new SimplexNoise.Grad(1.0, -1.0, 1.0, 0.0), new SimplexNoise.Grad(1.0, -1.0, -1.0, 0.0), new SimplexNoise.Grad(-1.0, 1.0, 1.0, 0.0), new SimplexNoise.Grad(-1.0, 1.0, -1.0, 0.0), new SimplexNoise.Grad(-1.0, -1.0, 1.0, 0.0), new SimplexNoise.Grad(-1.0, -1.0, -1.0, 0.0)}; + private static short[] p = new short[]{151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180}; + private static short[] perm = new short[512]; + private static short[] permMod12 = new short[512]; + private static final double F2; + private static final double G2; + private static final double F3 = 0.3333333333333333; + private static final double G3 = 0.16666666666666666; + private static final double F4; + private static final double G4; + + public SimplexNoise() { + } + + private static int fastfloor(double x) { + int xi = (int)x; + return x < (double)xi ? xi - 1 : xi; + } + + private static double dot(SimplexNoise.Grad g, double x, double y) { + return g.x * x + g.y * y; + } + + private static double dot(SimplexNoise.Grad g, double x, double y, double z) { + return g.x * x + g.y * y + g.z * z; + } + + private static double dot(SimplexNoise.Grad g, double x, double y, double z, double w) { + return g.x * x + g.y * y + g.z * z + g.w * w; + } + + public static double noise(double xin, double yin) { + double s = (xin + yin) * F2; + int i = fastfloor(xin + s); + int j = fastfloor(yin + s); + double t = (double)(i + j) * G2; + double X0 = (double)i - t; + double Y0 = (double)j - t; + double x0 = xin - X0; + double y0 = yin - Y0; + byte i1; + byte j1; + if (x0 > y0) { + i1 = 1; + j1 = 0; + } else { + i1 = 0; + j1 = 1; + } + + double x1 = x0 - (double)i1 + G2; + double y1 = y0 - (double)j1 + G2; + double x2 = x0 - 1.0 + 2.0 * G2; + double y2 = y0 - 1.0 + 2.0 * G2; + int ii = i & 255; + int jj = j & 255; + int gi0 = permMod12[ii + perm[jj]]; + int gi1 = permMod12[ii + i1 + perm[jj + j1]]; + int gi2 = permMod12[ii + 1 + perm[jj + 1]]; + double t0 = 0.5 - x0 * x0 - y0 * y0; + double n0; + if (t0 < 0.0) { + n0 = 0.0; + } else { + t0 *= t0; + n0 = t0 * t0 * dot(grad3[gi0], x0, y0); + } + + double t1 = 0.5 - x1 * x1 - y1 * y1; + double n1; + if (t1 < 0.0) { + n1 = 0.0; + } else { + t1 *= t1; + n1 = t1 * t1 * dot(grad3[gi1], x1, y1); + } + + double t2 = 0.5 - x2 * x2 - y2 * y2; + double n2; + if (t2 < 0.0) { + n2 = 0.0; + } else { + t2 *= t2; + n2 = t2 * t2 * dot(grad3[gi2], x2, y2); + } + + return 70.0 * (n0 + n1 + n2); + } + + public static double noise(double xin, double yin, double zin) { + double s = (xin + yin + zin) * 0.3333333333333333; + int i = fastfloor(xin + s); + int j = fastfloor(yin + s); + int k = fastfloor(zin + s); + double t = (double)(i + j + k) * 0.16666666666666666; + double X0 = (double)i - t; + double Y0 = (double)j - t; + double Z0 = (double)k - t; + double x0 = xin - X0; + double y0 = yin - Y0; + double z0 = zin - Z0; + byte i1; + byte j1; + byte k1; + byte i2; + byte j2; + byte k2; + if (x0 >= y0) { + if (y0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } else if (x0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + } else { + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } + } else if (y0 < z0) { + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 0; + j2 = 1; + k2 = 1; + } else if (x0 < z0) { + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 0; + j2 = 1; + k2 = 1; + } else { + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } + + double x1 = x0 - (double)i1 + 0.16666666666666666; + double y1 = y0 - (double)j1 + 0.16666666666666666; + double z1 = z0 - (double)k1 + 0.16666666666666666; + double x2 = x0 - (double)i2 + 0.3333333333333333; + double y2 = y0 - (double)j2 + 0.3333333333333333; + double z2 = z0 - (double)k2 + 0.3333333333333333; + double x3 = x0 - 1.0 + 0.5; + double y3 = y0 - 1.0 + 0.5; + double z3 = z0 - 1.0 + 0.5; + int ii = i & 255; + int jj = j & 255; + int kk = k & 255; + int gi0 = permMod12[ii + perm[jj + perm[kk]]]; + int gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]]; + int gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]]; + int gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]]; + double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0; + double n0; + if (t0 < 0.0) { + n0 = 0.0; + } else { + t0 *= t0; + n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0); + } + + double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; + double n1; + if (t1 < 0.0) { + n1 = 0.0; + } else { + t1 *= t1; + n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1); + } + + double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; + double n2; + if (t2 < 0.0) { + n2 = 0.0; + } else { + t2 *= t2; + n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2); + } + + double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; + double n3; + if (t3 < 0.0) { + n3 = 0.0; + } else { + t3 *= t3; + n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3); + } + + return 32.0 * (n0 + n1 + n2 + n3); + } + + public static double noise(double x, double y, double z, double w) { + double s = (x + y + z + w) * F4; + int i = fastfloor(x + s); + int j = fastfloor(y + s); + int k = fastfloor(z + s); + int l = fastfloor(w + s); + double t = (double)(i + j + k + l) * G4; + double X0 = (double)i - t; + double Y0 = (double)j - t; + double Z0 = (double)k - t; + double W0 = (double)l - t; + double x0 = x - X0; + double y0 = y - Y0; + double z0 = z - Z0; + double w0 = w - W0; + int rankx = 0; + int ranky = 0; + int rankz = 0; + int rankw = 0; + if (x0 > y0) { + ++rankx; + } else { + ++ranky; + } + + if (x0 > z0) { + ++rankx; + } else { + ++rankz; + } + + if (x0 > w0) { + ++rankx; + } else { + ++rankw; + } + + if (y0 > z0) { + ++ranky; + } else { + ++rankz; + } + + if (y0 > w0) { + ++ranky; + } else { + ++rankw; + } + + if (z0 > w0) { + ++rankz; + } else { + ++rankw; + } + + int i1 = rankx >= 3 ? 1 : 0; + int j1 = ranky >= 3 ? 1 : 0; + int k1 = rankz >= 3 ? 1 : 0; + int l1 = rankw >= 3 ? 1 : 0; + int i2 = rankx >= 2 ? 1 : 0; + int j2 = ranky >= 2 ? 1 : 0; + int k2 = rankz >= 2 ? 1 : 0; + int l2 = rankw >= 2 ? 1 : 0; + int i3 = rankx >= 1 ? 1 : 0; + int j3 = ranky >= 1 ? 1 : 0; + int k3 = rankz >= 1 ? 1 : 0; + int l3 = rankw >= 1 ? 1 : 0; + double x1 = x0 - (double)i1 + G4; + double y1 = y0 - (double)j1 + G4; + double z1 = z0 - (double)k1 + G4; + double w1 = w0 - (double)l1 + G4; + double x2 = x0 - (double)i2 + 2.0 * G4; + double y2 = y0 - (double)j2 + 2.0 * G4; + double z2 = z0 - (double)k2 + 2.0 * G4; + double w2 = w0 - (double)l2 + 2.0 * G4; + double x3 = x0 - (double)i3 + 3.0 * G4; + double y3 = y0 - (double)j3 + 3.0 * G4; + double z3 = z0 - (double)k3 + 3.0 * G4; + double w3 = w0 - (double)l3 + 3.0 * G4; + double x4 = x0 - 1.0 + 4.0 * G4; + double y4 = y0 - 1.0 + 4.0 * G4; + double z4 = z0 - 1.0 + 4.0 * G4; + double w4 = w0 - 1.0 + 4.0 * G4; + int ii = i & 255; + int jj = j & 255; + int kk = k & 255; + int ll = l & 255; + int gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32; + int gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32; + int gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32; + int gi3 = perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32; + int gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; + double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; + double n0; + if (t0 < 0.0) { + n0 = 0.0; + } else { + t0 *= t0; + n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0); + } + + double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; + double n1; + if (t1 < 0.0) { + n1 = 0.0; + } else { + t1 *= t1; + n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1); + } + + double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; + double n2; + if (t2 < 0.0) { + n2 = 0.0; + } else { + t2 *= t2; + n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2); + } + + double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; + double n3; + if (t3 < 0.0) { + n3 = 0.0; + } else { + t3 *= t3; + n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3); + } + + double t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; + double n4; + if (t4 < 0.0) { + n4 = 0.0; + } else { + t4 *= t4; + n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4); + } + + return 27.0 * (n0 + n1 + n2 + n3 + n4); + } + + static { + for(int i = 0; i < 512; ++i) { + perm[i] = p[i & 255]; + permMod12[i] = (short)(perm[i] % 12); + } + + F2 = 0.5 * (Math.sqrt(3.0) - 1.0); + G2 = (3.0 - Math.sqrt(3.0)) / 6.0; + F4 = (Math.sqrt(5.0) - 1.0) / 4.0; + G4 = (5.0 - Math.sqrt(5.0)) / 20.0; + } + + private static class Grad { + double x; + double y; + double z; + double w; + + Grad(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + Grad(double x, double y, double z, double w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + } +} + diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/TextUtils.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/TextUtils.java index 6cecb7a45..e6a9aa20f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/TextUtils.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/TextUtils.java @@ -1,15 +1,6 @@ package net.nuclearteam.createnuclear.foundation.utility; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; import org.apache.commons.lang3.StringUtils; -import org.joml.Matrix4f; -import java.util.Optional; import java.util.stream.Stream; public class TextUtils { @@ -41,80 +32,4 @@ public static String titleCaseConversion(String inputString) return StringUtils.trim(resultPlaceHolder.toString()); } - - public static void renderMultilineDebugText(PoseStack poseStack, MultiBufferSource buffer, int packedLight, - double baseY, boolean transparent, String... lines) { - double y = baseY + (lines.length/4.0D); - for (String line : lines) { - renderDebugText(poseStack, buffer, packedLight, y, transparent, line); - y -= 0.25D; - } - } - - public static void renderDebugText(PoseStack poseStack, MultiBufferSource pBuffer, int pPackedLight, - double y, boolean transparent, String text) { - poseStack.pushPose(); - poseStack.translate(0.0D, y, 0.0D); - poseStack.mulPose(Minecraft.getInstance().getBlockEntityRenderDispatcher().camera.rotation()); - poseStack.scale(-0.025F, -0.025F, 0.025F); - - Matrix4f matrix4f = poseStack.last().pose(); - - float f1 = Minecraft.getInstance().options.getBackgroundOpacity(0.25F); - int j = (int)(f1 * 255.0F) << 24; - Font font = Minecraft.getInstance().font; - - float f2 = (float)(-font.width(text) / 2); - font.drawInBatch(text, f2, 0, 553648127, false, matrix4f, pBuffer, transparent ? Font.DisplayMode.SEE_THROUGH : Font.DisplayMode.NORMAL, j, pPackedLight); - - if (transparent) { - font.drawInBatch(text, f2, 0, -1, false, matrix4f, pBuffer, Font.DisplayMode.NORMAL, 0, pPackedLight); - } - - poseStack.popPose(); - } - - public static Component translateWithFormatting(String key, Object... args) { - - MutableComponent base = Component.translatable(key, args); - - StringBuilder partsStringBuilder = new StringBuilder(); - - base.visit((style, part) -> { - partsStringBuilder.append(part); - return Optional.empty(); - }, Style.EMPTY); - - return Component.literal(partsStringBuilder.toString()); - } - - public static String formatInt(int num) { - return formatInt(num, ","); - } - - public static String formatInt(int num, String separator) { - - String raw = String.valueOf(num); - - if (raw.length() <= 3) - return raw; - - int start = raw.length() % 3; - StringBuilder out = new StringBuilder(raw.length() + (raw.length()/3) * separator.length()); - - out.append(raw, 0, start); - - for (int i = 0; i < raw.length() / 3; i++) { - if (i != 0 || start != 0) - out.append(separator); - out.append(raw, i*3 + start, i*3 + start + 3); - } - - return out.toString(); - } - - public static String leftPad(String s, char c, int width) { - if (s.length() >= width) return s; - return String.valueOf(c).repeat(width - s.length()) + s; - } -} \ No newline at end of file +} diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java new file mode 100644 index 000000000..f94588987 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -0,0 +1,233 @@ +package net.nuclearteam.createnuclear.gametest; + +import net.minecraft.core.BlockPos; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.PrefixGameTestTemplate; +import net.minecraftforge.items.ItemStackHandler; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerInventory; +import net.nuclearteam.createnuclear.content.multiblock.controller.display.ReactorDisplayState; +import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.DefaultHeatCalculator; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +import java.util.List; +import java.util.Map; + +/** + * GameTest coverage for {@link DefaultHeatCalculator#computeHeat}, run against a real + * {@code ServerLevel}, a real {@link ReactorControllerBlockEntity} and real registered + * rod items (no mocks) — plain JUnit cannot exercise this method at all: {@code Item}, + * {@code ItemStack} and {@code RodType} resolution all depend on Minecraft/Forge registries + * that only exist once the game has bootstrapped (see AUDIT_ACTUEL.md §3). + *

+ * All tests share the "empty_platform" structure and place a single + * {@code CNBlocks.REACTOR_CONTROLLER} to obtain a real {@link ReactorControllerInventory}. + * The reactor "pattern" (57-slot {@link ItemStackHandler}, slots per + * {@code DefaultHeatCalculator.formattedPattern}) is written directly into the blueprint + * item's {@code pattern} NBT tag and set into inventory slot 0, exactly as + * {@code ReactorBluePrintItem.getItemStorage} reads it back. + *

+ * Expected heat values are computed from the live {@code CNConfigs.server().rods} values + * rather than hardcoded, so these tests stay correct if the mod's default balance changes. + */ +@GameTestHolder(CreateNuclear.MOD_ID) +@PrefixGameTestTemplate(false) +public class DefaultHeatCalculatorGameTest { + + private static final String STRUCTURE = "empty_platform"; + private static final double DELTA = 1e-9; + + // ---------- test fixtures ---------- + + private static ReactorControllerInventory placeController(GameTestHelper helper, BlockPos rel) { + helper.setBlock(rel, CNBlocks.REACTOR_CONTROLLER.get().defaultBlockState()); + ReactorControllerBlockEntity be = (ReactorControllerBlockEntity) helper.getBlockEntity(rel); + return be.getInventoryObject(); + } + + /** Writes {@code rodsBySlot} into the blueprint item's "pattern" NBT and loads it into slot 0. */ + private static void loadPattern(ReactorControllerInventory inventory, Map rodsBySlot) { + ItemStackHandler patternHandler = new ItemStackHandler(57); + rodsBySlot.forEach((slot, item) -> patternHandler.setStackInSlot(slot, new ItemStack(item))); + + ItemStack blueprint = new ItemStack(CNItems.REACTOR_BLUEPRINT.get()); + blueprint.getOrCreateTag().put("pattern", patternHandler.serializeNBT()); + inventory.setStackInSlot(0, blueprint); + } + + private static final DefaultHeatCalculator CALCULATOR = new DefaultHeatCalculator(); + + // ================================================================ + // 1. single fuel rod, no neighbors + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void singleFuelRod_noNeighbors_addsOnlyItsOwnBaseRodHeat(GameTestHelper helper) { + Item thorium = CNItems.THORIUM_ROD.get(); + int baseRodHeat = CNConfigs.server().rods.baseValueThorium.get(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + // slot 18: middle row, no adjacent slot populated -> no neighbor bonus possible + loadPattern(inventory, Map.of(18, thorium)); + + ReactorDisplayState displayState = new ReactorDisplayState(Map.of(thorium, 1), List.of(), 0); + double overHeat = 10.0; + + double heat = CALCULATOR.computeHeat(null, null, inventory, overHeat, displayState, helper.getLevel()); + + helper.assertTrue(Math.abs(heat - (baseRodHeat + overHeat)) < DELTA, + "an isolated fuel rod should only contribute its own baseRodHeat, plus overHeat: expected " + + (baseRodHeat + overHeat) + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 2. single cooler rod, no neighbors + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void singleCoolerRod_noNeighbors_addsOnlyItsOwnBaseRodHeat(GameTestHelper helper) { + Item graphite = CNItems.GRAPHITE_ROD.get(); + int baseRodHeat = CNConfigs.server().rods.graphiteBaseValue.get(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.of(18, graphite)); + + ReactorDisplayState displayState = new ReactorDisplayState(Map.of(graphite, 1), List.of(), 0); + + // computeHeat clamps its result to a minimum of 0 (Math.max(0, heat+overHeat)); an isolated + // cooler's own baseRodHeat is negative by default, so a large overHeat is added here to keep + // the total positive and actually observe baseRodHeat's contribution instead of it being + // swallowed by the floor. + double overHeat = 50.0; + + double heat = CALCULATOR.computeHeat(null, null, inventory, overHeat, displayState, helper.getLevel()); + + helper.assertTrue(Math.abs(heat - (baseRodHeat + overHeat)) < DELTA, + "a cooler contributes its own baseRodHeat exactly like a fuel rod would, when isolated: expected " + + (baseRodHeat + overHeat) + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 3. fuel/cooler mix adjacency: cooler scans its own fuel neighbors symmetrically + // to a fuel rod (AUDIT_ACTUEL.md §2.2, fixed 2026-07-26 to match the wiki + // calculator / external spec: "Graphite extra: -1/4Q of the heating rod") + // ================================================================ + + /** + * Layout (row 3 of {@code formattedPattern}, three consecutive slots): + * uranium A (18) - thorium B (19) - graphite C (20). + *

+ * Expected total = sum of each rod's own baseRodHeat, PLUS proximity contributions from + * both fuel-fuel and cooler-fuel adjacency (cooler-cooler and fuel-cooler-from-the-fuel-side + * contribute nothing): + *

    + *
  • A's scan (fuel, neighbor B is fuel) -> + A.proximityRodHeat()
  • + *
  • B's scan (fuel, neighbor A is fuel) -> + B.proximityRodHeat()
  • + *
  • B's scan (fuel, neighbor C is cooler) -> contributes nothing (fuel only scores against fuel neighbors)
  • + *
  • C's scan (cooler, neighbor B is fuel) -> + B.baseRodHeat() * C.proximityRodHeat()
  • + *
+ */ + @GameTest(template = STRUCTURE) + public static void fuelCoolerMix_coolerScansItsOwnFuelNeighborsSymmetrically(GameTestHelper helper) { + Item uranium = CNItems.URANIUM_ROD.get(); + Item thorium = CNItems.THORIUM_ROD.get(); + Item graphite = CNItems.GRAPHITE_ROD.get(); + + int uraniumBase = CNConfigs.server().rods.uraniumBaseValue.get(); + float uraniumProxy = CNConfigs.server().rods.uraniumProximityBonus.get(); + int thoriumBase = CNConfigs.server().rods.baseValueThorium.get(); + float thoriumProxy = CNConfigs.server().rods.thoriumProxyBonus.get(); + int graphiteBase = CNConfigs.server().rods.graphiteBaseValue.get(); + float graphiteProxy = CNConfigs.server().rods.graphiteProximityMalus.getF(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.of(18, uranium, 19, thorium, 20, graphite)); + + ReactorDisplayState displayState = new ReactorDisplayState( + Map.of(uranium, 1, thorium, 1, graphite, 1), List.of(), 0); + + double heat = CALCULATOR.computeHeat(null, null, inventory, /*overHeat*/ 0.0, displayState, helper.getLevel()); + + double expected = (uraniumBase + thoriumBase + graphiteBase) // each rod's own baseRodHeat + + uraniumProxy // A's scan: fuel neighbor B (thorium) -> addition + + thoriumProxy // B's scan: fuel neighbor A (uranium) -> addition + + (thoriumBase * graphiteProxy); + // C's scan: fuel neighbor B (thorium) -> multiplication (neighbor's base * cooler's own proximity) + // B's scan towards C contributes 0: fuel only scores against fuel neighbors + + helper.assertTrue(Math.abs(heat - expected) < DELTA, + "cooler must score its own malus against its fuel neighbor: expected " + + expected + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 4. 3x3 diamond of rods: cross-checked against the community wiki calculator + // ================================================================ + + /** + * Layout (rows 3-5, columns 3-5 of {@code formattedPattern} — a fully interior 3x3 block, + * every position outside it stays empty so neighbor counts match an isolated 3x3 grid): + *
+     * graphite(18) thorium(19) graphite(20)
+     * thorium(27)  uranium(28) thorium(29)
+     * graphite(36) thorium(37) graphite(38)
+     * 
+ * With the mod's default balance values this totals {@code 128}, matching the value produced + * by the community wiki calculator for the same pattern (verified by hand during the JS/Java + * comparison audit, see AUDIT_ACTUEL.md §0/§2.2) — but the assertion below is derived from the + * live config, not hardcoded, so it stays correct if the default balance changes: + *
    + *
  • 4 corner graphites, each with 2 thorium neighbors -> + * {@code graphiteBase + 2 * (thoriumBase * graphiteProxy)} each
  • + *
  • 4 edge thoriums, each with 2 graphite neighbors (ignored, cooler) + 1 uranium neighbor (fuel) -> + * {@code thoriumBase + thoriumProxy} each
  • + *
  • 1 center uranium, with 4 thorium neighbors (all fuel) -> + * {@code uraniumBase + 4 * uraniumProxy}
  • + *
+ */ + @GameTest(template = STRUCTURE) + public static void threeByThreeDiamond_matchesWikiCalculatorReferenceValue(GameTestHelper helper) { + Item uranium = CNItems.URANIUM_ROD.get(); + Item thorium = CNItems.THORIUM_ROD.get(); + Item graphite = CNItems.GRAPHITE_ROD.get(); + + int uraniumBase = CNConfigs.server().rods.uraniumBaseValue.get(); + float uraniumProxy = CNConfigs.server().rods.uraniumProximityBonus.get(); + int thoriumBase = CNConfigs.server().rods.baseValueThorium.get(); + float thoriumProxy = CNConfigs.server().rods.thoriumProxyBonus.get(); + int graphiteBase = CNConfigs.server().rods.graphiteBaseValue.get(); + float graphiteProxy = CNConfigs.server().rods.graphiteProximityMalus.getF(); + + ReactorControllerInventory inventory = placeController(helper, new BlockPos(1, 1, 1)); + loadPattern(inventory, Map.ofEntries( + Map.entry(18, graphite), Map.entry(19, thorium), Map.entry(20, graphite), + Map.entry(27, thorium), Map.entry(28, uranium), Map.entry(29, thorium), + Map.entry(36, graphite), Map.entry(37, thorium), Map.entry(38, graphite) + )); + + ReactorDisplayState displayState = new ReactorDisplayState( + Map.of(uranium, 1, thorium, 4, graphite, 4), List.of(), 0); + + double heat = CALCULATOR.computeHeat(null, null, inventory, /*overHeat*/ 0.0, displayState, helper.getLevel()); + + double cornerGraphite = graphiteBase + 2 * (thoriumBase * graphiteProxy); + double edgeThorium = thoriumBase + thoriumProxy; + double centerUranium = uraniumBase + 4 * uraniumProxy; + double expected = 4 * cornerGraphite + 4 * edgeThorium + centerUranium; + + helper.assertTrue(Math.abs(heat - expected) < DELTA, + "3x3 diamond should match the wiki calculator's reference value for this pattern: expected " + + expected + " (128 with default balance), got " + heat); + helper.succeed(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java new file mode 100644 index 000000000..852f29978 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java @@ -0,0 +1,453 @@ +package net.nuclearteam.createnuclear.gametest; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.PrefixGameTestTemplate; +import net.minecraftforge.registries.ForgeRegistries; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.content.multiblock.controller.manager.ReactorInputFluidManager; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; +import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; + +import java.util.List; + +/** + * GameTest coverage for {@link ReactorInputFluidManager}, run against a real + * {@code ServerLevel} and real {@link ReactorFluidInputEntity} blocks (no mocks). + *

+ * All tests share the "empty_platform" structure + * (data/createnuclear/structures/empty_platform.nbt): a 5x3x5 area with a + * stone floor at y=0, leaving y=1..2 free to place fluid input blocks. The structure + * is a real compressed structure-block export (a hand-authored .snbt cannot be loaded + * directly here: Forge only auto-discovers packaged ".nbt" structures under + * data/<namespace>/structures/, not loose ".snbt" text unless it also sits on disk + * relative to the run's working directory). + *

+ * Tests named "*_expectedContract" cover the two extractFluids defects fixed on both branches: + * fluidNeeded was never decremented between handlers (so a request of 10 units drained 10 from + * EVERY input), and a request for exactly one unit was silently dropped by an + * {@code if (toExtract > 1)} guard. The whole suite passes; the two characterization tests that + * pinned the buggy behaviour were removed with the fix. + */ +@GameTestHolder(CreateNuclear.MOD_ID) +@PrefixGameTestTemplate(false) +public class ReactorInputFluidManagerGameTest { + + private static final String STRUCTURE = "empty_platform"; + + // ---------- test fixtures ---------- + + private static void place(GameTestHelper helper, BlockPos rel, Direction facing) { + helper.setBlock(rel, CNBlocks.REACTOR_FLUID_INPUT.get().defaultBlockState() + .setValue(MultiDirectionalReactorBlock.FACING, facing)); + } + + private static ReactorFluidInputEntity entity(GameTestHelper helper, BlockPos rel) { + return (ReactorFluidInputEntity) helper.getBlockEntity(rel); + } + + private static void fill(GameTestHelper helper, BlockPos rel, FluidStack stack) { + entity(helper, rel).getCapability(ForgeCapabilities.FLUID_HANDLER) + .ifPresent(h -> h.fill(stack, FluidAction.EXECUTE)); + } + + private static int tankAmount(GameTestHelper helper, BlockPos rel) { + return entity(helper, rel).getCapability(ForgeCapabilities.FLUID_HANDLER) + .map(h -> h.getFluidInTank(0).getAmount()) + .orElse(-1); + } + + private static ReactorInputFluidManager manager(GameTestHelper helper, BlockPos... relPositions) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + for (BlockPos rel : relPositions) manager.addBlock(helper.absolutePos(rel)); + return manager; + } + + // ================================================================ + // read / write (pure NBT, no world interaction required) + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void read_absentKey_leavesEmpty(GameTestHelper helper) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(new CompoundTag()); + + helper.assertTrue(manager.size() == 0, "expected no tracked positions when NBT key is absent"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_clearsPreviousPositions(GameTestHelper helper) { + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.addBlock(new BlockPos(1, 2, 3)); + + manager.read(new CompoundTag()); + + helper.assertTrue(manager.size() == 0, "read() must clear previously tracked positions before loading"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_singleEntry_roundTrips(GameTestHelper helper) { + CompoundTag entry = new CompoundTag(); + entry.putInt("x", 5); + entry.putInt("y", 64); + entry.putInt("z", -3); + ListTag list = new ListTag(); + list.add(entry); + CompoundTag root = new CompoundTag(); + root.put("ReactorInputFluid", list); + + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(root); + + helper.assertTrue(manager.size() == 1, "expected exactly one entry after read"); + helper.assertTrue(manager.contains(new BlockPos(5, 64, -3)), "expected BlockPos(5,64,-3) to be present"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void read_multipleEntries_preservesOrder(GameTestHelper helper) { + BlockPos a = new BlockPos(0, 0, 0); + BlockPos b = new BlockPos(1, 1, 1); + BlockPos c = new BlockPos(2, 2, 2); + + ListTag list = new ListTag(); + for (BlockPos p : List.of(a, b, c)) { + CompoundTag entry = new CompoundTag(); + entry.putInt("x", p.getX()); + entry.putInt("y", p.getY()); + entry.putInt("z", p.getZ()); + list.add(entry); + } + CompoundTag root = new CompoundTag(); + root.put("ReactorInputFluid", list); + + ReactorInputFluidManager manager = new ReactorInputFluidManager(); + manager.read(root); + + helper.assertTrue(manager.getBlocksPosition().equals(List.of(a, b, c)), + "expected insertion order to be preserved, found " + manager.getBlocksPosition()); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void write_emptyPositions_stillWritesKey(GameTestHelper helper) { + CompoundTag tag = new CompoundTag(); + new ReactorInputFluidManager().write(tag); + + helper.assertTrue(tag.contains("ReactorInputFluid"), "write() should always write the NBT key, even when empty"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void write_then_read_roundTrip(GameTestHelper helper) { + BlockPos a = new BlockPos(1, 2, 3); + BlockPos b = new BlockPos(-5, 64, 100); + + ReactorInputFluidManager original = new ReactorInputFluidManager(); + original.addBlock(a); + original.addBlock(b); + + CompoundTag tag = new CompoundTag(); + original.write(tag); + + ReactorInputFluidManager restored = new ReactorInputFluidManager(); + restored.read(tag); + + helper.assertTrue(restored.getBlocksPosition().equals(List.of(a, b)), + "round-trip through NBT should preserve exact positions and order"); + helper.succeed(); + } + + // ================================================================ + // clearInvalid + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void clearInvalid_missingBlockEntity_removesPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); // never placed: air, no block entity + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 0, "a position without a block entity should be removed"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_noCapability_removesPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + helper.setBlock(rel, Blocks.CHEST.defaultBlockState()); // real BE, no fluid capability + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 0, "a block entity without a fluid capability should be removed"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_validCapability_keepsPosition(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + ReactorInputFluidManager manager = manager(helper, rel); + + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.size() == 1, "a valid ReactorFluidInputEntity should be kept"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void clearInvalid_mixedSet_onlyInvalidRemoved(GameTestHelper helper) { + BlockPos valid = new BlockPos(1, 1, 1); + BlockPos chest = new BlockPos(3, 1, 1); + BlockPos missing = new BlockPos(1, 1, 3); + + place(helper, valid, Direction.NORTH); + helper.setBlock(chest, Blocks.CHEST.defaultBlockState()); + + ReactorInputFluidManager manager = manager(helper, valid, chest, missing); + manager.clearInvalid(helper.getLevel()); + + helper.assertTrue(manager.getBlocksPosition().equals(List.of(helper.absolutePos(valid))), + "only the valid fluid input position should remain, found " + manager.getBlocksPosition()); + helper.succeed(); + } + + // ================================================================ + // getBlocksPosition(Level) + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getBlocksPosition_filtersNonMatchingEntityType(GameTestHelper helper) { + BlockPos validRel = new BlockPos(1, 1, 1); + BlockPos otherRel = new BlockPos(3, 1, 1); + place(helper, validRel, Direction.NORTH); + helper.setBlock(otherRel, Blocks.CHEST.defaultBlockState()); + + ReactorInputFluidManager manager = manager(helper, validRel, otherRel); + + List result = manager.getBlocksPosition(helper.getLevel()); + + helper.assertTrue(result.equals(List.of(helper.absolutePos(validRel))), + "only the ReactorFluidInputEntity position should be returned, found " + result); + helper.succeed(); + } + + // ================================================================ + // getFuildHandlers + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getFuildHandlers_capabilityPresent_included(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 500)); + + List handlers = manager(helper, rel).getFuildHandlers(helper.getLevel()); + + helper.assertTrue(handlers.size() == 1, "expected exactly one handler"); + helper.assertTrue(handlers.get(0).getFluidInTank(0).getAmount() == 500, + "handler should expose the filled tank content"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void getFuildHandlers_preservesTrackingOrder(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 100)); + fill(helper, rel2, new FluidStack(Fluids.LAVA, 200)); + + List handlers = manager(helper, rel1, rel2).getFuildHandlers(helper.getLevel()); + + helper.assertTrue(handlers.size() == 2, "expected two handlers"); + helper.assertTrue(handlers.get(0).getFluidInTank(0).getFluid() == Fluids.WATER, + "first handler should be the water tank (matches insertion order)"); + helper.assertTrue(handlers.get(1).getFluidInTank(0).getFluid() == Fluids.LAVA, + "second handler should be the lava tank (matches insertion order)"); + helper.succeed(); + } + + // ================================================================ + // getInventory + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void getInventory_noHandlers_returnsEmpty(GameTestHelper helper) { + VirtualReactorInputFluid inventory = new ReactorInputFluidManager().getInventory(helper.getLevel()); + + helper.assertTrue(inventory.fluids().isEmpty(), "expected an empty inventory with no tracked handlers"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void getInventory_aggregatesAcrossHandlers(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 300)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 250)); + + VirtualReactorInputFluid inventory = manager(helper, rel1, rel2).getInventory(helper.getLevel()); + + ResourceLocation waterId = ForgeRegistries.FLUIDS.getKey(Fluids.WATER); + long total = inventory.getAmount(waterId); + helper.assertTrue(total == 550, "expected aggregated total of 550, found " + total); + helper.succeed(); + } + + // ================================================================ + // extractFluids — core of the audited bug + // ================================================================ + + @GameTest(template = STRUCTURE) + public static void extractFluids_nullLevel_returnsFalse(GameTestHelper helper) { + boolean result = new ReactorInputFluidManager().extractFluids(null, 10); + helper.assertTrue(!result, "extractFluids should return false for a null level"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_noHandlers_returnsFalse(GameTestHelper helper) { + boolean result = new ReactorInputFluidManager().extractFluids(helper.getLevel(), 10); + helper.assertTrue(!result, "extractFluids should return false when there are no handlers"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_singleHandlerEnoughStock_drainsExactAmount(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 1000)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 400); + + helper.assertTrue(result, "extraction should succeed when enough fluid is available"); + helper.assertTrue(tankAmount(helper, rel) == 600, "expected 600 remaining, found " + tankAmount(helper, rel)); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_singleHandlerInsufficientStock_drainsAvailable(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 30)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 100); + + helper.assertTrue(result, "extraction should be reported successful even for a partial drain"); + helper.assertTrue(tankAmount(helper, rel) == 0, "all 30 available units should have been drained"); + helper.succeed(); + } + + /** + * A request for exactly 1 unit with stock available must succeed. This used to fail against + * an {@code if (toExtract > 1)} guard that silently dropped single-unit requests. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_needOfOne_shouldSucceed_expectedContract(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 5)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 1); + + helper.assertTrue(result, "a request for exactly 1 unit with stock available should succeed"); + helper.assertTrue(tankAmount(helper, rel) == 4, "expected exactly 1 unit to be drained"); + helper.succeed(); + } + + /** + * Extracting 10 units from a 20-unit pool spread across two handlers must leave 10 total + * remaining. The requested amount is a total across every input, not a per-input quota; + * this used to drain both handlers in full because {@code fluidNeeded} was never + * decremented between them. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_twoHandlers_shouldNotOverExtract_expectedContract(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); + + manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 10); + + int totalRemaining = tankAmount(helper, rel1) + tankAmount(helper, rel2); + helper.assertTrue(totalRemaining == 10, + "extracting 10 out of a 20-unit pool should leave 10 total remaining, found " + totalRemaining); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_needZero_leavesTanksUntouched(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); + place(helper, rel2, Direction.NORTH); + fill(helper, rel1, new FluidStack(Fluids.WATER, 10)); + fill(helper, rel2, new FluidStack(Fluids.WATER, 10)); + + boolean result = manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 0); + + helper.assertTrue(!result, "a non-positive fluidNeeded should never extract anything"); + helper.assertTrue(tankAmount(helper, rel1) == 10 && tankAmount(helper, rel2) == 10, + "no tank should be touched when fluidNeeded <= 0"); + helper.succeed(); + } + + @GameTest(template = STRUCTURE) + public static void extractFluids_emptyStackHandler_skippedGracefully(GameTestHelper helper) { + BlockPos rel1 = new BlockPos(1, 1, 1); + BlockPos rel2 = new BlockPos(3, 1, 1); + place(helper, rel1, Direction.NORTH); // left empty + place(helper, rel2, Direction.NORTH); + fill(helper, rel2, new FluidStack(Fluids.WATER, 20)); + + boolean result = manager(helper, rel1, rel2).extractFluids(helper.getLevel(), 15); + + helper.assertTrue(result, "the second, non-empty handler should still be usable"); + helper.assertTrue(tankAmount(helper, rel1) == 0, "empty handler should stay untouched"); + helper.assertTrue(tankAmount(helper, rel2) == 5, "expected 15 drained out of 20, 5 remaining"); + helper.succeed(); + } + + /** + * A partial extraction still reports success: the reactor consumes whatever coolant it can + * reach rather than refusing to run. The Javadoc used to promise "true if the full amount + * was extracted", which never matched the implementation; it now documents this contract. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_partialExtraction_stillReportsSuccess(GameTestHelper helper) { + BlockPos rel = new BlockPos(1, 1, 1); + place(helper, rel, Direction.NORTH); + fill(helper, rel, new FluidStack(Fluids.WATER, 30)); + + boolean result = manager(helper, rel).extractFluids(helper.getLevel(), 100); + + helper.assertTrue(result, "current implementation returns true even for a partial extraction (Javadoc mismatch)"); + helper.assertTrue(tankAmount(helper, rel) == 0, "all available fluid should have been drained"); + helper.succeed(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/impl/registry/CreateNuclearRegistriesImpl.java b/src/main/java/net/nuclearteam/createnuclear/impl/registry/CreateNuclearRegistriesImpl.java new file mode 100644 index 000000000..649dd884e --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/impl/registry/CreateNuclearRegistriesImpl.java @@ -0,0 +1,29 @@ +package net.nuclearteam.createnuclear.impl.registry; + +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.registries.DataPackRegistryEvent; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; +import org.jetbrains.annotations.ApiStatus.Internal; + +@EventBusSubscriber(bus = Bus.MOD) +public class CreateNuclearRegistriesImpl { + @Internal + @SubscribeEvent + public static void registerDatapackRegistries(DataPackRegistryEvent.NewRegistry event) { + event.dataPackRegistry( + CreateNuclearRegistries.ROD_TYPE, + RodType.CODEC, + RodType.CODEC + ); + + event.dataPackRegistry( + CreateNuclearRegistries.FLUID_TYPE, + ReactorFluidType.CODEC, + ReactorFluidType.CODEC + ); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CBiomeRestore.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CBiomeRestore.java new file mode 100644 index 000000000..38721c2e9 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CBiomeRestore.java @@ -0,0 +1,21 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CBiomeRestore extends ConfigBase { + public final ConfigInt maxCharge = i(8, 1, 64, "maxCharge", Comments.maxCharge); + public final ConfigBool restoreInCircle = b(false, "restoreInCircle", Comments.restoreInCircle); + public final ConfigInt restoreRadiusChunks = i(1, 1, 3, "restoreRadiusChunks", Comments.restoreRadiusChunks); + + @Override + public String getName() { + return "BiomeRestore"; + } + + private static class Comments { + static String maxCharge = "Maximum number of charges the Biome Restore Cell can hold."; + static String restoreInCircle = "If true, restoring a chunk also restores nearby chunks in a circle " + + "(see restoreRadiusChunks). If false, only the chunk the player stands in is restored."; + static String restoreRadiusChunks = "Radius in chunks used when restoreInCircle is true (1 to 3)."; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java new file mode 100644 index 000000000..0a5d60c1d --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplode.java @@ -0,0 +1,20 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CExplode extends ConfigBase { + public final ConfigInt size = i(10, "Explosion size (radius in blocks)"); + public final ConfigInt type = i(1, 0, 2, "Type of explosion", Comments.type); + public final ConfigInt time = i(600, 100, 1200, "Delay before explosion (ticks)", Comments.explosionTime, Comments.hintExplosion); + + @Override + public String getName() { + return "Explosion Reactor"; + } + + private static class Comments { + static String explosionTime = "Delay before the nuclear explosion (in ticks)."; + static String hintExplosion = "300 ticks = 15 seconds."; + static String type = "0 = none, 1 = current explosion behavior, 2 = alternative explosion behavior."; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java deleted file mode 100644 index 1f2716747..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CExplose.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.nuclearteam.createnuclear.infrastructure.config; - -import net.createmod.catnip.config.ConfigBase; - -public class CExplose extends ConfigBase { - public final ConfigInt size = i(10, "Size of the reactor explosion"); - public final ConfigInt type = i(1, 0, 2, "Type of explosion", Comments.type); - public final ConfigInt time = i(600, 100, 1200, "Duration before exploration", Comments.explosionTime, Comments.hintExplosion); - - @Override - public String getName() { - return "Explosion Reactor"; - } - - private static class Comments { - static String explosionTime = "Create Nuclear Explosion Time"; - static String hintExplosion = "300 ticks = 15 seconds"; - static String type = "Explanation: 0 = no explosion, 1 = current explosion, 2 = new explosion."; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java index 0bbd8993d..86b0a4642 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java @@ -1,4 +1,17 @@ package net.nuclearteam.createnuclear.infrastructure.config; -public class CNCClient { -} +import net.createmod.catnip.config.ConfigBase; + +public class CNCClient extends ConfigBase { + public final ConfigBool nuclearBombFlash = b(true, "nuclear_bomb_flash", Comments.nuclearBombFlash); + public final ConfigBool screenShaking = b(true, "screen_shake", Comments.screenShaking); + + + @Override + public String getName() { return "Client"; } + + private static class Comments { + static String nuclearBombFlash = "Enable the bright flash at the start of a nuclear explosion."; + static String screenShaking = "Enable screen shake effect during a nuclear explosion."; + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java index cf642f723..5cd2e69a0 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java @@ -4,8 +4,6 @@ public class CNCCommon extends ConfigBase { public final CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); - public final CRods rods = nested(0, CRods::new, Comments.rods); - public final CExplose explode = nested(0, CExplose::new, Comments.explode); @Override public String getName() { @@ -13,8 +11,6 @@ public String getName() { } private static class Comments { - static String worldGen = "Modify CreateNuclear's impact on your terrain"; - static String rods = "Modify rods time and config"; - static String explode = "Explose: pas d'idée"; + static String worldGen = "Modify how CreateNuclear affects world generation."; } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java index 6192b4d5e..3924a0fff 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java @@ -1,4 +1,26 @@ package net.nuclearteam.createnuclear.infrastructure.config; -public class CNCServer { -} +import net.createmod.catnip.config.ConfigBase; + +public class CNCServer extends ConfigBase { + public final CRods rods = nested(0, CRods::new, Comments.rods); + public final CNotify notify = nested(0, CNotify::new, Comments.notify); + public final CRadiation radiation = nested(0, CRadiation::new, Comments.radiation); + public final CReactorHeat reactorHeat = nested(0, CReactorHeat::new, Comments.reactorHeat); + public final CBiomeRestore biomeRestore = nested(0, CBiomeRestore::new, Comments.biomeRestore); + + + @Override + public String getName() { + return "Server"; + } + + private static class Comments { + static String rods = "Modify rod durations and related parameters."; + static String radiation = "Enable or disable radiation effects emitted by mod items. "; + static String notify = "Notification settings for reactor warnings."; + static String reactorHeat = "Heat thresholds for different reactor sizes"; + static String biomeRestore = ""; + + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java index 6a3434a7f..09cd4462f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNConfigs.java @@ -23,10 +23,18 @@ public class CNConfigs { private static CNCCommon common; private static CNCServer server; + public static CNCClient client() { + return client; + } + public static CNCCommon common() { return common; } + public static CNCServer server() { + return server; + } + public static ConfigBase byType(ModConfig.Type type) { return CONFIGS.get(type); } @@ -46,6 +54,8 @@ private static T register(Supplier factory, ModConfig. public static void register(ModLoadingContext context) { common = register(CNCCommon::new, ModConfig.Type.COMMON); + server = register(CNCServer::new, ModConfig.Type.SERVER); + client = register(CNCClient::new, ModConfig.Type.CLIENT); for (Entry entry : CONFIGS.entrySet()) { context.registerConfig(entry.getKey(), entry.getValue().specification); diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java new file mode 100644 index 000000000..7ef0c44f2 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNotify.java @@ -0,0 +1,18 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CNotify extends ConfigBase { + public final ConfigBool warnAllPlayers = b(false, "warn_all_players", Comments.warning); + public final ConfigInt warningDistance = i(100, 30, 5000, "warning_distance_blocks", Comments.rangeOfWarning); + + @Override + public String getName() { + return "Notify"; + } + + private static class Comments { + static String warning = "When true, broadcast a warning to nearby players before a reactor explosion."; + static String rangeOfWarning = "Distance (in blocks) to search for players to warn about impending explosion."; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java new file mode 100644 index 000000000..a0c0f3502 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java @@ -0,0 +1,71 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; + +import java.util.List; + +@MethodsReturnNonnullByDefault +public class CRadiation extends ConfigBase { + public final ConfigBool enabledItemRadiation = b(true, "enabled_item_radiation", Comments.enabled); + public final ConfigInt radiationLevel1 = i(10, 0, 50, "radiation_level_1", Comments.radiationLevel1); + public final ConfigInt radiationLevel2 = i(25, 0, 50, "radiation_level_2", Comments.radiationLevel2); + public final ConfigInt radiationLevel3 = i(50, 0, 50, "radiation_level_3", Comments.radiationLevel3); + public final ConfigInt amplifierLevel0 = i(0, 0, 10, "amplifier_level_0", Comments.amplifierLevel0); + public final ConfigInt amplifierLevel1 = i(1, 0, 10, "amplifier_level_1", Comments.amplifierLevel1); + public final ConfigInt amplifierLevel2 = i(2, 0, 10, "amplifier_level_2", Comments.amplifierLevel2); + public final ConfiguredLists configuredLists = nested(0, ConfiguredLists::new, Comments.list); + + @Override + public String getName() { + return "Radiation"; + } + + private static class Comments { + static String enabled = "When enabled, certain items may emit radiation affecting players and nearby entities. Disable to turn off radiation effects without removing items."; + static String radiationLevel1 = "Minimum radiation value required to apply Radiation I. Values below this do not apply effects."; + static String radiationLevel2 = "Minimum radiation value required to apply Radiation II. Should be greater than radiation_level_1."; + static String radiationLevel3 = "Minimum radiation value required to apply Radiation III. Should be greater than radiation_level_2."; + static String amplifierLevel0 = "Effect amplifier for Radiation I (0 = level I)."; + static String amplifierLevel1 = "Effect amplifier for Radiation II (1 = level II)."; + static String amplifierLevel2 = "Effect amplifier for Radiation III (2 = level III)."; + static String list = "Lists related to radiation configuration, for example the entity blacklist."; + static String blackListEntity = + "List of entity IDs excluded from radiation effects. Use registry names like \"minecraft:armor_stand\".\n\n" + + "How to edit:\n" + + "- Add entries as namespace:entity_name strings.\n" + + "- Example: \"minecraft:armor_stand\"\n" + + "- Remove an entry to stop excluding it.\n"; + } + + public static class ConfiguredLists extends ConfigBase { + private static ConfigValue> ENTITY_BLACKLIST = null; + + @Override + public void registerAll(ForgeConfigSpec.Builder builder) { + + ENTITY_BLACKLIST = builder + .comment(Comments.blackListEntity) + .defineListAllowEmpty( + List.of("entity_blacklist"), + () -> List.of( + "minecraft:armor_stand", + "minecraft:item_frame", + "minecraft:glow_item_frame" + ), + obj -> obj instanceof String + ); + } + + @Override + public String getName() { + return "lists"; + } + + public List getEntityBlackList() { + return ENTITY_BLACKLIST.get(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java new file mode 100644 index 000000000..8c070b760 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CReactorHeat.java @@ -0,0 +1,14 @@ +package net.nuclearteam.createnuclear.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CReactorHeat extends ConfigBase { + public final ConfigInt size5Danger = i(256, 0, 8192, "size5Danger", "Heat threshold for DANGER level (5x5 reactor)"); + public final ConfigInt size7Danger = i(1024, 0, 8192, "size7Danger", "Heat threshold for DANGER level (7x7 reactor)"); + public final ConfigInt size9Danger = i(4096, 0, 8192, "size9Danger", "Heat threshold for DANGER level (9x9 reactor)"); + + @Override + public String getName() { + return "ReactorHeat"; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java index 947b9f432..ec7edcdca 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java @@ -1,22 +1,51 @@ package net.nuclearteam.createnuclear.infrastructure.config; import net.createmod.catnip.config.ConfigBase; +import net.minecraft.MethodsReturnNonnullByDefault; +@MethodsReturnNonnullByDefault public class CRods extends ConfigBase { - public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "Uranium rod lifespan", Comments.UraniumRodLifetime, Comments.hintTick); - public final ConfigInt graphiteRodLifetime = i(3600, 100, 5000, "Graphite rod lifespan", Comments.GraphiteRodLifetime, Comments.hintTick); - public final ConfigInt maxHeat = i(1000, 200, 1000, "Maximum reactor heat", Comments.maxHeat, Comments.hintHeat); + public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "uranium_rod_lifetime_ticks", Comments.uraniumRodLifetime, Comments.hintTick); + public final ConfigInt uraniumProximityBonus = i(32, -70, 70, "uranium_proximity_bonus", Comments.warning, Comments.uraniumProximityBonus); + public final ConfigInt uraniumBaseValue = i(64, -70, 70, "uranium_base_value", Comments.warning, Comments.uraniumBaseValue); + public final ConfigInt uraniumHeatRatio = i(2, -10, 10, "Heat ratio for uranium rods", Comments.warning, Comments.uraniumHeatRatio); + + public final ConfigInt graphiteRodLifetime = i(3600, 100, 5000, "graphite_rod_lifetime_ticks", Comments.graphiteRodLifetime, Comments.hintTick); + // the proximity value of coolant items are divisions so if the heat of the fuel is 64, the calcul will be "heat + 64/-4" + public final ConfigFloat graphiteProximityMalus = f(-0.25f, -70, 70, "graphite_proximity_penalty", Comments.warning, Comments.graphiteProximityMalus); + public final ConfigInt graphiteBaseValue = i(-32, -50, 50, "graphite_base_value", Comments.warning, Comments.graphiteBaseValue); + public final ConfigInt graphiteHeatRatio = i(1, -10, 10, "Heat ratio for graphite rods", Comments.warning, Comments.graphiteHeatRatio); + + public final ConfigInt thoriumRodLifetime = i(3600, 100, 5000, "Thorium rod lifetime (in ticks)", Comments.thoriumRodLifetime, Comments.hintTick); + public final ConfigInt thoriumProxyBonus = i(8, -70, 70, "Heat bonus from nearby thorium rods", Comments.warning, Comments.thoriumProximityBonus); + public final ConfigInt baseValueThorium = i(16, -70, 70, "Base heat value for thorium rods", Comments.warning, Comments.thoriumBaseValue); + public final ConfigInt thoriumHeatRatio = i(1, -10, 10, "Heat ratio for thorium rods", Comments.warning, Comments.thoriumHeatRatio); + @Override public String getName() { - return "Rods"; + return "rods"; } private static class Comments { static String hintTick = "20 ticks = 1 second"; - static String UraniumRodLifetime = "Uranium rod lifespan in reactor"; - static String GraphiteRodLifetime = "Graphite rod lifespan in reactor"; - static String maxHeat = "Maximum heat a reactor block can handle"; - static String hintHeat = "Avoids reactor failure due to excessive heat"; + static String warning = "Changing these values may unbalance reactor behavior."; + static String maxFuelPerCooled = "Maximum fuel rods supported by a single cooled rod"; + + static String uraniumRodLifetime = "Lifetime of uranium rods in ticks."; + static String uraniumProximityBonus = "Heat bonus applied when uranium rods are adjacent."; + static String uraniumBaseValue = "Base heat contribution of a uranium rod before modifiers."; + static String uraniumHeatRatio = "Heat ratio modifier for a uranium rod"; + + static String graphiteRodLifetime = "Lifetime of graphite (cooling) rods in ticks."; + static String graphiteProximityMalus = "Heat penalty applied when graphite rods are adjacent."; + static String graphiteBaseValue = "Base heat contribution of a graphite rod before modifiers."; + static String graphiteHeatRatio = "Heat ratio modifier for a graphite rod"; + + static String thoriumRodLifetime = "Lifetime of thorium rods in the reactor"; + static String thoriumProximityBonus = "Bonus heat applied when thorium rods are adjacent"; + static String thoriumBaseValue = "Base heat contribution of a thorium rod before modifiers"; + static String thoriumHeatRatio = "Heat ratio modifier for a thorium rod"; + } -} +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java index ea7de34eb..b4c66b33d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CWorldGen.java @@ -3,7 +3,7 @@ import net.createmod.catnip.config.ConfigBase; public class CWorldGen extends ConfigBase { - public final ConfigBool disable = b(false, "disableWorldGen", Comments.disable); + public final ConfigBool enable = b(true, "enable_world_gen", Comments.enable); @Override public String getName() { @@ -11,6 +11,6 @@ public String getName() { } private static class Comments { - static String disable = "Prevents all worldgen added by Create from taking effect"; + static String enable = "When true, CreateNuclear world generation features are active. Set to false to disable all added ores/structures."; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java index bf8ccbe5b..90cf0d31f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java @@ -10,11 +10,11 @@ import net.minecraft.data.PackOutput; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.data.event.GatherDataEvent; +import net.nuclearteam.createnuclear.CNSoundEvents; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.data.recipe.CNMechanicalCraftingRecipeGen; import net.nuclearteam.createnuclear.foundation.data.recipe.CNProcessingRecipeGen; -import net.nuclearteam.createnuclear.foundation.data.recipe.CNShapelessRecipeGen; import net.nuclearteam.createnuclear.foundation.data.recipe.CNStandardRecipeGen; import net.nuclearteam.createnuclear.foundation.ponder.CreateNuclearPonderPlugin; @@ -31,15 +31,15 @@ public static void gatherData(GatherDataEvent event) { CompletableFuture lookupProvider = event.getLookupProvider(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + generator.addProvider(event.includeClient(), CNSoundEvents.provider(generator)); + GeneratedEntriesProvider generatedEntriesProvider = new GeneratedEntriesProvider(output, lookupProvider); lookupProvider = generatedEntriesProvider.getRegistryProvider(); generator.addProvider(event.includeClient(), generatedEntriesProvider); generator.addProvider(event.includeClient(), new CNStandardRecipeGen(output)); -// generator.addProvider(event.includeClient(), new CNShapelessRecipeGen(output)); generator.addProvider(event.includeClient(), new CNMechanicalCraftingRecipeGen(output)); generator.addProvider(event.includeClient(), new CNAdvancement(output)); - /*if (event.includeClient()) { }*/ @@ -59,7 +59,9 @@ private static void addExtraRegistrateData() { provideDefaultLang("potion", langConsumer); provideDefaultLang("tooltips", langConsumer); provideDefaultLang("reactor", langConsumer); + provideDefaultLang("irradiated", langConsumer); CNAdvancement.provideLang(langConsumer); + CNSoundEvents.provideLang(langConsumer); providePonderLang(langConsumer); }); } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java index c023ed496..974c0a5b9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearRegistrateTags.java @@ -1,16 +1,19 @@ package net.nuclearteam.createnuclear.infrastructure.data; +import com.simibubi.create.AllItems; import com.simibubi.create.foundation.data.TagGen.CreateTagsProvider; import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.providers.RegistrateTagsProvider; import net.minecraft.tags.BlockTags; import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.FluidTags; +import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.common.Tags; import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CNEntityType; import net.nuclearteam.createnuclear.CNTags; @@ -43,6 +46,10 @@ private static void genBlockTags(RegistrateTagsProvider provIn) { .add(CNBlocks.ENRICHING_FIRE.get()) ; + prov.tag(CNBlockTags.FAN_PROCESSING_CATALYSTS_SNOW_POWDER.tag) + .add(Blocks.POWDER_SNOW) + ; + for (CNBlockTags tag : CNBlockTags.values()) { if (tag.alwaysDatagen) { prov.getOrCreateRawBuilder(tag.tag); @@ -71,6 +78,10 @@ private static void genFluidTags(RegistrateTagsProvider provIn) { .addTag(CNFluidTags.URANIUM.tag) ; + prov.tag(FluidTags.WATER) + .addTag(CNFluidTags.NITROGEN.tag) + ; + for (CNFluidTags tag : CNFluidTags.values()) { if (tag.alwaysDatagen) { diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java index e13ab777a..6f8eadb28 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/GeneratedEntriesProvider.java @@ -9,9 +9,16 @@ import net.minecraftforge.registries.ForgeRegistries; import net.nuclearteam.createnuclear.CNDamageTypes; import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; +import net.nuclearteam.createnuclear.content.multiblock.fluid.CNReactorFluidTypes; +import net.nuclearteam.createnuclear.content.multiblock.rod.CNRodTypes; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNBiomeModifiers; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNConfiguredFeatures; import net.nuclearteam.createnuclear.infrastructure.worldgen.CNPlacedFeatures; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNDensityFunctions; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNNoiseData; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNNoiseGeneratorSettings; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -19,11 +26,17 @@ public class GeneratedEntriesProvider extends DatapackBuiltinEntriesProvider { @SuppressWarnings({ "rawtypes", "unchecked" }) private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() - .add(Registries.DAMAGE_TYPE, CNDamageTypes::bootstrap) - .add(Registries.CONFIGURED_FEATURE, (RegistryBootstrap) CNConfiguredFeatures::bootstrap) - .add(Registries.PLACED_FEATURE, CNPlacedFeatures::bootstrap) - .add(ForgeRegistries.Keys.BIOME_MODIFIERS, CNBiomeModifiers::bootstrap) - ; + .add(Registries.DAMAGE_TYPE, CNDamageTypes::bootstrap) + .add(Registries.CONFIGURED_FEATURE, (RegistryBootstrap) CNConfiguredFeatures::bootstrap) + .add(Registries.PLACED_FEATURE, CNPlacedFeatures::bootstrap) + .add(ForgeRegistries.Keys.BIOME_MODIFIERS, CNBiomeModifiers::bootstrap) + .add(Registries.BIOME, CNBiomes::bootstrapRegistries) + .add(Registries.DENSITY_FUNCTION, CNDensityFunctions::bootstrapRegistries) + .add(Registries.NOISE_SETTINGS, CNNoiseGeneratorSettings::bootstrapRegistries) + .add(Registries.NOISE, CNNoiseData::bootstrapRegistries) + .add(CreateNuclearRegistries.ROD_TYPE, CNRodTypes::bootstrap) + .add(CreateNuclearRegistries.FLUID_TYPE, CNReactorFluidTypes::bootstrap) + ; public GeneratedEntriesProvider(PackOutput output, CompletableFuture registries) { super(output, registries, BUILDER, Set.of(CreateNuclear.MOD_ID)); diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNCreateNuclearPonderTags.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/CNCreateNuclearPonderTags.java similarity index 83% rename from src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNCreateNuclearPonderTags.java rename to src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/CNCreateNuclearPonderTags.java index d2e247864..9befb3c3f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNCreateNuclearPonderTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/CNCreateNuclearPonderTags.java @@ -1,7 +1,5 @@ -package net.nuclearteam.createnuclear.foundation.ponder; +package net.nuclearteam.createnuclear.infrastructure.ponder; -import com.simibubi.create.Create; -import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; import com.tterrag.registrate.util.entry.RegistryEntry; import net.createmod.catnip.platform.CatnipServices; import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; @@ -10,6 +8,7 @@ import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CreateNuclear; +import static com.simibubi.create.infrastructure.ponder.AllCreatePonderTags.DISPLAY_SOURCES; import static com.simibubi.create.infrastructure.ponder.AllCreatePonderTags.KINETIC_SOURCES; @@ -33,6 +32,10 @@ public static void register(PonderTagRegistrationHelper helper .add(CNBlocks.REACTOR_CONTROLLER) ; + HELPER.addToTag(DISPLAY_SOURCES) + .add(CNBlocks.REACTOR_CONTROLLER) + ; + } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java new file mode 100644 index 000000000..f5e43efac --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java @@ -0,0 +1,348 @@ +package net.nuclearteam.createnuclear.infrastructure.ponder.scenes; + +import net.createmod.catnip.math.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CNItems; +import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock; + +import java.util.HashMap; +import java.util.Map; + +public class CNPonderReactorScenes { + + // multiblock sizes and heights for tiers + private static final int S_T1 = 5; + private static final int H_T1 = 7; + private static final int S_T2 = 7; + private static final int H_T2 = 9; + private static final int S_T3 = 9; + private static final int H_T3 = 11; + + private static final int PEDESTAL_Y = 0; // pedestal layer (snow/concrete) + private static final int MULTIBLOCK_BASE_Y = 1; // multiblock starts at y=1 + private static final int MARGIN = 2; // Create margin + private static int plateSizeFor(int multiblockSize) { return multiblockSize + MARGIN * 2; } + + /** + * Simple container for storing all positions of interest for a multiblock. * The BlockPos values here must be in SCENE COORDINATES (0..plate-1 for X/Z, 1..H for Y). + */ + private record Positions(BlockPos controller, BlockPos input1, BlockPos input2, BlockPos liquidInput, + BlockPos alarm, BlockPos output) { + + /** + * All blocks that carry an explanatory callout, so a section-based reveal can show them per layer. + */ + BlockPos[] specials() { + return new BlockPos[]{controller, input1, input2, liquidInput, alarm, output}; + } + } + + /** Describes a single callout: its text and the direction to point at. */ + private record CalloutInfo(String text, Direction pointDirection, int fullDuration, int reducedDuration, int fullIdle, int reducedIdle) {} + + /** + * Static map of positions per multiblock size. + * Key = multiblockSize (5 for S_T1, 7 for S_T2, 9 for S_T3). + * Rule: x/z in 0..plate-1, y in 1..H; these values must match the structure's actual NBT layout. + */ + private static final Map STATIC_POS = new HashMap<>(); + static { + // Example for T1 (multiblockSize = 5) + // plate = 5 + 4 = 9 => valid x/z: 0..8; inner multiblock: 2..6 + STATIC_POS.put(5, new Positions( + new BlockPos(4, 4, 6), // controller + new BlockPos(3, 2, 6), // input1 + new BlockPos(3, 3, 6), // input2 + new BlockPos(3, 4, 6), // liquidInput + new BlockPos(5, 4, 6), // alarm + new BlockPos(5, 2, 6) // output + )); + + // Example for T2 (multiblockSize = 7) + STATIC_POS.put(7, new Positions( + new BlockPos(5, 5, 8), // controller + new BlockPos(3, 3, 8), // input1 + new BlockPos(3, 4, 8), // input2 + new BlockPos(3, 5, 8), // liquidInput + new BlockPos(7, 5, 8), // alarm + new BlockPos(7, 3, 8) // output + )); + + // Example for T3 (multiblockSize = 9) + STATIC_POS.put(9, new Positions( + new BlockPos(6, 6, 10), // controller + new BlockPos(5, 4, 10), // input1 + new BlockPos(5, 5, 10), // input2 + new BlockPos(5, 6, 10), // liquidInput + new BlockPos(7, 6, 10), // alarm + new BlockPos(7, 4, 10) // output + )); + } + + /** + * Precomputes a BlockPos -> CalloutInfo map for O(1) lookup per cell instead of + * iterating pos.specials() and comparing coordinates for every (x, y, z) visited. + */ + private static Map buildCallouts(Positions pos) { + Map callouts = new HashMap<>(); + callouts.put(pos.controller, new CalloutInfo( + "Controller: brain of the reactor, and the place where the blueprint goes to start it", + Direction.DOWN, + 130, 110, + 140, 120 + )); + + // Extend here if input1/input2/liquidInput/alarm/output ever need a callout + // during structure reveal (they currently don't have one — see ioPlacement() + // for their dedicated explanations). + return callouts; + } + + /** * Returns the static positions for the given size. * If no static entry exists, returns "reasonable" computed positions instead. */ + private static Positions positionsFor(int multiblockSize, int height) { + Positions p = STATIC_POS.get(multiblockSize); + if (p != null) return p; + + // fallback: simple centered calculation (avoids an NPE) + int plate = plateSizeFor(multiblockSize); + int offset = MARGIN; + int cx = offset + (multiblockSize / 2); + int cz = offset + (multiblockSize / 2); + int cy = MULTIBLOCK_BASE_Y + (height / 2); + return new Positions( + new BlockPos(cx, cy, cz), // controller + new BlockPos(cx, MULTIBLOCK_BASE_Y+1, offset + multiblockSize - 1), // input1 front + new BlockPos(cx, Math.min(MULTIBLOCK_BASE_Y+height-1, MULTIBLOCK_BASE_Y+2), offset + multiblockSize - 1), // input2 + new BlockPos(cx, cy, offset), // liquidInput back + new BlockPos(Math.max(offset, cx-1), cy, cz), // alarm + new BlockPos(offset + multiblockSize - 1, cy, cz) // output right + ); + } + + private static void showReactorStructure(SceneBuilder scene, SceneBuildingUtil util, int S, int H, int plate) { + showReactorStructure(scene, util, S, H, plate, false); + } + + /** + * @param bySections when true, each floor is revealed as a single render section instead of + * block-by-block. Block-by-block creates one {@code WorldSectionElement} per cell + * ({@code H * plate^2}, e.g. 1859 for T3) and they all keep rendering every frame, which + * is what makes the larger tiers lag past ~2/3 of the scene. T1/T2 stay block-by-block. + */ + private static void showReactorStructure(SceneBuilder scene, SceneBuildingUtil util, int S, int H, int plate, boolean bySections) { + Positions pos = positionsFor(S, H); + Map callouts = buildCallouts(pos); + + int minX = MARGIN; + int maxX = MARGIN + S - 1; + int minZ = MARGIN; + int maxZ = MARGIN + S - 1; + int minY = 1; + int maxY = H; + + scene.idle(20); + + for (int y = 1; y <= H; y++) { + scene.overlay().showText(bySections ? 25 : 8) + .text("Floor " + y) + .attachKeyFrame() + .placeNearTarget(); + + if (bySections) { + // One section for the whole floor: same visual build-up, a fraction of the draws. + scene.world().showSection(util.select().layer(y), Direction.NORTH); + // Block-by-block got its per-floor pacing from plate^2 * idle(4). With a single + // section per floor we must idle explicitly, otherwise callout-free floors flash + // by instantly and their "Floor N" labels overlap each other. + scene.idle(50); + for (Map.Entry entry : callouts.entrySet()) { + if (entry.getKey().getY() == y) { + showCallout(scene, util, entry.getKey(), entry.getValue(), bySections); + } + } + } else { + for (int x = 0; x < plate; x++) { + for (int z = 0; z < plate; z++) { + BlockPos cell = new BlockPos(x, y, z); + scene.world().showSection(util.select().position(x, y, z), Direction.NORTH); + scene.idle(4); + CalloutInfo info = callouts.get(cell); + if (info != null) { + showCallout(scene, util, cell, info, bySections); + } + } + } + } + } + + scene.idle(20); + scene.overlay() + .showText(110) + .text("To start the reactor you will need liquid and rods corresponding to the pattern, then right click the controller with the blueprint in hand"); + Vec3 topSide = util.vector().blockSurface(pos.controller, Direction.EAST); + scene.overlay() + .showControls(topSide, Pointing.UP, 60) + .withItem(CNItems.REACTOR_BLUEPRINT.asStack()) + .rightClick(); + scene.world().modifyBlock(pos.controller, s -> s.setValue(ReactorControllerBlock.ASSEMBLED, true), true); + + scene.idle(120); + scene.overlay() + .showText(120) + .text("Note: Check page 4 for I/O and Alarm blocks (placement & function).") + .attachKeyFrame() + .placeNearTarget(); + scene.idle(130); + } + + private static void showCallout(SceneBuilder scene, SceneBuildingUtil util, BlockPos at, CalloutInfo info, boolean reduced) { + scene.overlay().showText(reduced ? info.reducedDuration() : info.fullDuration()) + .text(info.text()) + .pointAt(util.vector().blockSurface(at, info.pointDirection())) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(reduced ? info.reducedIdle() : info.fullIdle()); + } + + public static void t1(SceneBuilder scene, SceneBuildingUtil util) { + int S = S_T1; + int plate = plateSizeFor(S); + scene.title("reactor_t1","Reactor T1"); + scene.configureBasePlate(0, 0, plate); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.showBasePlate(); + scene.rotateCameraY(180); + scene.scaleSceneView(0.55f); + showReactorStructure(scene, util, S, H_T1, plate, true); + } + + public static void t2(SceneBuilder scene, SceneBuildingUtil util) { + int S = S_T2; + int plate = plateSizeFor(S); + scene.title("reactor_t2","Reactor T2"); + scene.configureBasePlate(0, 0, plate); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.showBasePlate(); + scene.rotateCameraY(180); + scene.scaleSceneView(0.45f); + showReactorStructure(scene, util, S, H_T2, plate, true); + } + + public static void t3(SceneBuilder scene, SceneBuildingUtil util) { + int S = S_T3; + int plate = plateSizeFor(S); + scene.title("reactor_t3","Reactor T3"); + scene.configureBasePlate(0, 0, plate); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.showBasePlate(); + scene.rotateCameraY(180); + scene.scaleSceneView(0.35f); + // T3 reveals floor-by-floor (section-based) so the largest tier doesn't lag; T1/T2 stay block-by-block. + showReactorStructure(scene, util, S, H_T3, plate, true); + } + + public static void ioPlacement(SceneBuilder scene, SceneBuildingUtil util) { + int S = S_T1; + int plate = plateSizeFor(S); + Positions pos = positionsFor(S, H_T1); + + scene.title("reactor_io_placement", "Reactor I/O: Function & Placement"); + scene.configureBasePlate(0, 0, plate); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.showBasePlate(); + scene.rotateCameraY(180); + scene.scaleSceneView(0.55f); + + // Populate the correct I/O blocks at the beginning because the schematic has old broken IDs + scene.world().modifyBlock(pos.input1, s -> CNBlocks.REACTOR_ROD_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(pos.input2, s -> CNBlocks.REACTOR_ROD_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(pos.liquidInput, s -> CNBlocks.REACTOR_FLUID_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(pos.alarm, s -> CNBlocks.REACTOR_ALARM.get().defaultBlockState(), false); + scene.world().modifyBlock(pos.output, s -> CNBlocks.REACTOR_OUTPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.SOUTH), false); + + // Show the entire T1 structure instantly + scene.world().showSection(util.select().layersFrom(1), Direction.UP); + scene.idle(20); + + // Show Input 1 + scene.overlay().showText(150) + .text("Rod Input: Stores Heating or Cooling Rods. We need one Heating Rod (fuel) to heat the reactor, and one Cooling Rod for stability.") + .pointAt(util.vector().blockSurface(pos.input1, Direction.SOUTH)) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(160); + + // Show Input 2 + scene.overlay().showText(150) + .text("Second Rod Input: This is why we need at least two inputs! One for the Heating Rod and one for the Cooling Rod to prevent explosions.") + .pointAt(util.vector().blockSurface(pos.input2, Direction.SOUTH)) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(160); + + // Show Fluid Input + scene.overlay().showText(150) + .text("Fluid Input: Fluid is also required to cool the reactor and ensure it does not explode.") + .pointAt(util.vector().blockSurface(pos.liquidInput, Direction.SOUTH)) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(160); + + // Show Alarm + scene.overlay().showText(150) + .text("Alarm (Optional): Emits a sound when the reactor becomes unstable and risks exploding.") + .pointAt(util.vector().blockSurface(pos.alarm, Direction.SOUTH)) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(160); + + // Show Output + scene.overlay().showText(160) + .text("Output: Necessary to extract generated energy. You can place multiple outputs to dispatch the total energy between them.") + .pointAt(util.vector().blockSurface(pos.output, Direction.SOUTH)) + .attachKeyFrame() + .placeNearTarget(); + scene.idle(170); + + // --- Placement --- + scene.overlay().showText(120) + .text("These blocks can replace ANY Reactor Casing, as long as it is not on an edge.") + .attachKeyFrame() + .placeNearTarget(); + scene.idle(130); + + // Demonstrate moving the blocks to the roof (y=7 for T1) + BlockPos newIn1 = new BlockPos(3, 7, 3); + BlockPos newIn2 = new BlockPos(3, 7, 4); + BlockPos newLiq = new BlockPos(3, 7, 5); + BlockPos newAlm = new BlockPos(5, 7, 3); + BlockPos newOut = new BlockPos(5, 7, 5); + + // Replace old pos with casing + scene.world().modifyBlock(pos.input1, s -> CNBlocks.REACTOR_CASING.get().defaultBlockState(), true); + scene.world().modifyBlock(pos.input2, s -> CNBlocks.REACTOR_CASING.get().defaultBlockState(), true); + scene.world().modifyBlock(pos.liquidInput, s -> CNBlocks.REACTOR_CASING.get().defaultBlockState(), true); + scene.world().modifyBlock(pos.alarm, s -> CNBlocks.REACTOR_CASING.get().defaultBlockState(), true); + scene.world().modifyBlock(pos.output, s -> CNBlocks.REACTOR_CASING.get().defaultBlockState(), true); + + // Place I/O on roof + scene.world().modifyBlock(newIn1, s -> CNBlocks.REACTOR_ROD_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP), true); + scene.world().modifyBlock(newIn2, s -> CNBlocks.REACTOR_ROD_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP), true); + scene.world().modifyBlock(newLiq, s -> CNBlocks.REACTOR_FLUID_INPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP), true); + // Note: ReactorAlarm might not have FACING. Using default state. + scene.world().modifyBlock(newAlm, s -> CNBlocks.REACTOR_ALARM.get().defaultBlockState(), true); + scene.world().modifyBlock(newOut, s -> CNBlocks.REACTOR_OUTPUT.get().defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP), true); + + scene.overlay().showText(100) + .text("They can be grouped together on the roof or any other flat surface.") + .pointAt(util.vector().blockSurface(newIn2, Direction.UP)) + .placeNearTarget(); + scene.idle(110); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNBiomeModifiers.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNBiomeModifiers.java index 92047c935..601662567 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNBiomeModifiers.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNBiomeModifiers.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.infrastructure.worldgen; -import com.simibubi.create.infrastructure.worldgen.AllPlacedFeatures; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderSet; @@ -20,6 +19,8 @@ public class CNBiomeModifiers { public static final ResourceKey URANIUM_ORE = key("uranium_ore"), LEAD_ORE = key("lead_ore"), + THORIUM_ORE = key("thorium_ore"), + NITRATE_ORE = key("nitrate_ore"), STRIATED_ORES_OVERWORLD = key("striated_ores_overworld") ; @@ -34,10 +35,14 @@ public static void bootstrap(BootstapContext ctx) { HolderGetter featureLookup = ctx.lookup(Registries.PLACED_FEATURE); Holder uraniumOre = featureLookup.getOrThrow(CNPlacedFeatures.URANIUM_ORE); Holder leadOre = featureLookup.getOrThrow(CNPlacedFeatures.LEAD_ORE); + Holder thoriumOre = featureLookup.getOrThrow(CNPlacedFeatures.THORIUM_ORE); + Holder nitrateOre = featureLookup.getOrThrow(CNPlacedFeatures.NITRATE_ORE); Holder striatedOresOverworld = featureLookup.getOrThrow(CNPlacedFeatures.STRIATED_ORES_OVERWORLD); ctx.register(URANIUM_ORE, addOre(isOverworld, uraniumOre)); ctx.register(LEAD_ORE, addOre(isOverworld, leadOre)); + ctx.register(THORIUM_ORE, addOre(isOverworld, thoriumOre)); + ctx.register(NITRATE_ORE, addOre(isOverworld, nitrateOre)); ctx.register(STRIATED_ORES_OVERWORLD, addOre(isOverworld, striatedOresOverworld)); } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java index 53c63b45c..cdee138f3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java @@ -23,6 +23,8 @@ public class CNConfiguredFeatures { public static final ResourceKey> URANIUM_ORE = key("uranium_ore"), LEAD_ORE = key("lead_ore"), + THORIUM_ORE = key("thorium_ore"), + NITRATE_ORE = key("nitrate_ore"), STRIATED_ORES_OVERWORLD = key("striated_ores_overworld") ; @@ -32,21 +34,31 @@ public class CNConfiguredFeatures { public static void bootstrap(BootstapContext> ctx) { RuleTest stoneOreReplaceable = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); - RuleTest deepslateOreReplaceables = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + RuleTest deepslateOreReplaceable = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); List uraniumTargetStates = List.of( OreConfiguration.target(stoneOreReplaceable, CNBlocks.URANIUM_ORE.getDefaultState()), - OreConfiguration.target(deepslateOreReplaceables, CNBlocks.DEEPSLATE_URANIUM_ORE.getDefaultState()) + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_URANIUM_ORE.getDefaultState()) ); - register(ctx, URANIUM_ORE, Feature.ORE, new OreConfiguration(uraniumTargetStates, 7)); List leadTargetStates = List.of( OreConfiguration.target(stoneOreReplaceable, CNBlocks.LEAD_ORE.getDefaultState()), - OreConfiguration.target(deepslateOreReplaceables, CNBlocks.DEEPSLATE_LEAD_ORE.getDefaultState()) + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_LEAD_ORE.getDefaultState()) + ); + register(ctx, LEAD_ORE, Feature.ORE, new OreConfiguration(leadTargetStates, 12)); + + List thoriumTargetStates = List.of( + OreConfiguration.target(stoneOreReplaceable, CNBlocks.THORIUM_ORE.getDefaultState()), + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_THORIUM_ORE.getDefaultState()) ); + register(ctx, THORIUM_ORE, Feature.ORE, new OreConfiguration(thoriumTargetStates, 12)); - register(ctx, LEAD_ORE, Feature.ORE, new OreConfiguration(leadTargetStates, 7)); + List nitrateTargetStates = List.of( + OreConfiguration.target(stoneOreReplaceable, CNBlocks.NITRATE_ORE.getDefaultState()), + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_NITRATE_ORE.getDefaultState()) + ); + register(ctx, NITRATE_ORE, Feature.ORE, new OreConfiguration(nitrateTargetStates, 10)); List overworldLayerPatterns = List.of( CNLayerPatterns.AUTUNITE.get() diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java index 2735718cb..3a0e2221c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.infrastructure.worldgen; -import com.simibubi.create.infrastructure.worldgen.ConfigPlacementFilter; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; @@ -19,6 +18,8 @@ public class CNPlacedFeatures { public static final ResourceKey URANIUM_ORE = key("uranium_ore"), LEAD_ORE = key("lead_ore"), + THORIUM_ORE = key("thorium_ore"), + NITRATE_ORE = key("nitrate_ore"), STRIATED_ORES_OVERWORLD = key("striated_ores_overworld") ; @@ -30,11 +31,15 @@ public static void bootstrap(BootstapContext ctx) { HolderGetter> featureLookup = ctx.lookup(Registries.CONFIGURED_FEATURE); Holder> uraniumOre = featureLookup.getOrThrow(CNConfiguredFeatures.URANIUM_ORE); Holder> leadOre = featureLookup.getOrThrow(CNConfiguredFeatures.LEAD_ORE); + Holder> thoriumOre = featureLookup.getOrThrow(CNConfiguredFeatures.THORIUM_ORE); + Holder> nitrateOre = featureLookup.getOrThrow(CNConfiguredFeatures.NITRATE_ORE); Holder> striatedOresOverworld = featureLookup.getOrThrow(CNConfiguredFeatures.STRIATED_ORES_OVERWORLD); - register(ctx, URANIUM_ORE, uraniumOre, placementOres(CountPlacement.of(6), -64, 64)); - register(ctx, LEAD_ORE, leadOre, placementOres(CountPlacement.of(6), -64, 64)); - register(ctx, STRIATED_ORES_OVERWORLD, striatedOresOverworld, placement(RarityFilter.onAverageOnceEvery(18), -30, 70)); + register(ctx, URANIUM_ORE, uraniumOre, placementOres(CountPlacement.of(4), -63, 16)); + register(ctx, LEAD_ORE, leadOre, placementOres(CountPlacement.of(10), -16, 60)); + register(ctx, THORIUM_ORE, thoriumOre, placementOres(CountPlacement.of(6), -16, 55)); + register(ctx, NITRATE_ORE, nitrateOre, placementOres(CountPlacement.of(6), -63, 64)); + register(ctx, STRIATED_ORES_OVERWORLD, striatedOresOverworld, placement(RarityFilter.onAverageOnceEvery(64), -63, 16)); } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java new file mode 100644 index 000000000..9214a4ea6 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacementModifiers.java @@ -0,0 +1,19 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen; + + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class CNPlacementModifiers { + private static final DeferredRegister> REGISTER = DeferredRegister.create(Registries.PLACEMENT_MODIFIER_TYPE, CreateNuclear.MOD_ID); + + public static final RegistryObject> CONFIG_FILTER = REGISTER.register("config_filter", () -> () -> ConfigPlacementFilter.CODEC); + + public static void register(IEventBus modEventBus) { + REGISTER.register(modEventBus); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java new file mode 100644 index 000000000..09b495182 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/ConfigPlacementFilter.java @@ -0,0 +1,24 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementFilter; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +public class ConfigPlacementFilter extends PlacementFilter { + public static final ConfigPlacementFilter INSTANCE = new ConfigPlacementFilter(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + @Override + protected boolean shouldPlace(PlacementContext pContext, RandomSource pRandom, BlockPos pPos) { + return CNConfigs.common().worldGen.enable.get(); + } + + @Override + public PlacementModifierType type() { + return CNPlacementModifiers.CONFIG_FILTER.get(); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMapping.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMapping.java new file mode 100644 index 000000000..707f9a555 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMapping.java @@ -0,0 +1,8 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; + +public record BiomeIrradiationMapping(TagKey sourceTag, ResourceKey target) { +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMappings.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMappings.java new file mode 100644 index 000000000..8a3a04963 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationMappings.java @@ -0,0 +1,28 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.biome.Biome; + +import java.util.List; + +public class BiomeIrradiationMappings { + private static final List MAPPINGS = List.of( + new BiomeIrradiationMapping(BiomeTags.IS_OVERWORLD, CNBiomes.Irradiated.PLAIN), + new BiomeIrradiationMapping(BiomeTags.IS_NETHER, CNBiomes.Irradiated.PLAIN), + new BiomeIrradiationMapping(BiomeTags.IS_END, CNBiomes.Irradiated.PLAIN) + ); + + private BiomeIrradiationMappings() {} + + public static ResourceKey resolveTarget(Holder currentBiome, ResourceKey fallback) { + for (BiomeIrradiationMapping mapping : MAPPINGS) { + if (currentBiome.is(mapping.sourceTag())) { + return mapping.target(); + } + } + + return fallback; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationService.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationService.java new file mode 100644 index 000000000..5c35d09aa --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationService.java @@ -0,0 +1,120 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.SectionPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeResolver; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; + +import java.util.ArrayList; +import java.util.List; + +public final class BiomeIrradiationService { + public static void circularArea(ServerLevel serverLevel, BlockPos center, ResourceKey defaultTarget, int radius) { + Registry biomeRegistry = serverLevel.registryAccess().registryOrThrow(Registries.BIOME); + + Holder currentAtCenter = serverLevel.getBiome(center); + ResourceKey targetAtCenter = BiomeIrradiationMappings.resolveTarget(currentAtCenter, defaultTarget); + if (currentAtCenter.is(targetAtCenter)) { + return; + } + + int minX = center.getX() - radius; + int maxX = center.getX() + radius; + int minZ = center.getZ() - radius; + int maxZ = center.getZ() + radius; + + double radiusSq = radius * radius; + BiomeResolver resolver = createCircularResolver(biomeRegistry, center, radiusSq, defaultTarget, serverLevel); + + List chunks = new ArrayList<>(); + for (int cz = SectionPos.blockToSectionCoord(minZ); cz < SectionPos.blockToSectionCoord(maxZ); ++cz) { + for (int cx = SectionPos.blockToSectionCoord(minX); cx < SectionPos.blockToSectionCoord(maxX); ++cx) { + ChunkAccess chunkAccess = serverLevel.getChunk(cx, cz, ChunkStatus.FULL, false); + if (chunkAccess != null) { + chunkAccess.fillBiomesFromNoise(resolver, serverLevel.getChunkSource().randomState().sampler()); + chunkAccess.setUnsaved(true); + chunks.add(chunkAccess); + } + } + } + + PersistentIrradiatedZones.get(serverLevel).addChunks(chunks.stream().map(ChunkAccess::getPos).toList()); + serverLevel.getChunkSource().chunkMap.resendBiomesForChunks(chunks); + } + + public static boolean restoreArea(ServerLevel serverLevel, BlockPos pos) { + ChunkPos centerChunk = new ChunkPos(pos); + PersistentIrradiatedZones zones = PersistentIrradiatedZones.get(serverLevel); + + List restored = new ArrayList<>(); + for (ChunkPos target : resolveRestoreTargets(centerChunk)) { + if (!zones.containsChunk(target)) continue; + + ChunkAccess chunkAccess = serverLevel.getChunk(target.x, target.z, ChunkStatus.FULL, false); + if (chunkAccess == null) continue; + + BiomeResolver resolver = (x, y, z, sample) -> serverLevel.getChunkSource().getGenerator().getBiomeSource().getNoiseBiome(x, y, z, sample); + + chunkAccess.fillBiomesFromNoise(resolver, serverLevel.getChunkSource().randomState().sampler()); + chunkAccess.setUnsaved(true); + restored.add(chunkAccess); + + zones.removeChunk(target); + } + + if (restored.isEmpty()) return false; + + serverLevel.getChunkSource().chunkMap.resendBiomesForChunks(restored); + + return true; + } + + private static List resolveRestoreTargets(ChunkPos center) { + if (!CNConfigs.server().biomeRestore.restoreInCircle.get()) { + return List.of(center); + } + + int radius = CNConfigs.server().biomeRestore.restoreRadiusChunks.get(); + List targets = new ArrayList<>(); + for (int dz = -radius; dz <= radius; dz++) { + for (int dx = -radius; dx <= radius; dx++) { + if (dx * dx + dz * dz <= radius * radius) { + targets.add(new ChunkPos(center.x + dx, center.z + dz)); + } + } + } + + return targets; + } + + private static BiomeResolver createCircularResolver(Registry biomeRegistry, BlockPos center, double radiusSq, ResourceKey defaultTarget, ServerLevel level) { + return (x, y, z, noise) -> { + int blockX = x << 2; + int blockZ = z << 2; + + double distX = blockX - center.getX(); + double distZ = blockZ - center.getZ(); + + Holder current = level.getBiome(new BlockPos(blockX, y << 2, blockZ)); + + if ((distX * distX) + (distZ * distZ) <= radiusSq) { + ResourceKey target = BiomeIrradiationMappings.resolveTarget(current, defaultTarget); + + return biomeRegistry.getHolderOrThrow(target); + } + + return current; + }; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNBiomes.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNBiomes.java new file mode 100644 index 000000000..ead5d6659 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNBiomes.java @@ -0,0 +1,29 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.*; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.nuclearteam.createnuclear.CreateNuclear; +import org.jetbrains.annotations.NotNull; + +public class CNBiomes { + public static final class Irradiated { + public static final ResourceKey PLAIN = key("irradiated_land"); + } + + public static void bootstrapRegistries(BootstapContext context) { + HolderGetter featureLookup = context.lookup(Registries.PLACED_FEATURE); + HolderGetter> carverLookup = context.lookup(Registries.CONFIGURED_CARVER); + HolderGetter soundLookup = context.lookup(Registries.SOUND_EVENT); + context.register(Irradiated.PLAIN, IrradiatedBiomes.createPlain(featureLookup, carverLookup, soundLookup)); + } + + public static @NotNull ResourceKey key(String id) { + return ResourceKey.create(Registries.BIOME, CreateNuclear.asResource(id)); + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNDensityFunctions.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNDensityFunctions.java new file mode 100644 index 000000000..f5a6fe1c6 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNDensityFunctions.java @@ -0,0 +1,41 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.DensityFunction; +import net.minecraft.world.level.levelgen.DensityFunctions; +import net.minecraft.world.level.levelgen.synth.BlendedNoise; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class CNDensityFunctions { + public static final class Irradiated { + public static final ResourceKey EROSION = createKey("irradiated/erosion"); + public static final ResourceKey FINAL_DENSITY = createKey("irradiated/final_density"); + } + + private static ResourceKey createKey(String id) { + return ResourceKey.create(Registries.DENSITY_FUNCTION, CreateNuclear.asResource(id)); + } + + public static void bootstrapRegistries(BootstapContext context) { + context.register(Irradiated.EROSION, DensityFunctions.add( + DensityFunctions.yClampedGradient(0, 90, 1, -1), + BlendedNoise.createUnseeded(0.25, 0.375, 80.0, 160.0, 8.0) + )); + + context.register(Irradiated.FINAL_DENSITY, DensityFunctions.add( + DensityFunctions.yClampedGradient(0, 90, 1, -1), + BlendedNoise.createUnseeded(0.25, 0.375, 80.0, 160.0, 8.0) + )); + } + + private static DensityFunction registerAndWrap(BootstapContext context, ResourceKey key, DensityFunction densityFunction) { + return new DensityFunctions.HolderHolder(context.register(key, densityFunction)); + } + + public static DensityFunction getFunction(HolderGetter densityFunctions, ResourceKey key) { + return new DensityFunctions.HolderHolder(densityFunctions.getOrThrow(key)); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseData.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseData.java new file mode 100644 index 000000000..775908820 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseData.java @@ -0,0 +1,29 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.synth.NormalNoise.NoiseParameters; +import net.nuclearteam.createnuclear.CreateNuclear; + +public class CNNoiseData { + public static final ResourceKey EROSION = createKey("irradiated/erosion"); + + private static ResourceKey createKey(String id) { + return ResourceKey.create(Registries.NOISE, CreateNuclear.asResource(id)); + } + + public static void bootstrapRegistries(BootstapContext context) { + register(context, EROSION, -9, 1.0, 1.0, 0.0, 1.0, 1.0); + } + + private static void register( + BootstapContext context, + ResourceKey key, + int firstOctave, + double amplitude, + double... otherAmplitudes + ) { + context.register(key, new NoiseParameters(firstOctave, amplitude, otherAmplitudes)); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseGeneratorSettings.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseGeneratorSettings.java new file mode 100644 index 000000000..2c8c02c89 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseGeneratorSettings.java @@ -0,0 +1,99 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.OverworldBiomeBuilder; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.*; +import net.minecraft.world.level.levelgen.synth.NormalNoise; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule.IrradiatedSurfaceRules; +import org.jetbrains.annotations.NotNull; + +public class CNNoiseGeneratorSettings { + public static final ResourceKey IRRADIATED = key("irradiated_noise"); + + public static void bootstrapRegistries(BootstapContext context) { + HolderGetter densityLookup = context.lookup(Registries.DENSITY_FUNCTION); + HolderGetter noiseLookup = context.lookup(Registries.NOISE); + + context.register(IRRADIATED, new NoiseGeneratorSettings( + NoiseSettings.create(-32, 256, 1, 2), + CNBlocks.STEEL_BLOCK.get().defaultBlockState(), + Blocks.AIR.defaultBlockState(), + CNNoiseGeneratorSettings.irradiated(densityLookup, noiseLookup), + IrradiatedSurfaceRules.DEFAULT_RULE, + new OverworldBiomeBuilder().spawnTarget(), + 32, + false, + false, + false, + false + )); + } + + public static NoiseRouter irradiated(HolderGetter densityLookup, HolderGetter noiseLookup) { + DensityFunction shiftX = CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.SHIFT_X); + DensityFunction shiftZ = CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.SHIFT_Z); + DensityFunction y = CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.Y); + return new NoiseRouter( + DensityFunctions.constant(1), // barrierNoise + DensityFunctions.zero(), // fluidLevelFloodednessNoise + DensityFunctions.zero(), // fluidLevelSpreadNoise + DensityFunctions.zero(), // lavaNoise + DensityFunctions.shiftedNoise2d( + shiftX, shiftZ, 0.25, noiseLookup.getOrThrow(Noises.TEMPERATURE) + ), // temperature + DensityFunctions.shiftedNoise2d( + shiftX, shiftZ, 0, noiseLookup.getOrThrow(Noises.VEGETATION) + ), // vegetation + CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.CONTINENTS), // continents + CNDensityFunctions.getFunction(densityLookup, CNDensityFunctions.Irradiated.EROSION), // erosion + CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.DEPTH), // depth + CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.RIDGES), // ridges + DensityFunctions.add( + DensityFunctions.constant(0.1171875), + DensityFunctions.mul( + DensityFunctions.yClampedGradient( + -30, -40, 0, 1 + ), + DensityFunctions.add( + DensityFunctions.constant(-0.1171875), + DensityFunctions.add( + DensityFunctions.constant(-0.078125), + DensityFunctions.mul( + DensityFunctions.yClampedGradient( + 240, 256, 1, 0 + ), + DensityFunctions.add( + DensityFunctions.constant(0.078125), + DensityFunctions.add( + DensityFunctions.constant(-0.703125), + DensityFunctions.mul( + DensityFunctions.constant(4), + DensityFunctions.mul( + CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.DEPTH), + DensityFunctions.cache2d(CNDensityFunctions.getFunction(densityLookup, NoiseRouterData.FACTOR)) + ).quarterNegative() + ) + ).clamp(-30, 64) + ) + ) + ) + ) + ) + ), // initialDensityWithoutJaggedness + DensityFunctions.blendDensity(CNDensityFunctions.getFunction(densityLookup, CNDensityFunctions.Irradiated.FINAL_DENSITY)), // finalDensity + DensityFunctions.zero(), // veinToggle + DensityFunctions.zero(), // veinRidged + DensityFunctions.zero() // veinGap + ); + } + + private static @NotNull ResourceKey key(String id) { + return ResourceKey.create(Registries.NOISE_SETTINGS, CreateNuclear.asResource(id)); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/IrradiatedBiomes.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/IrradiatedBiomes.java new file mode 100644 index 000000000..69cbc7c92 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/IrradiatedBiomes.java @@ -0,0 +1,57 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.*; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.nuclearteam.createnuclear.CNSoundEvents; +import net.nuclearteam.createnuclear.content.particles.IrradiatedParticlesData; + +public class IrradiatedBiomes { + public static Biome createPlain(HolderGetter featureLookup, HolderGetter> carverLookup, HolderGetter soundLookup) { + return IrradiatedBiomes.irradiated(featureLookup, carverLookup, soundLookup, new BiomeGenerationSettings.Builder(featureLookup, carverLookup)); + } + + public static Biome irradiated(HolderGetter featureGetter, HolderGetter> carverGetter, HolderGetter soundLookup, BiomeGenerationSettings.Builder generation) { + MobSpawnSettings.Builder spawnBuilder = new MobSpawnSettings.Builder(); + BiomeSpecialEffects.Builder effectBuilder = new BiomeSpecialEffects.Builder(); + + effectBuilder + // Water: murky green + .waterColor(0x3B5133) + .waterFogColor(0x0A0E0A) + + // Fog: sickly radioactive green (kept bright so it stays visible) + .fogColor(0x485E3E) + + // Sky: washed-out grey-green (still lets the sun/moon and day-night cycle show through) + .skyColor(0x324132) + + // Grass: sulfur yellow / scorched + .grassColorOverride(0x8C8F5B) + + // Foliage: withered olive + .foliageColorOverride(0x565E3E) + + .ambientParticle(new AmbientParticleSettings(new IrradiatedParticlesData(), 0.025F)) + .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS) + // Plays continuously for as long as the player stands in the biome, under the + // Ambient/Environment volume slider. Deliberately NOT also set as .backgroundMusic(): + // that would start a second, unsynchronised copy of the same file in the MUSIC + // category, and the two would phase against each other. + .ambientLoopSound(soundLookup.getOrThrow(ResourceKey.create(Registries.SOUND_EVENT, CNSoundEvents.BIOME_WASTELAND.getId()))) + ; + + return new Biome.BiomeBuilder() + .mobSpawnSettings(spawnBuilder.build()) + .hasPrecipitation(false) + .temperature(2.0f) + .downfall(0f) + .specialEffects(effectBuilder.build()) + .generationSettings(generation.build()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/PersistentIrradiatedZones.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/PersistentIrradiatedZones.java new file mode 100644 index 000000000..572ef1077 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/PersistentIrradiatedZones.java @@ -0,0 +1,72 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.saveddata.SavedData; +import net.nuclearteam.createnuclear.CreateNuclear; + +import java.util.HashSet; +import java.util.Set; + +public class PersistentIrradiatedZones extends SavedData { + private static final String DATA = String.join("_", CreateNuclear.MOD_ID, "irradiated", "zones"); + + private final Set chunks = new HashSet<>(); + + public static PersistentIrradiatedZones get(ServerLevel level) { + return level.getDataStorage().computeIfAbsent(nbt -> { + PersistentIrradiatedZones d = new PersistentIrradiatedZones(); + d.readFrom(nbt); + + return d; + }, PersistentIrradiatedZones::new, DATA); + } + + public void addChunks(Iterable newChunks) { + boolean changed = false; + for (ChunkPos pos : newChunks) { + changed |= chunks.add(pos); + } + + if (changed) setDirty(); + } + + public boolean isInsideAnyZone(BlockPos pos) { + return chunks.contains(new ChunkPos(pos)); + } + + public boolean containsChunk(ChunkPos pos) { + return chunks.contains(pos); + } + + public void removeChunk(ChunkPos pos) { + if (chunks.remove(pos)) setDirty(); + } + + public void readFrom(CompoundTag nbt) { + chunks.clear(); + ListTag list = nbt.getList("chunks", Tag.TAG_COMPOUND); + list.forEach(tag -> { + CompoundTag e = (CompoundTag) tag; + + chunks.add(new ChunkPos(e.getInt("x"), e.getInt("z"))); + }); + } + + @Override + public CompoundTag save(CompoundTag nbt) { + ListTag list = new ListTag(); + chunks.forEach(pos -> { + CompoundTag e = new CompoundTag(); + e.putInt("x", pos.x); + e.putInt("z", pos.z); + list.add(e); + }); + nbt.put("chunks", list); + return nbt; + } +} diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/BiomeTagRule.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/BiomeTagRule.java new file mode 100644 index 000000000..033b5dabc --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/BiomeTagRule.java @@ -0,0 +1,35 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.TagKey; +import net.minecraft.util.KeyDispatchDataCodec; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.SurfaceRules; +import org.jetbrains.annotations.NotNull; + +public record BiomeTagRule(@NotNull TagKey tag) implements SurfaceRules.ConditionSource { + private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(TagKey.codec(Registries.BIOME).fieldOf("tag").forGetter(rule -> rule.tag)).apply(instance, BiomeTagRule::new)); + + @Override + public KeyDispatchDataCodec codec() { + return KeyDispatchDataCodec.of(BiomeTagRule.CODEC); + } + + @Override + public SurfaceRules.Condition apply(SurfaceRules.Context context) { + return new Predicate(context); + } + + private class Predicate extends SurfaceRules.LazyYCondition { + protected Predicate(SurfaceRules.Context context) { + super(context); + } + + @Override + protected boolean compute() { + return this.context.biome.get().is(BiomeTagRule.this.tag); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules.java new file mode 100644 index 000000000..a12cb4852 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules.java @@ -0,0 +1,81 @@ +package net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.SurfaceRules.ConditionSource; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.nuclearteam.createnuclear.CNBlocks; +import net.nuclearteam.createnuclear.CreateNuclear; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; +import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNNoiseData; +import org.jetbrains.annotations.NotNull; + +public class IrradiatedSurfaceRules { + private static final ConditionSource IS_IRRADIATED_PLAIN = biome(CNBiomes.Irradiated.PLAIN); + + private static final RuleSource BEDROCK = block(Blocks.BEDROCK); + private static final RuleSource ENRICHED_SOUL_SOIL = block(CNBlocks.ENRICHED_SOUL_SOIL.get()); + private static final RuleSource LEAD_BLOCK = block(CNBlocks.LEAD_BLOCK.get()); + private static final RuleSource LEAD_ORE = block(CNBlocks.LEAD_ORE.get()); + private static final RuleSource RAW_LEAD_BLOCK = block(CNBlocks.RAW_LEAD_BLOCK.get()); + + private static final RuleSource IRRADIATED_PLAIN_MATERIAL = + SurfaceRules.ifTrue(IS_IRRADIATED_PLAIN, RAW_LEAD_BLOCK); + private static final RuleSource SURFACE_GENERATION = SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, IRRADIATED_PLAIN_MATERIAL), + SurfaceRules.ifTrue(SurfaceRules.UNDER_FLOOR, IRRADIATED_PLAIN_MATERIAL) + ); + + public static final RuleSource DEFAULT_RULE = createDefaultRule(); + + public static @NotNull RuleSource createDefaultRule() { + return SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.isBiome(CNBiomes.Irradiated.PLAIN), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.noiseCondition(CNNoiseData.EROSION, 0.035, 0.0465), + LEAD_ORE + ), + SurfaceRules.ifTrue( + SurfaceRules.noiseCondition(CNNoiseData.EROSION, 0.039, 0.0545), + LEAD_BLOCK + ), + SurfaceRules.ifTrue( + SurfaceRules.noiseCondition(CNNoiseData.EROSION, 0.0545, 0.069), + RAW_LEAD_BLOCK + ) + ) + ), + + SurfaceRules.ifTrue(SurfaceRules.verticalGradient("bedrock_floor", VerticalAnchor.bottom(), VerticalAnchor.aboveBottom(5)), BEDROCK), + SurfaceRules.ifTrue(SurfaceRules.abovePreliminarySurface(), SURFACE_GENERATION), + SurfaceRules.ifTrue(SurfaceRules.verticalGradient("enriched", VerticalAnchor.absolute(-4), VerticalAnchor.absolute(4)), ENRICHED_SOUL_SOIL) + ); + } + + private static @NotNull RuleSource block(@NotNull Block block) { + return SurfaceRules.state(block.defaultBlockState()); + } + + public static SurfaceRules.@NotNull ConditionSource biome(@NotNull TagKey biome) { + return new BiomeTagRule(biome); + } + + @SafeVarargs + public static SurfaceRules.@NotNull ConditionSource biome(@NotNull ResourceKey @NotNull ... keys) { + return SurfaceRules.isBiome(keys); + } + + public static void register() { + Registry.register(BuiltInRegistries.MATERIAL_RULE, CreateNuclear.asResource("irradiated_surface"), Codec.unit(DEFAULT_RULE)); + } +} \ 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 79226f6fa..ab625c076 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,3 +1,12 @@ public net.minecraft.world.item.crafting.RecipeManager f_44007_ # recipes public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/world/item/alchemy/Potion;Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/alchemy/Potion;)V + +public net.minecraft.world.level.levelgen.SurfaceRules$Context +public net.minecraft.world.level.levelgen.SurfaceRules$LazyYCondition +public net.minecraft.world.level.levelgen.SurfaceRules$Condition +public net.minecraft.world.level.levelgen.SurfaceRules$Context f_189555_ # biome +public net.minecraft.world.level.levelgen.NoiseRouterData f_209448_ # SHIFT_X +public net.minecraft.world.level.levelgen.NoiseRouterData f_209447_ # Y +public net.minecraft.world.level.levelgen.NoiseRouterData f_209449_ # SHIFT_Z +public net.minecraft.client.Camera move(DDD)V \ 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 f9f24587b..7db08c4ab 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -10,7 +10,7 @@ version="${mod_version}" displayName="${mod_name}" authors="${mod_authors}" description='''${mod_description}''' -logoFile = "logo.png" +logoFile = "icon.png" [[dependencies.${mod_id}]] modId="forge" diff --git a/src/main/resources/assets/createnuclear/lang/af_za.json b/src/main/resources/assets/createnuclear/lang/af_za.json index 66d33db1c..4a522bb46 100644 --- a/src/main/resources/assets/createnuclear/lang/af_za.json +++ b/src/main/resources/assets/createnuclear/lang/af_za.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/ar_sa.json b/src/main/resources/assets/createnuclear/lang/ar_sa.json index 31e25e541..49b90a107 100644 --- a/src/main/resources/assets/createnuclear/lang/ar_sa.json +++ b/src/main/resources/assets/createnuclear/lang/ar_sa.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "سهم الإشعاع", "itemGroup.createnuclear.main": "الصناعة نووي", "itemgroup.uranium": "مجموعة اليورانيوم", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "تم تركيب المفاعل", "reactor.info.assembled.destroyer": "تم تفكيك المفاعل", "reactor.info.assembled.none": "المفاعل لم يتم تركيبه", diff --git a/src/main/resources/assets/createnuclear/lang/ca_es.json b/src/main/resources/assets/createnuclear/lang/ca_es.json index e79a54d96..6179bf7c6 100644 --- a/src/main/resources/assets/createnuclear/lang/ca_es.json +++ b/src/main/resources/assets/createnuclear/lang/ca_es.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/cs_cz.json b/src/main/resources/assets/createnuclear/lang/cs_cz.json index 975ffa878..a8c3ee756 100644 --- a/src/main/resources/assets/createnuclear/lang/cs_cz.json +++ b/src/main/resources/assets/createnuclear/lang/cs_cz.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Šíp ozáření", "itemGroup.createnuclear.main": "Create Nukleární", "itemgroup.uranium": "Skupina Uranu", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reaktor byl sestaven", "reactor.info.assembled.destroyer": "Reaktor byl rozebrán", "reactor.info.assembled.none": "Reaktor není sestaven", diff --git a/src/main/resources/assets/createnuclear/lang/da_dk.json b/src/main/resources/assets/createnuclear/lang/da_dk.json index 5c6a89ab7..245279f49 100644 --- a/src/main/resources/assets/createnuclear/lang/da_dk.json +++ b/src/main/resources/assets/createnuclear/lang/da_dk.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Pil af stråling", "itemGroup.createnuclear.main": "Create Atomkraft", "itemgroup.uranium": "Uran gruppe", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reaktoren er blevet monteret", "reactor.info.assembled.destroyer": "Reaktoren er blevet demonteret", "reactor.info.assembled.none": "Reaktoren er ikke monteret", diff --git a/src/main/resources/assets/createnuclear/lang/de_de.json b/src/main/resources/assets/createnuclear/lang/de_de.json index 2d5dae35c..aa7eb5bd4 100644 --- a/src/main/resources/assets/createnuclear/lang/de_de.json +++ b/src/main/resources/assets/createnuclear/lang/de_de.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Pfeil der Strahlung", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uran Gruppe", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reaktor wurde zusammengebaut", "reactor.info.assembled.destroyer": "Reaktor wurde zerlegt", "reactor.info.assembled.none": "Reaktor ist nicht zusammengebaut", diff --git a/src/main/resources/assets/createnuclear/lang/default/interface.json b/src/main/resources/assets/createnuclear/lang/default/interface.json index 1fc72eea6..6a27be52a 100644 --- a/src/main/resources/assets/createnuclear/lang/default/interface.json +++ b/src/main/resources/assets/createnuclear/lang/default/interface.json @@ -1,11 +1,16 @@ { "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", + "biome.createnuclear.irradiated_land": "Irradiated Land", "createnuclear.enriched.fan.recipe": "Bulk Enriching", "emi.category.createnuclear.fan_enriched": "Bulk Enriching", "create.recipe.fan_enriched.fan": "Fan behind Enriched Fire", + "createnuclear.snow_powder.fan.recipe": "Cryogenic fan", + "emi.category.createnuclear.snow_powder": "Cryogenic fan", + "create.recipe.fan_snow_powder.fan": "Fan behind Powder Snow", + "gui.createnuclear.reactor_controller.title": "Reactor Controller", "gui.createnuclear.reactor_input.title": "Reactor Input Storage", @@ -17,9 +22,75 @@ "createnuclear.tooltip.heatLevel.danger": "Danger", "createnuclear.generic.unit.heat": "Q", - "createnuclear.tooltip.item.uranium.rod": "Uranium Rod: ", - "createnuclear.tooltip.item.graphene.rod": "Graphite Rod: ", + "createnuclear.tooltip.item.fuel.rod": "Fuel Rod: ", + "createnuclear.tooltip.item.cooled.rod": "Cooler Rod: ", "createnuclear.tooltip.item.unknown.rod": "Unknown: ", - "createnuclear.gui.reactor_controller.info_header.title": "Heat value" + "createnuclear.tooltip.item.empty.rod": "Input Items: ", + "createnuclear.gui.reactor_controller.info_header.title": "Heat value", + + "createnuclear.generic.unit.countCooled.rod": "Count Cooled Rod: %d", + "createnuclear.generic.unit.countFuel.rod": "Count Fuel Rod: %d", + "createnuclear.generic.unit.count.rod": "Counts %s Rod", + "createnuclear.display_source.reactor_count_rod": "Count Rod in Pattern", + "createnuclear.display_source.reactor_controller_count_rod.fuel": "Fuel", + "createnuclear.display_source.reactor_controller_count_rod.cooled": "Cooled", + + "createnuclear.generic.unit.heat.value": "Q", + "createnuclear.generic.unit.heat.rotation": "RPM", + "createnuclear.generic.unit.heat.type": "Heat Level: %s", + "createnuclear.generic.unit.fluid.value": "mB", + "createnuclear.display_source.heat.value": "Q", + "createnuclear.display_source.heat.rotation": "RPM", + "createnuclear.display_source.heat.type": "Heat level", + "createnuclear.display_source.reactor_summary": "Reactor Summary", + "createnuclear.display_source.heat": "Reactor Heat", + "createnuclear.display_source.liquid_level": "Reactor Liquid Level", + "createnuclear.display_source.fuel": "Reactor Fuel", + "createnuclear.display_source.cooler": "Reactor Cooler", + "createnuclear.display_source.size": "Reactor Size", + "createnuclear.display_source.reactor_summary.no_controller": "Reactor not found", + "createnuclear.display_source.reactor_summary.status": "Status:", + "createnuclear.display_source.reactor_summary.active": "ACTIVE", + "createnuclear.display_source.reactor_summary.idle": "IDLE", + "createnuclear.display_source.reactor_summary.temperature": "Temp:", + "createnuclear.display_source.reactor_summary.fuel": "Rods:", + "createnuclear.display_source.reactor_summary.coolant": "Coolant:", + "createnuclear.display_source.reactor.not_enough_space": "Not enough space ", + "createnuclear.display_source.reactor.for_reactor_status": "for reactor status", + "createnuclear.display_source.reactor.no_controller": "No Reactor Controller found", + "createnuclear.display_source.reactor.status": "Status: ", + "createnuclear.display_source.reactor.active": "ACTIVE", + "createnuclear.display_source.reactor.idle": "IDLE", + "createnuclear.display_source.reactor.size": "Tier: ", + "createnuclear.display_source.reactor.fuel": "Fuel: ", + "createnuclear.display_source.reactor.cooler": "Cooler: ", + "createnuclear.display_source.reactor.heat": "Heat: ", + "createnuclear.display_source.reactor.mode.value": "Values", + "createnuclear.display_source.reactor.mode.percent": "Percentages", + "createnuclear.display_source.reactor.mode.gauge": "Gauges", + "createnuclear.display_source.reactor.size.small": "Small", + "createnuclear.display_source.reactor.size.medium": "Medium", + "createnuclear.display_source.reactor.size.large": "Large", + "createnuclear.display_source.reactor.mode.normal": "Normal", + "createnuclear.display_source.reactor.fluid": "Fluid: ", + + "createnuclear.generic.unit.liquid": "WIP", + "createnuclear.display_source.liquid": "Liquid Level", + "createnuclear.tooltip.fluid": "Fluid: %s ", + "createnuclear.tooltip.fluid.none": "Fluid: None ", + "createnuclear.tooltip.fluid.amount": "%d mb", + + "createnuclear.generic.unit.seconds": "s", + "createnuclear.notification.reactor.meltdown_in": "CORE MELTDOWN IN ", + "createnuclear.notification.reactor.overheating": "WARNING: CORE OVERHEATING", + "createnuclear.notification.reactor.critical_failure": "CRITICAL FAILURE", + "createnuclear.notification.reactor.imminent_explosion": "IMMINENT EXPLOSION", + "createnuclear.notification.reactor.stabilized": "CORE STABILIZED", + "createnuclear.notification.reactor.destroyed": "REACTOR DESTROYED", + "createnuclear.notification.reactor.meltdown_finished": "Critical meltdown completed", + "createnuclear.notification.reactor.disassembled": "Reactor has been disassembled", + "createnuclear.notification.reactor.assembled": "Reactor has been assembled", + "death.attack.createnuclear.radiation": "%1$s died from radiation", + "death.attack.createnuclear.fan_radiation": "%1$s died from radiation blast" } diff --git a/src/main/resources/assets/createnuclear/lang/default/irradiated.json b/src/main/resources/assets/createnuclear/lang/default/irradiated.json new file mode 100644 index 000000000..fab98a1a7 --- /dev/null +++ b/src/main/resources/assets/createnuclear/lang/default/irradiated.json @@ -0,0 +1,3 @@ +{ + "irradiated.taming.wip": "This creature cannot be tamed yet - irradiated mobs are still a work in progress" +} diff --git a/src/main/resources/assets/createnuclear/lang/default/potion.json b/src/main/resources/assets/createnuclear/lang/default/potion.json index 913480499..af7439ee8 100644 --- a/src/main/resources/assets/createnuclear/lang/default/potion.json +++ b/src/main/resources/assets/createnuclear/lang/default/potion.json @@ -15,5 +15,17 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_1": "Arrow of Radiation", "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", - "item.minecraft.tipped_arrow.effect.potion_of_radiation_2": "Arrow of Radiation" + "item.minecraft.tipped_arrow.effect.potion_of_radiation_2": "Arrow of Radiation", + + "effect.createnuclear.iodine": "Iodine", + + "item.minecraft.potion.effect.potion_of_iodine": "Potion of Iodine", + "item.minecraft.splash_potion.effect.potion_of_iodine": "Splash Potion of Iodine", + "item.minecraft.lingering_potion.effect.potion_of_iodine": "Lingering Potion of Iodine", + "item.minecraft.tipped_arrow.effect.potion_of_iodine": "Arrow of Iodine", + + "item.minecraft.potion.effect.potion_of_iodine_augment": "Potion of Iodine", + "item.minecraft.splash_potion.effect.potion_of_iodine_augment": "Splash Potion of Iodine", + "item.minecraft.lingering_potion.effect.potion_of_iodine_augment": "Lingering Potion of Iodine", + "item.minecraft.tipped_arrow.effect.potion_of_iodine_augment": "Arrow of Iodine" } \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/default/reactor.json b/src/main/resources/assets/createnuclear/lang/default/reactor.json index 67908b9dd..735d9a8ca 100644 --- a/src/main/resources/assets/createnuclear/lang/default/reactor.json +++ b/src/main/resources/assets/createnuclear/lang/default/reactor.json @@ -1,8 +1,14 @@ { - "reactor.info.assembled.none": "Reactor is not assembled", - "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.creator": "Reactor has been assembled", - "reactor.info.is": "controller is", "reactor.item.gui.name": "Config Pattern", - "reactor.update.casing.input": "Update the casing in input" + "reactor.update.casing.input": "Update the casing in input", + + "createnuclear.reactor.debug.title": "--- Reactor diagnostics ---", + "createnuclear.reactor.debug.summary": "%s: %s registered, %s valid", + "createnuclear.reactor.debug.registered_position": " registered @ %s", + "createnuclear.reactor.debug.valid_position": " valid @ %s", + "createnuclear.reactor.debug.label.input": "Input", + "createnuclear.reactor.debug.label.fluid_input": "Fluid Input", + "createnuclear.reactor.debug.label.output": "Output", + "createnuclear.reactor.debug.label.alarm": "Alarm" } \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/default/tooltips.json b/src/main/resources/assets/createnuclear/lang/default/tooltips.json index 94b20cf05..8dadffb97 100644 --- a/src/main/resources/assets/createnuclear/lang/default/tooltips.json +++ b/src/main/resources/assets/createnuclear/lang/default/tooltips.json @@ -4,9 +4,13 @@ "tag.item.createnuclear.fuel": "Fuel", - "block.createnuclear.reactor_input.tooltip.summary": "_The Reactor Input_ is a _block_ that can be used to insert _Uranium_ and _Graphene_ rods into the _Reactor_", - "block.createnuclear.reactor_input.tooltip.condition1": "When the Reactor is assembled", - "block.createnuclear.reactor_input.tooltip.behaviour1": "Insert _uranium_ and _graphene_ rods in large quantities to power _the reactor_ ", + "block.createnuclear.reactor_rod_input.tooltip.summary": "_The Reactor Rod Input_ is a _block_ that can be used to insert _Heating_ or _Cooling_ rods into the Reactor.", + "block.createnuclear.reactor_rod_input.tooltip.condition1": "When the reactor is assembled", + "block.createnuclear.reactor_rod_input.tooltip.behaviour1": "Insert _Heating_ (like _Uranium_ or _Thorium_) and _Cooling_ (like _Graphite_) rods in large quantities to power _The Reactor_.", + + "block.createnuclear.reactor_fluid_input.tooltip.summary": "_The Reactor Fluid Input_ is a _block_ that can be used to insert _Water_ or _Liquid Nitrogen_ into the Reactor.", + "block.createnuclear.reactor_fluid_input.tooltip.condition1": "When the reactor is assembled", + "block.createnuclear.reactor_fluid_input.tooltip.behaviour1": "Insert _Water_ or _Liquid Nitrogen_ in large quantities to power _The Reactor_ and avoid _overheating_.", "block.createnuclear.reactor_controller.tooltip.summary": " The _Reactor Controller_ is the _most important_ block for operating the reactor", @@ -29,19 +33,33 @@ "block.createnuclear.reactor_frame.tooltip.summary": "_Block_ used to build the _reactor_", - "item.createnuclear.graphite_rod.tooltip.summary": "_Stick_ to be used in the _reactor input_ to operate it.", + "item.createnuclear.graphite_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", + + "item.createnuclear.uranium_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", - "item.createnuclear.uranium_rod.tooltip.summary": "_Stick_ to be used in the _reactor input_ to operate it.", + "item.createnuclear.thorium_rod.tooltip.summary": "_Rod_ to be used in the _reactor rod input_ to operate it.", "item.createnuclear.reactor_blueprint_item.tooltip.summary": "It allows you to configure your own pattern.", - "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Filled with graphite and uranium rods", + "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Filled with cooling and heating rods", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour1": "_Right_ click to fill it.", "item.createnuclear.reactor_blueprint_item.tooltip.condition2": "The reactor must be assembled", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour2": "_Right_ click on the reactor controller to open it.", + "item.createnuclear.reactor_blueprint.tooltip": "Used to design and visualize the reactor's interior layout.", + "item.createnuclear.reactor_blueprint.tooltip_hint": "§7Press §eShift + Right Click §7to with the blueprint in hand to get the Wiki link.", + "item.createnuclear.reactor_blueprint.chat_info": "Follow the link to open the documentation:", + "item.createnuclear.reactor_blueprint.wiki_link": "[Open Official Wiki]", - "block.createnuclear.enriched_soul_soil.tooltip.summary": "The _only_ block who create _enriched fire_.Can be used to _craft_ enriched campfire or just to make a _green fire_.", + "block.createnuclear.enriched_soul_soil.tooltip.summary": "The _only_ block who create _enriched fire_. Can be used to _craft_ enriched campfire or just to make a _green fire_.", + "item.createnuclear.biome_irradiation_extractor.tooltip.summary": "This item is currently in _beta_ and will change it's form & texture in the next update.", + "createnuclear.tooltip.biome_irradiation_extractor.biome_restore": "Restorations: %d / %d", + "createnuclear.tooltip.statRod": "Rod Stat Pattern:", + "createnuclear.tooltip.baseRodHeat": "Base Rod Heat: %d Q", + "createnuclear.tooltip.proximityRodHeat": "Proximity Rod Heat: %.2f Q", + "createnuclear.tooltip.rodTimer": "Rod Duration: %d tick", + "createnuclear.tooltip.ratio": "Rod Value for ratio: %d", + "createnuclear.tooltip.typeRod": "Rod Type: %s", "tag.item.c.coal_dusts": "Coal Dusts", @@ -58,6 +76,5 @@ "tag.item.trinkets.head.face": "Head Face", - - "overlay.event_message": "⚠ Warning ⚠ %s timer" + "attribute.name.createnuclear.generic.irradiated_resistance": "Radiation Resistance" } \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/el_gr.json b/src/main/resources/assets/createnuclear/lang/el_gr.json index e79a54d96..6179bf7c6 100644 --- a/src/main/resources/assets/createnuclear/lang/el_gr.json +++ b/src/main/resources/assets/createnuclear/lang/el_gr.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/en_US.json b/src/main/resources/assets/createnuclear/lang/en_US.json index f7cde70fb..b01ee4c7f 100644 --- a/src/main/resources/assets/createnuclear/lang/en_US.json +++ b/src/main/resources/assets/createnuclear/lang/en_US.json @@ -1,4 +1,5 @@ { + "biome.createnuclear.irradiated_land": "Irradiated Land", "block.createnuclear.deepslate_lead_ore": "Deepslate Lead Ore", "block.createnuclear.deepslate_uranium_ore": "Deepslate Uranium Ore", "block.createnuclear.enriched_soul_soil": "Enriched Soul Soil", @@ -23,19 +24,17 @@ "createnuclear.enriched.fan.recipe": "Bulk Enriched", "createnuclear.generic.unit.heat": "Q", "createnuclear.gui.reactor_controller.info_header.title": "Heat value", - "createnuclear.ponder.reactor.header": "Setup from Reactor", - "createnuclear.ponder.reactor.text_1": "Floor 1", - "createnuclear.ponder.reactor.text_10": "Floor 7", - "createnuclear.ponder.reactor.text_2": "Reactor Output: This is where the block outputs the energy (SU) generated from production.", - "createnuclear.ponder.reactor.text_3": "Floor 2", - "createnuclear.ponder.reactor.text_4": "Floor 3", - "createnuclear.ponder.reactor.text_5": "Floor 4", - "createnuclear.ponder.reactor.text_6": "Reactor Input: A block that stores uranium rods and graphite rods to operate the reactor.", - "createnuclear.ponder.reactor.text_7": "Reactor Controller: The most important block for operating the reactor; it handles all the calculations needed to generate energy.", - "createnuclear.ponder.reactor.text_8": "Floor 5", - "createnuclear.ponder.reactor.text_9": "Floor 6", - "createnuclear.ponder.reactor_blueprint.header": "Enable controller", - "createnuclear.ponder.reactor_blueprint.text_1": "Reactor Blueprint: The most important item; it allows you to configure the reactor according to specific patterns.", + "createnuclear.ponder.reactor.title.t1": "Reactor T1 — Construction", + "createnuclear.ponder.reactor.title.t2": "Reactor T2 — Construction", + "createnuclear.ponder.reactor.title.t3": "Reactor T3 — Construction", + "createnuclear.ponder.reactor.floor": "Floor ", + "createnuclear.ponder.reactor.input1": "Input: stores uranium/graphite. One per rod.", + "createnuclear.ponder.reactor.input2": "Input 2: secondary input (place on an edge, not on the frame).", + "createnuclear.ponder.reactor.liquid_input": "Liquid input: cooling fluid inlet. Place on an edge.", + "createnuclear.ponder.reactor.alarm": "Alarm: place on an edge (not on the frame). Triggers on overheating.", + "createnuclear.ponder.reactor.output": "Output: produces energy (SU).", + "createnuclear.ponder.reactor.controller": "Controller: central block that manages the reactor.", + "createnuclear.ponder.reactor.use_blueprint": "Use the Reactor Blueprint to assemble the multiblock.", "createnuclear.tooltip.heatLevel": "Heat Level", "createnuclear.tooltip.heatLevel.caution": "Caution", "createnuclear.tooltip.heatLevel.danger": "Danger", @@ -165,5 +164,6 @@ "tag.item.createnuclear.fuel": "Fuel", "tag.item.minecraft.all.campfires": "All Campfires", "tag.item.minecraft.campfires": "Campfires", - "tag.item.trinkets.head.face": "Head Face" + "tag.item.trinkets.head.face": "Head Face", + "item.createnuclear.raw_thorium": "Raw Thorium" } \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/es_es.json b/src/main/resources/assets/createnuclear/lang/es_es.json index fdf4e9b60..d0bfb1250 100644 --- a/src/main/resources/assets/createnuclear/lang/es_es.json +++ b/src/main/resources/assets/createnuclear/lang/es_es.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Flecha de Radiación", "itemGroup.createnuclear.main": "Create: Nuclear", "itemgroup.uranium": "Grupo: Uranio", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "El Reactor ha sido Ensamblado", "reactor.info.assembled.destroyer": "El Reactor ha sido Desensamblado", "reactor.info.assembled.none": "El Reactor no está Ensamblado", diff --git a/src/main/resources/assets/createnuclear/lang/et_EE.json b/src/main/resources/assets/createnuclear/lang/et_EE.json index f55eb36bf..a3fa93636 100644 --- a/src/main/resources/assets/createnuclear/lang/et_EE.json +++ b/src/main/resources/assets/createnuclear/lang/et_EE.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/fi_fi.json b/src/main/resources/assets/createnuclear/lang/fi_fi.json index eade5a4a0..c2477bdc4 100644 --- a/src/main/resources/assets/createnuclear/lang/fi_fi.json +++ b/src/main/resources/assets/createnuclear/lang/fi_fi.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Säteilyn nuoli", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uraani ryhmä", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/fr_fr.json b/src/main/resources/assets/createnuclear/lang/fr_fr.json index 702c09e0f..edfa8581b 100644 --- a/src/main/resources/assets/createnuclear/lang/fr_fr.json +++ b/src/main/resources/assets/createnuclear/lang/fr_fr.json @@ -1,4 +1,5 @@ { + "biome.createnuclear.irradiated_land": "Terres irradiées", "advancement.createnuclear.anti_radiation_armor": "Armure anti-radiation", "advancement.createnuclear.anti_radiation_armor.desc": "Fabriquez votre première pièce d'armure anti-radiation pour vous protéger des radiations", "advancement.createnuclear.automatic_uranium": "Automatisation de l'uranium", @@ -95,9 +96,13 @@ "block.createnuclear.reactor_frame": "Structure de réacteur", "block.createnuclear.reactor_frame.tooltip.summary": "_Bloc_ utilisé pour construire le _réacteur_", "block.createnuclear.reactor_input": "Entrée de réacteur", - "block.createnuclear.reactor_input.tooltip.behaviour1": "Insérer des barres _d'uranium_ et de _graphene_ en grandes quantités pour alimenter _le réacteur_ ", + "block.createnuclear.reactor_input.tooltip.behaviour1": "Insérer des barres de _chauffage_ (comme l'_uranium_ ou le _thorium_) et de _refroidissement_ (comme le _graphite_) en grandes quantités pour alimenter _le réacteur_.", "block.createnuclear.reactor_input.tooltip.condition1": "Quand le réacteur est assemblé", - "block.createnuclear.reactor_input.tooltip.summary": "_L'entrée du réacteur_ est un _bloc_ qui peut être utilisé pour insérer des barres _d'Uranium_ et de _Graphene_ dans le _Réacteur_", + "block.createnuclear.reactor_input.tooltip.summary": "_L'entrée de barre de réacteur_ est un _bloc_ qui peut être utilisé pour insérer des barres de _chauffage_ ou de _refroidissement_ dans le réacteur.", + + "block.createnuclear.reactor_liquid_input.tooltip.summary": "_L'entrée de fluide de réacteur_ est un _bloc_ qui peut être utilisé pour insérer de l'_eau_ ou de l'_azote liquide_ dans le réacteur.", + "block.createnuclear.reactor_liquid_input.tooltip.condition1": "Quand le réacteur est assemblé", + "block.createnuclear.reactor_liquid_input.tooltip.behaviour1": "Insérer de l'_eau_ ou de l'_azote liquide_ en grandes quantités pour alimenter _le réacteur_ et éviter la _surchauffe_.", "block.createnuclear.reactor_output": "Sortie de réacteur", "block.createnuclear.reactor_output.tooltip.behaviour1": "Vous pouvez _extraire l'énergie_ produite par le réacteur en attachant un _rotor_ à la sortie du _réacteur_", "block.createnuclear.reactor_output.tooltip.condition1": "Quand le réacteur produit de l'énergie", @@ -211,7 +216,7 @@ "item.createnuclear.reactor_blueprint_item": "Plan du réacteur", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour1": "Faites un clic _droit_ pour le remplir.", "item.createnuclear.reactor_blueprint_item.tooltip.behaviour2": "Faites un clic _droit_ sur le contrôleur de réacteur pour l'ouvrir.", - "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Rempli de graphite et de barres d'uranium", + "item.createnuclear.reactor_blueprint_item.tooltip.condition1": "Rempli de barres de refroidissement et de chauffage", "item.createnuclear.reactor_blueprint_item.tooltip.condition2": "Le réacteur doit être assemblé", "item.createnuclear.reactor_blueprint_item.tooltip.summary": "Il vous permet de configurer votre propre paterne.", "item.createnuclear.red_anti_radiation_chestplate": "Plastron anti-radiations rouge", @@ -220,6 +225,8 @@ "item.createnuclear.red_cloth": "Tissu rouge", "item.createnuclear.steel_ingot": "Lingot d'acier", "item.createnuclear.steel_nugget": "Pépite d'acier", + "item.createnuclear.thorium_rod": "Barre de thorium", + "item.createnuclear.thorium_rod.tooltip.summary": "_Barre_ pour être utilisé dans _l'entrée du réacteur_ pour l'utiliser.", "item.createnuclear.uranium_bucket": "Seau d'uranium", "item.createnuclear.uranium_powder": "Poudre d'uranium", "item.createnuclear.uranium_rod": "Barre d'uranium", @@ -248,7 +255,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Flèche irradiée", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Groupe d'uranium", - "overlay.event_message": "⚠️ Avertissement ⚠️ Délai %s", "reactor.info.assembled.creator": "Le réacteur a été assemblé", "reactor.info.assembled.destroyer": "Le réacteur a été désassemblé", "reactor.info.assembled.none": "Le réacteur n'est pas assemblé", @@ -267,5 +273,6 @@ "tag.item.createnuclear.fuel": "Carburant", "tag.item.minecraft.all.campfires": "Tous les feux de camps", "tag.item.minecraft.campfires": "Feu de camps", - "tag.item.trinkets.head.face": "Face avant" + "tag.item.trinkets.head.face": "Face avant", + "item.createnuclear.raw_thorium": "Thorium brut" } \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/lang/he_il.json b/src/main/resources/assets/createnuclear/lang/he_il.json index e79a54d96..6179bf7c6 100644 --- a/src/main/resources/assets/createnuclear/lang/he_il.json +++ b/src/main/resources/assets/createnuclear/lang/he_il.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/hu_hu.json b/src/main/resources/assets/createnuclear/lang/hu_hu.json index 4c95ac9cc..a7fd4c5e7 100644 --- a/src/main/resources/assets/createnuclear/lang/hu_hu.json +++ b/src/main/resources/assets/createnuclear/lang/hu_hu.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Sugárzás Nyila", "itemGroup.createnuclear.main": "Create: Nukleáris", "itemgroup.uranium": "Uránium Csoport", - "overlay.event_message": "⚠ Veszély ⚠ %s időzítő", "reactor.info.assembled.creator": "A reaktor összeállt", "reactor.info.assembled.destroyer": "A reaktor szét lett szedve", "reactor.info.assembled.none": "A reaktor nincs összeállítva", diff --git a/src/main/resources/assets/createnuclear/lang/it_it.json b/src/main/resources/assets/createnuclear/lang/it_it.json index e1f1597e0..8cee875bf 100644 --- a/src/main/resources/assets/createnuclear/lang/it_it.json +++ b/src/main/resources/assets/createnuclear/lang/it_it.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Il reattore è stato assemblato", "reactor.info.assembled.destroyer": "Il reattore è stato smontato", "reactor.info.assembled.none": "Il reattore non è assemblato", diff --git a/src/main/resources/assets/createnuclear/lang/ja_jp.json b/src/main/resources/assets/createnuclear/lang/ja_jp.json index 057ac2b6c..4630fb1eb 100644 --- a/src/main/resources/assets/createnuclear/lang/ja_jp.json +++ b/src/main/resources/assets/createnuclear/lang/ja_jp.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/ko_kr.json b/src/main/resources/assets/createnuclear/lang/ko_kr.json index dc49d60b3..00ebf35f6 100644 --- a/src/main/resources/assets/createnuclear/lang/ko_kr.json +++ b/src/main/resources/assets/createnuclear/lang/ko_kr.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "방사선 물약을 바른 화살", "itemGroup.createnuclear.main": "Create 원자력", "itemgroup.uranium": "우라늄 관련", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "원자로가 조립되었습니다", "reactor.info.assembled.destroyer": "원자로가 해체되었습니다", "reactor.info.assembled.none": "원자로가 조립되지 않았습니다", diff --git a/src/main/resources/assets/createnuclear/lang/lt_LT.json b/src/main/resources/assets/createnuclear/lang/lt_LT.json index 7df3ed84a..bbe538043 100644 --- a/src/main/resources/assets/createnuclear/lang/lt_LT.json +++ b/src/main/resources/assets/createnuclear/lang/lt_LT.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/nl_nl.json b/src/main/resources/assets/createnuclear/lang/nl_nl.json index 1870e2d29..226c831b8 100644 --- a/src/main/resources/assets/createnuclear/lang/nl_nl.json +++ b/src/main/resources/assets/createnuclear/lang/nl_nl.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nucleair", "itemgroup.uranium": "Uranium Groep", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor is geconstrueerd", "reactor.info.assembled.destroyer": "Reactor is uit elkaar gehaald", "reactor.info.assembled.none": "Reactor is niet geconstrueerd", diff --git a/src/main/resources/assets/createnuclear/lang/no_no.json b/src/main/resources/assets/createnuclear/lang/no_no.json index e79a54d96..6179bf7c6 100644 --- a/src/main/resources/assets/createnuclear/lang/no_no.json +++ b/src/main/resources/assets/createnuclear/lang/no_no.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/pl_pl.json b/src/main/resources/assets/createnuclear/lang/pl_pl.json index 0142b8f4d..78a26dffd 100644 --- a/src/main/resources/assets/createnuclear/lang/pl_pl.json +++ b/src/main/resources/assets/createnuclear/lang/pl_pl.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Strzała radiacji", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Grupa uranu", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reaktor został zmontowany", "reactor.info.assembled.destroyer": "Reaktor został rozmontowany", "reactor.info.assembled.none": "Reaktor nie jest zmontowany", diff --git a/src/main/resources/assets/createnuclear/lang/pt_br.json b/src/main/resources/assets/createnuclear/lang/pt_br.json index 28ba8973d..4056a35cf 100644 --- a/src/main/resources/assets/createnuclear/lang/pt_br.json +++ b/src/main/resources/assets/createnuclear/lang/pt_br.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Flecha Radioativa", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Grupo do Urânio", - "overlay.event_message": "⚠️ Aviso ⚠️ %s timer", "reactor.info.assembled.creator": "O Reator foi montado", "reactor.info.assembled.destroyer": "O Reator foi desmontado", "reactor.info.assembled.none": "O Reator não está montado", diff --git a/src/main/resources/assets/createnuclear/lang/pt_pt.json b/src/main/resources/assets/createnuclear/lang/pt_pt.json index 64b4b9138..ed7761c3b 100644 --- a/src/main/resources/assets/createnuclear/lang/pt_pt.json +++ b/src/main/resources/assets/createnuclear/lang/pt_pt.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/ro_ro.json b/src/main/resources/assets/createnuclear/lang/ro_ro.json index cb2774467..da2f9c1f8 100644 --- a/src/main/resources/assets/createnuclear/lang/ro_ro.json +++ b/src/main/resources/assets/createnuclear/lang/ro_ro.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Săgeată de Radiație ", "itemGroup.createnuclear.main": "Creează Nuclear", "itemgroup.uranium": "Grupa Uraniumului", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactorul a fost asamblat", "reactor.info.assembled.destroyer": "Reactorul a fost dezasamblat", "reactor.info.assembled.none": "Reactorul nu este asamblat", diff --git a/src/main/resources/assets/createnuclear/lang/ru_ru.json b/src/main/resources/assets/createnuclear/lang/ru_ru.json index 04132e443..a5b9e214d 100644 --- a/src/main/resources/assets/createnuclear/lang/ru_ru.json +++ b/src/main/resources/assets/createnuclear/lang/ru_ru.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Стрела радиации", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Группа урана", - "overlay.event_message": "⚠ Предупреждение ⚠ %s таймер", "reactor.info.assembled.creator": "Реактор собран", "reactor.info.assembled.destroyer": "Реактор разобран", "reactor.info.assembled.none": "Реактор не собран", diff --git a/src/main/resources/assets/createnuclear/lang/sr_sp.json b/src/main/resources/assets/createnuclear/lang/sr_sp.json index e79a54d96..6179bf7c6 100644 --- a/src/main/resources/assets/createnuclear/lang/sr_sp.json +++ b/src/main/resources/assets/createnuclear/lang/sr_sp.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/lang/sv_se.json b/src/main/resources/assets/createnuclear/lang/sv_se.json index a483c792f..a047a500f 100644 --- a/src/main/resources/assets/createnuclear/lang/sv_se.json +++ b/src/main/resources/assets/createnuclear/lang/sv_se.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Strålningspil", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uran grupp", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reaktorn har satts ihop", "reactor.info.assembled.destroyer": "Reaktorn har tagits isär", "reactor.info.assembled.none": "Reaktorn är inte ihopsatt", diff --git a/src/main/resources/assets/createnuclear/lang/tr_tr.json b/src/main/resources/assets/createnuclear/lang/tr_tr.json index d1dc5bf74..d0bda529b 100644 --- a/src/main/resources/assets/createnuclear/lang/tr_tr.json +++ b/src/main/resources/assets/createnuclear/lang/tr_tr.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Radyasyon Oku", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranyum Grubu", - "overlay.event_message": "⚠ Uyarı ⚠ %s zamanlayıcı", "reactor.info.assembled.creator": "Reaktör Kuruldu", "reactor.info.assembled.destroyer": "Reaktör Söküldü", "reactor.info.assembled.none": "Reaktör Bir Arada Değil", diff --git a/src/main/resources/assets/createnuclear/lang/uk_ua.json b/src/main/resources/assets/createnuclear/lang/uk_ua.json index 4798ccc50..46f236412 100644 --- a/src/main/resources/assets/createnuclear/lang/uk_ua.json +++ b/src/main/resources/assets/createnuclear/lang/uk_ua.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Стріла радіації", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Група: уран", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Реактор зібрано", "reactor.info.assembled.destroyer": "Реактор розібрано", "reactor.info.assembled.none": "Реактор не зібрано", diff --git a/src/main/resources/assets/createnuclear/lang/vi_vn.json b/src/main/resources/assets/createnuclear/lang/vi_vn.json index 1dcf07e91..45800d30a 100644 --- a/src/main/resources/assets/createnuclear/lang/vi_vn.json +++ b/src/main/resources/assets/createnuclear/lang/vi_vn.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Mũi tên phóng xạ", "itemGroup.createnuclear.main": "Tạo ra hạt nhân", "itemgroup.uranium": "Nhóm Uranium", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Lò phản ứng đã được lắp vào", "reactor.info.assembled.destroyer": "Lò phản ứng đã bị tháo ra", "reactor.info.assembled.none": "Lò phản ứng không được lắp ráp", diff --git a/src/main/resources/assets/createnuclear/lang/zh_cn.json b/src/main/resources/assets/createnuclear/lang/zh_cn.json index 79a234fcc..cd3baeb0e 100644 --- a/src/main/resources/assets/createnuclear/lang/zh_cn.json +++ b/src/main/resources/assets/createnuclear/lang/zh_cn.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "辐射之箭", "itemGroup.createnuclear.main": "机械动力:原子核动", "itemgroup.uranium": "铀类", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "反应堆已组装完成", "reactor.info.assembled.destroyer": "反应堆被破坏", "reactor.info.assembled.none": "反应堆未完成组装", diff --git a/src/main/resources/assets/createnuclear/lang/zh_tw.json b/src/main/resources/assets/createnuclear/lang/zh_tw.json index c80f88ad0..da023f478 100644 --- a/src/main/resources/assets/createnuclear/lang/zh_tw.json +++ b/src/main/resources/assets/createnuclear/lang/zh_tw.json @@ -248,7 +248,6 @@ "item.minecraft.tipped_arrow.effect.potion_of_radiation_augment_1": "Arrow of Radiation", "itemGroup.createnuclear.main": "Create Nuclear", "itemgroup.uranium": "Uranium Group", - "overlay.event_message": "⚠ Warning ⚠ %s timer", "reactor.info.assembled.creator": "Reactor has been assembled", "reactor.info.assembled.destroyer": "Reactor has been disassembled", "reactor.info.assembled.none": "Reactor is not assembled", diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/alarm/block.json b/src/main/resources/assets/createnuclear/models/block/reactor/alarm/block.json new file mode 100644 index 000000000..0db3279e4 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/alarm/block.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/controller/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/controller/item.json index 7a0ca2382..fa132ac75 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/controller/item.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/controller/item.json @@ -2,9 +2,9 @@ "credit": "Made with Blockbench", "parent": "block/cube", "textures": { - "1": "createnuclear:block/reactor/controller/controller_panel", + "1": "createnuclear:block/reactor/controller/controller_panel_on", "2": "createnuclear:block/reactor/casing/reactor_casing", - "particle": "createnuclear:block/reactor/controller/controller_panel" + "particle": "createnuclear:block/reactor/controller/controller_panel_on" }, "elements": [ { diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json new file mode 100644 index 000000000..91e7ce7d6 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json @@ -0,0 +1,91 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/casing/reactor_casing", + "1": "createnuclear:block/reactor/fluid_input/fluid_input", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/casing/reactor_casing" + }, + "elements": [ + { + "name": "right", + "from": [14, 0, 15], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#1"}, + "up": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [14, 15, 16, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "left", + "from": [0, 0, 15], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "east": {"uv": [2, 0, 3, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "west": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 15, 2, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "down", + "from": [2, 0, 15], + "to": [14, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "south": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "up": {"uv": [2, 14, 14, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 15, 14, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "up", + "from": [2, 14, 15], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "south": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [2, 1, 14, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "core", + "from": [0, 0, 0], + "to": [16, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [1, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 15, 16], "texture": "#0"}, + "up": {"uv": [0, 1, 16, 16], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 0, 16, 15], "rotation": 180, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "north", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + }, + 4 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json new file mode 100644 index 000000000..bdb0efb7a --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json @@ -0,0 +1,249 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/fluid_input/fluid_input", + "1": "createnuclear:block/reactor/casing/reactor_casing", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/rod_input/rod_input" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#1"}, + "east": {"uv": [0, 0, 14, 16], "rotation": 270, "texture": "#2"}, + "south": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [12, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 12, 2, 16], "rotation": 90, "texture": "#1"}, + "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#1"}, + "west": {"uv": [3, 0, 5, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 4, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [4, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#1"}, + "east": {"uv": [11, 0, 13, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 12, 2, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [12, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 4, 16], "texture": "#0"} + } + }, + { + "from": [4, 14, 0], + "to": [5, 16, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 4, 2, 5], "rotation": 90, "texture": "#1"}, + "east": {"uv": [10, 9, 12, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 9, 6, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [10, 9, 12, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 9, 12, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 9, 12, 16], "texture": "#0"} + } + }, + { + "from": [11, 14, 0], + "to": [12, 16, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 11, 2, 12], "rotation": 90, "texture": "#1"}, + "east": {"uv": [4, 9, 6, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 9, 6, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [4, 9, 6, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 9, 5, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 9, 5, 16], "texture": "#0"} + } + }, + { + "from": [11, 14, 9], + "to": [12, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [4, 6, 6, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [4, 0, 6, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 11, 2, 12], "rotation": 90, "texture": "#1"}, + "west": {"uv": [4, 0, 6, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 0, 5, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 0, 5, 7], "texture": "#0"} + } + }, + { + "from": [4, 14, 9], + "to": [5, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [4, 6, 6, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [10, 0, 12, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 4, 2, 5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [10, 0, 12, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 0, 12, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 0, 12, 7], "texture": "#0"} + } + }, + { + "from": [5, 14, 10], + "to": [6, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [5, 5, 7, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [9, 0, 11, 6], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 6, 2, 7], "rotation": 90, "texture": "#1"}, + "west": {"uv": [9, 0, 11, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [10, 0, 11, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10, 0, 11, 6], "texture": "#0"} + } + }, + { + "from": [10, 14, 10], + "to": [11, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [5, 5, 7, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [5, 0, 7, 6], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 10, 2, 11], "rotation": 90, "texture": "#1"}, + "west": {"uv": [5, 0, 7, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [5, 0, 6, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5, 0, 6, 6], "texture": "#0"} + } + }, + { + "from": [10, 14, 0], + "to": [11, 16, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 10, 2, 11], "rotation": 90, "texture": "#1"}, + "east": {"uv": [5, 10, 7, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [5, 10, 7, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [5, 10, 7, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [5, 10, 6, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5, 10, 6, 16], "texture": "#0"} + } + }, + { + "from": [9, 14, 0], + "to": [10, 16, 5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#1"}, + "east": {"uv": [6, 11, 8, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [6, 11, 8, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [6, 11, 8, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [6, 11, 7, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 11, 7, 16], "texture": "#0"} + } + }, + { + "from": [6, 14, 0], + "to": [7, 16, 5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 6, 2, 7], "rotation": 90, "texture": "#1"}, + "east": {"uv": [8, 11, 10, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [6, 11, 8, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [8, 11, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 11, 10, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 11, 10, 16], "texture": "#0"} + } + }, + { + "from": [6, 14, 11], + "to": [7, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [6, 4, 8, 5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [8, 0, 10, 5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 7, 2, 8], "rotation": 90, "texture": "#1"}, + "west": {"uv": [8, 0, 10, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 0, 10, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 0, 10, 5], "texture": "#0"} + } + }, + { + "from": [9, 14, 11], + "to": [10, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [6, 4, 8, 5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [6, 0, 8, 5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#1"}, + "west": {"uv": [6, 0, 8, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [6, 0, 7, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 0, 7, 5], "texture": "#0"} + } + }, + { + "from": [7, 14, 12], + "to": [9, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [3, 7, 5, 9], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 0, 9, 4], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 7, 2, 9], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 0, 9, 4], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7, 0, 9, 4], "rotation": 180, "texture": "#0"}, + "down": {"uv": [7, 0, 9, 4], "texture": "#0"} + } + }, + { + "from": [7, 14, 0], + "to": [9, 16, 4], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 7, 2, 9], "rotation": 90, "texture": "#1"}, + "east": {"uv": [7, 12, 9, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [3, 7, 5, 9], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 12, 9, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7, 12, 9, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [7, 12, 9, 16], "texture": "#0"} + } + }, + { + "from": [5, 14, 0], + "to": [6, 16, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 5, 2, 6], "rotation": 90, "texture": "#1"}, + "east": {"uv": [9, 10, 11, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [5, 10, 7, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [9, 10, 11, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [10, 10, 11, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10, 10, 11, 16], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [ + 0, + { + "name": "face", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json new file mode 100644 index 000000000..67a5e7968 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json @@ -0,0 +1,91 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/casing/reactor_casing", + "1": "createnuclear:block/reactor/fluid_input/fluid_input", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/casing/reactor_casing" + }, + "elements": [ + { + "name": "right", + "from": [0, 0, 0], + "to": [2, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [13, 0, 14, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [14, 0, 16, 1], "texture": "#2"}, + "down": {"uv": [14, 15, 16, 16], "texture": "#2"} + } + }, + { + "name": "left", + "from": [14, 0, 0], + "to": [16, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "west": {"uv": [2, 0, 3, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "down": {"uv": [0, 15, 2, 16], "texture": "#2"} + } + }, + { + "name": "down", + "from": [2, 0, 0], + "to": [14, 2, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "up": {"uv": [2, 14, 14, 15], "texture": "#1"}, + "down": {"uv": [2, 15, 14, 16], "texture": "#2"} + } + }, + { + "name": "up", + "from": [2, 14, 0], + "to": [14, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 1], "texture": "#2"}, + "down": {"uv": [2, 1, 14, 2], "texture": "#1"} + } + }, + { + "name": "core", + "from": [0, 0, 1], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 15, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [1, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 1, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 15], "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "north", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + }, + 4 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_bottom.json b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_bottom.json index e315baef7..4f44b7f95 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_bottom.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_bottom.json @@ -1,25 +1,22 @@ { + "format_version": "1.21.11", "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "createnuclear:block/reactor/casing/casing_inner", - "1": "createnuclear:block/reactor/casing/casing_top", "2": "createnuclear:block/reactor/frame/window", "3": "createnuclear:block/reactor/casing/reactor_casing", - "4": "createnuclear:fluid/uranium_still", - "5": "createnuclear:fluid/uranium_flow", - "particle": "createnuclear:block/reactor/casing/casing_inner" + "particle": "createnuclear:block/reactor/casing/reactor_casing" }, "elements": [ { "name": "SideRight", "from": [1, 4, 0], "to": [4, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 0.5]}, "faces": { "north": {"uv": [12, 5, 15, 12], "texture": "#3", "cullface": "north"}, "east": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "north"}, - "south": {"uv": [1, 0, 4, 12], "texture": "#3", "cullface": "north"}, + "south": {"uv": [1, 3, 4, 15], "texture": "#3", "cullface": "north"}, "west": {"uv": [4, 0, 5, 12], "texture": "#3"}, "down": {"uv": [1, 12, 4, 11], "texture": "#3"} } @@ -28,11 +25,11 @@ "name": "SideLeft", "from": [12, 4, 0], "to": [15, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 0.5]}, "faces": { "north": {"uv": [1, 5, 4, 12], "texture": "#3", "cullface": "north"}, "east": {"uv": [11, 0, 12, 12], "texture": "#3"}, - "south": {"uv": [12, 0, 15, 12], "texture": "#3", "cullface": "north"}, + "south": {"uv": [12, 3, 15, 15], "texture": "#3", "cullface": "north"}, "west": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "north"}, "down": {"uv": [12, 11, 15, 12], "texture": "#3"} } @@ -52,10 +49,11 @@ "name": "SideRight", "from": [15, 4, 1], "to": [16, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 10, 8]}, "faces": { "east": {"uv": [12, 5, 15, 12], "texture": "#3", "cullface": "east"}, "south": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "east"}, - "west": {"uv": [1, 0, 4, 12], "texture": "#3", "cullface": "east"}, + "west": {"uv": [1, 3, 4, 15], "texture": "#3", "cullface": "east"}, "down": {"uv": [11, 2, 12, 5], "texture": "#3"} } }, @@ -63,10 +61,11 @@ "name": "SideLeft", "from": [15, 4, 12], "to": [16, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 10, 8]}, "faces": { "north": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "east"}, "east": {"uv": [1, 5, 4, 12], "texture": "#3", "cullface": "east"}, - "west": {"uv": [12, 0, 15, 12], "texture": "#3", "cullface": "east"}, + "west": {"uv": [12, 3, 15, 15], "texture": "#3", "cullface": "east"}, "down": {"uv": [12, 9, 13, 12], "texture": "#3"} } }, @@ -83,8 +82,9 @@ "name": "SideRight", "from": [12, 4, 15], "to": [15, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 15.5]}, "faces": { - "north": {"uv": [1, 0, 4, 12], "texture": "#3", "cullface": "south"}, + "north": {"uv": [1, 3, 4, 15], "texture": "#3", "cullface": "south"}, "south": {"uv": [12, 5, 15, 12], "texture": "#3", "cullface": "south"}, "west": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "south"}, "down": {"uv": [12, 11, 15, 12], "texture": "#3"} @@ -94,8 +94,9 @@ "name": "SideLeft", "from": [1, 4, 15], "to": [4, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 15.5]}, "faces": { - "north": {"uv": [12, 0, 15, 12], "texture": "#3", "cullface": "south"}, + "north": {"uv": [12, 3, 15, 15], "texture": "#3", "cullface": "south"}, "east": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "south"}, "south": {"uv": [1, 5, 4, 12], "texture": "#3", "cullface": "south"}, "down": {"uv": [1, 11, 4, 12], "texture": "#3"} @@ -114,9 +115,10 @@ "name": "SideRight", "from": [0, 4, 12], "to": [1, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 10, 8]}, "faces": { "north": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "west"}, - "east": {"uv": [1, 0, 4, 12], "texture": "#3", "cullface": "west"}, + "east": {"uv": [1, 3, 4, 15], "texture": "#3", "cullface": "west"}, "west": {"uv": [12, 5, 15, 12], "texture": "#3", "cullface": "west"}, "down": {"uv": [11, 9, 12, 12], "texture": "#3"} } @@ -125,8 +127,9 @@ "name": "SideLeft", "from": [0, 4, 1], "to": [1, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 10, 8]}, "faces": { - "east": {"uv": [12, 0, 15, 12], "texture": "#3", "cullface": "west"}, + "east": {"uv": [12, 3, 15, 15], "texture": "#3", "cullface": "west"}, "south": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "west"}, "west": {"uv": [1, 5, 4, 12], "texture": "#3", "cullface": "west"}, "down": {"uv": [4, 9, 5, 12], "texture": "#3"} @@ -187,21 +190,8 @@ "east": {"uv": [0, 12, 16, 16], "texture": "#3", "cullface": "east"}, "south": {"uv": [0, 12, 16, 16], "texture": "#3", "cullface": "south"}, "west": {"uv": [0, 12, 16, 16], "texture": "#3", "cullface": "west"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "down"} - } - }, - { - "name": "fluid", - "from": [1, 4, 1], - "to": [15, 16, 15], - "faces": { - "north": {"uv": [0, 0, 7, 6], "texture": "#5"}, - "east": {"uv": [0, 0, 7, 6], "texture": "#5"}, - "south": {"uv": [0, 0, 7, 6], "texture": "#5"}, - "west": {"uv": [0, 0, 7, 6], "texture": "#5"}, - "up": {"uv": [0, 0, 14, 14], "texture": "#4"}, - "down": {"uv": [0, 0, 7, 7], "texture": "#4"} + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3", "cullface": "down"} } } ], diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_middle.json b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_middle.json index 639116c97..be631e36a 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_middle.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_middle.json @@ -1,10 +1,9 @@ { + "format_version": "1.21.11", "credit": "Made with Blockbench", "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/frame/window", - "1": "createnuclear:fluid/uranium_flow", - "2": "createnuclear:fluid/uranium_still", "3": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/frame/window" }, @@ -52,22 +51,22 @@ "name": "SideRight", "from": [1, 0, 0], "to": [4, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0.5]}, "faces": { "north": {"uv": [12, 5, 15, 11], "texture": "#3", "cullface": "north"}, "east": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "north"}, - "south": {"uv": [1, 0, 4, 16], "texture": "#3", "cullface": "north"} + "south": {"uv": [1, 3, 4, 13], "texture": "#3", "cullface": "north"} } }, { "name": "SideLeft", "from": [12, 0, 0], "to": [15, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0.5]}, "faces": { "north": {"uv": [1, 5, 4, 11], "texture": "#3", "cullface": "north"}, "east": {"uv": [11, 0, 12, 16], "texture": "#3"}, - "south": {"uv": [12, 0, 16, 16], "texture": "#3", "cullface": "north"}, + "south": {"uv": [12, 3, 16, 13], "texture": "#3", "cullface": "north"}, "west": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "north"} } }, @@ -84,21 +83,23 @@ "name": "SideRight", "from": [15, 0, 1], "to": [16, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 8, 8]}, "faces": { "east": {"uv": [12, 5, 15, 11], "texture": "#3", "cullface": "east"}, "south": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "east"}, - "west": {"uv": [1, 0, 4, 16], "texture": "#3", "cullface": "east"} + "west": {"uv": [1, 3, 4, 13], "texture": "#3", "cullface": "east"} } }, { "name": "SideLeft", "from": [15, 0, 12], "to": [16, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 8, 8]}, "faces": { "north": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "east"}, "east": {"uv": [1, 5, 4, 11], "texture": "#3", "cullface": "east"}, "south": {"uv": [11, 0, 12, 16], "texture": "#3"}, - "west": {"uv": [12, 0, 15, 16], "texture": "#3", "cullface": "east"} + "west": {"uv": [12, 3, 15, 13], "texture": "#3", "cullface": "east"} } }, { @@ -113,8 +114,9 @@ "name": "SideRight", "from": [12, 0, 15], "to": [15, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 15.5]}, "faces": { - "north": {"uv": [1, 0, 4, 16], "texture": "#3", "cullface": "south"}, + "north": {"uv": [1, 3, 4, 13], "texture": "#3", "cullface": "south"}, "east": {"uv": [4, 0, 5, 16], "texture": "#3"}, "south": {"uv": [12, 5, 15, 11], "texture": "#3", "cullface": "south"}, "west": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "south"} @@ -124,8 +126,9 @@ "name": "SideLeft", "from": [1, 0, 15], "to": [4, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 15.5]}, "faces": { - "north": {"uv": [12, 0, 15, 16], "texture": "#3", "cullface": "south"}, + "north": {"uv": [12, 3, 15, 13], "texture": "#3", "cullface": "south"}, "east": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "south"}, "south": {"uv": [1, 5, 4, 11], "texture": "#3", "cullface": "south"}, "west": {"uv": [4, 0, 5, 16], "texture": "#3"} @@ -143,9 +146,10 @@ "name": "SideRight", "from": [0, 0, 12], "to": [1, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 8, 8]}, "faces": { "north": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "west"}, - "east": {"uv": [1, 0, 4, 16], "texture": "#3", "cullface": "west"}, + "east": {"uv": [1, 3, 4, 13], "texture": "#3", "cullface": "west"}, "west": {"uv": [12, 5, 15, 11], "texture": "#3", "cullface": "west"} } }, @@ -153,8 +157,9 @@ "name": "SideLeft", "from": [0, 0, 1], "to": [1, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 8, 8]}, "faces": { - "east": {"uv": [12, 0, 15, 16], "texture": "#3", "cullface": "west"}, + "east": {"uv": [12, 3, 15, 13], "texture": "#3", "cullface": "west"}, "south": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "west"}, "west": {"uv": [1, 5, 4, 11], "texture": "#3", "cullface": "west"} } @@ -166,19 +171,6 @@ "north": {"uv": [15, 5, 16, 11], "texture": "#3"}, "west": {"uv": [0, 5, 1, 11], "texture": "#3"} } - }, - { - "name": "Liquid", - "from": [1, 0, 1], - "to": [15, 16, 15], - "faces": { - "north": {"uv": [0, 0, 7, 8], "texture": "#1"}, - "east": {"uv": [0, 0, 7, 8], "texture": "#1"}, - "south": {"uv": [0, 0, 7, 8], "texture": "#1"}, - "west": {"uv": [0, 0, 7, 8], "texture": "#1"}, - "up": {"uv": [0, 0, 14, 14], "texture": "#2"}, - "down": {"uv": [0, 0, 14, 14], "texture": "#2"} - } } ], "groups": [ diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_none.json b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_none.json index 8fa0e6878..41640b3c2 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_none.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_none.json @@ -2,13 +2,11 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "4": "createnuclear:fluid/uranium_still", - "5": "createnuclear:fluid/uranium_flow", "6": "createnuclear:block/reactor/casing/reactor_casing", - "8": "createnuclear:block/reactor/casing/casing_inner", - "9": "createnuclear:block/reactor/casing/casing_top", + "8": "createnuclear:block/reactor/casing/reactor_casing", + "9": "createnuclear:block/reactor/casing/reactor_casing", "10": "createnuclear:block/reactor/frame/window_single", - "particle": "createnuclear:fluid/uranium_still" + "particle": "createnuclear:block/reactor/casing/reactor_casing" }, "elements": [ { @@ -157,20 +155,6 @@ "up": {"uv": [0, 0, 16, 16], "texture": "#8"}, "down": {"uv": [0, 0, 16, 16], "texture": "#9", "cullface": "down"} } - }, - { - "name": "Liquid", - "from": [1, 2.9, 1], - "to": [15, 9.9, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7.5, 6.4, 8]}, - "faces": { - "north": {"uv": [0, 0, 7, 3.5], "texture": "#5"}, - "east": {"uv": [0, 0, 7, 3.5], "texture": "#5"}, - "south": {"uv": [0, 0, 7, 3.5], "texture": "#5"}, - "west": {"uv": [0, 0, 7, 3.5], "texture": "#5"}, - "up": {"uv": [0, 0, 14, 14], "texture": "#4"}, - "down": {"uv": [0, 0, 14, 14], "texture": "#4"} - } } ], "display": { diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_top.json b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_top.json index e8d897c1f..1c840c154 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_top.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/frame/frame_top.json @@ -1,14 +1,11 @@ { + "format_version": "1.21.11", "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "createnuclear:block/reactor/casing/casing_inner", - "1": "createnuclear:block/reactor/casing/casing_top", "2": "createnuclear:block/reactor/frame/window", "3": "createnuclear:block/reactor/casing/reactor_casing", - "4": "createnuclear:fluid/uranium_flow", - "5": "createnuclear:fluid/uranium_still", - "particle": "createnuclear:block/reactor/casing/casing_inner" + "particle": "createnuclear:block/reactor/casing/reactor_casing" }, "elements": [ { @@ -56,7 +53,7 @@ "faces": { "north": {"uv": [12, 4, 15, 11], "texture": "#3", "cullface": "north"}, "east": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "north"}, - "south": {"uv": [1, 4, 4, 16], "texture": "#3", "cullface": "north"} + "south": {"uv": [1, 1, 4, 13], "texture": "#3", "cullface": "north"} } }, { @@ -66,7 +63,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, "faces": { "north": {"uv": [1, 4, 4, 11], "texture": "#3", "cullface": "north"}, - "south": {"uv": [12, 4, 15, 16], "texture": "#3", "cullface": "north"}, + "south": {"uv": [12, 1, 15, 13], "texture": "#3", "cullface": "north"}, "west": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "north"} } }, @@ -85,7 +82,7 @@ "faces": { "east": {"uv": [12, 4, 15, 11], "texture": "#3", "cullface": "east"}, "south": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "east"}, - "west": {"uv": [1, 4, 4, 16], "texture": "#3", "cullface": "east"} + "west": {"uv": [1, 1, 4, 13], "texture": "#3", "cullface": "east"} } }, { @@ -95,7 +92,7 @@ "faces": { "north": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "east"}, "east": {"uv": [1, 4, 4, 11], "texture": "#3", "cullface": "east"}, - "west": {"uv": [12, 4, 15, 16], "texture": "#3", "cullface": "east"} + "west": {"uv": [12, 1, 15, 13], "texture": "#3", "cullface": "east"} } }, { @@ -111,7 +108,7 @@ "from": [12, 0, 15], "to": [15, 12, 16], "faces": { - "north": {"uv": [1, 4, 4, 16], "texture": "#3", "cullface": "south"}, + "north": {"uv": [1, 1, 4, 13], "texture": "#3", "cullface": "south"}, "south": {"uv": [12, 4, 15, 11], "texture": "#3", "cullface": "south"}, "west": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "south"} } @@ -121,7 +118,7 @@ "from": [1, 0, 15], "to": [4, 12, 16], "faces": { - "north": {"uv": [12, 4, 15, 16], "texture": "#3", "cullface": "south"}, + "north": {"uv": [12, 1, 15, 13], "texture": "#3", "cullface": "south"}, "east": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "south"}, "south": {"uv": [1, 4, 4, 11], "texture": "#3", "cullface": "south"} } @@ -141,7 +138,7 @@ "to": [1, 12, 15], "faces": { "north": {"uv": [11, 4, 12, 12], "texture": "#3", "cullface": "west"}, - "east": {"uv": [1, 4, 4, 16], "texture": "#3", "cullface": "west"}, + "east": {"uv": [1, 1, 4, 13], "texture": "#3", "cullface": "west"}, "west": {"uv": [12, 4, 15, 11], "texture": "#3", "cullface": "west"} } }, @@ -150,7 +147,7 @@ "from": [0, 0, 1], "to": [1, 12, 4], "faces": { - "east": {"uv": [12, 4, 15, 16], "texture": "#3", "cullface": "west"}, + "east": {"uv": [12, 1, 15, 13], "texture": "#3", "cullface": "west"}, "south": {"uv": [4, 4, 5, 12], "texture": "#3", "cullface": "west"}, "west": {"uv": [1, 4, 4, 11], "texture": "#3", "cullface": "west"} } @@ -167,27 +164,14 @@ "name": "Top", "from": [0, 12, 0], "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, "faces": { "north": {"uv": [0, 0, 16, 4], "texture": "#3", "cullface": "north"}, "east": {"uv": [0, 0, 16, 4], "texture": "#3", "cullface": "east"}, "south": {"uv": [0, 0, 16, 4], "texture": "#3", "cullface": "south"}, "west": {"uv": [0, 0, 16, 4], "texture": "#3", "cullface": "west"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "up"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} - } - }, - { - "name": "fluid", - "from": [1, 0, 1], - "to": [15, 9, 15], - "faces": { - "north": {"uv": [0, 0, 7, 4.5], "texture": "#4"}, - "east": {"uv": [0, 0, 7, 4.5], "texture": "#4"}, - "south": {"uv": [0, 0, 7, 4.5], "texture": "#4"}, - "west": {"uv": [0, 0, 7, 4.5], "texture": "#4"}, - "up": {"uv": [0, 0, 14, 14], "texture": "#5"}, - "down": {"uv": [0, 0, 14, 14], "texture": "#5"} + "up": {"uv": [0, 0, 16, 16], "texture": "#3", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3"} } } ], diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/input/block.json b/src/main/resources/assets/createnuclear/models/block/reactor/input/block.json deleted file mode 100644 index ba6c0e1f4..000000000 --- a/src/main/resources/assets/createnuclear/models/block/reactor/input/block.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/input/input", - "2": "createnuclear:block/reactor/casing/casing_top", - "particle": "createnuclear:block/reactor/casing/reactor_casing" - }, - "elements": [ - { - "name": "right", - "from": [14, 0, 15], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, - "faces": { - "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, - "south": {"uv": [14, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [13, 0, 14, 16], "texture": "#1"}, - "up": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#2"}, - "down": {"uv": [14, 15, 16, 16], "rotation": 180, "texture": "#2"} - } - }, - { - "name": "left", - "from": [0, 0, 15], - "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, - "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "east": {"uv": [2, 0, 3, 16], "texture": "#1"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "west": {"uv": [15, 0, 16, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2"}, - "down": {"uv": [0, 15, 2, 16], "rotation": 180, "texture": "#2"} - } - }, - { - "name": "down", - "from": [2, 0, 15], - "to": [14, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, - "faces": { - "south": {"uv": [2, 14, 14, 16], "texture": "#1"}, - "up": {"uv": [2, 14, 14, 15], "rotation": 180, "texture": "#1"}, - "down": {"uv": [2, 15, 14, 16], "rotation": 180, "texture": "#2"} - } - }, - { - "name": "up", - "from": [2, 14, 15], - "to": [14, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, - "faces": { - "south": {"uv": [2, 0, 14, 2], "texture": "#1"}, - "up": {"uv": [2, 0, 14, 1], "rotation": 180, "texture": "#2"}, - "down": {"uv": [2, 1, 14, 2], "rotation": 180, "texture": "#1"} - } - }, - { - "name": "core", - "from": [0, 0, 0], - "to": [16, 16, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "east": {"uv": [1, 0, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 15, 16], "texture": "#0"}, - "up": {"uv": [0, 1, 16, 16], "rotation": 180, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 15], "rotation": 180, "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "block", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "north", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3] - }, - 4 - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/input/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/input/item.json deleted file mode 100644 index 7cb6aabcc..000000000 --- a/src/main/resources/assets/createnuclear/models/block/reactor/input/item.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/input/input", - "2": "createnuclear:block/reactor/casing/casing_top", - "particle": "createnuclear:block/reactor/casing/reactor_casing" - }, - "elements": [ - { - "name": "right", - "from": [0, 0, 0], - "to": [2, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, - "faces": { - "north": {"uv": [14, 0, 16, 16], "texture": "#1"}, - "east": {"uv": [13, 0, 14, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, - "up": {"uv": [14, 0, 16, 1], "texture": "#2"}, - "down": {"uv": [14, 15, 16, 16], "texture": "#2"} - } - }, - { - "name": "left", - "from": [14, 0, 0], - "to": [16, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, - "faces": { - "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, - "west": {"uv": [2, 0, 3, 16], "texture": "#1"}, - "up": {"uv": [0, 0, 2, 1], "texture": "#2"}, - "down": {"uv": [0, 15, 2, 16], "texture": "#2"} - } - }, - { - "name": "down", - "from": [2, 0, 0], - "to": [14, 2, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, - "faces": { - "north": {"uv": [2, 14, 14, 16], "texture": "#1"}, - "up": {"uv": [2, 14, 14, 15], "texture": "#1"}, - "down": {"uv": [2, 15, 14, 16], "texture": "#2"} - } - }, - { - "name": "up", - "from": [2, 14, 0], - "to": [14, 16, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, - "faces": { - "north": {"uv": [2, 0, 14, 2], "texture": "#1"}, - "up": {"uv": [2, 0, 14, 1], "texture": "#2"}, - "down": {"uv": [2, 1, 14, 2], "texture": "#1"} - } - }, - { - "name": "core", - "from": [0, 0, 1], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "east": {"uv": [0, 0, 15, 16], "texture": "#0"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "west": {"uv": [1, 0, 16, 16], "texture": "#0"}, - "up": {"uv": [0, 1, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 0, 16, 15], "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "block", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "north", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3] - }, - 4 - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/output/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/output/item.json index 3b55684f2..e6357ae45 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/output/item.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/output/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/output/output", - "1": "createnuclear:block/reactor/casing/casing_top", + "1": "createnuclear:block/reactor/casing/reactor_casing", "2": "createnuclear:block/reactor/casing/reactor_casing", "1_1": "create:block/axis_top", "1_0": "create:block/axis" diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/output/output.json b/src/main/resources/assets/createnuclear/models/block/reactor/output/output.json index afeb503ad..76cd34b4f 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/output/output.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/output/output.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/output/output", - "1": "createnuclear:block/reactor/casing/casing_top", + "1": "createnuclear:block/reactor/casing/reactor_casing", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/output/output" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/output/output_vertical.json b/src/main/resources/assets/createnuclear/models/block/reactor/output/output_vertical.json index 03ad747fa..8cf59b370 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/output/output_vertical.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/output/output_vertical.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/output/output", - "1": "createnuclear:block/reactor/casing/casing_top", + "1": "createnuclear:block/reactor/casing/reactor_casing", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/output/output" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json new file mode 100644 index 000000000..44a5bfd39 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json @@ -0,0 +1,91 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/casing/reactor_casing", + "1": "createnuclear:block/reactor/rod_input/rod_input", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/casing/reactor_casing" + }, + "elements": [ + { + "name": "right", + "from": [0, 0, 0], + "to": [2, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [13, 0, 14, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [14, 0, 16, 1], "texture": "#2"}, + "down": {"uv": [14, 15, 16, 16], "texture": "#2"} + } + }, + { + "name": "left", + "from": [14, 0, 0], + "to": [16, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "west": {"uv": [2, 0, 3, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "down": {"uv": [0, 15, 2, 16], "texture": "#2"} + } + }, + { + "name": "down", + "from": [2, 0, 0], + "to": [14, 2, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "up": {"uv": [2, 14, 14, 15], "texture": "#1"}, + "down": {"uv": [2, 15, 14, 16], "texture": "#2"} + } + }, + { + "name": "up", + "from": [2, 14, 0], + "to": [14, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 1], "texture": "#2"}, + "down": {"uv": [2, 1, 14, 2], "texture": "#1"} + } + }, + { + "name": "core", + "from": [0, 0, 1], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 15, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [1, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 1, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 15], "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "north", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + }, + 4 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json new file mode 100644 index 000000000..e51c47749 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json @@ -0,0 +1,91 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/casing/reactor_casing", + "1": "createnuclear:block/reactor/rod_input/rod_input", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/casing/reactor_casing" + }, + "elements": [ + { + "name": "right", + "from": [14, 0, 15], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#1"}, + "up": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [14, 15, 16, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "left", + "from": [0, 0, 15], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "north": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "east": {"uv": [2, 0, 3, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#1"}, + "west": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 15, 2, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "down", + "from": [2, 0, 15], + "to": [14, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "south": {"uv": [2, 14, 14, 16], "texture": "#1"}, + "up": {"uv": [2, 14, 14, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [2, 15, 14, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "up", + "from": [2, 14, 15], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "south": {"uv": [2, 0, 14, 2], "texture": "#1"}, + "up": {"uv": [2, 0, 14, 1], "rotation": 180, "texture": "#2"}, + "down": {"uv": [2, 1, 14, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "core", + "from": [0, 0, 0], + "to": [16, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [1, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 15, 16], "texture": "#0"}, + "up": {"uv": [0, 1, 16, 16], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 0, 16, 15], "rotation": 180, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "north", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + }, + 4 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json new file mode 100644 index 000000000..754f8f595 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json @@ -0,0 +1,249 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "createnuclear:block/reactor/rod_input/rod_input", + "1": "createnuclear:block/reactor/casing/reactor_casing", + "2": "createnuclear:block/reactor/casing/reactor_casing", + "particle": "createnuclear:block/reactor/rod_input/rod_input" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#1"}, + "east": {"uv": [0, 0, 14, 16], "rotation": 270, "texture": "#2"}, + "south": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [2, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [12, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 12, 2, 16], "rotation": 90, "texture": "#1"}, + "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#1"}, + "west": {"uv": [3, 0, 5, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 4, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [4, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#1"}, + "east": {"uv": [11, 0, 13, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 12, 2, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [12, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 4, 16], "texture": "#0"} + } + }, + { + "from": [4, 14, 0], + "to": [5, 16, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 4, 2, 5], "rotation": 90, "texture": "#1"}, + "east": {"uv": [10, 9, 12, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 9, 6, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [10, 9, 12, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 9, 12, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 9, 12, 16], "texture": "#0"} + } + }, + { + "from": [11, 14, 0], + "to": [12, 16, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 11, 2, 12], "rotation": 90, "texture": "#1"}, + "east": {"uv": [4, 9, 6, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 9, 6, 10], "rotation": 90, "texture": "#0"}, + "west": {"uv": [4, 9, 6, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 9, 5, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 9, 5, 16], "texture": "#0"} + } + }, + { + "from": [11, 14, 9], + "to": [12, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [4, 6, 6, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [4, 0, 6, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 11, 2, 12], "rotation": 90, "texture": "#1"}, + "west": {"uv": [4, 0, 6, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 0, 5, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 0, 5, 7], "texture": "#0"} + } + }, + { + "from": [4, 14, 9], + "to": [5, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [4, 6, 6, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [10, 0, 12, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 4, 2, 5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [10, 0, 12, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 0, 12, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 0, 12, 7], "texture": "#0"} + } + }, + { + "from": [5, 14, 10], + "to": [6, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [5, 5, 7, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [9, 0, 11, 6], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 6, 2, 7], "rotation": 90, "texture": "#1"}, + "west": {"uv": [9, 0, 11, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [10, 0, 11, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10, 0, 11, 6], "texture": "#0"} + } + }, + { + "from": [10, 14, 10], + "to": [11, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [5, 5, 7, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [5, 0, 7, 6], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 10, 2, 11], "rotation": 90, "texture": "#1"}, + "west": {"uv": [5, 0, 7, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [5, 0, 6, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5, 0, 6, 6], "texture": "#0"} + } + }, + { + "from": [10, 14, 0], + "to": [11, 16, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 10, 2, 11], "rotation": 90, "texture": "#1"}, + "east": {"uv": [5, 10, 7, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [5, 10, 7, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [5, 10, 7, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [5, 10, 6, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5, 10, 6, 16], "texture": "#0"} + } + }, + { + "from": [9, 14, 0], + "to": [10, 16, 5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#1"}, + "east": {"uv": [6, 11, 8, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [6, 11, 8, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [6, 11, 8, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [6, 11, 7, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 11, 7, 16], "texture": "#0"} + } + }, + { + "from": [6, 14, 0], + "to": [7, 16, 5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 6, 2, 7], "rotation": 90, "texture": "#1"}, + "east": {"uv": [8, 11, 10, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [6, 11, 8, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [8, 11, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 11, 10, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 11, 10, 16], "texture": "#0"} + } + }, + { + "from": [6, 14, 11], + "to": [7, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [6, 4, 8, 5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [8, 0, 10, 5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 7, 2, 8], "rotation": 90, "texture": "#1"}, + "west": {"uv": [8, 0, 10, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 0, 10, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 0, 10, 5], "texture": "#0"} + } + }, + { + "from": [9, 14, 11], + "to": [10, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [6, 4, 8, 5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [6, 0, 8, 5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#1"}, + "west": {"uv": [6, 0, 8, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [6, 0, 7, 5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 0, 7, 5], "texture": "#0"} + } + }, + { + "from": [7, 14, 12], + "to": [9, 16, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [3, 7, 5, 9], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 0, 9, 4], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 7, 2, 9], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 0, 9, 4], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7, 0, 9, 4], "rotation": 180, "texture": "#0"}, + "down": {"uv": [7, 0, 9, 4], "texture": "#0"} + } + }, + { + "from": [7, 14, 0], + "to": [9, 16, 4], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 7, 2, 9], "rotation": 90, "texture": "#1"}, + "east": {"uv": [7, 12, 9, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [3, 7, 5, 9], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 12, 9, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [7, 12, 9, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [7, 12, 9, 16], "texture": "#0"} + } + }, + { + "from": [5, 14, 0], + "to": [6, 16, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [0, 5, 2, 6], "rotation": 90, "texture": "#1"}, + "east": {"uv": [9, 10, 11, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [5, 10, 7, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [9, 10, 11, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [10, 10, 11, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10, 10, 11, 16], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [ + 0, + { + "name": "face", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_boots/item.json b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_boots/item.json new file mode 100644 index 000000000..1e2ba9844 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_boots/item.json @@ -0,0 +1,113 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "14": "createnuclear:item/default_anti_radiation_suit" + }, + "elements": [ + { + "name": "power_boot", + "from": [7.45, 0.2, 6.45], + "to": [11.95, 4.7, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [7.8633, 12.0833, 9.7667]}, + "faces": { + "north": {"uv": [11.5, 7.16667, 10.83333, 7.83333], "texture": "#14"}, + "east": {"uv": [12.16667, 7.16667, 11.5, 7.83333], "texture": "#14"}, + "south": {"uv": [12.83333, 7.16667, 12.16667, 7.83333], "texture": "#14"}, + "west": {"uv": [10.83333, 7.16667, 10.16667, 7.83333], "texture": "#14"}, + "up": {"uv": [10.83333, 7.16667, 11.5, 6.5], "texture": "#14"}, + "down": {"uv": [11.5, 6.5, 12.16667, 7.16667], "texture": "#14"} + } + }, + { + "name": "power_boot", + "from": [3.55, 0.2, 6.45], + "to": [8.05, 4.7, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 7.75, 10]}, + "faces": { + "north": {"uv": [10.83333, 7.16667, 11.5, 7.83333], "texture": "#14"}, + "east": {"uv": [10.16667, 7.16667, 10.83333, 7.83333], "texture": "#14"}, + "south": {"uv": [12.16667, 7.16667, 12.83333, 7.83333], "texture": "#14"}, + "west": {"uv": [11.5, 7.16667, 12.16667, 7.83333], "texture": "#14"}, + "up": {"uv": [11.5, 7.16667, 10.83333, 6.5], "texture": "#14"}, + "down": {"uv": [12.16667, 6.5, 11.5, 7.16667], "texture": "#14"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "thirdperson_lefthand": { + "rotation": [95, 0, 0], + "translation": [0, 0.5, 2.75], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [-180, 32.75, -180], + "translation": [0, 3.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [-180, 32.75, -180], + "translation": [0, 3.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [-146, 45, -180], + "translation": [-0.5, 3, 2] + }, + "head": { + "translation": [0, -37.25, -4], + "scale": [0.5, 0.5, 0.5] + }, + "on_shelf": { + "rotation": [0, -180, 0] + } + }, + "groups": [ + { + "name": "black_anti_radiation_boots", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [ + { + "name": "right_leg", + "origin": [9.67, -2.43333, 8.76667], + "scope": 0, + "color": 0, + "children": [ + { + "name": "right_boot", + "origin": [9.7, -5.3, 8.7], + "scope": 0, + "color": 0, + "children": [0] + } + ] + }, + { + "name": "left_leg", + "origin": [5.78333, -2.43333, 8.76667], + "scope": 0, + "color": 0, + "children": [ + { + "name": "left_boot", + "origin": [5.8, -5.3, 8.7], + "scope": 0, + "color": 0, + "children": [1] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate/item.json b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate/item.json new file mode 100644 index 000000000..9fe686707 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_chestplate/item.json @@ -0,0 +1,184 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "14": "createnuclear:item/default_anti_radiation_suit" + }, + "elements": [ + { + "name": "power_chestplate_inner", + "from": [3.7, 0.75, 6.2], + "to": [11.7, 12.75, 11.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.75, 9]}, + "faces": { + "north": {"uv": [0.83333, 4, 2.16667, 6], "texture": "#14"}, + "east": {"uv": [0, 4, 0.83333, 6], "texture": "#14"}, + "south": {"uv": [3, 4, 4.33333, 6], "texture": "#14"}, + "west": {"uv": [2.16667, 4, 3, 6], "texture": "#14"}, + "up": {"uv": [2.16667, 4, 0.83333, 3.16667], "texture": "#14"}, + "down": {"uv": [3.5, 3.16667, 2.16667, 4], "texture": "#14"} + } + }, + { + "name": "power_chestplate_outer", + "from": [3.4, 0.75, 5.9], + "to": [12.4, 13.75, 11.9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.75, 9]}, + "faces": { + "north": {"uv": [1, 1, 2.5, 3.16667], "texture": "#14"}, + "east": {"uv": [0, 1, 1, 3.16667], "texture": "#14"}, + "south": {"uv": [3.5, 1, 5, 3.16667], "texture": "#14"}, + "west": {"uv": [2.5, 1, 3.5, 3.16667], "texture": "#14"}, + "up": {"uv": [2.5, 1, 1, 0], "texture": "#14"}, + "down": {"uv": [4, 0, 2.5, 1], "texture": "#14"} + } + }, + { + "name": "power_pants_inner", + "from": [3.7, 0.75, 6.3], + "to": [11.7, 12.75, 11.3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.75, 9]}, + "faces": { + "north": {"uv": [0.83333, 6.83333, 2.16667, 8.83333], "texture": "#14"}, + "east": {"uv": [0, 6.83333, 0.83333, 8.83333], "texture": "#14"}, + "south": {"uv": [3, 6.83333, 4.33333, 8.83333], "texture": "#14"}, + "west": {"uv": [2.16667, 6.83333, 3, 8.83333], "texture": "#14"}, + "up": {"uv": [2.16667, 6.83333, 0.83333, 6], "texture": "#14"}, + "down": {"uv": [3.5, 6, 2.16667, 6.83333], "texture": "#14"} + } + }, + { + "name": "power_pants_outer", + "from": [3.5, 0.75, 6], + "to": [12.5, 13.75, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.75, 9]}, + "faces": { + "north": {"uv": [11.66667, 1, 13.16667, 3.16667], "texture": "#14"}, + "east": {"uv": [10.66667, 1, 11.66667, 3.16667], "texture": "#14"}, + "south": {"uv": [14.16667, 1, 15.66667, 3.16667], "texture": "#14"}, + "west": {"uv": [13.16667, 1, 14.16667, 3.16667], "texture": "#14"}, + "up": {"uv": [13.16667, 1, 11.66667, 0], "texture": "#14"}, + "down": {"uv": [14.66667, 0, 13.16667, 1], "texture": "#14"} + } + }, + { + "name": "power_right_arm_inner", + "from": [11.45, 0.3, 6.25], + "to": [16.35, 13.2, 11.15], + "rotation": {"angle": 0, "axis": "y", "origin": [13.9, 6.75, 8.7]}, + "faces": { + "north": {"uv": [8.83333, 6, 8.16667, 8], "texture": "#14"}, + "east": {"uv": [9.5, 6, 8.83333, 8], "texture": "#14"}, + "south": {"uv": [10.16667, 6, 9.5, 8], "texture": "#14"}, + "west": {"uv": [8.16667, 6, 7.5, 8], "texture": "#14"}, + "up": {"uv": [8.16667, 6, 8.83333, 5.33333], "texture": "#14"}, + "down": {"uv": [8.83333, 5.33333, 9.5, 6], "texture": "#14"} + } + }, + { + "name": "power_right_arm_outer", + "from": [11.35, 0.2, 6.15], + "to": [16.45, 13.3, 11.25], + "rotation": {"angle": 0, "axis": "y", "origin": [13.9, 6.75, 8.7]}, + "faces": { + "north": {"uv": [6.16667, 6, 5.5, 8], "texture": "#14"}, + "east": {"uv": [6.83333, 6, 6.16667, 8], "texture": "#14"}, + "south": {"uv": [7.5, 6, 6.83333, 8], "texture": "#14"}, + "west": {"uv": [5.5, 6, 4.83333, 8], "texture": "#14"}, + "up": {"uv": [5.5, 6, 6.16667, 5.33333], "texture": "#14"}, + "down": {"uv": [6.16667, 5.33333, 6.83333, 6], "texture": "#14"} + } + }, + { + "name": "power_left_arm_inner", + "from": [-0.7, 0.35, 6.3], + "to": [4.1, 13.15, 11.1], + "rotation": {"angle": 0, "axis": "y", "origin": [1.7, 6.75, 8.7]}, + "faces": { + "north": {"uv": [8.16667, 6, 8.83333, 8], "texture": "#14"}, + "east": {"uv": [7.5, 6, 8.16667, 8], "texture": "#14"}, + "south": {"uv": [9.5, 6, 10.16667, 8], "texture": "#14"}, + "west": {"uv": [8.83333, 6, 9.5, 8], "texture": "#14"}, + "up": {"uv": [8.83333, 6, 8.16667, 5.33333], "texture": "#14"}, + "down": {"uv": [9.5, 5.33333, 8.83333, 6], "texture": "#14"} + } + }, + { + "name": "power_left_arm_outer", + "from": [-0.8, 0.25, 6.2], + "to": [4.2, 13.25, 11.2], + "rotation": {"angle": 0, "axis": "y", "origin": [1.7, 6.75, 8.7]}, + "faces": { + "north": {"uv": [5.5, 6, 6.16667, 8], "texture": "#14"}, + "east": {"uv": [4.83333, 6, 5.5, 8], "texture": "#14"}, + "south": {"uv": [6.83333, 6, 7.5, 8], "texture": "#14"}, + "west": {"uv": [6.16667, 6, 6.83333, 8], "texture": "#14"}, + "up": {"uv": [6.16667, 6, 5.5, 5.33333], "texture": "#14"}, + "down": {"uv": [6.83333, 5.33333, 6.16667, 6], "texture": "#14"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "thirdperson_lefthand": { + "rotation": [95.07, -88.51, 4.51], + "translation": [0.5, -2, -1.75], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [-152.1, 49.9, 178.86], + "translation": [-0.25, 0, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "translation": [0, -12, -1.25] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "black_anti_radiation_chestplate", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [ + { + "name": "body", + "origin": [7.825, 18.25, 8.85], + "scope": 0, + "color": 0, + "children": [0, 1, 2, 3] + }, + { + "name": "right_arm", + "origin": [13.8, 19.5, 8.8], + "scope": 0, + "color": 0, + "children": [4, 5] + }, + { + "name": "left_arm", + "origin": [1.8, 19.5, 8.8], + "scope": 0, + "color": 0, + "children": [6, 7] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_helmet/item.json b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_helmet/item.json new file mode 100644 index 000000000..730206825 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_helmet/item.json @@ -0,0 +1,95 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [96, 96], + "textures": { + "particle": "createnuclear:item/default_anti_radiation_suit", + "layer0": "createnuclear:item/default_anti_radiation_suit" + }, + "elements": [ + { + "name": "power_helmet_inner", + "from": [3.8, 0.6, 4.8], + "to": [12.2, 9, 13.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.65, 9]}, + "faces": { + "north": {"uv": [6.33333, 1.33333, 7.66667, 2.66667], "texture": "#layer0"}, + "east": {"uv": [5, 1.33333, 6.33333, 2.66667], "texture": "#layer0"}, + "south": {"uv": [9, 1.33333, 10.33333, 2.66667], "texture": "#layer0"}, + "west": {"uv": [7.66667, 1.33333, 9, 2.66667], "texture": "#layer0"}, + "up": {"uv": [7.66667, 1.33333, 6.33333, 0], "texture": "#layer0"}, + "down": {"uv": [9, 0, 7.66667, 1.33333], "texture": "#layer0"} + } + }, + { + "name": "power_helm_outer", + "from": [3.5, 0, 4.5], + "to": [12.5, 9, 13.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.65, 9]}, + "faces": { + "north": {"uv": [6.33333, 4, 7.66667, 5.33333], "texture": "#layer0"}, + "east": {"uv": [5, 4, 6.33333, 5.33333], "texture": "#layer0"}, + "south": {"uv": [9, 4, 10.33333, 5.33333], "texture": "#layer0"}, + "west": {"uv": [7.66667, 4, 9, 5.33333], "texture": "#layer0"}, + "up": {"uv": [7.66667, 4, 6.33333, 2.66667], "texture": "#layer0"}, + "down": {"uv": [9, 2.66667, 7.66667, 4], "texture": "#layer0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "thirdperson_lefthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "firstperson_righthand": { + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "firstperson_lefthand": { + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "ground": { + "translation": [0, 2, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, -180, 0], + "translation": [0, 13, 7] + }, + "fixed": { + "translation": [0, 3.5, 0] + }, + "on_shelf": { + "rotation": [0, -180, 0] + } + }, + "groups": [ + { + "name": "black_anti_radiation_helmet", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [ + { + "name": "head", + "origin": [8, 36, 9], + "scope": 0, + "color": 0, + "children": [0, 1] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_leggings/item.json b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_leggings/item.json new file mode 100644 index 000000000..a60dc9d49 --- /dev/null +++ b/src/main/resources/assets/createnuclear/models/item/default_anti_radiation_leggings/item.json @@ -0,0 +1,128 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "14": "createnuclear:item/default_anti_radiation_suit" + }, + "elements": [ + { + "name": "power_leg_inner", + "from": [7.71, -2, 6.9], + "to": [11.71, 10, 10.9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 9]}, + "faces": { + "north": {"uv": [6.16667, 8.66667, 5.5, 10.66667], "texture": "#14"}, + "east": {"uv": [6.83333, 8.66667, 6.16667, 10.66667], "texture": "#14"}, + "south": {"uv": [7.5, 8.66667, 6.83333, 10.66667], "texture": "#14"}, + "west": {"uv": [5.5, 8.66667, 4.83333, 10.66667], "texture": "#14"}, + "up": {"uv": [5.5, 8.66667, 6.16667, 8], "texture": "#14"}, + "down": {"uv": [6.16667, 8, 6.83333, 8.66667], "texture": "#14"} + } + }, + { + "name": "power_leg_outer", + "from": [7.35, -2.25, 6.45], + "to": [11.85, 10.25, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 9]}, + "faces": { + "north": {"uv": [8.83333, 8.66667, 8.16667, 10.66667], "texture": "#14"}, + "east": {"uv": [9.5, 8.66667, 8.83333, 10.66667], "texture": "#14"}, + "south": {"uv": [10.16667, 8.66667, 9.5, 10.66667], "texture": "#14"}, + "west": {"uv": [8.16667, 8.66667, 7.5, 10.66667], "texture": "#14"}, + "up": {"uv": [8.16667, 8.66667, 8.83333, 8], "texture": "#14"}, + "down": {"uv": [8.83333, 8, 9.5, 8.66667], "texture": "#14"} + } + }, + { + "name": "power_leg_inner", + "from": [3.75, -2, 6.9], + "to": [7.75, 10, 10.9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 9]}, + "faces": { + "north": {"uv": [5.5, 8.66667, 6.16667, 10.66667], "texture": "#14"}, + "east": {"uv": [4.83333, 8.66667, 5.5, 10.66667], "texture": "#14"}, + "south": {"uv": [6.83333, 8.66667, 7.5, 10.66667], "texture": "#14"}, + "west": {"uv": [6.16667, 8.66667, 6.83333, 10.66667], "texture": "#14"}, + "up": {"uv": [6.16667, 8.66667, 5.5, 8], "texture": "#14"}, + "down": {"uv": [6.83333, 8, 6.16667, 8.66667], "texture": "#14"} + } + }, + { + "name": "power_leg_outer", + "from": [3.55, -2.25, 6.45], + "to": [8.05, 10.25, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 9]}, + "faces": { + "north": {"uv": [8.16667, 8.66667, 8.83333, 10.66667], "texture": "#14"}, + "east": {"uv": [7.5, 8.66667, 8.16667, 10.66667], "texture": "#14"}, + "south": {"uv": [9.5, 8.66667, 10.16667, 10.66667], "texture": "#14"}, + "west": {"uv": [8.83333, 8.66667, 9.5, 10.66667], "texture": "#14"}, + "up": {"uv": [8.83333, 8.66667, 8.16667, 8], "texture": "#14"}, + "down": {"uv": [9.5, 8, 8.83333, 8.66667], "texture": "#14"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "thirdperson_lefthand": { + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] + }, + "firstperson_righthand": { + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "firstperson_lefthand": { + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "ground": { + "translation": [0, 2, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [-151.96, 54.21, 174.44], + "translation": [-0.75, 1.75, 0], + "scale": [0.8, 0.8, 0.8] + }, + "head": { + "rotation": [0, -180, 0], + "translation": [0, 13, 7] + }, + "fixed": { + "rotation": [0, -180, 0] + }, + "on_shelf": { + "rotation": [0, -180, 0] + } + }, + "groups": [ + { + "name": "black_anti_radiation_leggings", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [ + { + "name": "right_leg", + "origin": [9.67, -2.43333, 8.76667], + "scope": 0, + "color": 0, + "children": [0, 1] + }, + { + "name": "left_leg", + "origin": [5.78333, -2.43333, 8.76667], + "scope": 0, + "color": 0, + "children": [2, 3] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/particles/irradiated_particles.json b/src/main/resources/assets/createnuclear/particles/irradiated_particles.json new file mode 100644 index 000000000..4c09429a7 --- /dev/null +++ b/src/main/resources/assets/createnuclear/particles/irradiated_particles.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "createnuclear:irradiated_particles" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud.json b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud.json new file mode 100644 index 000000000..6e3e151a5 --- /dev/null +++ b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud.json @@ -0,0 +1,20 @@ +{ + "textures": [ + "minecraft:explosion_0", + "minecraft:explosion_1", + "minecraft:explosion_2", + "minecraft:explosion_3", + "minecraft:explosion_4", + "minecraft:explosion_5", + "minecraft:explosion_6", + "minecraft:explosion_7", + "minecraft:explosion_8", + "minecraft:explosion_9", + "minecraft:explosion_10", + "minecraft:explosion_11", + "minecraft:explosion_12", + "minecraft:explosion_13", + "minecraft:explosion_14", + "minecraft:explosion_15" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_explosion.json b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_explosion.json new file mode 100644 index 000000000..6e3e151a5 --- /dev/null +++ b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_explosion.json @@ -0,0 +1,20 @@ +{ + "textures": [ + "minecraft:explosion_0", + "minecraft:explosion_1", + "minecraft:explosion_2", + "minecraft:explosion_3", + "minecraft:explosion_4", + "minecraft:explosion_5", + "minecraft:explosion_6", + "minecraft:explosion_7", + "minecraft:explosion_8", + "minecraft:explosion_9", + "minecraft:explosion_10", + "minecraft:explosion_11", + "minecraft:explosion_12", + "minecraft:explosion_13", + "minecraft:explosion_14", + "minecraft:explosion_15" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_smoke.json b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_smoke.json new file mode 100644 index 000000000..271261099 --- /dev/null +++ b/src/main/resources/assets/createnuclear/particles/nuclear_mushroom_cloud_smoke.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t1_ponder.nbt b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t1_ponder.nbt new file mode 100644 index 000000000..44cd6ae65 Binary files /dev/null and b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t1_ponder.nbt differ diff --git a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t2_ponder.nbt b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t2_ponder.nbt new file mode 100644 index 000000000..d3b8229d2 Binary files /dev/null and b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t2_ponder.nbt differ diff --git a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t3_ponder.nbt b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t3_ponder.nbt new file mode 100644 index 000000000..9676d99e7 Binary files /dev/null and b/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t3_ponder.nbt differ diff --git a/src/main/resources/assets/createnuclear/ponder/reactor/setup.nbt b/src/main/resources/assets/createnuclear/ponder/reactor/setup.nbt index 227cf19b5..5e25912ea 100644 Binary files a/src/main/resources/assets/createnuclear/ponder/reactor/setup.nbt and b/src/main/resources/assets/createnuclear/ponder/reactor/setup.nbt differ diff --git a/src/main/resources/assets/createnuclear/sounds/alarm/alarm.ogg b/src/main/resources/assets/createnuclear/sounds/alarm/alarm.ogg new file mode 100644 index 000000000..34b8230e9 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/alarm/alarm.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/biomes/wasteland.ogg b/src/main/resources/assets/createnuclear/sounds/biomes/wasteland.ogg new file mode 100644 index 000000000..d1947d6ff Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/biomes/wasteland.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/large_nuclear_explosion.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/large_nuclear_explosion.ogg new file mode 100644 index 000000000..312530dfe Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/large_nuclear_explosion.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/main.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/main.ogg new file mode 100644 index 000000000..003865425 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/main.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion.ogg new file mode 100644 index 000000000..4efa58c23 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion_rumble.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion_rumble.ogg new file mode 100644 index 000000000..835045fe8 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/nuclear_explosion_rumble.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/ringing.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/ringing.ogg new file mode 100644 index 000000000..d6a5ce440 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/ringing.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/rumble.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/rumble.ogg new file mode 100644 index 000000000..bde039ecb Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/rumble.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/explosion/shockwave.ogg b/src/main/resources/assets/createnuclear/sounds/explosion/shockwave.ogg new file mode 100644 index 000000000..4703edd3b Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/explosion/shockwave.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/geiger/high.ogg b/src/main/resources/assets/createnuclear/sounds/geiger/high.ogg new file mode 100644 index 000000000..88ca8b7b8 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/geiger/high.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/geiger/low.ogg b/src/main/resources/assets/createnuclear/sounds/geiger/low.ogg new file mode 100644 index 000000000..7140009e4 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/geiger/low.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/geiger/medium.ogg b/src/main/resources/assets/createnuclear/sounds/geiger/medium.ogg new file mode 100644 index 000000000..8d6e06411 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/geiger/medium.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/reacteur/activation.ogg b/src/main/resources/assets/createnuclear/sounds/reacteur/activation.ogg new file mode 100644 index 000000000..b043866f0 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/reacteur/activation.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_assemble.ogg b/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_assemble.ogg new file mode 100644 index 000000000..3d7ac0485 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_assemble.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_disassemble.ogg b/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_disassemble.ogg new file mode 100644 index 000000000..8e1db4ca7 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/reacteur/assemble_deassemble/motor_disassemble.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/reacteur/running.ogg b/src/main/resources/assets/createnuclear/sounds/reacteur/running.ogg new file mode 100644 index 000000000..761f9dfe6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/reacteur/running.ogg differ diff --git a/src/main/resources/assets/createnuclear/sounds/reacteur/shut_off.ogg b/src/main/resources/assets/createnuclear/sounds/reacteur/shut_off.ogg new file mode 100644 index 000000000..249f1f24b Binary files /dev/null and b/src/main/resources/assets/createnuclear/sounds/reacteur/shut_off.ogg differ diff --git a/src/main/resources/assets/createnuclear/textures/block/deepslate_nitrate_ore.png b/src/main/resources/assets/createnuclear/textures/block/deepslate_nitrate_ore.png new file mode 100644 index 000000000..602792694 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/deepslate_nitrate_ore.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/deepslate_thorium_ore.png b/src/main/resources/assets/createnuclear/textures/block/deepslate_thorium_ore.png new file mode 100644 index 000000000..875565b98 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/deepslate_thorium_ore.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/nitrate_ore.png b/src/main/resources/assets/createnuclear/textures/block/nitrate_ore.png new file mode 100644 index 000000000..3eda18f22 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/nitrate_ore.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_basketweave.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_basketweave.png index 18b2c25ca..a6e2fc13c 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_basketweave.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_basketweave.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_bond.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_bond.png index 6aac6f0eb..90d0531c7 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_bond.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_bond.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_indented.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_indented.png index 007c89436..77f6814a3 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_indented.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/alternatives/autunite_cut_indented.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/brick/autunite_cut_brick.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/brick/autunite_cut_brick.png index 34a296df8..630f7cddd 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/brick/autunite_cut_brick.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/brick/autunite_cut_brick.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap.png index 007c89436..77f6814a3 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap_connected.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap_connected.png index 02274e175..59c887bd8 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap_connected.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cap/autunite_cut_cap_connected.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cut/autunite_cut.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cut/autunite_cut.png index 3cfc1ae1d..a18e994bc 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cut/autunite_cut.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/cut/autunite_cut.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered.png index 3f27e3206..36f661351 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered_connected.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered_connected.png index 0f9be1b8f..102073ba4 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered_connected.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/layered/autunite_cut_layered_connected.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_0.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_0.png index 90aab089e..bd3544dde 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_0.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_0.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_1.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_1.png index 823d624b7..ce805424f 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_1.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_1.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_2.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_2.png index 97597db64..459817089 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_2.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_2.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_3.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_3.png index 14f577a77..bb391e754 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_3.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/natural/autunite_3.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar.png index d614ad10d..618705471 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar_connected.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar_connected.png index 46b045fc8..56d263a7a 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar_connected.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/pillar/autunite_cut_pillar_connected.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/polished/autunite_cut_polished.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/polished/autunite_cut_polished.png index 3980d0198..850425842 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/polished/autunite_cut_polished.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/polished/autunite_cut_polished.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/slab/autunite_cut_slab.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/slab/autunite_cut_slab.png index 2914c808a..9c1c53d91 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/slab/autunite_cut_slab.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/slab/autunite_cut_slab.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/small_brick/autunite_cut_small_brick.png b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/small_brick/autunite_cut_small_brick.png index 19643134a..fa05afc4a 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/small_brick/autunite_cut_small_brick.png and b/src/main/resources/assets/createnuclear/textures/block/palettes/stone_types/small_brick/autunite_cut_small_brick.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/raw_thorium_block.png b/src/main/resources/assets/createnuclear/textures/block/raw_thorium_block.png new file mode 100644 index 000000000..88c8ce69b Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/raw_thorium_block.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png deleted file mode 100644 index 5783d7181..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_inner.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png deleted file mode 100644 index c4d4460ca..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/casing_top.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png index 10473d824..b2d67db90 100644 Binary files a/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png and b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_off.png b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_off.png new file mode 100644 index 000000000..354c2068f Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_off.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_on.png b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_on.png new file mode 100644 index 000000000..33a3fdcc5 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_on.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_standby.png b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_standby.png new file mode 100644 index 000000000..7b9c7297f Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/reactor/controller/controller_panel_standby.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/fluid_input/fluid_input.png b/src/main/resources/assets/createnuclear/textures/block/reactor/fluid_input/fluid_input.png new file mode 100644 index 000000000..e041d3d3b Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/reactor/fluid_input/fluid_input.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor/input/input.png b/src/main/resources/assets/createnuclear/textures/block/reactor/rod_input/rod_input.png similarity index 100% rename from src/main/resources/assets/createnuclear/textures/block/reactor/input/input.png rename to src/main/resources/assets/createnuclear/textures/block/reactor/rod_input/rod_input.png diff --git a/src/main/resources/assets/createnuclear/textures/block/reactor_alarm.png b/src/main/resources/assets/createnuclear/textures/block/reactor_alarm.png new file mode 100644 index 000000000..b57826a06 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/reactor_alarm.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/thorium_block.png b/src/main/resources/assets/createnuclear/textures/block/thorium_block.png new file mode 100644 index 000000000..35b943f80 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/thorium_block.png differ diff --git a/src/main/resources/assets/createnuclear/textures/block/thorium_ore.png b/src/main/resources/assets/createnuclear/textures/block/thorium_ore.png new file mode 100644 index 000000000..0a903efb5 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/block/thorium_ore.png differ diff --git a/src/main/resources/assets/createnuclear/textures/entity/irradiated_cow.png b/src/main/resources/assets/createnuclear/textures/entity/irradiated_cow.png new file mode 100644 index 000000000..cada4987c Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/entity/irradiated_cow.png differ diff --git a/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png new file mode 100644 index 000000000..646a78559 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png differ diff --git a/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png.mcmeta b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png.mcmeta new file mode 100644 index 000000000..f6730e30a --- /dev/null +++ b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png new file mode 100644 index 000000000..a232dff3d Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png differ diff --git a/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png.mcmeta b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png.mcmeta new file mode 100644 index 000000000..b84e69f2c --- /dev/null +++ b/src/main/resources/assets/createnuclear/textures/fluid/nitrogen_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 4 + } +} diff --git a/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png b/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png new file mode 100644 index 000000000..d29c920bd Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png differ diff --git a/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png.mcmeta b/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png.mcmeta new file mode 100644 index 000000000..f6730e30a --- /dev/null +++ b/src/main/resources/assets/createnuclear/textures/fluid/thorium_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png b/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png new file mode 100644 index 000000000..6535408c3 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png differ diff --git a/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png.mcmeta b/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png.mcmeta new file mode 100644 index 000000000..b84e69f2c --- /dev/null +++ b/src/main/resources/assets/createnuclear/textures/fluid/thorium_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 4 + } +} diff --git a/src/main/resources/assets/createnuclear/textures/gui/advancements/backgrounds/background_advancement.png b/src/main/resources/assets/createnuclear/textures/gui/advancements/backgrounds/background_advancement.png new file mode 100644 index 000000000..d869a9823 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/gui/advancements/backgrounds/background_advancement.png differ diff --git a/src/main/resources/assets/createnuclear/textures/gui/icons.png b/src/main/resources/assets/createnuclear/textures/gui/icons.png new file mode 100644 index 000000000..b9713654e Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/gui/icons.png differ diff --git a/src/main/resources/assets/createnuclear/textures/gui/storage-slot.png b/src/main/resources/assets/createnuclear/textures/gui/storage-slot.png index eb8699dbc..39a4e509b 100644 Binary files a/src/main/resources/assets/createnuclear/textures/gui/storage-slot.png and b/src/main/resources/assets/createnuclear/textures/gui/storage-slot.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/anti_radiation_boots.png deleted file mode 100644 index 5e2aafa41..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/black_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/black_anti_radiation_suit.png new file mode 100644 index 000000000..620408971 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/black_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/blue_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/blue_anti_radiation_suit.png new file mode 100644 index 000000000..9122ba8bb Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/blue_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/brown_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/brown_anti_radiation_suit.png new file mode 100644 index 000000000..cd2c4e9e6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/brown_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/black_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/black_anti_radiation_chestplate.png deleted file mode 100644 index 2e376a1cf..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/black_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/blue_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/blue_anti_radiation_chestplate.png deleted file mode 100644 index fb0136aee..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/blue_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/brown_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/brown_anti_radiation_chestplate.png deleted file mode 100644 index d5f3bb11a..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/brown_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/cyan_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/cyan_anti_radiation_chestplate.png deleted file mode 100644 index 59af829f5..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/cyan_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/gray_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/gray_anti_radiation_chestplate.png deleted file mode 100644 index 7981b5909..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/gray_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/green_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/green_anti_radiation_chestplate.png deleted file mode 100644 index 707258c98..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/green_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_blue_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_blue_anti_radiation_chestplate.png deleted file mode 100644 index c943950b9..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_blue_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_gray_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_gray_anti_radiation_chestplate.png deleted file mode 100644 index 6f37af532..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/light_gray_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/lime_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/lime_anti_radiation_chestplate.png deleted file mode 100644 index 6f8da4465..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/lime_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/magenta_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/magenta_anti_radiation_chestplate.png deleted file mode 100644 index b0bb709eb..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/magenta_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/orange_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/orange_anti_radiation_chestplate.png deleted file mode 100644 index b83a217c8..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/orange_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/pink_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/pink_anti_radiation_chestplate.png deleted file mode 100644 index c6b096c17..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/pink_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/purple_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/purple_anti_radiation_chestplate.png deleted file mode 100644 index 4e21121b3..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/purple_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/red_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/red_anti_radiation_chestplate.png deleted file mode 100644 index 0d73ee638..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/red_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/white_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/white_anti_radiation_chestplate.png deleted file mode 100644 index 581bbbd37..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/white_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/yellow_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/yellow_anti_radiation_chestplate.png deleted file mode 100644 index 8429f5dc6..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/chestplates/yellow_anti_radiation_chestplate.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/cyan_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/cyan_anti_radiation_suit.png new file mode 100644 index 000000000..4f3a193e0 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/cyan_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_boots.png new file mode 100644 index 000000000..b1fa59cc0 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_boots.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_chestplate.png b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_chestplate.png new file mode 100644 index 000000000..380c01e9d Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_chestplate.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_helmet.png new file mode 100644 index 000000000..3431a8491 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_helmet.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_leggings.png new file mode 100644 index 000000000..9f56680e9 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_leggings.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_suit.png new file mode 100644 index 000000000..df8abdb3d Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/default_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/gray_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/gray_anti_radiation_suit.png new file mode 100644 index 000000000..e5038e341 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/gray_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/green_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/green_anti_radiation_suit.png new file mode 100644 index 000000000..8eb3abdc6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/green_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/black_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/black_anti_radiation_helmet.png deleted file mode 100644 index 98a0676a2..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/black_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/blue_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/blue_anti_radiation_helmet.png deleted file mode 100644 index 5aa8e9707..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/blue_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/brown_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/brown_anti_radiation_helmet.png deleted file mode 100644 index f809bf5f9..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/brown_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/cyan_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/cyan_anti_radiation_helmet.png deleted file mode 100644 index 0e93c48dd..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/cyan_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/gray_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/gray_anti_radiation_helmet.png deleted file mode 100644 index 0cbaa9ec2..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/gray_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/green_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/green_anti_radiation_helmet.png deleted file mode 100644 index 69cc070bb..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/green_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_blue_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_blue_anti_radiation_helmet.png deleted file mode 100644 index 1b9a7c1c8..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_blue_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_gray_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_gray_anti_radiation_helmet.png deleted file mode 100644 index c42680931..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/light_gray_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/lime_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/lime_anti_radiation_helmet.png deleted file mode 100644 index 28333da4b..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/lime_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/magenta_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/magenta_anti_radiation_helmet.png deleted file mode 100644 index 79eccd875..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/magenta_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/orange_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/orange_anti_radiation_helmet.png deleted file mode 100644 index a75498231..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/orange_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/pink_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/pink_anti_radiation_helmet.png deleted file mode 100644 index 26955cd54..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/pink_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/purple_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/purple_anti_radiation_helmet.png deleted file mode 100644 index cb9f6ae84..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/purple_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/red_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/red_anti_radiation_helmet.png deleted file mode 100644 index baadfee21..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/red_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/white_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/white_anti_radiation_helmet.png deleted file mode 100644 index 952835723..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/white_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/yellow_anti_radiation_helmet.png b/src/main/resources/assets/createnuclear/textures/item/armors/helmets/yellow_anti_radiation_helmet.png deleted file mode 100644 index 518fb040a..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/helmets/yellow_anti_radiation_helmet.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/black_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/black_anti_radiation_leggings.png deleted file mode 100644 index de76aae92..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/black_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/blue_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/blue_anti_radiation_leggings.png deleted file mode 100644 index 92a087cdc..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/blue_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/brown_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/brown_anti_radiation_leggings.png deleted file mode 100644 index 4935e7a68..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/brown_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/cyan_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/cyan_anti_radiation_leggings.png deleted file mode 100644 index 7aaed8489..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/cyan_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/gray_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/gray_anti_radiation_leggings.png deleted file mode 100644 index 01e1a8425..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/gray_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/green_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/green_anti_radiation_leggings.png deleted file mode 100644 index ab34ea48c..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/green_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_blue_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_blue_anti_radiation_leggings.png deleted file mode 100644 index 5230cf8df..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_blue_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_gray_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_gray_anti_radiation_leggings.png deleted file mode 100644 index 29edbb266..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/light_gray_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/lime_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/lime_anti_radiation_leggings.png deleted file mode 100644 index ed28ad85b..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/lime_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/magenta_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/magenta_anti_radiation_leggings.png deleted file mode 100644 index e0db666ad..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/magenta_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/orange_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/orange_anti_radiation_leggings.png deleted file mode 100644 index 90e25f191..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/orange_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/pink_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/pink_anti_radiation_leggings.png deleted file mode 100644 index f0c741413..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/pink_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/purple_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/purple_anti_radiation_leggings.png deleted file mode 100644 index a2fa6ec29..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/purple_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/red_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/red_anti_radiation_leggings.png deleted file mode 100644 index 8f4ac0519..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/red_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/white_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/white_anti_radiation_leggings.png deleted file mode 100644 index 1763c81fd..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/white_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/yellow_anti_radiation_leggings.png b/src/main/resources/assets/createnuclear/textures/item/armors/leggings/yellow_anti_radiation_leggings.png deleted file mode 100644 index 63178c703..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/leggings/yellow_anti_radiation_leggings.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/light_blue_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/light_blue_anti_radiation_suit.png new file mode 100644 index 000000000..4584c6cb6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/light_blue_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/light_gray_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/light_gray_anti_radiation_suit.png new file mode 100644 index 000000000..2b2c85880 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/light_gray_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/lime_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/lime_anti_radiation_suit.png new file mode 100644 index 000000000..376edba05 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/lime_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/magenta_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/magenta_anti_radiation_suit.png new file mode 100644 index 000000000..91c1a8c90 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/magenta_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/orange_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/orange_anti_radiation_suit.png new file mode 100644 index 000000000..c8b3d0c78 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/orange_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/pink_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/pink_anti_radiation_suit.png new file mode 100644 index 000000000..de04539b3 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/pink_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/purple_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/purple_anti_radiation_suit.png new file mode 100644 index 000000000..d2a0244de Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/purple_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/red_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/red_anti_radiation_suit.png new file mode 100644 index 000000000..2b0d6b89c Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/red_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/white_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/white_anti_radiation_suit.png new file mode 100644 index 000000000..741fad4ae Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/white_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/yellow_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/armors/yellow_anti_radiation_suit.png new file mode 100644 index 000000000..2caad2bbe Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/armors/yellow_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/empty.png b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/empty.png new file mode 100644 index 000000000..fd63d514a Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/empty.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/full.png b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/full.png new file mode 100644 index 000000000..f9298c5f2 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/full.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/half.png b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/half.png new file mode 100644 index 000000000..1f22e807b Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/half.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/quarter.png b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/quarter.png new file mode 100644 index 000000000..5203618a7 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/quarter.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/three_quarters.png b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/three_quarters.png new file mode 100644 index 000000000..fc46c1842 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/biome_irradiation_extractor/three_quarters.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/cooled_nitrogen_concentrate.png b/src/main/resources/assets/createnuclear/textures/item/cooled_nitrogen_concentrate.png new file mode 100644 index 000000000..51e11a2bb Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/cooled_nitrogen_concentrate.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/nitrate.png b/src/main/resources/assets/createnuclear/textures/item/nitrate.png new file mode 100644 index 000000000..bb2f95820 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/nitrate.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/nitrogen_bucket.png b/src/main/resources/assets/createnuclear/textures/item/nitrogen_bucket.png new file mode 100644 index 000000000..691532bd9 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/nitrogen_bucket.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/nitrogen_concentrate.png b/src/main/resources/assets/createnuclear/textures/item/nitrogen_concentrate.png new file mode 100644 index 000000000..446db5365 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/nitrogen_concentrate.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/raw_thorium.png b/src/main/resources/assets/createnuclear/textures/item/raw_thorium.png new file mode 100644 index 000000000..231eff208 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/raw_thorium.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/reinforced_glass_bottle.png b/src/main/resources/assets/createnuclear/textures/item/reinforced_glass_bottle.png new file mode 100644 index 000000000..2cfcd77e5 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/reinforced_glass_bottle.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/thorium_bucket.png b/src/main/resources/assets/createnuclear/textures/item/thorium_bucket.png new file mode 100644 index 000000000..80a9407b0 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/thorium_bucket.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/thorium_dust.png b/src/main/resources/assets/createnuclear/textures/item/thorium_dust.png new file mode 100644 index 000000000..799029c3b Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/thorium_dust.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/thorium_ingot.png b/src/main/resources/assets/createnuclear/textures/item/thorium_ingot.png new file mode 100644 index 000000000..0a430f330 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/thorium_ingot.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/thorium_nugget.png b/src/main/resources/assets/createnuclear/textures/item/thorium_nugget.png new file mode 100644 index 000000000..276e3778e Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/thorium_nugget.png differ diff --git a/src/main/resources/assets/createnuclear/textures/item/thorium_rod.png b/src/main/resources/assets/createnuclear/textures/item/thorium_rod.png new file mode 100644 index 000000000..ff27f25d2 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/item/thorium_rod.png differ diff --git a/src/main/resources/assets/createnuclear/textures/misc/bomb_flash.png b/src/main/resources/assets/createnuclear/textures/misc/bomb_flash.png new file mode 100644 index 000000000..12e3f0c20 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/misc/bomb_flash.png differ diff --git a/src/main/resources/assets/createnuclear/textures/mob_effect/iodine.png b/src/main/resources/assets/createnuclear/textures/mob_effect/iodine.png new file mode 100644 index 000000000..276fa23a5 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/mob_effect/iodine.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit.png new file mode 100644 index 000000000..620408971 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_1.png deleted file mode 100644 index 6346835d5..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_2.png deleted file mode 100644 index 86f1b189c..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/black_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit.png new file mode 100644 index 000000000..9122ba8bb Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_1.png deleted file mode 100644 index 3a5ec079e..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_2.png deleted file mode 100644 index 34c8ec269..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/blue_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit.png new file mode 100644 index 000000000..cd2c4e9e6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_1.png deleted file mode 100644 index fa70b2740..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_2.png deleted file mode 100644 index 62ee17e04..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/brown_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit.png new file mode 100644 index 000000000..4f3a193e0 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_1.png deleted file mode 100644 index 3dc08eecc..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_2.png deleted file mode 100644 index 0217d65bc..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/cyan_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/default_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/default_anti_radiation_suit.png new file mode 100644 index 000000000..b8a89e193 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/default_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit.png new file mode 100644 index 000000000..e5038e341 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_1.png deleted file mode 100644 index de6701632..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_2.png deleted file mode 100644 index 869018c1b..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/gray_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit.png new file mode 100644 index 000000000..8eb3abdc6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_1.png deleted file mode 100644 index 7bd7d6e3a..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_2.png deleted file mode 100644 index 7ff7725c0..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/green_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit.png new file mode 100644 index 000000000..4584c6cb6 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_1.png deleted file mode 100644 index 76de36b63..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_2.png deleted file mode 100644 index 734f850b9..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/light_blue_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit.png new file mode 100644 index 000000000..2b2c85880 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_1.png deleted file mode 100644 index eb351406b..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_2.png deleted file mode 100644 index 1df753426..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/light_gray_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit.png new file mode 100644 index 000000000..376edba05 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_1.png deleted file mode 100644 index 24dab4e62..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_2.png deleted file mode 100644 index dfdef32bd..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/lime_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit.png new file mode 100644 index 000000000..91c1a8c90 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_1.png deleted file mode 100644 index 980f1fc6a..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_2.png deleted file mode 100644 index 5f3dc23f3..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/magenta_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit.png new file mode 100644 index 000000000..c8b3d0c78 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_1.png deleted file mode 100644 index 777bcf151..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_2.png deleted file mode 100644 index 4066a8c87..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/orange_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit.png new file mode 100644 index 000000000..de04539b3 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_1.png deleted file mode 100644 index 5eeba4cd0..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_2.png deleted file mode 100644 index 67051d54e..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/pink_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit.png new file mode 100644 index 000000000..d2a0244de Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_1.png deleted file mode 100644 index 39fd597e5..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_2.png deleted file mode 100644 index a8d8dc555..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/purple_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit.png new file mode 100644 index 000000000..2b0d6b89c Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_1.png deleted file mode 100644 index 4ac5d3a60..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_2.png deleted file mode 100644 index 5687e5784..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/red_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit.png new file mode 100644 index 000000000..741fad4ae Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_1.png deleted file mode 100644 index 4e433f597..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_2.png deleted file mode 100644 index 1bbdc3e23..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/white_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit.png new file mode 100644 index 000000000..2caad2bbe Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit.png differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_1.png b/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_1.png deleted file mode 100644 index d13022a82..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_2.png b/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_2.png deleted file mode 100644 index ab3b52d84..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/yellow_anti_radiation_suit_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/particle/irradiated_particles.png b/src/main/resources/assets/createnuclear/textures/particle/irradiated_particles.png new file mode 100644 index 000000000..c3e80185f Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/particle/irradiated_particles.png differ diff --git a/src/main/resources/assets/createnuclear/textures/particle/nuclear_mushroom_cloud.png b/src/main/resources/assets/createnuclear/textures/particle/nuclear_mushroom_cloud.png new file mode 100644 index 000000000..2904e00b3 Binary files /dev/null and b/src/main/resources/assets/createnuclear/textures/particle/nuclear_mushroom_cloud.png differ diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json index 0b9764994..fcd17e3d3 100644 --- a/src/main/resources/assets/minecraft/atlases/blocks.json +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -1,5 +1,13 @@ { "sources": [ + { + "type": "single", + "resource": "createnuclear:fluid/thorium_flow" + }, + { + "type": "single", + "resource": "createnuclear:fluid/thorium_still" + }, { "type": "single", "resource": "createnuclear:fluid/uranium_flow" @@ -7,6 +15,14 @@ { "type": "single", "resource": "createnuclear:fluid/uranium_still" + }, + { + "type": "single", + "resource": "createnuclear:fluid/nitrogen_flow" + }, + { + "type": "single", + "resource": "createnuclear:fluid/nitrogen_still" } ] } \ No newline at end of file diff --git a/src/main/resources/createnuclear.forge.mixins.json b/src/main/resources/createnuclear.forge.mixins.json index 1a26dd562..e90be855b 100644 --- a/src/main/resources/createnuclear.forge.mixins.json +++ b/src/main/resources/createnuclear.forge.mixins.json @@ -3,10 +3,15 @@ "priority": 1100, "package": "net.nuclearteam.createnuclear.foundation.mixin", "compatibilityLevel": "JAVA_17", + "refmap": "createnuclear.refmap.json", "mixins": [ - "BaseFireBlockMixin" + "BaseFireBlockMixin", + "SmithingTransformRecipeMixin" ], "client": [ + "client.RadiationHeartMixin", + "client.GameRendererMixin", + "client.CameraAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/data/createnuclear/structures/empty_platform.nbt b/src/main/resources/data/createnuclear/structures/empty_platform.nbt new file mode 100644 index 000000000..1181be11b Binary files /dev/null and b/src/main/resources/data/createnuclear/structures/empty_platform.nbt differ diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 000000000..41afd40fb Binary files /dev/null and b/src/main/resources/icon.png differ